modbus小结

1.关于报文

    1. 整个报文都是16进制,01代表一个16进制、一个字节,0和1分别是一个二进制8位。

    2. 0001 代表两个16进制,两个字节,00为高位,01为低位,读取寄存器个数的长度最大为0x007d,modbus协议的限制

      01                    03            0001                    0001                    840a

      设备地址        功能号        读取起始地址        读取数据个数        crc校验

    3. 返回报文

      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');


打赏

看恩吧
网站不承担任何有关评论的责任
  • 最新评论
  • 总共条评论
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦