ModbusのLRCおよびCRCチェックの詳細な理解

無料無料技术资料

这篇内容可直接阅读,适合用于基础学习和検索引流。

ModbusのLRCおよびCRCチェックの詳細な理解

シリアルリンクベースのModbus 通信では、伝送モード(ASCI IまたはRTU)によって異なる検証方法を使用するエラーチェックが必要です。

  • ASCIIモード 検証フィールドは2文字で構成され、その値はすべてのメッセージ内容の実行に基づいています。 LRC Longitudinal Redundancy Check(縦冗長チェック)の計算結果。計算オブジェクトには、開始コロン:)と改行記号(CRLF)。
  • RTUモード 検証フィールドは16ビット(2バイト)で構成され、その値はすべてのメッセージ内容の実行に基づいています。 CRC Cyclical Redundancy Check(巡回冗長検査)の計算結果。計算オブジェクトには、チェックドメインの前のすべてのバイトが含まれます。

LRCテスト​

LRCチェックは、ASCIIプロトコルで使用される比較的単純なもので、先頭のコロンと末尾のキャリッジリターン以外のメッセージフィールド内のものを検出します。送信する必要があるすべてのデータをバイトごとに重ね合わせ(すべてのキャリーを破棄)、結果に2の補数を適用するだけです。

以下は、LRC検証の具体的なコードです。

unsigned char LRC(unsigned char *auchMsg, unsigned short usDataLen)
{
    unsigned char uchLRC = 0;
    while (usDataLen--)
        uchLRC += *auchMsg++;
    return ((unsigned char)(-((char)uchLRC)));
}

アルゴリズムの本質的には、LRCフィールド自体は1バイトしか占めませんが、メッセージフレームをASCIIモードで渡す場合、LRC値は2バイトのASCII文字にエンコードされます。例えば、計算されたLRC値が0 x F 3であれば、ASCIIメッセージフレームでは'F'と'3'の2文字として表現されます。

CRCチェック​

CRCフィールドは、16ビットのバイナリ値を含む2バイトです。送信デバイスによって計算され、メッセージに追加されます。受信デバイスは、受信したメッセージのCRCを再計算し、受信したCRCフィールド内の値と比較し、2つの値が異なる場合は誤りである。

CRCは、すべて“1”の値を持つ16ビットレジスタを呼び出し、メッセージ内の連続した8ビットバイトの現在のレジスタ内の値を処理するプロセスを呼び出します。各文字の8ビットのデータのみがCRCに有効で、開始ビットと停止ビット、パリティビットは無効です。CRC生成プロセスでは、各8ビット文字はレジスタの内容と個別に相関し(OR)、結果は最下位ビットにシフトし、最上位ビットは0で埋められます。LSBが検出され、LSBが1の場合、レジスタが個別にプリセットされた値またはそれ以下で、LSBが0の場合は実行されません。このプロセスを8回繰り返す。最後のビット(8番目のビット)が完了すると、次の8ビットバイトはレジスタの現在値と個別に相関します。レジスタにおける値は、メッセージ中のすべてのバイトが実行された后のCRC値である。

以下は、CRCチェックの具体的なコードです。

unsigned short CRC16(unsigned char *puchMsg, unsigned short usDataLen)
{
    int i, j;
    unsigned short usRegCRC = 0xFFFF;
    
    for (i=0; i<usDataLen; i++)
    {
        usRegCRC ^= *puchMsg++;
        for (j=0; j<8; j++)
        {
            if (usRegCRC & 0x0001)
                usRegCRC = usRegCRC >> 1 ^ 0xA001;
            else
                usRegCRC >>= 1;
        }
    }
    
    return usRegCRC;
}

Modbus RTUモードでは、メッセージフレームの送信時にCRCチェック値がローバイトの前に、ハイバイトの後に順序付けられなければならないことが規定されている。例えば、CRC値が0 x CA 31であれば、送信順序は0 x 31、0 x CAとなります。

上記のCRC16の計算方法は、多くの演算を必要とし、速度に敏感でない場合にのみ適しているため、最適ではありません。計算速度が要求される場合は、ルックアップテーブル法を使用してチェック値を取得することができます。これは、時間のための空間戦略です。

この資料を実際のプロジェクトに活用しませんか?

ツールセンターで電文解析、CRCチェック、デバイスデバッグを行うか、要件を送信して選定と接続のアドバイスを受けましょう。

エンジニア会員

この記事を実行可能なデバッグ資料に

登録すると、高度な電文解析、資料パックのダウンロード、コード例、エンジニアリングケース、優先技術サポートが利用可能に。実際のプロジェクト納品に最適です。

高度なツール無制限
資料パックとコードパック
完全なエンジニアリングケースライブラリ
優先技術サポート窓口

发表回复

あなたのメールアドレスアドレス不会被公开。 必須項目已用 * 标注