現在、スマートライトのYouTubeチャンネルでNode-RED100本ノックという企画をやっております。
その第29回目に、ModbusRTUで制御できる安定化電源をNode-REDでコントロールする方法を紹介しました。
今回はここで紹介している楠川さんのブログに出ているNode-REDのフローをもとに、Modbusの学習をしていきたいと思います。
激安安定化電源を自動化して試験を楽にする(DPS3005をNode-REDで操作する)|電気/アンテナ/無線|技術開発|TechBLOG|Braveridge TechBLOG
まずは、DPS3005のドキュメントの中から、通信について書かれている「DPS3005 CNC Power Communication Protocol V1.2」の内容を翻訳して確認します。
↓ ドキュメント・ダウンロード
DPS3005 file
通信プロトコルの概要
このデバイスの通信プロトコルは、MODBUS RTUです。これは、RS232、RS485、またはBluetoothのシリアルインターフェースで使用できます。
注)本製品はMODBUS RTU機能コード0x03(03H)、0x06(06H)、0x10(10H)のみサポートしています。
通信プロトコルの説明
メッセージの送信は非同期で、Modbus-RTUは11ビットのバイトである。
一般的なMODBUS RTUプロトコルの詳細な説明については 下記のリンク参照。
Modicon Modbus Protocol Reference GuideDocument
Modbusは一般的なプロトコルです。レジスタの位置と機能の実装は、このデバイスの設計者に固有のものですが、Modbus通信のコマンド構造のフォーマットは固定されており、上記の文書に詳細が記載されています。以下は、標準的なModbus RTUプロトコルと、この特定のデバイスで使用されるレジスタとModbus RTUファンクション・コードについての簡単な紹介です。
データを送信する前に、バスの無音期間(データを送信していない時間)が3.5文字以上(例:ボーレートが9600、時間が5ms)になるようにします。
RTUメッセージは、少なくとも3.5文字分の無音区間で始まり、最後に送信された文字に続いて、少なくとも3.5文字分の同様の区間がメッセージの終わりを示します。最後に送信された文字の後、少なくとも3.5文字分の同様の間隔でメッセージが終了します。
メッセージ・フレーム全体を連続したストリームとして送信する必要があります。フレームが完了する前に3.5文字分以上の無音区間が発生した場合、受信機器は不完全なメッセージをフラッシュし、次のバイトが新しいメッセージのアドレス・フィールドになると判断します。
同様に、新しいメッセージが前のメッセージの3.5文字分よりも早く始まった場合、受信機器は前のメッセージの続きとみなします。この場合、最後のCRCフィールドの値が結合されたメッセージに対して有効ではないため、エラーになります。
Address code
メッセージフレームのアドレスフィールドは、1~255の8ビットで構成されています。このバイトは、ユーザーがメインフォームからのメッセージを受信するスレイバーの設定アドレスを示します。
各スレイバーは固有のアドレスフィールドを持っていなければならず、アドレスフィールドに適合するスレイバーだけがループバックメッセージに応答することができます。
スレイバーがメッセージを送り返すと、ループバックデータは自分のアドレスフィールドで始まります。
メインから送られてきたアドレスフィールドは、サルバーが受信したアドレスファイルであり、ループバックアドレスファイルは、ループバックのスレイバーがファイルしたアドレスです。このアドレスフィールドは、どこから来たのかを示しています。
Function code
ファンクションコードフィールドは、アドレス指定されたスレーブがどのような機能を実行するかを示します。本機は、0x03 0x06 0x10の機能のみをサポートしています。
Data area
データバイトには、スレーブが機能を実行するために必要な追加情報が含まれています。例えば、ファンクションコード03では、ホールドレジスタの読み出しをスレーブに要求し、その内容を応答します。データ・フィールドには、どのレジスタから読み始めるか、何個のレジスタを読み出すかをスレーブに伝える情報が含まれていなければなりません。
レスポンスでは、データバイトには、スレーブから収集したレジスタ値やステータスなどのデータが格納されます。エラーが発生した場合、ファンクションコードはエラーレスポンスであることを示すように変更され、データバイトにはエラーの内容を示すコードが含まれます。
このデバイスのレジスタマップ
注:
- 本製品には、ユーザーがプログラム可能な「データグループ」があり、それぞれにM0~M9のユーザー名がプリセットされており、合計10個の「データグループ」があります。
各データグループは、8つの値のサブセットを持っています。グループは10~17番のパラメーターです。M1とM2は、データグループを表示するショートカットです。
M3~M9は通常のストレージデータグループです。各データグループ(M0~M9)のスタートアドレスは次のように計算されます。の式で計算されます。0050H + (データグループ番号 * 0010H)。
例えば、M3データグループの開始アドレスは次のようになります。0050h + (3 * 0010h) = 0080hです。
- キーロック機能の読み取りと書き込みの値は0と1で、0はロックしないことを表し、1はロックすることを表します。
- 保護状態の読み取り値は0~3で、0は良好な動作、1はOVP、2はOCP、3はOPPを表します。
- Constant voltage and constant current reading value are 0-1, 0 represents CV, 1 represents CC.
- 制御出力機能の読み書きの値は0~1で、0はクローズ、1はオープンを表します。
- バックライトランクの読み書き値のレベルは0~5で、0が最も暗く、5が最も明るいことを表しています。
- ショートカットでデータグループを呼び出す機能 書き込み値は0~9で、書き込み後、対応するすべてのデータグループが抽出されます。
Error-checking
RTUモードでは、メッセージにはCRC(Cyclical Redundancy Check)方式のエラーチェックフィールドが含まれています。CRCフィールドは、メッセージ全体のコンテンツをチェックします。CRCフィールドは、メッセージの個々の文字に使用されているパリティチェック方法とは関係なく適用されます。
CRC Calculation method:
CRC(Cyclical Redundancy Check)フィールドは2バイトで、16ビットのバイナリ値を含んでいます。CRCフィールドは2バイトで、16ビットのバイナリ値が含まれています。CRC値は送信側の機器で計算され、メッセージに付加されます。
受信側のデバイスは、メッセージの受信中にCRCを再計算し、計算した値とCRCフィールドで受信した実際の値を比較します。CRCフィールドで受信した実際の値と比較します。2つの値が等しくない場合はエラーとなります。
CRCは、まず16ビットのレジスタをすべて1にプリロードすることで開始されます。その後、メッセージの連続した8ビットのバイトをレジスタの現在の内容に適用するプロセスが開始されます。CRCの生成には、各文字の8ビットのデータのみが使用されます。スタートビットとストップビット、そしてパリティビットはCRCには適用されません。
CRCの生成時には,各8ビットのキャラクタがレジスタの内容と排他的論理和されます。結果は最下位ビット(LSB)の方向にシフトされ,最上位ビット(MSB)の位置にゼロが埋められます。
LSBが抽出され、検査されます。LSBが1の場合は、あらかじめ設定された固定値との排他的論理和(XOR)が行われます。LSBが0であった場合、排他的論理和(XOR)は行われません。
このプロセスは、8回のシフトが行われるまで繰り返されます。最後(8回目)のシフトの後、次の8ビットの文字がレジスタの現在の値と排他的論理和され、このプロセスは上記のようにさらに8回のシフトを繰り返します。メッセージのすべての文字が適用された後のレジスタの最終的な内容は、CRC値です。