西门子1200使用信号板CB 1241 RS485实现ModbusRTU源码分享一、实现ModbusRTU源码分享1、信号板硬件接线2、硬件组态3、参数设置4、程序编写5、Modbus地址说明二、modbusRTU详解1、核心概念与特点2、通信过程3、数据帧结构 (RTU Mode)4、 地址映射5、 错误处理6、关键点总结与实践注意事项一、实现ModbusRTU源码分享1、信号板硬件接线注意信号板TA接485从机BTB接485从机A线序正好相反。2、硬件组态3、参数设置双击上一步拖入的信号板4、程序编写注意要使用MODBUS包而不是MODBUSRTU包因为MODBUSRTU包用于侧面的通信模块使用。下面是完整程序注意点1.PORT要选择信号板2、MB_DB参数选择MODBUS主机块3.MODE和DATA_ADDR参数设置5、Modbus地址说明西门子 S7-1200 系列 PLC 的 Modbus 通信地址需要根据 PLC 内部的存储区来映射。Modbus 协议使用四种主要的寄存器类型它们分别对应 PLC 内部的不同存储区线圈 (Coils) - Modbus 功能码 01 (读), 05 (写单个), 15 (写多个)映射到 PLC 的输出位Q或 位存储器M。地址范围00001到09999(十进制表示)。PLC 地址映射规则Q区Q地址需要转换为十进制数然后加 1。例如Q0.0对应 Modbus 地址00001(0 * 8 0 1 1)。例如Q1.7对应 Modbus 地址00016(1 * 8 7 1 16)。M区M地址需要转换为十进制数然后加 1。例如M0.0对应 Modbus 地址00001。例如M3.5对应 Modbus 地址00030(3 * 8 5 1 30)。离散输入 (Discrete Inputs) - Modbus 功能码 02 (读)映射到 PLC 的输入位I。地址范围10001到19999(十进制表示)。PLC 地址映射规则I区I地址需要转换为十进制数然后加 1。例如I0.0对应 Modbus 地址10001(0 * 8 0 1 1, 加上前缀 10000)。例如I2.4对应 Modbus 地址10021(2 * 8 4 1 21, 加上前缀 10000)。输入寄存器 (Input Registers) - Modbus 功能码 04 (读)映射到 PLC 的过程映像输入区I(字访问)。地址范围30001到39999(十进制表示)。PLC 地址映射规则IW区IW地址需要转换为十进制数然后加 1。例如IW0(包含I0.0到I0.7和I1.0到I1.7) 对应 Modbus 地址30001(0 1 1, 加上前缀 30000)。例如IW4对应 Modbus 地址30003(4 / 2 1 3, 加上前缀 30000)。注意IW地址是字地址每 2 个字节对应一个寄存器地址。保持寄存器 (Holding Registers) - Modbus 功能码 03 (读), 06 (写单个), 16 (写多个)映射到 PLC 的输出字QW、位存储器字MW或 数据块DB中的字。地址范围40001到49999(十进制表示)。PLC 地址映射规则QW区QW地址需要转换为十进制数然后加 1。例如QW0(包含Q0.0到Q0.7和Q1.0到Q1.7) 对应 Modbus 地址40001(0 1 1, 加上前缀 40000)。例如QW8对应 Modbus 地址40005(8 / 2 1 5, 加上前缀 40000)。MW区MW地址需要转换为十进制数然后加 1。例如MW0对应 Modbus 地址40001。例如MW10对应 Modbus 地址40006(10 / 2 1 6, 加上前缀 40000)。DB区 (数据块)这是最常用的映射区域。映射规则稍复杂DB块号和块内的字节偏移量共同决定 Modbus 地址。计算公式Modbus 地址 (DB_Number × 16384) Byte_Offset 1例如DB1.DBW0(DB1块字节偏移0处的字) 对应 Modbus 地址(1 * 16384) 0 1 16385(即40001 16384 40001 16384实际地址为416385? 注意范围需要验证实际范围限制)。重要对于DB区内的位(DBX)需要先找到该位所在的字节地址然后使用线圈或离散输入的映射规则取决于你将其映射为线圈还是离散输入。例如DB1.DBX0.0这个位如果映射为线圈(1 * 16384) (0 * 8) 0 1 16385(即00001 16384 16385)。如果映射为离散输入(1 * 16384) (0 * 8) 0 1 16385(即10001 16384 26385? 注意范围需要验证实际范围限制)。关键点总结Modbus 地址是1-based的从 1 开始而 PLC 的存储区地址通常是0-based的从 0 开始。因此在映射时通常需要在 PLC 地址的数值计算结果上加 1。对于DB块需要使用块号和字节偏移量来计算 Modbus 地址。实际可用的地址范围受限于 S7-1200 的 Modbus 通信库或硬件模块的具体实现限制。务必查阅你使用的 Modbus 通信模块如 CM 1241或库函数如西门子 Modbus TCP 或 RTU 库的官方手册确认其支持的最大地址范围和对各存储区的实际映射方式。在配置 Modbus 主站上位机、HMI等时需要按照上述映射规则设置其访问的 Modbus 地址。在 PLC 端编程时需要正确配置 Modbus 从站库或模块的参数指定要映射的 PLC 存储区地址范围。二、modbusRTU详解Modbus RTU (Remote Terminal Unit)是一种广泛应用的串行通信协议主要用于工业自动化领域实现主站Master通常是 PLC、SCADA 系统或上位机和从站Slaves通常是传感器、执行器、仪表或其他 PLC之间的数据交换。它以高效、简洁和可靠性著称。1、核心概念与特点主从架构通信由主站发起。主站向特定从站地址发送请求消息该从站处理请求并回复响应消息。其他从站忽略该请求。串行传输通常运行在 RS-232 或 RS-485 物理层上。RS-485 因其多点通信一条总线上可挂多个从站和抗干扰能力在工业环境中更为常见。RTU 模式使用二进制Hexadecimal编码数据。相比 Modbus ASCII 模式RTU 更紧凑、效率更高。无起始符和结束符依靠字符间的时间间隔大于 3.5 个字符传输时间来界定消息帧的开始和结束。数据紧凑所有值地址、功能码、数据、校验码都用二进制字节表示。校验机制使用CRC-16循环冗余校验来检测传输过程中可能出现的错误。发送方计算 CRC 并附加在消息末尾接收方重新计算 CRC 并与接收到的 CRC 比较若不一致则丢弃该帧。2、通信过程主站请求主站构造一个请求消息帧并通过串行总线发送出去。从站响应目标从站接收到消息后检查从站地址是否匹配自身地址。计算 CRC 校验码并与帧尾的 CRC 比较验证数据完整性。如果地址匹配且 CRC 校验通过则执行请求指定的操作。构造一个响应消息帧包含请求结果或数据并通过总线发送回主站。主站处理响应主站接收到响应后检查响应是否来自期望的从站地址匹配。计算 CRC 校验码进行验证。如果校验通过则解析响应数据并确认操作结果。3、数据帧结构 (RTU Mode)一个完整的 Modbus RTU 消息帧由以下几部分组成[从站地址] [功能码] [数据] [CRC 校验码]从站地址 (1 Byte):唯一标识总线上的一个从站设备。范围通常是 1 - 2470 是广播地址但极少使用248-255 保留。主站请求中指定目标从站地址从站响应中返回自身地址。功能码 (1 Byte):指定主站要求从站执行的操作类型。常见功能码有01 (0x01): 读线圈状态Read Coils - 读一组开关量输出DO或离散量输入DI。02 (0x02): 读离散量输入Read Discrete Inputs - 读一组 DI 的状态。03 (0x03): 读保持寄存器Read Holding Registers - 读一组可读写的模拟量寄存器通常是 16 位整数。04 (0x04): 读输入寄存器Read Input Registers - 读一组只读的模拟量输入寄存器通常是 16 位整数。05 (0x05): 写单个线圈Write Single Coil - 写一个 DO 的状态ON/OFF。06 (0x06): 写单个寄存器Write Single Register - 写一个保持寄存器的值。15 (0x0F): 写多个线圈Write Multiple Coils。16 (0x10): 写多个寄存器Write Multiple Registers。数据 (N Bytes):包含功能码操作所需的具体信息。其结构取决于功能码。例如读请求 (03,04等)包含要读取的起始地址和要读取的寄存器/线圈数量。读响应包含实际读取到的字节数和具体的数据字节。写单个请求 (05,06): 包含要写入的地址和要写入的值。写多个请求 (15,16): 包含要写入的起始地址、数量、数据字节数和具体的数据字节。CRC 校验码 (2 Bytes):对整个消息帧从地址开始到数据结束计算得出的校验值。低位字节在前Little-Endian。4、 地址映射Modbus 协议定义了几种不同的数据区域线圈、离散输入、输入寄存器、保持寄存器。设备制造商需要在其设备内部如 PLC 的 I/O 点、内存区和这些 Modbus 地址之间建立映射关系。线圈 (Coils): 1 位可读写。常用于数字量输出 (DO)。地址范围00001 - 09999 (对应协议地址 0x0000 - 0xFFFF)。离散输入 (Discrete Inputs): 1 位只读。常用于数字量输入 (DI)。地址范围10001 - 19999。输入寄存器 (Input Registers): 16 位只读。常用于模拟量输入 (AI)。地址范围30001 - 39999。保持寄存器 (Holding Registers): 16 位可读写。常用于模拟量输出 (AO) 或内部参数存储。地址范围40001 - 49999。注意协议中传输的地址是“偏移地址”从 0 开始而上述 00001/10001 等是“逻辑地址”从 1 开始。例如逻辑地址 40001 对应的协议偏移地址是 0x0000。5、 错误处理如果从站无法处理主站的请求例如功能码不支持、地址无效、数据值非法等它会返回一个异常响应帧[从站地址] [功能码 0x80] [异常码] [CRC]功能码 0x80: 将原功能码的最高位设为 1即加上 0x80表示这是一个异常响应。异常码 (1 Byte):指示错误的具体原因。例如01: 非法功能码。02: 请求的地址非法超出设备范围。03: 请求的数据值非法超出允许范围。04: 处理请求时发生从站设备故障。6、关键点总结与实践注意事项物理层配置波特率、数据位、停止位、奇偶校验位必须主从站一致。RS-485 网络需要正确的终端电阻和接地。地址唯一性总线上每个从站必须有唯一的地址。定时要求RTU 模式依赖字符间的时间间隔 3.5T来界定帧。要求串口驱动能正确处理此超时。通信速率越高对定时精度要求越高。CRC 计算必须正确实现 CRC-16-Modbus 算法多项式 0x8005初始值 0xFFFF。字节序对于 16 位寄存器值Modbus 协议规定高位字节在前Big-Endian。例如数值0x1234在总线上传输为0x12后跟0x34。如果设备内部使用 Little-Endian需要进行转换。数据类型扩展对于 32 位浮点数或长整数通常用两个连续的 16 位寄存器表示。此时字节序和寄存器顺序高字在前还是低字在前需要根据设备文档确定。工具使用串口调试助手、Modbus 主/从站模拟软件、协议分析仪如 Wireshark Modbus 插件进行调试非常有用。
西门子1200使用信号板(CB 1241 RS485)实现ModbusRTU源码分享
西门子1200使用信号板CB 1241 RS485实现ModbusRTU源码分享一、实现ModbusRTU源码分享1、信号板硬件接线2、硬件组态3、参数设置4、程序编写5、Modbus地址说明二、modbusRTU详解1、核心概念与特点2、通信过程3、数据帧结构 (RTU Mode)4、 地址映射5、 错误处理6、关键点总结与实践注意事项一、实现ModbusRTU源码分享1、信号板硬件接线注意信号板TA接485从机BTB接485从机A线序正好相反。2、硬件组态3、参数设置双击上一步拖入的信号板4、程序编写注意要使用MODBUS包而不是MODBUSRTU包因为MODBUSRTU包用于侧面的通信模块使用。下面是完整程序注意点1.PORT要选择信号板2、MB_DB参数选择MODBUS主机块3.MODE和DATA_ADDR参数设置5、Modbus地址说明西门子 S7-1200 系列 PLC 的 Modbus 通信地址需要根据 PLC 内部的存储区来映射。Modbus 协议使用四种主要的寄存器类型它们分别对应 PLC 内部的不同存储区线圈 (Coils) - Modbus 功能码 01 (读), 05 (写单个), 15 (写多个)映射到 PLC 的输出位Q或 位存储器M。地址范围00001到09999(十进制表示)。PLC 地址映射规则Q区Q地址需要转换为十进制数然后加 1。例如Q0.0对应 Modbus 地址00001(0 * 8 0 1 1)。例如Q1.7对应 Modbus 地址00016(1 * 8 7 1 16)。M区M地址需要转换为十进制数然后加 1。例如M0.0对应 Modbus 地址00001。例如M3.5对应 Modbus 地址00030(3 * 8 5 1 30)。离散输入 (Discrete Inputs) - Modbus 功能码 02 (读)映射到 PLC 的输入位I。地址范围10001到19999(十进制表示)。PLC 地址映射规则I区I地址需要转换为十进制数然后加 1。例如I0.0对应 Modbus 地址10001(0 * 8 0 1 1, 加上前缀 10000)。例如I2.4对应 Modbus 地址10021(2 * 8 4 1 21, 加上前缀 10000)。输入寄存器 (Input Registers) - Modbus 功能码 04 (读)映射到 PLC 的过程映像输入区I(字访问)。地址范围30001到39999(十进制表示)。PLC 地址映射规则IW区IW地址需要转换为十进制数然后加 1。例如IW0(包含I0.0到I0.7和I1.0到I1.7) 对应 Modbus 地址30001(0 1 1, 加上前缀 30000)。例如IW4对应 Modbus 地址30003(4 / 2 1 3, 加上前缀 30000)。注意IW地址是字地址每 2 个字节对应一个寄存器地址。保持寄存器 (Holding Registers) - Modbus 功能码 03 (读), 06 (写单个), 16 (写多个)映射到 PLC 的输出字QW、位存储器字MW或 数据块DB中的字。地址范围40001到49999(十进制表示)。PLC 地址映射规则QW区QW地址需要转换为十进制数然后加 1。例如QW0(包含Q0.0到Q0.7和Q1.0到Q1.7) 对应 Modbus 地址40001(0 1 1, 加上前缀 40000)。例如QW8对应 Modbus 地址40005(8 / 2 1 5, 加上前缀 40000)。MW区MW地址需要转换为十进制数然后加 1。例如MW0对应 Modbus 地址40001。例如MW10对应 Modbus 地址40006(10 / 2 1 6, 加上前缀 40000)。DB区 (数据块)这是最常用的映射区域。映射规则稍复杂DB块号和块内的字节偏移量共同决定 Modbus 地址。计算公式Modbus 地址 (DB_Number × 16384) Byte_Offset 1例如DB1.DBW0(DB1块字节偏移0处的字) 对应 Modbus 地址(1 * 16384) 0 1 16385(即40001 16384 40001 16384实际地址为416385? 注意范围需要验证实际范围限制)。重要对于DB区内的位(DBX)需要先找到该位所在的字节地址然后使用线圈或离散输入的映射规则取决于你将其映射为线圈还是离散输入。例如DB1.DBX0.0这个位如果映射为线圈(1 * 16384) (0 * 8) 0 1 16385(即00001 16384 16385)。如果映射为离散输入(1 * 16384) (0 * 8) 0 1 16385(即10001 16384 26385? 注意范围需要验证实际范围限制)。关键点总结Modbus 地址是1-based的从 1 开始而 PLC 的存储区地址通常是0-based的从 0 开始。因此在映射时通常需要在 PLC 地址的数值计算结果上加 1。对于DB块需要使用块号和字节偏移量来计算 Modbus 地址。实际可用的地址范围受限于 S7-1200 的 Modbus 通信库或硬件模块的具体实现限制。务必查阅你使用的 Modbus 通信模块如 CM 1241或库函数如西门子 Modbus TCP 或 RTU 库的官方手册确认其支持的最大地址范围和对各存储区的实际映射方式。在配置 Modbus 主站上位机、HMI等时需要按照上述映射规则设置其访问的 Modbus 地址。在 PLC 端编程时需要正确配置 Modbus 从站库或模块的参数指定要映射的 PLC 存储区地址范围。二、modbusRTU详解Modbus RTU (Remote Terminal Unit)是一种广泛应用的串行通信协议主要用于工业自动化领域实现主站Master通常是 PLC、SCADA 系统或上位机和从站Slaves通常是传感器、执行器、仪表或其他 PLC之间的数据交换。它以高效、简洁和可靠性著称。1、核心概念与特点主从架构通信由主站发起。主站向特定从站地址发送请求消息该从站处理请求并回复响应消息。其他从站忽略该请求。串行传输通常运行在 RS-232 或 RS-485 物理层上。RS-485 因其多点通信一条总线上可挂多个从站和抗干扰能力在工业环境中更为常见。RTU 模式使用二进制Hexadecimal编码数据。相比 Modbus ASCII 模式RTU 更紧凑、效率更高。无起始符和结束符依靠字符间的时间间隔大于 3.5 个字符传输时间来界定消息帧的开始和结束。数据紧凑所有值地址、功能码、数据、校验码都用二进制字节表示。校验机制使用CRC-16循环冗余校验来检测传输过程中可能出现的错误。发送方计算 CRC 并附加在消息末尾接收方重新计算 CRC 并与接收到的 CRC 比较若不一致则丢弃该帧。2、通信过程主站请求主站构造一个请求消息帧并通过串行总线发送出去。从站响应目标从站接收到消息后检查从站地址是否匹配自身地址。计算 CRC 校验码并与帧尾的 CRC 比较验证数据完整性。如果地址匹配且 CRC 校验通过则执行请求指定的操作。构造一个响应消息帧包含请求结果或数据并通过总线发送回主站。主站处理响应主站接收到响应后检查响应是否来自期望的从站地址匹配。计算 CRC 校验码进行验证。如果校验通过则解析响应数据并确认操作结果。3、数据帧结构 (RTU Mode)一个完整的 Modbus RTU 消息帧由以下几部分组成[从站地址] [功能码] [数据] [CRC 校验码]从站地址 (1 Byte):唯一标识总线上的一个从站设备。范围通常是 1 - 2470 是广播地址但极少使用248-255 保留。主站请求中指定目标从站地址从站响应中返回自身地址。功能码 (1 Byte):指定主站要求从站执行的操作类型。常见功能码有01 (0x01): 读线圈状态Read Coils - 读一组开关量输出DO或离散量输入DI。02 (0x02): 读离散量输入Read Discrete Inputs - 读一组 DI 的状态。03 (0x03): 读保持寄存器Read Holding Registers - 读一组可读写的模拟量寄存器通常是 16 位整数。04 (0x04): 读输入寄存器Read Input Registers - 读一组只读的模拟量输入寄存器通常是 16 位整数。05 (0x05): 写单个线圈Write Single Coil - 写一个 DO 的状态ON/OFF。06 (0x06): 写单个寄存器Write Single Register - 写一个保持寄存器的值。15 (0x0F): 写多个线圈Write Multiple Coils。16 (0x10): 写多个寄存器Write Multiple Registers。数据 (N Bytes):包含功能码操作所需的具体信息。其结构取决于功能码。例如读请求 (03,04等)包含要读取的起始地址和要读取的寄存器/线圈数量。读响应包含实际读取到的字节数和具体的数据字节。写单个请求 (05,06): 包含要写入的地址和要写入的值。写多个请求 (15,16): 包含要写入的起始地址、数量、数据字节数和具体的数据字节。CRC 校验码 (2 Bytes):对整个消息帧从地址开始到数据结束计算得出的校验值。低位字节在前Little-Endian。4、 地址映射Modbus 协议定义了几种不同的数据区域线圈、离散输入、输入寄存器、保持寄存器。设备制造商需要在其设备内部如 PLC 的 I/O 点、内存区和这些 Modbus 地址之间建立映射关系。线圈 (Coils): 1 位可读写。常用于数字量输出 (DO)。地址范围00001 - 09999 (对应协议地址 0x0000 - 0xFFFF)。离散输入 (Discrete Inputs): 1 位只读。常用于数字量输入 (DI)。地址范围10001 - 19999。输入寄存器 (Input Registers): 16 位只读。常用于模拟量输入 (AI)。地址范围30001 - 39999。保持寄存器 (Holding Registers): 16 位可读写。常用于模拟量输出 (AO) 或内部参数存储。地址范围40001 - 49999。注意协议中传输的地址是“偏移地址”从 0 开始而上述 00001/10001 等是“逻辑地址”从 1 开始。例如逻辑地址 40001 对应的协议偏移地址是 0x0000。5、 错误处理如果从站无法处理主站的请求例如功能码不支持、地址无效、数据值非法等它会返回一个异常响应帧[从站地址] [功能码 0x80] [异常码] [CRC]功能码 0x80: 将原功能码的最高位设为 1即加上 0x80表示这是一个异常响应。异常码 (1 Byte):指示错误的具体原因。例如01: 非法功能码。02: 请求的地址非法超出设备范围。03: 请求的数据值非法超出允许范围。04: 处理请求时发生从站设备故障。6、关键点总结与实践注意事项物理层配置波特率、数据位、停止位、奇偶校验位必须主从站一致。RS-485 网络需要正确的终端电阻和接地。地址唯一性总线上每个从站必须有唯一的地址。定时要求RTU 模式依赖字符间的时间间隔 3.5T来界定帧。要求串口驱动能正确处理此超时。通信速率越高对定时精度要求越高。CRC 计算必须正确实现 CRC-16-Modbus 算法多项式 0x8005初始值 0xFFFF。字节序对于 16 位寄存器值Modbus 协议规定高位字节在前Big-Endian。例如数值0x1234在总线上传输为0x12后跟0x34。如果设备内部使用 Little-Endian需要进行转换。数据类型扩展对于 32 位浮点数或长整数通常用两个连续的 16 位寄存器表示。此时字节序和寄存器顺序高字在前还是低字在前需要根据设备文档确定。工具使用串口调试助手、Modbus 主/从站模拟软件、协议分析仪如 Wireshark Modbus 插件进行调试非常有用。