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)
④ PC(带以太网卡)
⑤ TP以太网电缆网络
软件:
① STEP 7 Professional V11 SP2 UPD4+HSP
② ModSim(该软件是第三方软件,能够从 Internet 网络下载)
所完成的通讯任务:
将Modbus RTU从站ModSim中Modbus地址从40001开始的5个字中的数据,分别读取到Modbus RTU主站CPU1215C 中地址从DB1.DBW0开始的5 个字中。测试
1.组态Modbus RTU 通讯模块spa
在硬件目录里找到“通讯模块”→“点到点”→“CM1241(RS485)”,双击或拖拽此模块至CPU左侧便可,以下图1所示:3d
图1 组态通讯模块指针
接下来,在“设备视图”中用鼠标选中CM1241(RS485)模块,在“属性”→“端口组态”中配置此模块硬件接口参数。以下图2所示:htm
如下以传输率=9.6Kbps,奇偶校验=无奇偶校验,数据位=8位字符,中止位=1,其它保持默认设置为例。blog
图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主站,用F03功能码读取Modbus RTU从站2,从Modbus地址40001开始的五个字,接收的数据存放在缓冲区DB3.DBW0开始区域为例。设置以下所示:MB_ADDR=2,MODE=0,DATA_ADDR=40001,DATA_LEN=5。
地址对应关系以下表2所示:
Modbus RTU主站CPU1215C 数据缓冲区地址 | Modbus RTU从站Modbus地址 |
DB3.DBW0 | 40001 |
DB3.DBW2 | 40002 |
DB3.DBW4 | 40003 |
DB3.DBW6 | 40004 |
DB3.DBW8 | 40005 |
表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功能表
6. Modbus 从站软件设置
注意:Modbus RTU从站采用ModSim软件测试,该软件是第三方软件,能够从 Internet 网络下载。
在打开的ModSim软件中创建链接,并设置RTU模式的参数:波特率Baud=9600,数据位Data=8,中止位Stop=1,校验Parity=NONE,以下图10所示:
图10 创建ModSim链接
选择“File”→“New”打开ModSim通讯界面,设置Modbus RTU从站的地址Device Id=2,开始地址Address=0001,数据长度Length=5,Modbus数据类型功能码03。分别双击各Modbus地址后的数据区,出现“Write Register"对话框,在此写入数据值,以下图11所示:
注意:Device Id设置必须与“MB_MASTER”指令中输入引脚“MB_ADDR”设置的地址一致。
图11 设置ModSim
7. Modbus RTU测试结果
在STEP 7 Professional V11 UPD4软件中打开该项目CPU1215C DC/DC/DC的“监控表”,触发“MB_MASER”指令的输入位M10.0。Modbus RTU主站将ModSim从站地址40001中的数值11,40002中的数值12,40003中的数值13,40004中的数值14,40005中的数值15,分别读取到了地址DB3.DBW0,DB3.DBW2,DB3.DBW4,DB3.DBW6,DB3.DBW8中,以下图12所示:
图12 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通信?
http://support.automation.siemens.com/CN/view/zh/47756141
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 协议的错误消息)
如何检查S7-1200 通讯模块CM1241是否已被成功设置为Modbus RTU通讯模式?
可在程序或监控表中查看“MB_COMM_LOAD”指令的输出位“DONE”,“ERROR”以及“STATUS”状态来判断S7-1200 通讯模块CM1241是否已被成功设置为Modbus RTU通讯模式。
执行“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 参数读出。
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”。
在“监控表”内输入“MB_MASTER_DB.EXTENDED_ADDRESSING”,将该位置1。
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)
④ PC(带以太网卡)
⑤ TP以太网电缆
软件:
① STEP 7 V11 Professional SP2 UPD4 +HSP
② ModScan(该软件是第三方软件,能够从 Internet 网络下载)
所完成的通讯任务:
将Modbus RTU从站CPU1215C中地址从DB1.DBW0开始的5 个字中的数据,分别读取到Modbus RTU主站ModScan中Modbus地址从40001开始的5个字中。
1.组态Modbus RTU 通讯模块
在硬件目录里找到“通讯模块”→“点到点”→“CM1241(RS485)”,双击或拖拽此模块至CPU左侧便可,以下图1所示:
图1 组态通讯模块
接下来,在“设备视图”中用鼠标选中CM1241(RS485)模块,在“属性”→“端口组态”中配置此模块硬件接口参数。以下图2所示:
如下以传输率=9.6Kbps,奇偶校验=无奇偶校验,数据位=8位字符,中止位=1,其它保持默认设置为例。
图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_SLAVE”指令的背景数据块,以下图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.建立MB_HOLD_REG数据块
经过“程序块”→ “添加新块”,选择“数据块(DB)”建立 DB 块,选择“标准与S7- 300/400兼容” ,点击“确认”键,定义数据区为5个字的数组,以下图7所示:
注意:MB_HOLD_REG使用的DB访问类型必须是标准与S7- 300/400兼容。
图7 建立MB_HOLD_REG数据块
5.调用MB_SLAVE指令
在OB1中调用MB_SLAVE指令, 调用该指令时会自动弹出建立相应背景数据块的界面,以下图8所示:
图8 调用MB_SLAVE指令
点击“确认”为该指令建立背景数据块后,并为各输入/输出引脚分配地址,以下图9所示:
S7-1200做为Modbus RTU从站,MB_HOLD_REG指向Modbus保持寄存器数据块的指针。设置以下所示:MB_HOLD_REG=P#DB3.DBX0.0 WORD 5。
对应关系以下表2所示:
Modbus RTU主站Modbus地址 | Modbus RTU从站CPU1215C 数据缓冲区地址 |
40001 | DB3.DBW0 |
40002 | DB3.DBW2 |
40003 | DB3.DBW4 |
40004 | DB3.DBW6 |
40005 | DB3.DBW8 |
表2 Modbus地址对应关系
图9 MB_SLAVE指令
引脚 | 说明 |
EN |
使能端 |
MB_ADDR |
Modbus 从站的站地址 。默认地址范围: 0 至 247;扩展地址范围: 0 至 65535 |
MB_HOLD_REG |
指向 Modbus 保持寄存器数据块的指针。 必须使用“标准 - 与 S7-300/400 兼容”访问类型建立该数据块。 |
NDR |
新数据就绪:0-无新数据;1-表示Modbus主站已写入新的数据 |
DR |
数据读取:0-无数据读取;1-表示Modbus主站已读取新的数据 |
ERROR |
错误位 |
STATUS |
表3 MB_SLAVE指令参数意义
MB_SLAVE Modbus功能 | S7-1200 | ||||
代码 | 功能 | 数据区 | 地址范围 | 数据区 | CPU地址 |
01 | 读位 | 输出 | 1到8192 | 输出过程映像区 | Q0.0到Q1023.7 |
02 | 读位 | 输入 | 10001到18192 | 输入映像区 | I0.0到I1023.7 |
04 | 读字 | 输入 | 30001到30512 | 输入映像区 | IW0到IW1022 |
05 | 写位 | 输出 | 1到8192 | 输出过程映像区 | Q0.0到Q1023.7 |
15 | 写位 | 输出 | 1到8192 | 输出过程映像区 | Q0.0到Q1023.7 |
表4 Modbus地址到过程映象区的映射
MB_SLAVE Modbus功能 | S7-1200 | ||||
代码 | 功能 | 数据区 | 地址范围 | CPU DB数据区 | CPU地址 |
03 | 读字 | 保持寄存器 | 40001到49999 | MB_HOLD_REG | 字1到字9999 |
400001到465535 | 字1到字65535 | ||||
06 | 写字 | 保持寄存器 | 40001到49999 | MB_HOLD_REG | 字1到字9999 |
400001到465535 | 字1到字65535 | ||||
16 | 写字 | 保持寄存器 | 40001到49999 | MB_HOLD_REG | 字1到字9999 |
400001到465535 | 字1到字65535 |
表5 Modbus地址到CPU存储区的映射
6. Modbus 主站软件设置
注意:客户机采用ModScan软件测试,该软件是第三方软件,能够从 Internet 网络上下载。
首先在打开的ModScan软件中创建链接,并设置RTU模式的参数:波特率Baud=9600,数据位Data=8,中止位Stop=1,校验Parity=NONE,以下图10所示:
图10 创建ModScan链接
选择“File”→“New” 打开ModScan通讯界面,设置Modbus RTU从站的地址Device Id=1,数据开始地址Address=0001,数据长度Length=5,Modbus数据类型功能码03,以下图11所示:
注意:Device Id设置必须与“MB_SLAVE”指令中输入引脚“MB_ADDR”设置的地址一致。
图11 设置ModScan
7.Modbus RTU测试结果
在STEP 7 V11 Professional SP2 UPD4软件中打开该项目CPU1215 DC/DC/DC的“监控表”,对DB3.DBW0写入数值21,DB3.DBW2写入数值22,DB3.DBW4写入数值23,DB3.DBW6写入数值24,DB3.DBW8写入数值25。ModScan主站将S7-1200 Modbus RTU从站地址DB3.DBW0的数值21,DB3.DBW2的数值22,DB3.DBW4的数值23,DB3.DBW6的数值24,DB3.DBW8的数值25,分别读取到了地址40001,40002,40003,40004,40005中。以下图12所示:
图12 Modbus RTU测试结果
STATUS(W#16#) | 说明 |
0000 | 端口无错误 |
8180 | 端口ID值无效 |
8181 | 波特率值无效 |
8182 | 奇偶校验值无效 |
8183 | 流控制值无效 |
8184 | 响应超时值无效 |
8185 | MB_DB参数不是MB_MASTER或MB_SLAVE的背景数据块 |
表6 MB_COMM_LOAD指令STATUS错误代码
STATUS(W#16#) | 说明 |
0000 | 无错误 |
80D1 | 接收方发出了暂停主动传输的流控制请求而且在指定的等待时间内未从新激活该传输 |
80D2 | 传送请求终止 |
80E0 | 因接收缓冲区满,消息被终止 |
80E1 | 因出现奇偶校验错误,消息被终止 |
80E2 | 因组帧错误,消息被终止 |
80E3 | 因出现超限错误,消息被终止 |
80E4 | 因指定长度超出总缓冲区大小,消息被终止 |
8180 | 无效端口ID值或MB_COMM_LOAD指令出错 |
8186 | Modbus站地址无效 |
8187 | 指向MB_HOLD_REG指针无效 |
818C | 指向M存储器或DB(DB区域容许符号地址和直接地址)的MB_HOLD_REG指针无效 |
表7 MB_SLAVE指令STATUS参数意义(通讯和组态错误)
STATUS(W#16#) | 从站的响应代码 |
说明 |
8380 | 无响应 | CRC错误 |
8381 | 01 | 不支持功能代码或者在广播中不支持功能代码 |
8382 | 03 | 数据长度错误 |
8383 | 02 | 数据地址错误或地址超出DATA_PTR取的有效范围 |
8384 | 03 | 数据值错误 |
8385 | 03 | 不支持此数据诊断代码值 |
表8 MB_SLAVE指令STATUS参数意义(Modbus协议错误)
为何触发“MB_SLAVE”指令出错,输出位“ERROR”=1,输出状态字“STATUS”=16#8187?
输出状态字”STATUS“=16#8187表示指向MB_HOLD_REG指针无效。如下两种状况会形成如上错误:
解决方法分别以下:
S7-1200 Mobus RTU通讯网络中包含多个从站站点时,因为轮询的网络特性,只能同时读或写一个站点数据。所以有以下因素,会影响到最终总体的轮询时间:
1. 通讯速率(波特率)设置时间
2. 每一个站点的通讯数据量
3. 站点数量
4. 通讯距离
5. 各站点链接时间
不管是因为信号干扰,硬件质量引发的从站掉站或是因为工程须要暂时关闭站点,此时都会因为“各站点链接时间”的增长而使通讯系统的轮询时间大大延长。在S7-1200的Modbus RTU通讯中,主要有三个参数与“各站点链接时间”的设置相关。
如图1所示,V2.x版本的MB_COMM_LOAD初始化块可设置从站响应时间RESP_TO参数:
设置单次链接从站的可响应时间,范围为5ms到65535ms(默认值为1000ms);即如从站在此时间段内未做出响应,则MB_MASTER将在发送指定次数的重试请求后终止请求并提示错误信息80C8。
图1. RESP_TO参数设置
注意:如图2所示,Modbus从站的执行频率须至少小于RESP_TO设置的响应时间(须要考虑响应延迟时间),才能够正常通信。
图2. 从站响应时间
在初始化功能块MB_COMM_LOAD的背景数据块中,可设置重试次数RETRIES参数:
主站在返回无响应错误代码 0x80C8 以前的重试次数。(默认值为2次) 注意:此参数表示初次链接无响应后,再次链接的次数;即以默认2次为例,实际尝试链接次数为3次。
图3 RETRIES参数设置
注意:在更改RETRIES参数后,须要从新使能MB_COMM_LOAD功能块的REQ管脚,不然更改参数不生效。
当因为某些缘由(如已发出主站请求,但在完全完成该请求前中止调用主站功能块时),形成Done及Error均没有置1时,须要提供一个定时时间,在时间到达后置位,以便执行下一个功能块或轮询下一个站点。
MB_Master的背景数据块中提供了主站定时参数Blocked_Proc_Timeout(范围0S到5.5S,默认3S)
此前的RESP_TO 是针对从站响应时间的,而Blocked_Proc_Timeout则是针对主站的定时时间,此功能参数用于防止单个 MB_Master 指令独占或锁定对端口的访问。
图4. Blocked_Proc_Timeout参数设置
因为某一个从站掉站引发的轮询周期时间延长,如何减少此影响?
一般,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)。