|
西门子 S7-1500 的 Modbus RTU 通信是其串行通信中最常用、最成熟的功能。它允许 S7-1500 作为 主站 (Master) 读取/写入从站设备(如变频器、仪表、传感器),或者作为 从站 (Slave) 响应其他主站(如上位机、触摸屏)的请求。以下是基于 TIA Portal (STEP 7) 环境的详细配置与编程指南。 --- 1. 核心概念与准备工作 A. 硬件要求 通信模块: CM PtP (RS232/RS422/RS485) 或 通信板 CB PtP。推荐: 对于 Modbus RTU,通常使用 RS485 接口(两线制),因为它支持多点网络且抗干扰能力强。型号如 CM PtP RS422/485 HF。TIA Portal 版本: 建议 V15.1 及以上(库指令更稳定,功能更全)。全局库: 需要安装 Modbus (RTU) 全局库。路径:项目树 -> “库” (Libraries) -> “全局库” (Global libraries) -> “Modbus (RTU)” -> 右键“打开”。 注意: 如果没有该库,需从西门子官网下载并导入,或在 TIA Portal 的“选项”->“管理通用库”中安装。B. 通信角色 Master (主站): 主动发起请求(读/写),控制通信时序。S7-1500 最多可配置多个主站实例(取决于 CPU 性能和模块数量)。Slave (从站): 被动响应请求,提供数据区。S7-1500 作为从站时,需定义哪些地址映射到 Modbus 寄存器。--- 2. 硬件组态 (Hardware Configuration) 在 TIA Portal 的设备视图 (Device View) 中进行: 插入模块: 将 CM PtP 或 CB PtP 拖入对应位置。参数设置: 双击模块,进入“属性” -> “串行接口” -> “参数”。波特率 (Baud rate): 必须与从站设备一致 (如 9600, 19200, 115200)。数据位 (Data bits): 通常 8。奇偶校验 (Parity): None, Even, Odd (必须与从站一致,Modbus 常用 Even 或 None)。停止位 (Stop bits): 1, 2 (必须与从站一致)。协议 (Protocol): 选择 Modbus RTU。注意: 即使在这里选了 Modbus,具体的参数(如超时时间)也可以在指令中覆盖,但在此处选定协议会激活相关的诊断功能。Modbus 特定参数:主站/从站模式: 此处通常保持默认,具体模式由调用的指令 (Modbus_Master 或 Modbus_Slave) 决定。最大帧长度: 默认即可。编译并下载: 完成组态后编译硬件,下载到 PLC。--- 3. 编程实现:S7-1500 作为 Master (主站) 这是最常见的场景,用于读取仪表数据或控制变频器。 A. 所需指令 从“Modbus (RTU)”库中拖出以下两个指令到程序块 (如 OB1 或 FB): Modbus_Comm_Load: 初始化通信端口。只需执行一次(通常在启动组织块 OB100 或通过上升沿触发一次)。Modbus_Master: 执行具体的读写操作。可多次调用以访问不同从站或不同寄存器。B. 指令详解与引脚配置 (1) 初始化指令:Modbus_Comm_Load 引脚 | 数据类型 | 说明 | 典型配置 | | PORT | Hardware Identifier | 通信端口硬件 ID | 选中 CM/CB 模块,如 PCM_PTP_1 或硬件标识符 (如 272) | | BAUD | Int | 波特率 (可选) | 0=使用组态值,或填入具体值 (如 9600) | | PARITY | Int | 校验位 (可选) | 0=None, 1=Odd, 2=Even | | MB_DB | Instance DB | 背景数据块 | 点击生成一个新的背景 DB (如 Modbus_Init_DB) | | REQ | Bool | 执行请求 | 上升沿触发 (仅一次) | | DONE | Bool | 完成标志 | 初始化成功置位 | | ERROR | Bool | 错误标志 | 出错置位 | | STATUS | Word | 状态代码 | 0 = 无错误 |
逻辑示例: 在 OB100 (Startup) 中调用一次,或在 OB1 中使用 Positive_Edge 指令触发一次 REQ。 (2) 读写指令:Modbus_Master 引脚 | 数据类型 | 说明 | 典型配置 | | REQ | Bool | 请求触发 | 脉冲信号。每次通信完成前不能再次触发。通常用上一个通信的 DONE 或 BUSY 取反来串联。 | | MODE | Int | 功能码模式 | 0: 读保持寄存器 (03)1: 写单个寄存器 (06)2: 写多个寄存器 (16)3: 读线圈 (01)4: 写线圈 (05)5: 写多个线圈 (15)6: 读输入寄存器 (04) | | DATA_ADDR | Int | 起始地址 | 关键点: Modbus 地址偏移量。例如:要读保持寄存器 40001,此处填 0 (因为 40001-40001=0)。若要读 40010,填 9。 | | DATA_LEN | Int | 数据长度 | 读取/写入的寄存器数量 (Word) 或线圈数量 (Bit)。 | | DATA_PTR | Variant | 数据指针 | 指向 PLC 内部存储区。格式:PM100.0 WORD 10 (读10个字到 M100 开始区域)。注意: 区域大小必须 >= DATA_LEN。 | | MB_HOLD_REG | Instance DB | 映射数据块 | 关联一个专用的 DB 块,用于存放 Modbus 映射数据 (通常库会自动生成或手动创建,用于 Slave 模式,Master 模式下某些版本可不连或连同一 DB,具体视库版本而定,Master 模式下主要关注 DATA_PTR)。修正: 在较新库中,Master 指令不需要 MB_HOLD_REG,该引脚主要用于 Slave 指令。请根据实际库版本确认。如果是旧版库,可能需要关联。 | | MB_DB | Instance DB | 背景数据块 | 必须与 Modbus_Comm_Load 使用的 DB 相同 (如 Modbus_Init_DB)。 | | BUSY | Bool | 忙标志 | 通信进行中为 TRUE。此时不能触发新的 REQ。 | | DONE | Bool | 完成标志 | 单次通信成功完成,产生一个脉冲。 | | ERROR | Bool | 错误标志 | 通信出错。 | | STATUS | Word | 状态代码 | |
C. 编程技巧:轮询逻辑 由于串口是半双工且同一时刻只能处理一个请求,不能同时触发多个 Modbus_Master 指令。需要建立状态机或顺序轮询逻辑: 定义一个步序变量 (Step)。 Step 1: 触发读取温度指令 -> 等待 DONE -> Step 2。 Step 2: 触发读取压力指令 -> 等待 DONE -> Step 3。 ... 最后一步完成后回到 Step 1。 --- 4. 编程实现:S7-1500 作为 Slave (从站) 当 S7-1500 需要被上位机 (SCADA) 或其他 PLC 读取数据时使用。 A. 所需指令 Modbus_Comm_Load: 同上,初始化端口 (只需一次)。Modbus_Slave: 循环调用,监听主站请求。B. 指令详解:Modbus_Slave 引脚 | 数据类型 | 说明 | 典型配置 | | MB_HOLD_REG | Instance DB | 保持寄存器映射 DB | 核心引脚。创建一个 DB (如 Modbus_Data_DB),里面定义好需要对外暴露的数据变量。指令会自动将 Modbus 请求映射到这个 DB 的地址上。 | | MB_DB | Instance DB | 背景数据块 | 与 Load 指令共用。 | | MODE | Int | 模式选择 | 通常设为 0 (自动处理所有标准功能码)。 | | MB_ADDR | Int | 从站站号 | 设置 S7-1500 的 Modbus 站地址 (1-247),必须与主站请求的地址一致。 | | BUSY | Bool | 忙标志 | 正在处理请求。 | | ERROR | Bool | 错误标志 | 出错。 | | STATUS | Word | 状态代码 | 诊断信息。 |
逻辑: 将 Modbus_Slave 放在 OB1 中无条件循环调用。它会自动检测串口是否有符合本站地址的请求,若有则自动读写 MB_HOLD_REG 指定的数据块,无需用户编写解析逻辑。 --- 5. 关键注意事项与常见问题 A. 地址偏移陷阱 (Address Offset) 这是最容易出错的地方。 Modbus 协议习惯: 人类常称 "40001", "40002"。指令 DATA_ADDR: 需要填入 相对偏移量。读 40001 -> DATA_ADDR = 0 读 40010 -> DATA_ADDR = 9 读 40100 -> DATA_ADDR = 99 有些设备文档: 直接给出的是 0-based 地址 (0, 1, 2...),此时直接填入即可,无需减 1。务必查阅从站设备手册。B. 数据字节序 (Byte Order) Modbus 传输的是 16-bit Word。如果传输 32-bit 数据 (如 Float, DInt),涉及高低字交换。 S7-1500 的 Modbus 库通常提供选项或在 DATA_PTR 指向的区域自行处理。 如果发现读取的数值巨大无比或完全错误,尝试在 PLC 程序中交换高低字节 (Swap Bytes)。 C. 通信超时与重试 工业现场干扰大,偶尔超时正常。 在编程时应加入重试机制:当 ERROR=1 且 STATUS 指示超时时,不要立即报警停机,而是计数器 +1,连续失败 N 次后再报故障。 D. 硬件接线 RS485: A 接 A (Data+), B 接 B (Data-)。终端电阻: 如果总线两端距离长 (>50m) 或节点多,需在总线两端的设备上启用 120Ω 终端电阻 (CM 模块上有拨码开关或在组态中启用)。共地: 确保所有设备的 GND 连接良好,防止电位差损坏接口。E. 诊断代码速查 160000: 无错误。160001: 超时 (Timeout) - 检查接线、波特率、从站是否上电、站号是否正确。160002: 接收错误 (Receive error) - 校验位错误或帧格式错误。160004: 本地错误 (Local error) - 组态错误或资源冲突。168xxx: 从站返回的异常码 (Exception Code),如 168001 表示非法功能码,168002 表示非法数据地址。总结 S7-1500 的 Modbus RTU 通信通过标准化的库指令实现了极高的易用性。 硬件组态:设好波特率。Master 模式下,用 Load 初始化,用 Master 指令配合轮询逻辑读写数据,注意地址偏移。Slave 模式下,用 Slave 指令循环扫描,自动映射数据块。重点排查接线、波特率匹配和地址偏移问题。 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |