メインコンテンツまでスキップ

三菱 MELSEC ドライバ

概要

三菱電機PLCシリーズ (Q / L / iQ-R / iQ-F / FX) のMCプロトコル (3E / 1E) 通信。

項目
opc_typeMELSEC
実装クラスplantpulse.driver.protocol.melsec.Melsec_34_Driver
ライブラリiot-communication (plantpulse.plc.protocol.melsec)
read✅ (バッチモード)
write✅ (Boolean/Integer/Long/Float/Double/String + BIN[n] ワードビットRMW)
セキュリティなし (TCP直結、社内網前提)

OPC登録フォーム

フィールド意味
opc_agent_ipPLC IP192.168.0.60
opc_agent_portMCポート5000 (Q/L 既定 1500)
timecycleポーリング周期 (ms)1000
options.controller-typeシリーズ (Q_L, QnA, IQ_R, A — iQ-F/FX は Q_L)Q_L
options.read-modesingle (タグ単位の個別read、default) / grouped (グループ一括read — 往復を最小化)single
options.batch-gap-wordsgrouped モードでのワードブロック結合を許容するgap16 (default)
options.string-charsetStringタグのエンコーディング (韓国語対応)MS949 (default)
options.enable-iqr-extendediQ-R 拡張デバイス (LCN/LZ/LF/LSTN/LCC/LSC) の直接readfalse (default)

controller-type 未指定時は Q_L を使用 (Q / L シリーズ)。


タグ plc_address 形式

iot-communication 表記。デバイスコード + インデックス (10進) の組み合わせ。

表記意味
D100Data Register 100 (16-bit)
D100.W16-bit word (明示)
D100.D32-bit double word (D100~D101)
D100.F32-bit float (D100~D101)
M100Internal relay 100 (1 bit)
X100Input X100 (1 bit)
Y100Output Y100 (1 bit)
B0Link relay
W100Link register
R100File register

D Data Register、M Coil、X/Y I/O、R File Reg、W Link Reg。


data_type / format マッピング

data_typeformat幅 / 解釈
Boolean / Bool(empty)1-bit (M, X, Y など)
Short / Int / Integer(empty)16-bit signed (W)
UInt16UI / UWORD16-bit unsigned
Int32 / DWordDW32-bit signed (2ワード)
UInt32UDW32-bit unsigned
Float / REALREAL32-bit IEEE 754
Double / LREALLREAL64-bit IEEE 754
StringSTR[N]Nワード → 2NバイトASCII

バッチモード (IS_BATCH_MODE=true) が既定で有効です。単一PLCの全タグを1回のread要求にまとめて 処理します (REQUEST_LIMIT=1)。


よくあるエラーと対処

メッセージ / 症状原因対処
Connection refusedMCプロトコル無効、ポート遮断GX Works で MELSOFT 접속 / TCP / 포트 5000 を有効化
Wrong device codeデバイスコード非対応controller-type の一致を確認 (Q と iQ-R のデバイスコード差異)
32-bit値の不整合byte orderD100.D (signed) / D100.UD (unsigned) を明示
全タグが0network番号 / station番号のmismatchオプションに networkstation を明示 (現在の既定は0)

curl 登録例

curl -X POST http://<edge-host>/api/v1/opc \
-H "Content-Type: application/json" \
-d '{
"opc_id": "OPC_MELSEC_LINE1",
"opc_type": "MELSEC",
"opc_name": "Line1 Q-Series",
"opc_agent_ip": "192.168.0.60",
"opc_agent_port": "5000",
"site_id": "SITE_00001",
"auto_collect": true,
"timecycle": 1000,
"options": { "controller-type": "Q_L" },
"tag_list": [
{
"tag_id": "OPC_MELSEC_LINE1_TAG_00001",
"tag_name": "Counter",
"plc_address": "D100",
"data_type": "Integer"
},
{
"tag_id": "OPC_MELSEC_LINE1_TAG_00002",
"tag_name": "Pressure",
"plc_address": "D200",
"data_type": "Float",
"format": "REAL"
},
{
"tag_id": "OPC_MELSEC_LINE1_TAG_00003",
"tag_name": "PumpRun",
"plc_address": "M100",
"data_type": "Boolean"
}
]
}'

サンプル集 (データタイプ別)

三菱デバイスコード: D (Data)、M (Internal Relay)、X (Input)、Y (Output)、B (Link Relay)、W (Link Register)、R (File Register)、T (Timer)、C (Counter)。

ビット / ブール (Boolean)

data_typeformatplc_address意味
Boolean(empty)M100Internal relay 100
Boolean(empty)X100Input bit X100
Boolean(empty)Y100Output bit Y100
Boolean(empty)B0Link relay 0

16-bit 整数

data_typeformatplc_address意味
Integer(empty)D100Data Register (signed 16)
Integer(empty)D100.W明示的な16-bit Word
IntegerUID100unsigned 16
Integer(empty)W100Link register
Integer(empty)R100File register

32-bit 整数

data_typeformatplc_address意味
IntegerDWD100signed 32 (D100~D101 結合)
Integer(empty)D100.Dライブラリ表記による32-bit signed
IntegerUDWD100unsigned 32
Integer(empty)D100.UDライブラリ表記によるunsigned 32

実数

data_typeformatplc_address意味
FloatREALD200IEEE 754 32-bit (D200~D201)
Float(empty)D200.Fライブラリ表記
DoubleLREALD300IEEE 754 64-bit

文字列

data_typeformatplc_address意味
StringSTR[5]D4005ワード = 10 byte ASCII
StringSTR[16]D50016ワード = 32 byte

Formula の活用

用途data_typefomula備考
整数raw → 実数スケールFloat${VALUE}*0.0112345 → 123.45
カウンタ積算 (他タグとの合計)Integer${VALUE}+${TAG_PREV}直前の積算値を合算
単位変換 (g → kg)Float${VALUE}/1000

curl 総合例

curl -X POST http://<edge-host>/api/v1/opc \
-H "Content-Type: application/json" \
-d '{
"opc_id": "OPC_MELSEC_FULL",
"opc_type": "MELSEC",
"opc_name": "MELSEC iQ-R Full",
"opc_agent_ip": "192.168.0.60",
"opc_agent_port": "5000",
"site_id": "SITE_00001",
"auto_collect": true,
"timecycle": 1000,
"options": { "controller-type": "IQ_R" },
"tag_list": [
{"tag_id":"OPC_MELSEC_FULL_T01", "tag_name":"InternalBit", "plc_address":"M100", "data_type":"Boolean"},
{"tag_id":"OPC_MELSEC_FULL_T02", "tag_name":"InputBit", "plc_address":"X100", "data_type":"Boolean"},
{"tag_id":"OPC_MELSEC_FULL_T03", "tag_name":"DataWord", "plc_address":"D100", "data_type":"Integer"},
{"tag_id":"OPC_MELSEC_FULL_T04", "tag_name":"DataDWord", "plc_address":"D102", "data_type":"Integer", "format":"DW"},
{"tag_id":"OPC_MELSEC_FULL_T05", "tag_name":"Pressure", "plc_address":"D200", "data_type":"Float", "format":"REAL"},
{"tag_id":"OPC_MELSEC_FULL_T06", "tag_name":"Power", "plc_address":"D300", "data_type":"Double", "format":"LREAL"},
{"tag_id":"OPC_MELSEC_FULL_T07", "tag_name":"Batch", "plc_address":"D500", "data_type":"String", "format":"STR[16]"},
{"tag_id":"OPC_MELSEC_FULL_T08", "tag_name":"PressKpa", "plc_address":"D200", "data_type":"Float", "format":"REAL", "fomula":"${VALUE}*0.001"}
]
}'