本文以西门子s7-1200 PLC为例子介绍其与外部IO扩展模块进行Modbus通讯读写的步骤设置。本例中所使用的io扩展模块为综科智控品牌的ZKA-4488-RS485模块,该模块是一款 8 路数字量输入(DI),8 路数字量输出(DO),4 路模拟量输入(AI),4 路模拟量输出设备(AO),485 通信的开关量和模拟量混合控制模块。
以 ZKA-4488-RS485 出厂默认通讯参数如下:
站号:01
波特率:115200(注意:客户需要参照综科智控公司的配置指导文档,将ZKA-4488-RS485模块的波特率修改为9600才能适用本例中的介绍)
数据格式:8,N,1
S7-200 Modbus RTU通信1 S7-200 Modbus RTU 通信简介
Modbus具有两种串行传输模式:分别为ASCII和RTU。Modbus是一种单主站的主从通信模式,Modbus网络上只能有一个主站存在,主站在Modbus网络上没有地址,每个从站必须有唯一的地址,从站的地址范围为0 - 247,其中0为广播地址,从站的实际地址范围为1 - 247。
Modbus RTU通信以主从的方式进行数据传输,在传输的过程中Modbus RTU主站是主动方,即主站发送数据请求报文到从站,Modbus RTU从站返回响应报文。
S7-1200以下模块支持 Modbus RTU通信:
名称 | CM 1241 RS232 | CM 1241 RS422/485 | CB 1241 RS485 |
订货号 | 6ES7241-1AH32-0XB0 | 6ES7241-1CH32-0XB0 | 6ES7241-1CH30-1XB0 |
通讯口类型 | RS232 | RS422/RS485 | RS485 |
波特率(bps) | 300 ;600 ;1.2 k; 2.4 k; 4.8 k; 9.6 k;19.2 k; 38.4 k; 57.6 k; 76.8 k; 115.2 k | ||
校验方式 |
| ||
流控 | 硬件流控;软件流控 | RS422 支持软件流控 | 不支持 |
接收缓冲区 | 1kB | ||
通讯距离(屏蔽电缆) | 10m | 1000m | 1000m |
电源消耗(5V DC) | 200mA | 220mA | 50mA |
电源消耗(24V DC) | - | - | 80mA |
注意:
1. 使用通信模块CM 1241 RS232作为Modbus RTU主站时,只能与一个从站通讯。
2. 使用通信模块CM 1241 RS485作为Modbus RTU主站时,则允许建立最多与 32 个从站的通讯。
3. 使用通信板CB 1241 RS485时,CPU 固件必须为 V2.0 或更高版本,且使用软件必须为STEP 7 Basic V11 或STEP 7 Professional V11 以上更高版本。
2 Modbus RTU 主站指令库
随着 TIA PORATL 软件和 S7-1200 CPU 固件的不断更新,S7-1200 Modbus RTU 指令也出现了不同的版本。 用户需要根据使用的软件和硬件,正确选择使用符合要求的 S7-1200 Modbus RTU 指令来实现 Modbus RTU 通信。
软件,硬件要求和指令版本说明如下。
TIA PORTAL 中的 S7-1200 Modbus RTU 指令TIA PORTAL 软件中提供了2个版本的 Modbus RTU指令。如下图 1 所示:
- 早期版本的 Modbus RTU 指令(图1. 中 MODBUS (V2.2))仅可通过 CM1241 通信模块或 CB1241 通信板进行 Modbus RTU 通信。
- 新版本的 Modbus RTU 指令(图1. 中 MODBUS(RTU) V3.0)扩展了 Modbus RTU 的功能,该指令除了支持 CM1241 通信模块、CB1241 通信板,还支持 PROFINET 或 PROFIBUS 分布式 I/O 机架上的 PTP 通信模块实现 Modbus RTU 通信。
注意:新版本 Modbus RTU 指令的使用限制条件
新版本 Modbus RTU 指令通过CM1241通信模块或CB1241通信板进行Modbus RTU通信时,需要满足如下条件:
a. S7-1200 CPU 的固件版本不能低于V4.1;
b. CM1241通信模块 V2.1 以上或 CB1241。
图1. 两个版本 Modbus RTU 指令
3 Modbus RTU 主站功能编程
Modbus RTU V1 - V2 版本指令介绍(S7-1200 作为Modbus RTU 主站)S7-1200 支持Modbus RTU通信模式的模块可作为Modbus RTU主站。以下以 CPU1215C DC/DC/DC和CM1241 RS485 模块为例,介绍S7-1200 Modbus RTU 主站通信组态及编程步骤。
硬件和软件需求及所完成的通信任务:
硬件:
① CPU1215C DC/DC/DC (订货号: 6ES7 215-1AG31-0XB0)
② CM1241 RS485 (订货号:6ES7 241-1CH30-0XB0)
③ PS 307电源(订货号:6ES7307-1KA02-0AA0)
④ ZKA-4488-RS485(综科智控品牌)
⑤ TP以太网电缆
软件:
① STEP 7 Professional V11 SP2 UPD4 HSP
所完成的通信任务:
将ZKA-4488-RS485从站中Modbus地址从30001开始的5个字中的数据,分别读取到Modbus RTU主站CPU1215C 中地址从DB1.DBW0开始的5 个字中。
1.组态Modbus RTU 通信模块
在硬件目录里找到“通信模块”→“点到点”→“CM1241(RS485)”,双击或拖拽此模块至CPU左侧即可,如下图1所示:
图1 组态通信模块
接下来,在“设备视图”中用鼠标选中CM1241(RS485)模块,在“属性”→“端口组态”中配置此模块硬件接口参数。如下图2所示:
以下以传输率=9.6Kbps,奇偶校验=无奇偶校验,数据位=8位字符,停止位=1,其它保持默认设置为例。注意:请把ZKA-4488-RS485模块的波特率改成和此处一致的参数。
图2 RS485 端口设置
最后在“硬件标识符”里确认一下硬件标识符为271,如下图3所示:
图3 硬件标识符
2.添加启动OB
在项目树下选择“CPU1215C DC/DC/DC”→“程序块”→“添加新块”,在弹出的窗口中选择“OB 组织块”→ “Startup”,添加启动OB 100,如下图4所示:
图4 添加启动OB
3.调用MB_COMM_LOAD指令
为使端口一启动就被设置为Modbus RTU通信模式,可在OB 100中调用“MB_COMM_LOAD”指令。调用“MB_COMM_LOAD”指令时会自动弹出创建相应背景数据块的界面,如下图5所示:
图5 调用MB_COMM_LOAD指令
点击“确认”为该指令创建背景数据块后,为各输入/输出引脚分配地址。尤其需注意MB_DB输入引脚需指向“MB_MASTER”指令的背景数据块,如下图6所示:
注意: “MB_COMM_LOAD”指令输入位“REQ”需使用上升沿触发。由于OB 100只在S7-1200启动时执行一次,因此,此例中将“REQ”设为“TRUE”。
图6 MB_COMM_LOAD指令
MB_COMM_LOAD指令参数意义如下表1所示:
引脚 | 说明 |
EN | 使能端 |
REQ | 在上升沿执行该指令 |
PORT | 通信端口的硬件标识符 |
BAUD | 波特率选择:3600,6000,12000,2400,4800,9600,19200,38400,57600,76800,115200 (注意:所有其它值均无效) |
PARITY | 奇偶检验选择:0-无;1-奇校验;2-偶校验 |
FLOW_CTRL | 流控制选择:0-(默认值)无流控制 |
RTS_ON_DLY | RTS延时选择:0-(默认值) |
RTS_OFF_DLY | RTS关断延时选择:0-(默认值) |
RESP_TO | 响应超时: 默认值 = 1000 ms。MB_MASTER 允许用于从站响应的时间(以毫秒为单位)。 |
MB_DB | 对 MB_MASTER 或 MB_SLAVE 指令所使用的背景数据块。 |
DONE | 完成位:指令执行完成且未出错置1 |
ERROR | 错误位:0-未检测到错误;1-检测到错误。在参数STATUS中输出错误代码。 |
STATUS | 端口组态错误代码 |
表1 MB_COMM_LOAD指令参数意义
4.创建DATA_PTR数据发送、接收缓冲区
通过“程序块”→ “添加新块”,选择“数据块(DB)”创建 DB 块,选择“标准与S7- 300/400兼容” ,点击“确认”键。在DB中创建数据类型为5个字的数组,如下图7所示:
注意:DATA_PTR数据发送、接收缓冲区使用的DB访问类型必须是标准与S7- 300/400兼容。
图7 创建DATA_PTR 数据发送、接收缓冲区
5.调用MB_MASTER指令
在OB1中调用“MB_MASTER”指令,调用该指令时会自动弹出创建相应背景数据块的界面,如下图8所示:
图8 调用MB_MASTER指令
点击“确认”为该指令创建背景数据块后,并为各输入/输出引脚分配地址,如下图9所示:
注意:“MB_MASTER”指令的输入位“REQ”必须使用上升沿触发。
以下以S7-1200作为Modbus RTU主站,用F04功能码读取Modbus RTU从站2,从Modbus地址30001开始的五个字,接收的数据存放在缓冲区DB3.DBW0开始区域为例。设置如下所示:MB_ADDR=2,MODE=0,DATA_ADDR=30001,DATA_LEN=5。
地址对应关系如下表2所示:
Modbus RTU主站CPU1215C 数据缓冲区地址 | Modbus RTU从站Modbus地址 |
DB3.DBW0 | 30001 |
DB3.DBW2 | 30002 |
DB3.DBW4 | 30003 |
DB3.DBW6 | 30004 |
DB3.DBW8 | 30005 |
表2 Modbus地址对应关系
图9 MB_MASTER指令
MB_MASTER指令参数意义如下表3所示:
引脚 | 说明 |
EN | 使能端 |
REQ | 在上升沿执行该指令,请求将数据发送或读取到Modbus从站 |
MB_ADDR | Modbus RTU从站地址。默认地址范围:0至247;扩展地址范围:0至65535。值0被保留用于将消息广播到所有Modbus从站。 |
MODE | 模式选择:指定请求类型 |
DATA_ADDR | 从站中的起始地址:指定Modbus从站中将供访问的数据的起始地址。 |
DATA_LEN | 数据长度:指定要在该请求中访问的位数或字数。 |
DATA_PTR | 数据指针: 指向要写入或读取的数据的 M 或 DB 地址(DB访问类型必须是标准与S7-300/400兼容)。 |
DONE | 完成位:上一请求已完成且没有出错后,DONE 位将保持为 TRUE 一个扫描周期时间。 |
BUSY | 0 – 无正在进行的 MB_MASTER 操作; 1 – MB_MASTER 操作正在进行 |
EEROR | 错误位: 上一请求因错误而终止后,ERROR 位将保持为 TRUE 一个扫 |
STATUS | 错误代码 |
表3 MB_MASTER指令参数意义
关于MODE,DATA_ADDR,DATA_LEN可在下表4中查看:
MB_MASTER Modbus功能 | ||||
Modbus地址参数 | 地址类型 | Modbus数据长度参数 | Modbus功能 | |
模式0 | ||||
读取 | 00001到09999 | 输出位 | 1到2000 | 01 |
10001到19999 | 输入位 | 1到2000 | 02 | |
30001到39999 | 输入寄存器 | 1到125 | 04 | |
40001到49999 400001到465535(扩展) | 保持寄存器 | 1到125 | 03 | |
模式1 | ||||
写入 | 00001到09999 | 输出位 | 1(单个位) | 05 |
40001到49999 400001到465535(扩展) | 保持寄存器 | 1(单个字) | 06 | |
00001到09999 | 输出位 | 2到1968 | 15 | |
40001到49999 400001到465535(扩展) | 保持寄存器 | 2到123 | 16 | |
模式2 | ||||
有些Modbus从站不支持使用Modbus功能05H或06H写入单个位或字。在这样的情况下,可通过模式2强制使用Modbus功能15H或16H写入单个位或字 | ||||
写入 | 00001到09999 | 输出位 | 2到1968 | 15 |
40001到49999 400001到465535(扩展) | 保持寄存器 | 1到123 | 16 | |
模式11 | ||||
读出从站的通信状态字和事件计数器:状态字指示指令的执行状态(0:未在执行;0xFFFF:正在执行)。 每次成功传送一条消息时,事件计数器值将递增。使用该功能时,忽略“MB_MASTER”指令的 DATA_ADDR 和 DATA_LEN 参数。 | ||||
模式80 | ||||
通过读取错误代码 (0x0000) 检查从站状态:每个请求1个字 | ||||
模式81 | ||||
通过诊断代码 0x000A 复位从站的事件计数器:每个请求1个字 |
表4 MB_MASTER Modbus功能表
7. Modbus RTU测试结果
在STEP 7 Professional V11 UPD4软件中打开该项目CPU1215C DC/DC/DC的“监控表”,触发“MB_MASER”指令的输入位M10.0。PLC主站将从站ZKA-4488-RS485地址30001中的数值11,30002中的数值12,30003中的数值13,30004中的数值14,30005中的数值15,分别读取到了地址DB3.DBW0,DB3.DBW2,DB3.DBW4,DB3.DBW6,DB3.DBW8中,如下图12所示:
图12 Modbus RTU测试结果
S7-1200 Modbus RTU通信模式的多地址或多站点轮询多个CM 1241 RS485 通讯模块之间可以使用 PROFIBUS 电缆相互连接。可以将 1 个主站和最多 31 个 MODBUS 从站使用 PROFIBUS 电缆连接组网。
S7-1200 Modbus RTU轮询需要通过上一条”MB_MASTER“指令输出位“Done“=1来触发下一条“MB_MASTER“指令。具体说明及编程思路请参考以下链接:
如何使用STEP 7(TIA Portal)V11为SIMATIC S7-1200建立Modbus RTU通讯?
MB_COMM_LOAD和MB_MASTER指令STATUS错误代码STATUS(W#16#) | 说明 |
0000 | 端口无错误 |
8180 | 端口ID值无效 |
8181 | 波特率值无效 |
8182 | 奇偶校验值无效 |
8183 | 流控制值无效 |
8184 | 响应超时值无效 |
8185 | MB_DB参数不是MB_MASTER或MB_SLAVE的背景数据块 |
表5 MB_COMM_LOAD指令STATUS错误代码
STATUS(W#16#) | 说明 |
0000 | 无错误 |
80C8 | 从站超时。检查波特率,奇偶校验和从站的接线 |
80D1 | 接收方发出了暂停主动传输的流控制请求并在指定的等待时间内未重新激活该传输。 如果接收方在等待时间内未检测到 CTS,则在硬件流控制期间也会生成该错误。 |
80D2 | 由于没有从 DCE 接收到 DSR 信号,传送请求终止 |
80E0 | 接收缓冲区已满,消息被终止 |
80E1 | 奇偶校验错误,消息被终止 |
80E2 | 组帧错误,消息被终止 |
80E3 | 超时错误,消息被终止 |
80E4 | 指定长度超出总缓冲区大小,消息被终止 |
8180 | 无效端口ID值 |
8186 | Modbus站地址无效 |
8188 | 对于广播调用,参数 MODE 的值无效。 |
8189 | 数据地址值无效 |
818A | 数据长度值无效 |
818B | 指向本地数据源/目标的指针无效 |
818C | DATA_PTR的指针无效:使用指向位存储区或访问类型为“标准 - 与 S7-300/400 兼容”的数据块的指针。 |
8200 | 端口正忙于处理传送请求 |
表6 MB_MASTER指令STATUS错误代码(指令的通信和组态错误消息)
STATUS(W#16#) | 从站的响应代码 | 说明 |
8380 | - | CRC错误 |
8381 | 01 | 不支持此功能码 |
8382 | 03 | 数据长度错误 |
8383 | 02 | 数据地址错误或地址超出 DATA_PTR 的有效范围 |
8384 | >03 | 数据值错误 |
8385 | 03 | 不支持此数据诊断代码 |
8386 | - | 响应中的功能代码与传送中的功能代码不匹配 |
8387 | - | 响应的从站错误 |
8388 | - | 从站对写请求的响应不正确 |
表7 MB_MASTER指令STATUS错误代码(Modbus 协议的错误消息)
4 连接超时参数
S7-1200 Mobus RTU通信网络中包含多个从站站点时,由于轮询的网络特性,只能同时读或写一个站点数据。因此有如下因素,会影响到最终整体的轮询时间:
1. 通信速率(波特率)设置时间
2. 每个站点的通信数据量
3. 站点数量
4. 通信距离
5. 各站点连接时间
无论是由于信号干扰,硬件质量引起的从站掉站或是由于工程需要暂时关闭站点,此时都会由于“各站点连接时间”的增加而使通信系统的轮询时间大大延长。在S7-1200的Modbus RTU通信中,主要有三个参数与“各站点连接时间”的设置相关。
1. 从站响应时间 RESP_TO如图1所示,V2.x版本的MB_COMM_LOAD初始化块可设置从站响应时间RESP_TO参数:
设置单次连接从站的可响应时间,范围为5ms到65535ms(默认值为1000ms);即如从站在此时间段内未作出响应,则MB_MASTER将在发送指定次数的重试请求后终止请求并提示错误信息80C8。
图1. RESP_TO参数设置
注意:如图2所示,Modbus从站的执行频率须至少小于RESP_TO设置的响应时间(需要考虑响应延迟时间),才可以正常通讯。
图2. 从站响应时间
2.重试次数 RETRIES在初始化功能块MB_COMM_LOAD的背景数据块中,可设置重试次数RETRIES参数:
主站在返回无响应错误代码 0x80C8 之前的重试次数。(默认值为2次)
注意:此参数表示初次连接无响应后,再次连接的次数;即以默认2次为例,实际尝试连接次数为3次。
图3 RETRIES参数设置
注意:在更改RETRIES参数后,需要重新使能MB_COMM_LOAD功能块的REQ管脚,否则更改参数不生效。
3. 主站定时参数 Blocked_Proc_Timeout当由于某些原因(如已发出主站请求,但在彻底完成该请求前停止调用主站功能块时),造成Done及Error均没有置1时,需要提供一个定时时间,在时间到达后置位,以便执行下一个功能块或轮询下一个站点。
MB_Master的背景数据块中提供了主站定时参数Blocked_Proc_Timeout(范围0S到5.5S,默认3S)
此前的RESP_TO 是针对从站响应时间的,而Blocked_Proc_Timeout则是针对主站的定时时间,此功能参数用于防止单个 MB_Master 指令独占或锁定对端口的访问。
图4. Blocked_Proc_Timeout参数设置
5 Modbus RTU 主站常问问题
S7-1200 是否支持 Modbus ASCII 通信模式?
西门子不提供支持上述通信模式的的现成指令,需要用户自己用自由口模式编程。
Modbus RTU指令V1和V2两个版本有什么区别?
Modbus RTU指令版本 V2 将参数 “REQ” 和 “DONE” 添加到“MB_COMM_LOAD”指令。而且,“MB_MASTER”和“MB_SLAVE ”指令的“MB_ADDR ”参数现在允许一个 UInt 值以进行扩展寻址。
同一CPU程序中是否可以同时使用V1和V2两个不同版本的Modbus RTU指令?
不能在同一CPU 程序中同时使用V1(V1.x)和V2(V2.y)指令版本。用户程序的 Modbus 指令必须具有相同的主版本号;主版本组内的各个指令可具有不同的次版本号。
S7-1200 通信模块CM1241是否可作为Modbus RTU主站或作为Modbus RTU从站?
对S7-1200 通信模块CM1241组态并编程调用“MB_COMM_LOAD”指令,可将其设置为Modbus RTU通信模式。通过编程调用“MB_MASTER”指令,S7-1200 通信模块CM1241可作为Modbus RTU主站,或调用“MB_SLAVE”指令,S7-1200 通信模块CM1241可作为Modbus RTU从站。
注意:无论S7-1200 通信模块CM1241作为Modbus RTU主站还是从站,都需要调用“MB_COMM_LOAD”指令进行编程。
由于某一个从站掉站引起的轮询周期时间延长,如何减小此影响?
通常,S7-1200可同时调整两个参数:从站响应时间 RESP_TO和重试次数 RETRIES,用于减小Modbus从站掉站或暂时关闭而增大的轮询周期时间。
例:系统默认的尝试连接次数为3次,每次1S,总计3S;
可根据项目实际工况适当减小从站响应时间RESP_TO。这一时间无法估算,建议多次测试,确认每个从站都能够正常稳定连接情况下,将此时间设置的尽量小。
以设置500ms为例。再将RETRIES设置为0。即对于每个从站,主站只尝试连接一次,总计耗时500ms。
MB_MASTER报错8200(端口正忙于处理传送请求),如何处理?
此情况是由于MB_MASTER的DONE或ERROR均未置位从而与后续MB_MASTER冲突导致。确保接通下一个MB_MASTER的时间大于Blocked_Proc_Timeout的设定时间(默认3S)。
如何检查S7-1200 通信模块CM1241是否已被成功设置为Modbus RTU通信模式?
可在程序或监控表中查看“MB_COMM_LOAD”指令的输出位“DONE”,“ERROR”以及“STATUS”状态来判断S7-1200 通信模块CM1241是否已被成功设置为Modbus RTU通信模式。
- 如果该模块被成功设置为Modbus RTU通信模式:“MB_COMM_LOAD”指令输出位“DONE”=1,“ERROR”=0,输出状态字“STATUS”=0;
- 如果该模块未被成功设置为Modbus RTU通信模式:“MB_COMM_LOAD”指令输出位“DONE”=0,“ERROR”=1,输出状态字“STATUS”输出错误代码。具体错误原因可查看“MB_COMM_LOAD指令STATUS错误代码”表。
执行“MB_MASTER”指令,总是显示输出位“Busy”=1,为什么?
因为端口正忙于处理传送请求。出现该错误时请检查“MB_MASTER“指令输入位”REQ“是否为上升沿触发,或是否有其它的多个“MB_MASTER”指令在执行。
通过执行“MB_MASTER”指令无法写入或读取Modbus RTU丛站地址的数据,但程序中监视“MB_MASTER”指令错误位“Error”=0,错误代码“STATUS”=16#0,为什么?
“MB_MASTER”指令上一请求因错误而终止后,ERROR 位将保持为 TRUE 一个扫描周期时间,并且 STATUS 参数中的错误代码值仅在 ERROR =TRUE 的一个扫描周期内有效,因此无法通过程序或监控表查看到。可采用如下所示的编程方式将ERROR 和 STATUS 参数读出。
图13 捕捉错误代码
S7-1200 作为Modbus RTU 主站,如何对Modbus RTU从站进行0-65535扩展寻址?
通常,“MB_MASTER”指令的背景数据块“MB_MASTER_DB”中的“EXTENDED_ADDRESSING”默认为0,可以对Modbus RTU从站地址0-247进行访问。
将“MB_MASTER”指令的背景数据块“MB_MASTER_DB”中的“EXTENDED_ADDRESSING”设置为1,才能对Modbus RTU从站进行0-65535扩展寻址。可按照如下步骤设置“EXTENDED_ADDRESSING”:
首先找到“系统块”→“程序资源”,双击“MB_MASTER_DB”,在“MB_MASTER”指令的背景数据块“MB_MASTER_DB”中查看“EXTENDED_ADDRESSING”。
图14 扩展地址区
在“监控表”内输入“MB_MASTER_DB.EXTENDED_ADDRESSING”,将该位置1。
图15 修改变量
,