1.关于报文
整个报文都是16进制,01代表一个16进制、一个字节,0和1分别是一个二进制8位。
0001 代表两个16进制,两个字节,00为高位,01为低位,读取寄存器个数的长度最大为0x007d,modbus协议的限制
01 03 0001 0001 840a
设备地址 功能号 读取起始地址 读取数据个数 crc校验
返回报文
00d7为两个16进制,表示两个字节,所以字节数为2,一个寄存器存储的为两个字节
01 03 02 00d7 xxxx
设备地址 功能号 返回的字节数 返回的数据 crc校验
2.转换为浮点数
两个寄存器转换为一个浮点数,转换函数
//16进制转换为浮点数 unpack('f', pack('H*', $a))
//浮点数转换为16进制 unpack('H*',pack('f',18.60))
3.报文的crc校验函数
function crc16($string) { $newstring=pack('H*', $string); $crc = 0xFFFF; for ($x = 0; $x < strlen ($newstring); $x++) { $crc = $crc ^ ord($newstring[$x]); for ($y = 0; $y < 8; $y++) { if (($crc & 0x0001) == 0x0001) { $crc = (($crc >> 1) ^ 0xA001); } else { $crc = $crc >> 1; } } } $s1=(($crc%256)<16)?'0'.dechex($crc%256):dechex($crc%256); $s2=(($crc/256)<16)?'0'.dechex($crc/256):dechex($crc/256); return $s1.$s2; } echo crc16('010300000001');
本文为看恩吧原创文章,转载无需和我联系,但请注明来自knsay.com