Modbus RTU 协议的多站点轮询(CP341,RS485)

硬件列表

组态配置

编程

总结

硬件列表

设备名称 设备型号

PS 307

6ES7 307-1EA00-0AA0

CPU 315-2PN/DP

6ES7 315-2EH13-0AB0

MMC

6ES7 953-8LG11-0AA0

CP341

6ES7 341-1CH01-0AE0

Dongle

6ES7 870-1AA01-0YA0

注意:STEP7 V5.X软件上,必须安装如下软件包才可进行后续的组态配置。

组态配置

1、组态CPU及CP341,如图1将CP341逻辑地址设为256。

图1

2、设置Modbus总线传输速率和帧字符结构

双击CP341->Parameters->Protocol中选择Modbus Master;双击信封Protocol,选择Modbus Master设置总线传输速率和帧字符结构以及,其它从站的设置必须和主站设置一致。如图,本例传输速率为9.6Kbit/s,帧字符1-8-e-1,即1位起始位,8位数据位,偶校验,1位停止位。

图2

3、设置电气接口

选择半双工RS 485,接收端初始状态按图3设置,各从站的接口电气标准应和主站一致,如图,具体配置步骤请参考手册《CP340/341/440/441通讯及编程》。

图3

编程

1、创建发送数据块DB1

如图,定义Modbus功能码03的数据格式,更多功能码格式参考手册《以用于 PtP CP MODBUS 协议 RTU 格式 S7 的 SIMATIC 可加载驱动程序为主站》

图4

2、创建接收数据DB

在此共建立了2个DB(DB4,DB5)分别存放来自两个从站的数据,每个DB分配了一个0~1000个字的整型数组如图。

图5

3、创建轮询功能块FC1

设置指令计数器(MW2),如图,本例中设置为2,即2两条指令。

图6

根据指令计数器值构造发送指令并指定接收缓冲区。如图,指令计数器数值为1,构造的发送指令为访问1号从站,功能码03,起始地址0(对应Modbus地址40001),4个寄存器;接收缓冲区为数据块DB4,起始地址为0。

图7

如图,指令计数器数值为2,构造的发送指令为访问2号从站,功能码03,起始地址0(对应Modbus地址40001),4个寄存器;接收缓冲区为数据块DB5,起始地址为2。

图8

为了实现数据发送和接收,FC1中还必须调用CP341发送FB8 和接收FB7 功能块。

图9

FB8参数说明表

SF

‘S’为发送,此处必须为大写的‘S’

LADDR

硬件组态中的起始逻辑地址,本例中为256

REQ

发送数据触发位,上升沿触发,本例中为M0.0

DB_NO

发送数据块号,本例中为1

DBB_NO

发送数据的起始地址,本例中为0

LEN

发送数据的长度,本例中为6

R_TYP

‘X’为扩展的数据块,此处必须为大写的‘X’

R

取消通讯,本例始终为初始值FALSE

DONE

发送完成位,无故障发送完成后为true,M0.1

ERROR

错误位,为true说明有错误,M0.2

STATUS

状态字,标识错误代码,查看Modbus Master和CP341手册

其它参数

查看在线帮助

 

图10

FB7参数说明表

LADDR

硬件组态中的起始逻辑地址,本例中为256

DB_NO

发送数据块号,本例中为MW4

DBB_NO

发送数据的起始地址,本例中为MW6

LEN

接收数据的长度

EN_R

使能接收位,本例中始终为TURE

R

取消通讯,本例始终为初始值FALSE

NDR

接收完成位,无故障接收完成后为true

ERROR

错误位,为true说明有错误

STATUS

状态字,标识错误代码,查看Modbus Master和CP341手册

其它参数

查看在线帮助

 

CP341 Modbus RTU主站轮询从站过程:以功能码03(Function Code 03)为例,正常情况下REQ(M0.0)检测到一个上升沿时,FB8启动发送作业,从站收到主站请求后发送响应数据,FB7将从站响应的数据送回给CPU处理,发送作业完成位DONE(M0.1)置位,同时指令计数器MW2加1,构造下条指令,传递到发送DB中(DB1.DBB0~DB1.DBB5),更新下一条指令的接收区地址(MW4,MW6)同时触发REQ上升沿,启动一个新的发送作业。

图11

同样以功能码03(Function Code 03)为例,在故障情况下,FB8发送功能无法完成,ERROR置位,那么判断该次发送作业失败,更新发送区地址和接收区地址启动下一个发送作业。如果FB8的DONE和ERROR由于某些故障都无法置位,那么通讯将处于死锁状态,所以在启动发送作业同时启动超时定时器t0(本例中超时定时器时间设为2100ms),即定时器计时结束时DONE或ERROR仍然没有置位,那么判断该次发送作业失败,更新发送区地址和接收区地址启动下一个发送作业。

如图所示,主站向Slave1发送请求指令,由于1号从站断线故障,从站没有收到主站请求,也无法返回主站需要的数据,当预设的从站响应时间t(如图11,t=2000ms)超时,发送功能块ERROR(M0.2)置位,主站判断本条指令失败,同时发起下一条指令作业(Function Code 03)访问Slave2,Slave2收到主站请求后,将响应数据返回给主站CP341,主站再通过FB7将从站接收到的数据保存到指定位置,发送功能块DONE(M0.1)置位,同时触发下一次发送作业。

图12

需要注意的是超时定时器时间(t0)必需大于预设的从站响应时间t,而预设的从站响应时间应大于等于主站发出请求到接收到从站响应数据的时间最大值(tn,n=1,2),即t0 > t ≥ Max(t1,t2),如图。

图13

4、在OB1中调用轮询功能块FC1

图14

总结

本文档所提供的例程适用于CP341作为Modbus主站轮询访问多个从站,根据实际需要构造不同功能码指令,可读写不同的从站的不同地址空间。本例对通讯故障时的处理方式是简单的放弃当前作业,并触发下一个作业,实际运用中可根据实际情况判断是否需要重发或进行其他故障处理。