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