虽然博图软件已经成为西门子的主流编程工具,但是经典Step7在对S7-400和S7400H系统时还是不可或缺的编程软件。下面分享一份使用经典Step7编写的在使用ET200MP/SP PTP模块时使用Modbus RTU通讯协议进行轮询通讯的SCL程序。
在做任何通讯时其实主要有两步:第一步是将数据怎么读过来或者写到对方去,第二步是解析数据。本例程主要解决第一步的问题。很多人用过Modbus网关,其中一种就是可以在网关中配置多条Modbus命令,将数据读到网关的指定缓冲区,或者将指定缓冲区的数据写给对方。使用本例程就像在使用一个Modbus网关一样方便,可以实现以下功能:
1. 使用标准的Modbus功能码,支持1、2、3、4、5、6、15、16(对于了解Modbus通讯协议的人不喜欢使用西门子Mode加地址格式的方式
)
2. 多命令自动轮询读写数据,可以在功能块引脚设置MinIdleTi让轮询不那么快
3. 对于WORD型数据(功能码3,4,6,16),将数据读/写到”BufferWordDB”接口指定的DB中,对于BOOL型数据(功能码1,2,5,15)将数据读/写到”BufferBoolDB”接口指定的DB中。分了两个不同类型的缓冲区主要是方便后续解析数据
4. 可以通过配置任务中的SetIntervalCycles,让不太紧急的任务不是每个轮询周期都执行
5. 可以通过配置任务中的SetSkipCycles,当任务执行错误时可以跳过几个轮询周期后才再次执行,放置错误任务一直影响正常任务
6. 通过配置ExecuteOneTime任务执行成功后自动复位JobEnable从而只需执行一次,再次需要执行时只需要设置JobEnable即可,通常针对“写”任务
7. 提供手动测试模式,即不自动轮询,手动触发任务列表中的指定任务
8. 掉站恢复时不用在OB86等中额外写程序
使用本例程时需要要用到3个DB,上面提到保存WORD数据的DB和保存BOOL类型数据的DB,数据类型可以定义成数组(推荐,后续再来解析)也可以和你实际读写的名称命名的离散变量;一个配置Modbus任务列表的DB,通常以ARRAY[1..xx] of “Udt_MdbsRtuJob”定义数据,然后在“Data view”视图下配置每条任务:

特别提醒一下DataBufferOffset,对于WORD数据,这个为要保存在DB中的偏移地址,对于BOOL数据类型,如果数据类型以ARRAY[0..xx] of BOOL定义,为数组索引号,如果其他格式以绝对地址比如DBX3.5换算为 offset = 3 x 8 + 5。
Modbus通讯库采用的是Modbus_rtu_V1_3,其中对于功能码5还有bug,希望西门子可以修复。
程序部分截图(太多,随便放几张
):





LMdb_RTU_Master_V1.0.zip
Modbus_rtu_V1_3.zip