關於安碩

【服務項目】

 自動化設備控制系統及機構設計
 PC Based 控制系統設計
 PLC 及 HMI 程式設計
 多軸運動控制
 機器視覺檢測系統設計
 資料收集及遠端監控
 設備電控電路設計及控制盤體配線
 機械手臂整合應用
 舊有設備整理及改善
 客製化程式開發
 IPC / 軸控模組 / IO 模組 代理

系統整合外包服務 E-mail: ling.ryan@gmail.com 歡迎來信連絡

2020年12月23日 星期三

[筆記]Modbus CRC-16 算法 C# 版本

 (1) CRC 寄存器的初始值設為H'FFFF

(2) CRC 寄存器和資訊的第個位元組資料進行XOR 運算,並將計算結果

返回CRC 寄存器。

(3) 用“0”填入MSB,同時使CRC 寄存器右移位。

(4) LSB 移動的位如果為“0”,則重複執行步驟(3)( 處理下個移位)

LSB 移動的位如果為“1”,則對CRC 寄存器和H'A001 進行XOR 運算,並將結果返回

CRC 寄存器。

(5) 重複執行步驟(3) (4),直到移動位。

(6) 如果資訊處理尚未結束,則對CRC 寄存器和資訊的下個位元組進行XOR 運算,並返回CRC

寄存器,從第(3) 步起重複執行。

(7) 將計算的結果(CRC 寄存器的值從低位元位元組附加到資訊上。

 


public static byte[] CRC16_Sum(byte[] msg)
{
     UInt16 crc16_buf = 0xFFFF;
     for (int i = 0; i < msg.Length; i++)
     {
          crc16_buf ^= msg[i];
          for (int j = 0; j < 8; j++)
          {
              if ((crc16_buf & 0x01) == 0x01)
              {
                  crc16_buf >>= 1;
                  crc16_buf ^= 0xA001;
              }
              else crc16_buf >>= 1;
           }
     }
     byte[] data = { (byte)(crc16_buf & 0xFF), (byte)(crc16_buf >> 8) };

    return data;

}

沒有留言:

張貼留言