MODBUS RTU协议理解

一、MODBUS 工业上常用的一种串口通讯协议,协议包括RTU、TCP、ASCII;其中MODBUS RTU协议最常用;

二、串口参数

设备地址:1~247  (仪表的设备地址)

波特率:50、75、100、150、300、600、1200、2400、4800、9600、115200、19200、38400;

校验位:偶校验、奇校验、无校验;

数据位:8、7、6

停止位:1、1.5、2

三、报文格式

设备地址(两个字节)、功能码(两个字节)、寄存器地址(四个字节)、寄存器数量(四个字节)、CRC校验码(四个字节)

发报文:01 03 00 00 00 01 84 0A

解释:01:仪表的地址;      03:功能码;

00:寄存器地址高位;  00:寄存器地址低位;

00:寄存器数量高位;  01:寄存器数量低位;

84 0A:校验位

接收报文:01 03 00 02 00 DC 7B F1

解释:01:仪表的地址;        03:功能码;

00:数据字节长度高位;  00:数据字节长度低位;

00:寄存器数据高位;    DC:寄存器数据低位;

7B F1:校验位

四、功能码定义

发数据时:设备地址(两个字节)、功能码(两个字节)、寄存器地址(四个字节)、寄存器数量(四个字节)、数据的字节长度(两个字节)、数据(四个字节)、CRC校验码(四个字节)

接收数据时:设备地址(两个字节)、功能码(两个字节)、寄存器地址(四个字节)、寄存器数量(四个字节)、CRC校验码(四个字节)

根据功能码的不同,主机和从机都可接收数据和发送数据.

CRC校验码

//CRC校验码

static string CRC16(byte[] pDataBytes)

{

ushort crc = 0xffff;

ushort polynom = 0xA001;

for (int i = 0; i < pDataBytes.Length; i++)

{

crc ^= pDataBytes[i];

for (int j = 0; j < 8; j++)

{

if ((crc & 0x01) == 0x01)

{

crc >>= 1;

crc ^= polynom;

}

else

{

crc >>= 1;

}

}

}

byte hi = (byte)((crc & 0xFF00) >> 8);  //高位置

byte lo = (byte)(crc & 0x00FF);

string data = lo.ToString("X2") + hi.ToString("X2");

return data;

}

你可能感兴趣的:(MODBUS RTU协议理解)