S7-1500可以在主机架或分布式IO站使用点对点通信模块来实现Modbus-RTU
通信,如需在S7-1500的分布式IO站上实现Modbus-RTU通信,推荐通过
Profinet或者Profibus的方式扩展ET200MP或者ET200SP站,通过在ET
200MP或者ET200SP上配置HF(高性能)的点对点通信模块来实现。
根据实际使用通信物理接口的不同,S7-1500主机架和ET200MP可使用的模板
分CMPtPRS232HF(6ES7541-1AD00-0AB0)和CMPtPRS422/485HF
(6ES7541-1AB00-0AB0)两种,普通的点对点通信模块(型号BA结尾)是
无法通过本文档实现Modbus-RTU通信;而ET200SP的点对点通信模块只有
一个,即CMPtP(6ES7137-6AA00-0BA0),该模块物理接口支持
RS-232/422/485。
无论是安装在S7-1500主机架的模板还是分布式IO站的模板,都可做Modbus-RTU的主站或从站,通过直接调用Modbus-RTU相关程序块即可实现Modbus-RTU通信,
S7-1500Modbus-RTU的特点还在于:无论点对点通信模块安装在S7-1500主机架还是分布式IO站;也无论分布式IO站是通过ET200MP还是ET200SP来实现Modbus-RTU通信,其组态步骤、方法、调用的程序块及注意事项等均完全相同。
S7-1500支持的Modbus功能代码如下表1和表2。
表1用于读取数据的功能:读取分布式I/O
1)用于扩展寻址
表2用于写入数据的功能:更改分布式I/O和程序数据
功能代码5用于设置或删除各个位。设置位时,必须在通过DATA_PTR寻址到的DB或位存储区的首个字中指定值“160000”。所有其它值通过ERROR=TRUE和STATUS=16的方式),将该变量填在“Modbus_Slave”的“MB_HOLD_REG”参数处,如下图17。
然后对“Modbus_Comm_Load”指令的“MD_DB”参数赋值,将“Modbus_Comm_Load”指令与“Modbus_Slave”指令进行关联,即将“Modbus_Slave”指令的背景DB块中静态变量“MB_DB”赋值给“Modbus_Comm_Load”指令的“MD_DB”,可以通过拖拽的方式来实现,拖拽路径如下图18。
在OB1中分别调用Modbus主站程序块和Modbus从站程序块,并为其分配全局DB块,如下图19。
至此,程序编写基本结束,建立2个变量监视表,分别用来监视Modbus主站数据和Modbus从站数据,将该例程下载到PLC后,可以看到通信模块对应的收发LED指示灯在闪烁,表示端口正在发送/接收数据。将DB块“SlaveData”中的变量赋值,监视主站“MasterData”中的变量,可以看到主站已经读取到从站的数据,如下图20所示:
使用变量监视表测试,主站侧已成功读取到从站数据
6.添加OB83和OB86用于故障状态下的响应为了防止Modbus-RTU通信模块发生插拔中断或所在的IO站点发生机架故障时可能引发的通信中断无法恢复,需要在程序中添加OB83和OB86并编写相应的程序来对以上2种情况进行响应和处理。在调用Modbus主站程序FB的静态变量下新建一个BOOL变量“Re_Load_Master”作为标志位,用于在故障恢复时对Modbus主站模块重新进行参数化,即再次执行“Modbus_Comm_Load”指令,如下图21所示:
将刚才创建的变量“Re_Load_Master”添加到主站的“Modbus_Comm_Load”函数块的“REQ”触发端,之后再添加一行程序,使用“Modbus_Comm_Load”参数化完成信号“DONE”将该信号复位,如下图22所示:
为“Modbus_Master”指令设置调用条件,在“Re_Load_Master”信号没有复位前,禁止执行该指令,如下图23所示:
同理,在调用Modbus从站程序的FB的静态变量下也新建一个变量“Re_Load_Slave”作为标志位,用于在故障恢复时对Modbus从站模块重新进行参数化,即再次执行“Modbus_Comm_Load”指令,如下图24所示:
将刚才创建的变量“Re_Load_Slave”添加到从站“Modbus_Comm_Load”函数块的“REQ”触发端,之后再添加一行程序,使用“Modbus_Comm_Load”参数化完成信号“DONE”将该信号复位,如下图25所示:
为“Modbus_Slave”指令设置调用条件,在“Re_Load_Slave”信号没有复位前,禁止执行该指令,如下图26所示:
在PLC程序块中添加OB83,用于模块发生插拔中断时的故障处理。在OB83内编写如下程序,第一个程序段用于ModbusRTU主站模块发生插拔中断后,置位主站重新参数化标志位,用于重新对主站模块进行参数化,并将主站通信指令块“Modbus_Master”背景数据块中的静态变量“MB_State”清零,如下图27所示:
OB83中第二个程序段用于ModbusRTU从站模块发生插拔中断后,置位从站重新参数化标志位,用于重新对从站模块进行参数化,并将从站通信指令块“Modbus_Slave”背景数据块中的2个静态变量“MB_State”和“SEND__state”清零,如下图28所示:
在PLC程序块中添加OB86,用于模块所属分布式IO发生机架故障中断时(站故障、站恢复)的处理,在OB86中编写以下程序,用于ModbusRTU从站模块所属IO发生机架故障中断后,置位从站重新参数化标志位,用于重新对从站模块进行参数化,并将从站通信指令块“Modbus_Slave”背景数据块中的2个静态变量“MB_State”和“SEND__state”清零,如下图29所示:
需要注意的是,由于本例中做ModbusRTU的主站模块在主机架上,主机架上的模块不会触发OB86,所以在OB86中并没有ModbusRTU主站模块相关的程序块;但如果ModbusRTU的主站模块位于分布式IO站上,则必须在OB86中编写相应的程序块对标志位置位、“MB_State”静态变量清零。
7.注意事项Modbus通信,不论是主站侧还是从站侧,其收发数据区必须是可通过指针寻址的,即必须是有确切地址的数据区;而优化的DB块由于其内部变量没有地址,所以收发数据区均不能使用优化的DB块,必须使用标准DB,否则PLC运行会报错。除Modbus收发数据区必须使用标准的DB块,其它部分如程序等均可使用优化的程序块实现。“Modbus_Comm_Load”指令的初始化信号端“REQ”和“Modbus_Master”指令的发送/接收信号端“REQ”必须使用边沿信号触发,否则初始化、发送/接收都无法完成。
8.常见错误Ø没有定义端口的工作模式。如未定义,缺省模式为RS232。
Ø收发数据区使用了优化的DB。将优化的DB修改为绝对DB。
Ø“Modbus_Comm_Load”初始化未执行。重新执行初始化指令。
Ø“Modbus_Master”指令输入接口参数“DATA_LEN”和“DATA_PTR”不匹配,无法实现收发。“DATA_LEN”必须小于等于“DATA_PTR”指向的数据存储区。
Ø点对点通信模块的“TX”/“RX”或“TXD”/“RXD”灯无闪烁。检查“Modbus_Comm_Load”初始化参数,确保其被正确初始化;检查“Modbus_Master”参数和“Modbus_Slave”指令参数,确保参数正确。
Ø点对点通信模块所处的分布式IO掉站后,又重新连上PLC,但Modbus通信无法恢复。需要调用OB86,并对“Modbus_Comm_Load”重新进行初始化
Ø点对点通信模块发生插拔模块事件后,即使点对点通信模块被重新插入原来的槽位,但Modbus通信无法恢复。需要调用OB83,并对“Modbus_Comm_Load”重新进行初始化
Ø“TX”/“RX”或“TXD”/“RXD”灯无闪烁。模块没有进入收发数据状态,请检查程序。