本文转自liyu34的博客
NARTU通常装备有串行端口或者以太网端口,串行端口支持MODBUS协议,以太网端口支持MODBUS TCP/IP协议(注释:MODBUS协议和MODBUS TCP/IP协议是生产PLC的施耐德电气公司制定的,NARTU完全遵循以上两种标准协议)。
1、概要介绍
(1)信息交换属性
MODBUS是一个主从类型的协议,它允许一次读写一个或者多个字(16bits),但是在任何情况下都不允许直接读写单个byte。
除去广播信息之外,所有的信息交换都是由主方发起的,所有完整的信息交换流程都包含下行(downlink)和上行(uplink)两个消息。
* 下行消息:一个由主方发出的请求消息
* 上行消息:一个由从方发出的回应消息
如图Fig.12.1,主方的请求信号一般是向特定的从属设备发出的(通过请求信息的第一个字节我们可以知道目标从属设备的地址)。如图Fig.12.2,如果从属设备地址为0的话,那么这条消息就是一条广播消息,广播消息会被发送到所有的从属设备,但是ModBus通信协议规定这种信息只能是写入指令,从属设备也不会对广播消息作出回应(发出回应消息)。
(2)信息格式
所有的RTU交换信息(包括上行消息和下行消息)都遵循相同的信息格式。信息格式如下:
每条信息具有四种信息:
从属设备地址
从属设备的地址长度为一个字节(取值范围为0-FFH),但是如果从属设备地址为0的话,这条消息实际上是一个广播消息,所以从属设备的真正的取值范围为01H-FFH(即1-255)。
操作码
操作码的长度也为一个字节,操作码用来告诉设备这条消息选择了哪一个指令(读、写、回答正确还是不正确等等)。操作码的有效范围为1-255,各种操作码的指令含义会在本手册的后续部分进行详细讲解。
数据区
数据区均为16进制的数据,数据区的长度并不固定,实际长度与操作码有关。
CRC16检测
CRC16检测占每条信息的最后两个字节。这是一个遵循CRC16算法的检测,检测范围是从第一个字节(从属设备地址)到数据区的最后一个字节。
【例子】CRC16算法的C语言实现:
unsigned short CRC16(unsigned char* buf, unsigned short len)
{
unsigned short crc=0xffff;
unsigned short i,j,k;
for(i=0;i<len;i++)
{
crc =crc ^ buf[i];
for(j=0;j<8;j++)
{
k=crc & 01;
crc=crc >> 1;
if (k==0) continue;
crc =crc ^ 0xA001;
}
}
return crc;
2、寻址方式
如上图Fig.12.1和Fig12.2所示,主方设备可以与n(1≤n≤255)个从属设备进行通话。当然,n=0(即从属设备地址为0)的时候是广播消息。
从Fig.12.1和Fig.12.2可以得出,主方设备访问从属设备这一行为实际上是主方设备访问特定从属设备中的特定装置中的一系列寄存器。所以主方设备访问的地址应该由三个方面共同决定:从属设备地址,从属设备中的装置号,装置中寄存器的地址。
在信息中,装置号和装置中寄存器的地址被合称为”word address”。
未完待续