欢迎光临
我们一直在努力

西门子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从机B,TB接485从机A,线序正好相反。 在这里插入图片描述

2、硬件组态

在这里插入图片描述

3、参数设置

双击上一步拖入的信号板: 在这里插入图片描述

4、程序编写

在这里插入图片描述

注意,要使用MODBUS包,而不是MODBUS(RTU)包,因为MODBUS(RTU)包用于侧面的通信模块使用。 下面是完整程序:

在这里插入图片描述 注意点:

  • 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 – 247(0 是广播地址,但极少使用;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 插件)进行调试非常有用。

    在这里插入图片描述

    赞(0)
    未经允许不得转载:171主机测评 » 西门子1200使用信号板(CB 1241 RS485)实现ModbusRTU源码分享
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址