Modbusクライアントの下流方向制御

PD Handler Modbus Client の下流方向制御について説明します。
PD Handler Modbus Client の下流方向制御に用いるJSON文字列のオブジェクトを示します。

PD Handler Modbus Client の下流方向制御に用いるJSON文字列のオブジェクト

キーデータ型必須説明
protocol文字列TCP接続機器の場合は"tcp"、RTU接続機器の場合は"rtu"を設定。
node文字列TCP接続PLC機器のIPアドレスを設定。
port整数TCP接続PLC機器のポート番号を設定。
device文字列RTU接続PLC機器のデバイスファイルを設定。
unit整数PLC機器のModbusID、1~247又は255(TCP接続のみ)を設定。
function文字列又は整数Modbusの下流方向制御に説明するファンクションコードの内、次表PD Handler Modbus Clientで利用可能なファンクションコードに記載されるコードを設定。
data_type文字列又は整数次の何れか
符号なし16ビット整数 :
'uint16_t' 又は '0'
符号付き16ビット整数 :
'int16_t' 又は '1'
符号なし32ビット整数/リトルエンディアン :
'uint32lsb_t' 又は '2'
符号付き32ビット整数/リトルエンディアン :
'int32lsb_t' 又は '3
符号なし32ビット整数/ビッグエンディアン :
'uint32msb_t' 又は '4'
符号付き32ビット整数/ビッグエンディアン :
'int32msb_t' 又は '5'
指定されない場合は、符号なし16ビット整数
address文字列又は整数データが格納されている、あるいは格納するPLC機器上の開始アドレスを設定します。先頭が'0x'の場合は16進数と解釈されます。指定されない場合は、0x00となります。
number文字列又は整数読み書きするレジスタ数を記載します。指定されない場合は、1となります。
values整数配列書き込むデータ(整数値)の並び

PD Handler Modbus Clientで利用可能なファンクションコードを示します。

PD Handler Modbus Client で利用可能なファンクションコード
コード名称利用可能
0x01Read Coils
0x02Read Discrete Input
0x03Read Holding Registers
0x04Read Input Registers
0x05Write Single Coil
0x06Write Single Register
0x07Read Exception Status
0x09Write Single Discrete Input
0x0aWrite Single Input Register
0x0fWrite Multiple Coils
0x10Write Multiple Registers
0x11Report Slave ID
0x13Write Multiple Discrete Input
0x14Write Multiple Input Registers
0x16Mark Write Registers
0x17Write and Read Registers

例えば、TCP接続されている入力レジスタを読み込むのであれば、クラウドより次のような制御メッセージを送ります。

{
"protocol": "tcp", "node": "192.168.1.8", "port": 502, "unit": 255,
"function": "0x04", "data_type": "uinit16_t", "address": "0x160", "number": 5
}

対する応答メッセージは、次のようになります。

{
"time": "2017-09-05T15:30:05.758+09:00",
"reply_to": "452556d8daf1f7eb483d00ee03718e8e", "result": "done",
"memo": "Modbus Client 00",
"protocol": "tcp", "node": "192.168.1.8", "port": 502,
"unit":255, "address": 352, "function": 4, "data_type": "uint16_t",
"values": [65535, 0, 1, 2, 3]
}

ここで"reply_to"は、制御メッセージのハッシュ値(MD5)です。

シリアル接続のPLC機器の出力レジスタに値を書き込むのであれば、クラウドより次のような制御メッセージを送ります。

{
"protocol": "rtu", "device": "/dev/ttyEX1",
"unit": 16, "function": "0x10", "data_type": "uint32lsb_t", "address": "0x120",
"values": [4567, 891011]
}

ここで"data _type"が32bitsの場合、"values"は上位/下位の16bitsに分割されて処理されるため、"number"が1であって "function"はWrite Multiple Registersを使用しなくてはなりません。

対する応答メッセージは、次のようになります。

{
"time": "2017-09-05T16:35:13.653+09:00",
"reply_to": "fe9b49ff045f435a371303a82281f3f9", "result": "done",
"memo": "Modbus Client 01",
"protocol": "rtu", "device": "/dev/ttyMDF1",
"unit":16, "address": 288, "function": 16, "data_type": "uint32_t",
"values": [4567, 891011]
}

なお、"protocol","node","port","device"で指定されるPLC機器(への接続方法)は、Modbusクライアントデバイスとして登録され使用設定が有効になっているものに限られます。