Modbus RTU作为工业上常用的一种通讯协议,被广泛的应用在各个场合。多数情况下仪器仪表作为从站发送数据,PLC作为接受数据的一方。西门子PLC封装好的功能块可以很方便的使用Modbus协议,但是在使用的时候也会出现很多问题。本人在用过一段时间后,也有了一些想法,希望整理一些问题,方便后来者可以很快的掌握西门子Modbus功能块的使用。
首先,要使用Modbus,就需要了解Modbus协议,网上很多都在讲具体的协议内容,其实如果只是使用西门子功能块的话,是不需要很深入了解的,我的建议是当你已经比较熟练的能使用Modbus获取数据之后,再去详细了解协议的具体内容,这样就会更加理解西门子的封装方式有何特点。
作为新手,你只需要了解两个步骤:1初始化 2收发数据,是不是有点像TCP/IP协议的建立连接,收发数据,断开连接。只是少了断开连接。
知道基本步骤后,需要选择要用到的指令,按照官方文档,1200的两个版本指令区别如下
按照这个文档的时间来算,近两年产的1200和通讯模块基本都会满足文档上提到的版本要求,也就是如果用不到分布式IO的Modbus功能,那么其实选哪个版本都一样。
但是在实际使用中,如果是1200系列PLC,我还是会使用V2.2版本的指令,因为V3.0调不通的程序,我用V2.2就会正常。即使是按照官方给出的V3.0版指令使用说明,依然通信不上。
官方给出的V3.0指令使用说明:Modbus RTU V3及以上版本指令介绍
官方给出的V2.2指令使用说明:Modbus RTU 旧版本指令
目前还不清楚问题出在哪里,在考虑是不是V3.0的指令只适用于1500系列,因为目前手头没有1500的PLC,还没有做进一步测试,后期如果进行了测试,我会第一时间更新的。
注意区分V2.2版指令的文件夹名是MODBUS,V3.0版文件夹名是MODBUS(RTU)
具体的指令使用方法可以参考上面的链接,这里只说几个使用时遇到比较多的几个问题(V2.2版)
1重复创建主站背景DB块
一般情况下,Modbus的线上可以挂多个设备,也就是多个从站,但是主站只有一个,就是PLC。
主站为了读取多个不同厂家的设备,需要以轮询的方式进行读取,这个时候你就要调用多个MB_MASTER指令,但是需要注意,在使用第二个MB_MASTER指令时,不要让系统自动分配背景数据块,需要你自己手动选择第一次使用该指令时已经创建好的背景块,因为在初始化指令里只能填写一个背景数据块,也就是所有你调用的MB_MASTER指令的所有背景块都必须和初始指令中MB_DB接口填的参数一致,如图
所谓的初始化指令,也就是规定这一条线路上所有设备需要遵循的协议标准,如上图,从站都要设置为9600的波特率,8个数据位,1个停止位,无校验。其中数据位,停止位,校验位都是默认的,如果需要修改,可以参考官方文档。
那么对于有的设备如果无法遵循上述的协议标准,是不能够挂载到这个初始化指令所对应的数据线上,