php – CRC-CCITT转CRC16 Modbus实现

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – CRC-CCITT转CRC16 Modbus实现脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我在使用 PHP生成modbus CRC16代码时遇到了很多麻烦.我在互联网找到了很多不同的代码,但我已经尝试了它们,由于某些原因我没有得到正确的结果.我找到了一个用于生成CRC16-CCITT的PHP代码.我已将查找表变为modbus CRC对应表,但结果仍然不正确.
代码如下.为了将CRC16-CCITT代码转换为CRC16-MODBUS代码,我还需要做些什么呢?

<?PHP 

/*************************************************************************
 * PHPCrc16 v1.1 -- CRC16/CCITT implementation 
 *
 * By Matteo Beccati <;matteo@beccati.COM>
 * 
 * Original code by:
 * Ashley Roll
 * Digital Nemesis Pty Ltd
 * www.digitalnemesis.com
 * ash@digitalnemesis.com 
 *
 * test Vector: "123456789" (character string,no quotes)
 * Generated CRC: 0x29B1
 * 
 *************************************************************************/



/*
 * Returns CRC16 of a string as int value
 */
function CRC16($str)
{
    static $CRC16_Lookup = array(
              0X0000,0XC0C1,0XC181,0X0140,0XC301,0X03C0,0X0280,0XC241,0XC601,0X06C0,0X0780,0XC741,0X0500,0XC5C1,0XC481,0X0440,0XCC01,0X0CC0,0X0D80,0XCD41,0X0F00,0XCfc1,0XCE81,0X0E40,0X0A00,0XCAC1,0XCB81,0X0B40,0XC901,0X09C0,0X0880,0XC841,0XD801,0X18C0,0X1980,0XD941,0X1B00,0XDBC1,0XDA81,0X1A40,0X1E00,0XDEC1,0XDF81,0X1F40,0XDD01,0X1DC0,0X1C80,0XDC41,0X1400,0XD4C1,0XD581,0X1540,0XD701,0X17C0,0X1680,0XD641,0XD201,0X12C0,0X1380,0XD341,0X1100,0XD1C1,0XD081,0X1040,0XF001,0X30C0,0X3180,0XF141,0X3300,0XF3C1,0Xf281,0X3240,0X3600,0XF6C1,0XF781,0X3740,0XF501,0X35C0,0X3480,0XF441,0X3C00,0XFCC1,0XFD81,0X3D40,0XFF01,0X3FC0,0X3E80,0XFE41,0XFA01,0X3AC0,0X3B80,0XFB41,0X3900,0XF9C1,0XF881,0X3840,0X2800,0XE8C1,0XE981,0X2940,0XEB01,0X2BC0,0X2A80,0XEA41,0XEE01,0X2EC0,0X2F80,0XEF41,0X2D00,0XEDC1,0XEC81,0X2C40,0XE401,0X24C0,0X2580,0XE541,0X2700,0XE7C1,0XE681,0X2640,0X2200,0XE2C1,0XE381,0X2340,0XE101,0X21C0,0X2080,0XE041,0XA001,0X60C0,0X6180,0XA141,0X6300,0XA3C1,0XA281,0X6240,0X6600,0XA6C1,0XA781,0X6740,0XA501,0X65C0,0X6480,0XA441,0X6C00,0XACC1,0XAD81,0X6D40,0XAF01,0X6FC0,0X6E80,0XAE41,0XAA01,0X6AC0,0X6B80,0XAB41,0X6900,0XA9C1,0XA881,0X6840,0X7800,0XB8C1,0XB981,0X7940,0XBB01,0X7BC0,0X7A80,0XBA41,0XBE01,0X7EC0,0X7F80,0XBF41,0X7D00,0XBDC1,0XBC81,0X7C40,0XB401,0X74C0,0X7580,0XB541,0X7700,0XB7C1,0XB681,0X7640,0X7200,0XB2C1,0XB381,0X7340,0XB101,0X71C0,0X7080,0XB041,0X5000,0X90C1,0X9181,0X5140,0X9301,0X53C0,0X5280,0X9241,0X9601,0X56C0,0X5780,0X9741,0X5500,0X95C1,0X9481,0X5440,0X9C01,0X5CC0,0X5D80,0X9D41,0X5F00,0X9FC1,0X9E81,0X5E40,0X5A00,0X9AC1,0X9B81,0X5B40,0X9901,0X59C0,0X5880,0X9841,0X8801,0X48C0,0X4980,0X8941,0X4B00,0X8BC1,0X8A81,0X4A40,0X4E00,0X8EC1,0X8F81,0X4F40,0X8D01,0X4DC0,0X4C80,0X8C41,0X4400,0X84C1,0X8581,0X4540,0X8701,0X47C0,0X4680,0X8641,0X8201,0X42C0,0X4380,0X8341,0X4100,0X81C1,0X8081,0X4040
    );

    $crc16 = 0xFFFF; // the CRC
    $len = strlen($str);

    for($i = 0; $i < $len; $i++ )
    {
        $t = ($crc16 >> 8) ^ ord($str[$i]); // High byte Xor Message Byte to get index
        $crc16 = (($crc16 << 8) &amp; 0xffff) ^ $CRC16_Lookup[$t]; // Update the CRC From table
    }

    // crc16 Now contains the CRC value
    return $crc16;
}

/*
 * Returns CRC16 of a string as hexadecimal string
 */
function CRC16HexDigest($str)
{
    return sPRintf('%04X',crc16($str));
}
echo CRC16HexDigest('123456789');
?>

解决方法

这个Pascal片段是MODBUS RTU(ASCII是不同的)协议在线计算,没有任何表格:

function mb_CalcCRC16(ptr: pointer to byte; ByteCount: byte): word;
VAR
  crc: word;
  b,i,n: byte;
begin
  crc := $FFFF;
  for i := 0 to ByteCount do
    if i = 0 then           // device id is 1st byte in message,and it is not in the buffer
      b := mb_GetMessageiD; // so we have to calculate it and put it as 1st crc byte
    else
      b := ptr^;
      Inc(ptr);
    endif;
    crc := crc xor word(b);
    for n := 1 to 8 do
      if (crc and 1) = 1 then
        crc := (crc shr 1) xor $A001;
      else
        crc := crc shr 1;
      endif;
    endfor;
  endfor;
  Return(crc);
end;

function mb_CalcCRC: word; // Calculate CRC for message in mb_pdu
begin // this message can be one that is just received,or in a reply we have just composed
  Return(mb_CalcCRC16(@mb_pdu[1],mb_GetEndOfData));
end;

这是一个工作的嵌入式AVR设备的引用,其中实现了MODBUS RTU从属协议.

脚本宝典总结

以上是脚本宝典为你收集整理的php – CRC-CCITT转CRC16 Modbus实现全部内容,希望文章能够帮你解决php – CRC-CCITT转CRC16 Modbus实现所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。