1. TOP
  2. Python
  3. PLC通信
  4. 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接続先ポート番号

戻り値
戻り値MCProtcol3Eオブジェクト

mcp = MCProtcol3E('192.168.0.41', 4999)

メソッド

read(memAddres, size, unitOfBit)

メモリエリアの読み出し

パラメータ
memAddresメモリアドレス
size読出し点数
unitOfBitTrue = ビット単位, 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ビット数(ビット単位で書込みするときのみ指定)

戻り値
戻り値00 00 (正常終了)

対応メモリアドレス

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ダブルワード読出しアドレス(カンマ区切り)

戻り値
戻り値00 00 (正常終了)

対応メモリアドレス

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

rcv = mcp.MonitorGet()

データ変換用メソッド

print(mcp.toInt16(data))

受け取ったデータのバイト列(bytes)を変換するためのメソッド
バイト列のデータがどのようなデータかによってメソッドが変わります

メソッド名変換するデータの長さ
toBinビット列
WordtoBin16ビット単位のビット列
toInt1616bit数値
toUInt1616bit符号なし
toInt3232bit数値
toUInt3232bit符号なし
toInt6464bit数値
toUInt6464bit符号なし
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からダウンロードできます

GitHub MC-Protocol


このサイトが役に立ったと感じたら、ご支援いただけると嬉しいです

この記事へのコメント