コンテンツにスキップ

Modbusコネクタ

Modbusコネクタは、Modbusプロトコルを使用してPLCおよび産業デバイスとの通信を可能にし、シリアル(RTU)とTCP/IP接続の両方をサポートします。

コネクタタイプ:

  • ModbusReader - Modbusデバイスからデータを読み取る
  • ModbusWriter - Modbusデバイスにデータを書き込む
  • ✅ 複数のトランスポートプロトコル(TCP、RTU、UDP、TLS)
  • ✅ すべてのレジスタタイプ(Holding、Input、Coil、Discrete Input)
  • ✅ 複数のデータ型(Int16/32/64、UInt16/32/64、Float32/64、ASCII)
  • ✅ 設定可能なバイトおよびワード順序
  • ✅ マルチデバイスネットワーク用のUnit IDサポート

Meddleは以下のModbusトランスポートをサポートします:

  • TCP - イーサネット上のModbus TCP
  • TCPWithTLS - TLS暗号化付きModbus TCP
  • UDP - UDP上のModbus
  • RTU - シリアル上のModbus RTU
  • RTUOverTCP - TCPにカプセル化されたModbus RTU
  • RTUOverUDP - UDPにカプセル化されたModbus RTU
{
"type": "ModbusReader",
"config": {
"endpoint": "192.168.1.100:502",
"transport": "TCP",
"pollingRate": 1000,
"defaultUnitId": 1,
"defaultBitOrder": "BigEndian",
"defaultWordOrder": "HighFirst"
},
"variables": [
{
"key": "temperature",
"address": 0,
"registerType": "HoldingRegister",
"dataType": "Float64"
},
{
"key": "pressure",
"address": 4,
"registerType": "HoldingRegister",
"dataType": "Int32"
}
]
}
{
"type": "ModbusReader",
"config": {
"endpoint": "/dev/ttyUSB0",
"transport": "RTU",
"pollingRate": 1000,
"defaultUnitId": 1,
"baudRate": 9600,
"dataBits": 8,
"parity": "None",
"stopBits": 1
},
"variables": [
{
"key": "sensor_value",
"address": 0,
"registerType": "InputRegister",
"dataType": "UInt16"
}
]
}
{
"type": "ModbusWriter",
"config": {
"endpoint": "192.168.1.100:502",
"transport": "TCP",
"defaultUnitId": 1
},
"variables": [
{
"key": "setpoint",
"address": 100,
"registerType": "HoldingRegister",
"dataType": "Float32"
},
{
"key": "enable",
"address": 0,
"registerType": "Coil"
}
]
}

Holding Registers(読み取り/書き込み)

Section titled “Holding Registers(読み取り/書き込み)”

読み取りおよび書き込みが可能な汎用レジスタ。

{
"key": "temperature",
"address": 0,
"registerType": "HoldingRegister",
"dataType": "Float64"
}

機能コード: Read(03)、Write Single(06)、Write Multiple(16)

通常センサーデータに使用される読み取り専用レジスタ。

{
"key": "sensor_reading",
"address": 0,
"registerType": "InputRegister",
"dataType": "Int16"
}

機能コード: Read(04)

Coils(読み取り/書き込みブール値)

Section titled “Coils(読み取り/書き込みブール値)”

デジタル出力用の単一ビットレジスタ。

{
"key": "motor_enable",
"address": 0,
"registerType": "Coil"
}

機能コード: Read(01)、Write Single(05)、Write Multiple(15)

Discrete Inputs(読み取り専用ブール値)

Section titled “Discrete Inputs(読み取り専用ブール値)”

デジタル入力用の読み取り専用単一ビットレジスタ。

{
"key": "limit_switch",
"address": 0,
"registerType": "DiscreteInput"
}

機能コード: Read(02)

// 16ビット符号付き整数(-32768から32767)
{"dataType": "Int16"} // 1レジスタ
// 16ビット符号なし整数(0から65535)
{"dataType": "UInt16"} // 1レジスタ
// 32ビットfloat(4バイト)
{"dataType": "Float32"} // 2レジスタ
// 64ビットfloat(8バイト)
{"dataType": "Float64"} // 4レジスタ
// ASCII文字(レジスタあたり1バイト)
{"dataType": "AsciiChar"} // 1レジスタ

Modbusデバイスは異なるバイトおよびワード順序を使用できます。デバイスに合わせて設定してください:

{
"defaultBitOrder": "BigEndian" // または "LittleEndian"
}
  • BigEndian: 最上位バイトが最初(デフォルト、最も一般的)
  • LittleEndian: 最下位バイトが最初

マルチレジスタ値(32ビット、64ビット)の場合:

{
"defaultWordOrder": "HighFirst" // または "LowFirst"
}
  • HighFirst: 上位ワードが最初(デフォルト)
  • LowFirst: 下位ワードが最初
{
"key": "special_value",
"address": 10,
"registerType": "HoldingRegister",
"dataType": "Float32",
"bitOrder": "LittleEndian",
"wordOrder": "LowFirst"
}

シリアル接続でのModbus RTUの場合:

{
"endpoint": "/dev/ttyUSB0",
"transport": "RTU",
"baudRate": 9600,
"dataBits": 8,
"parity": "None",
"stopBits": 1,
"timeout": 1000
}

パラメータ:

  • baudRate: 1200、2400、4800、9600、19200、38400、57600、115200
  • dataBits: 7または8
  • parity: None、Even、Odd
  • stopBits: 1または2
  • timeout: ミリ秒単位の読み取りタイムアウト

Modbusは、Unit IDを使用して同じネットワーク上の複数のデバイスをサポートします:

{
"defaultUnitId": 1 // すべての変数のデフォルト
}

変数ごとのオーバーライド:

{
"key": "device2_temp",
"address": 0,
"registerType": "HoldingRegister",
"dataType": "Float32",
"unitId": 2 // この変数のオーバーライド
}

1. エネルギーメーター読み取り

Section titled “1. エネルギーメーター読み取り”
{
"type": "ModbusReader",
"config": {
"endpoint": "192.168.1.50:502",
"transport": "TCP",
"pollingRate": 5000,
"defaultUnitId": 1
},
"variables": [
{
"key": "voltage",
"address": 0,
"registerType": "InputRegister",
"dataType": "Float32"
},
{
"key": "current",
"address": 2,
"registerType": "InputRegister",
"dataType": "Float32"
},
{
"key": "power",
"address": 4,
"registerType": "InputRegister",
"dataType": "Float32"
},
{
"key": "energy",
"address": 6,
"registerType": "InputRegister",
"dataType": "Float64"
}
]
}
{
"type": "ModbusWriter",
"config": {
"endpoint": "192.168.1.100:502",
"transport": "TCP",
"defaultUnitId": 1
},
"variables": [
{
"key": "motor_speed",
"address": 100,
"registerType": "HoldingRegister",
"dataType": "UInt16"
},
{
"key": "motor_start",
"address": 0,
"registerType": "Coil"
},
{
"key": "motor_stop",
"address": 1,
"registerType": "Coil"
}
]
}

3. マルチデバイスネットワーク

Section titled “3. マルチデバイスネットワーク”
{
"type": "ModbusReader",
"config": {
"endpoint": "/dev/ttyUSB0",
"transport": "RTU",
"pollingRate": 1000,
"baudRate": 9600
},
"variables": [
{
"key": "device1_temp",
"address": 0,
"registerType": "HoldingRegister",
"dataType": "Float32",
"unitId": 1
},
{
"key": "device2_temp",
"address": 0,
"registerType": "HoldingRegister",
"dataType": "Float32",
"unitId": 2
},
{
"key": "device3_temp",
"address": 0,
"registerType": "HoldingRegister",
"dataType": "Float32",
"unitId": 3
}
]
}

解決策:

  • エンドポイントアドレスとポートを確認
  • ネットワーク接続を確認
  • タイムアウト値を増やす
  • デバイスの電源が入っていて応答していることを確認

解決策:

  • バイト順序を確認(BigEndian vs LittleEndian
  • ワード順序を確認(HighFirst vs LowFirst
  • データ型がデバイス仕様と一致することを確認
  • レジスタアドレスが正しいことを確認

解決策:

  • シリアルケーブル接続を確認
  • ボーレートがデバイスと一致することを確認
  • パリティとストップビット設定を確認
  • 適切な終端抵抗を確認
  • バス衝突を避けるためにポーリング頻度を減らす

一般的なModbus例外コード:

  • 01: 不正な機能
  • 02: 不正なデータアドレス
  • 03: 不正なデータ値
  • 04: スレーブデバイスエラー
  1. 読み取り専用から開始: 書き込み前にInput Registerでテスト
  2. 適切なポーリングを使用: デバイスが応答できる速度より速くポーリングしない
  3. 連続レジスタをグループ化: 散在した読み取りよりも効率的
  4. バイト順序を文書化: デバイス固有の設定に関するメモを保持
  5. Unit IDをテスト: 各デバイスがそのUnit IDに応答することを確認
  • OPC UA - 代替産業プロトコル
  • Siemens S7 - Siemens PLC直接通信
  • Filter - Modbusデータをフィルタリング
  • SQL Writer - Modbusデータをデータベースに保存