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
