MITSUBISHI MC-Protocol通信
概略
三菱 シーケンサの通信プロトコル MCプロトコル を使ってPythonからデバイスの値を読み書きします
動作環境
動作確認環境: Win10
python3.9
MITSUBISHI MC Protocol Frame3E UDP/IP Connection
構成

メソッド一覧
| メソッド | 内容 |
| read | メモリエリアの読み出し |
| write | メモリエリアへ書き込み |
| RandomRead | 不連続デバイスの読出し |
| MonitorSet | モニタするデバイスを登録 |
| MonitorGet | 登録したデバイスの値を読出し |
オブジェクトの作成
MCProtcol3E(IPAddress, Port)
パラメータ
| IPAddress | 接続先IPアドレス |
| Port | 接続先ポート番号 |
戻り値
例
mcp = MCProtcol3E('192.168.0.41', 4999)
メソッド
read(memAddres, size, unitOfBit)
メモリエリアの読み出し
パラメータ
| memAddres | メモリアドレス |
| size | 読出し点数 |
| unitOfBit | True = ビット単位, False = ワード単位 |
戻り値
読み出したデータはデータ変換メソッドで変換してください
対応メモリアドレス
X, Y, M, L, F, V, B, D, W, TS, TC, TN, SS, SC, SN, CS, CC, CN, SB, SW, S ,DX, DY, SM, SD
例
# bits単位
data = mcp.read('M0', 8, True)
# word単位
data = mcp.read('D0', 1, False)
write(memAddres, data, bitSize)
メモリエリアへ書き込み
パラメータ
| memAddres | メモリアドレス |
| data | 書込みデータ (バイト配列) |
| bitSize | ビット数(ビット単位で書込みするときのみ指定) |
戻り値
対応メモリアドレス
X, Y, M, L, F, V, B, D, W, TS, TC, TN, SS, SC, SN, CS, CC, CN, SB, SW, S ,DX, DY, SM, SD
例
# E0_0からdataを書込み
rcv = finsudp.write('E0_0', data)
RandomRead(worddevice, dworddevice)
不連続デバイスの読出し
パラメータ
| worddevice | ワード読出しアドレス(カンマ区切り) |
| dworddevice | ダブルワード読出しアドレス(カンマ区切り) |
戻り値
対応メモリアドレス
X, Y, M, L, F, V, B, D, W, TN, SN, CN, SB, SW, S ,DX, DY, SM, SD
例
rcv = mcp.RandomRead('D0,TN0,M100,X20', 'D1500,Y160,M1111')
MonitorSet(worddevice, dworddevice)
モニタするデバイスを登録
パラメータ
| worddevice | ワード読出しアドレス(カンマ区切り) |
| dworddevice | ダブルワード読出しアドレス(カンマ区切り) |
戻り値
対応メモリアドレス
X, Y, M, L, F, V, B, D, W, TN, SN, CN, SB, SW, S ,DX, DY, SM, SD
例
rcv = mcp.MonitorSet('D50, D55', 'D60, D64')
MonitorGet()
登録したデバイスの値を読出し
対応メモリアドレス
X, Y, M, L, F, V, B, D, W, TN, SN, CN, SB, SW, S ,DX, DY, SM, SD
例
データ変換用メソッド
例
受け取ったデータのバイト列(bytes)を変換するためのメソッド
バイト列のデータがどのようなデータかによってメソッドが変わります
| メソッド名 | 変換するデータの長さ |
| toBin | ビット列 |
| WordtoBin | 16ビット単位のビット列 |
| toInt16 | 16bit数値 |
| toUInt16 | 16bit符号なし |
| toInt32 | 32bit数値 |
| toUInt32 | 32bit符号なし |
| toInt64 | 64bit数値 |
| toUInt64 | 64bit符号なし |
| toFloat | 浮動小数点 |
| toDouble | 倍精度 |
| toString | 文字列 |
使用例
# example
# set IPAddress,Port
mcp = MCProtcol3E('192.168.250.41', 4999)
# words
data = mcp.read('D10000', 1)
print(mcp.toInt16(data)) # convert int16 out> [0]
rcv = mcp.write('D10', data)
print(rcv) # normal recieve out> b'\x00\x00'
# bits
#data = mcp.read('M8000', 8, True)
data = mcp.read('M0', 16, True)
print(data) # out> b'\x00\x00\x00\x00\x00\x00\x00\x00
print(mcp.toBin(data)) # out> 0000000000000000
rcv = mcp.write('M100', data, 8)
print(rcv) # out> b'\x00\x00'
data = mcp.read('D0', 1, False)
print(mcp.WordToBin(data)) # out> 0000000000000000
# numeric
data = struct.pack('hhh', 123, 456, 789)
rcv = mcp.write('D20', data)
print(rcv) # out> b'\x00\x00'
# float
data = struct.pack('f', 1.23)
rcv = mcp.write('D10020', data)
print(rcv) # out> b'\x00\x00'
# bits
data = [0x11, 0x11, 0x10]
rcv = mcp.write('M8100', data, 5)
# RandomRead
rcv = mcp.RandomRead('D0,TN0,M100,X20', 'D1500,Y160,M1111')
print(rcv) # out> b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
print(mcp.toInt16(rcv[:8])) # out> [0, 0, 0, 0]
print(mcp.toInt32(rcv[8:])) # out> [0, 0, 0]
# Monitor
data = mcp.MonitorSet('D50, D55', 'D60, D64')
rcv = mcp.MonitorGet()
print(mcp.toInt16(rcv[:4])) # out> [50, 55]
print(mcp.toInt32(rcv[4:])) # out> [3997756, 4259904]
Qiita記事
三菱MELSEC MCプロトコルをpythonで送信
GitHub
GitHubからダウンロードできます
MC-Protocol
このサイトが役に立ったと感じたら、ご支援いただけると嬉しいです