刚才在PLC擂台里费了半天的力写了关于MODBUS 的介绍,所以新开一个贴,给大伙再介绍介绍。
MODBUS协议应该说是目前使用最广泛的一种协议,从变频器到各类仪表都将支持MODBUS协议作为首选。各类组态软件以及触摸屏也都支持此协议,矩形科技的PLC的地址也是按照MODBUS协议来分类。这样可以那边和各家的组态以及HMI连接。
MODBUS协议将变量分为4种数据类型的变量,分别是0类型变量,1类型变量,3类型变量,4类型变量,分别0xxxx变量对应于线圈(输出以及中节点);1xxx变量为输入节点(DI点);
3xxxx变量为输入寄存器,一般为模拟量输入;4xxx变量为保持性寄存器,一般为模拟量输出寄存器和辅助寄存器。
那么因此我们也可以知道,1XXX,3XXX变量是只能读的,不能写的,0xxxx,4xxxx是可读可写的。
另外基于串口的MODBUS协议又分为MODBUS RTU,以及MODBUS ASCII,MODBUS ASCII的效率要低很多,基本同样的协议,数据量要大一倍。将一个数据分解成2个ASCII传送。
基于以太网的MODBUS协议称为MODBUS/TCP,国际互联网组织给工控领域唯一指定分配端口的就只有这个协议了(502端口)(很NB吧)。
有了前面的引入,就可以来编程了。MODBUS 协议可以大致的分为读和写2类型的命令。
但是针对不同的命令又有不同的功能码。
具体的MODBUS协议的命令组成如下:站地址+功能码+数据+效验组成(CRC16)
具体的可以看看MODBUS的协议。
矩形科技的MODBUS功能块应该是业内(国内、国际品牌)小PLC中最早开始做MODBUS功能块以通讯功能块的公司。我们在04年实现MODBUS标准功能块以及通讯的自由通讯指令。
矩形的MODBUS指令设置相当简单,上节点设置读或者写(0表示读,1表示写)。中节点设置站地址,从1-255(0一般为广播地址)。下节点设置需要读或者写的来源数据和目标数据的类型以及地址偏移,另外还有通讯的状态指示。占用6个寄存器,其中5个需要设置,1个为状态显示,无需设置。参数说明如下:
一个写操作的程序:上节点=1为写,中节点=2为站地址2,将主站0类型变量1地址开始写入2号站地址设备的0类型变量中,从1地址开始,数量是16个,如通讯故障可重试5次。就是将PLC的0001~0016的数据写入到对方的00001-000016中。串口操作为第三个串口。
看看一个MODBUS读的指令:上节点=0为读,中节点=1为站地址1,将从站4类型变量1001H地址开始读到PLC,存放在PLC的4类型变量的400地址开始,数量是10个,就是将对方的44097(1001H=4097)到44106的10个变量读入到PLC的40400到40409中。串口操作为第二个串口
当然在开始通讯之前,必须确定波特率,校验、停止位等一致。这个可以用SADDR指令配置。另外,是通讯那个串口操作是需要指定的,矩形的PLC一般有4个串口,可以通过通讯功能块的I2,I3组合来确定串口号。还有需要注意的,MODBUS主站是没有站地址概念的,从站才有。下面再介绍一下通过以太网如何通讯,实际的功能块参数很类似。
首先也需要配置IP地址和站号对应上,通讯的功能块和串口的类似。 设置2个IP地址为从站2和从站3.
主站(PLC)将40001~40016的数据写到从站2(192.168.1.152)的40001~40016中
上图的读说明:将从站3(IP地址192.168.1.153)40001~40016的数据读入到主站PLC,存放在40100~40015中。
最后一点需要注意的就是标准的MODBUS协议地址是从1开始的,但是有的设备的说明是从0开始,有可能地址需要+1或者-1来两者对应。自由通讯协议来实现MODBUS协议,则需要将MODBUS的协议了解很充分。
下面的程序图是站地址=02,功能码= 03(读保持型寄存器),地址= (03 E7H)长度=00 20的程序。