『7x24小时有问必答』
西门子 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 HFTIA 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
状态代码
错误时查看此代码 (如 160001  超时, 160002  校验错等)。

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  指令循环扫描,自动映射数据块。
重点排查接线波特率匹配地址偏移问题。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码