一、导读
Modbus 通信是一种应用广泛的通信协议 ,在变频器、智能仪表或是其他的一些智能设备上应用的一种通用通信协议,在上一篇文章中为大家分享了一个用自定义的Modbus 通信块指令编写的S7-200SMART与西门子V20和欧姆龙E5EZ的Modbus通信程序,本文重点为大家分享下自定义Modbus 通信块指令的搭建,在文章的后面会为搭建提供搭建好的通信块指令库,后续大家使用时可直接添加到软件库指令选项卡后直接使用。
二、自定义Modbus通信块指令
如下图所示为一条自定义的Modbus通信块指令,Modbus_RTU指令用于针对PLC的端口0使用,Modbus_RTU2用于针对于扩展的通信信号板使用,。
三、自定义Modbus 通信块指令搭建
(1) 数据缓冲区的规划
根据S7-200SMART的Modbus主站通信库指令MBUS_MSG规划数据缓冲区,每一条消息的数据缓冲区大小必须定义为一样,该条数据缓冲区中必须包括MBUS_MSG指令管脚中的Slave、RW、Addr、Count这些参数。同理对于MBUS_MSG指令上的DataPtr也指定对应的地址,且每条信息数据中对该地址的偏移和前面的数据缓冲区指定大小一样。
如下图所示为定义号的数据缓冲区大小,以10个字节为一条消息的缓存区大小。
(2) 编写数据处理程序块
使用间接寻址方式,编写一个数据处理的子程序块命名为“ModbusData”,用于把定义好的数据缓冲区中指定的数据,分别读取出来 ,然后放入到MBUS_MSG指令的输入管脚上,用于和从中实现数据通信交换。如下图所示为数据处理子程序的变量表。
其中,CommDataPtr表示定义的数据缓冲区起始地址,使用指针的形式指定,如上图在数据块中定义的第一条数据地址为V100开始,则此次使用&VB100。
RwDataPtr 表示读写数据存放的地址,使用指针的形式指定,如上图在数据块中定义的第一条数据地址中的读写数据的存放地址为VW200,则此次使用&VB200。
CoomDataoffset表示每条是数据缓冲区的偏移地址,上图中定义的每条数据为10个,所以该值可以设置为10.
CoomCount表示的是需要用于通信的第几条数据,说明需要把那一条的通信数据给到MBUS_MSG指令上。
输出地址的参数后续给到MBUS_MSG指令的对应的输入管脚中,详细程序如下所示:
(3) 调用Modbus库指令完成通信程序
新建一个子程序对该子程序命名为“Modbus_RTU”,在该子程序中调用前面建立好的ModbusData数据处理指令和提供的Modbus主站库指令中MBUS_CTRL和MBUS_MSG指令,完成通信子程序的编写。该子程序的接口区定义如下:
其中,DataCount表示需要进行数据通信的条数,如前面在数据也中所规划的数据条数为6条,则该管脚的数值设置为6.
DataAddr表示指针形式给定的第一条通信数据的起始地址,该地址关联到ModbusData子程序上的CommDataPtr管脚上,若DataAdd的管脚使用的地址为&VB100,则CommDataPtr的值也同为&VB100.
DataAddPtr表示指针形式给定的第一条通信数据的读写数据存储的地址,该地址关联到ModbusData子程序上的RwDataPtr管脚上,若DataAddPtr的管脚使用的地址为&VB200,则RwDataPtr的值也同为&VB200.
DataAddrOffset表示数据缓存器地址的偏移量,该地址关联到ModbusData子程序上的CoomDataoffset管脚上,若DataAddrOffset的管脚使用的值为10,则CoomDataoffset的值也同为10。
RecordCount 用于记录通信完的次数,每完成一次数据交换,该值加1,同时把该地址关联到ModbusData子程序上的CommCount管脚上,用于调用需要分配到MBUS_MSG指令上的数据。
详细程序如下所示:先对存储器进行初始化,复位完成为,复位事件间隔指令用到的存储器,然后判断数据调试是否大于0,若等于0,则说明没有需要进行数据通信的条数,调整到标签1的位置,标签1的位置,让程序块的错误代码输出为2,表示当前无通信数据条数。若有数据设置需要通信的数据条数则不执行跳转,并调用Modbus通信初始化指令对端口进行初始化操作,调用Modbus通信数据处理子程序块(ModbusData),分配把通信的数据分配到MBUS_MSG指令,
调用MBUS_MSG 指令,初始化完后,激活一次MBUS_MSG指令用于完成通信数据的交换,每次交换完一次后,RecordCount自动加1,然后间隔100ms后,重新激活一次MBUS_MSG指令,当RecordCount的数据大于或等于DataCount,则说明定义的数据的条数全部发完,对RecordCount清零,重新开始。
异常处理,若初始化完成了,但MBUS_MSG指令的激活条件因异常未接通,则在3S后,自动把MBUS_MSG指令的激活条件接通。
注:在该程序中有写地址只有符号名称未出现任何地址,当我们把该程序建立未库指令后,调用该库指令,未该库分别库存储地址时,会自动分配地址到这些只有符号名称的地址上。
四、结语
在Modbus通信指令块的搭建过程中,需要应道到带参数的子程序使用方法、指针的应用知识,Modbus通信库指令的应用等相关的知识,但对应后续使用来说,可以无需了解这些知识,只需要知道通信数据缓冲区中数据的定义原则,即可很好的使用该指令来完成通信程序的设计
领取专属 10元无门槛券
私享最新 技术干货