一、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;
}