三菱電機株式会社製のPLCからデータを読み出す, 書き込む際には,
MCプロトコルという通信プロトコルを通信フォーマットでデータのやり取りを行う必要があります.
すでにQiitaにはMCプロトコルの説明や実装を紹介する記事を先駆者様たちが投稿されていましたが,
この度PythonのMCプロトコルライブラリpymcprotocolを作成いたしましたので紹介いたします.
PyPI: https://pypi.org/project/pymcprotocol/
APIリファレンス: https://pymcprotocol.netlify.app/pymcprotocol.html
github: https://github.com/yohei250r/pymcprotocol
対応PLC
Qシリーズ, Lシリーズ, QnA, iQ-R, iQ-Lシリーズに対応.
iQ-RシリーズのみQシリーズと異なるので, 明確に指定する必要があります。
動作確認はQシリーズでのみ行っています。
(Aシリーズは3Eフレームには対応していないため, 現状は不可です.)
対応通信フォーマット
MCプロトコル3Eタイプ(バイナリ形式, ASCII形式)を実装しています.
4Eタイプは実装していますが未テストです。
対応コマンド
- 一括読み込み(ワード単位, ビット単位)
- 一括書き込み(ワード単位, ビット単位)
- ランダム読み込み
- ランダム書き込み(ワード単位, ビット単位)
- リモートRUN, リモートSTOP, リモートRESET, リモートPAUSE
に対応しています.
その他のコマンドですが, 実装が簡単で使用されそうなコマンドを優先して実装する予定です.
要望がありましたら教えて下さい。
インストール
pip install pymcprotocol
PLCの設定
PLCのネットワーク設定でIPアドレス設定, MCプロトコル用のポート開放と, イーサネット通信形式の選択をしてください.
PythonからPLCへ接続
import pymcprotocol
#Qシリーズがデフォルトです
pymc3e = pymcprotocol.Type3E()
#Lシリーズの場合はインスタンス化にplctypeを与えてください
pymc3e = pymcprotocol.Type3E(plctype="L")
#iQ-Rシリーズの場合はインスタンス化にplctypeを与えてください
pymc3e = pymcprotocol.Type3E(plctype="iQ-R")
#イーサネットの接続形式をASCIIにした場合はここで"ascii"を与えてください
#もしMCプロトコルのアクセス経路をデフォルトから変更する場合もこのメソッドから可能です.
pymc3e.setaccessopt(commtype="ascii")
#PLCに設定したIPアドレス, MCプロトコル用ポートに接続
pymc3e.connect("192.168.1.2", 1025)
コマンド発行
#D100からD110まで読み込み
wordunits_values = pymc3e.batchread_wordunits(headdevice="D100", readsize=10)
#X10からX20まで読み込み(ビットデバイスアクセス)
bitunits_values = pymc3e.batchread_bitunits(headdevice="X10", readsize=10)
#D10からD15まで与えた数値を書き込み
pymc3e.batchread_wordunits(headdevice="D10", values=[0, 10, 20, 30, 40])
#Y10からY15まで与えた数値を書き込み(ビットデバイスアクセス)
pymc3e.batchwrite_bitunits(headdevice="Y10", values=[0, 1, 0, 1, 0])
#"D1000", "D2000"をワード単位で読み込み
#"D3000"をダブルワードで読み込み. (D3001が上位16ビットD3000が下位16ビット)
word_values, dword_values = pymc3e.randomread(word_devices=["D1000", "D2000"], dword_devices=["D3000"])
#"D1000"に1000 "D2000"に2000を書き込み
#"D3000"に655362を書き込み. (D3001が上位16ビットD3000が下位16ビット)
pymc3e.randomwrite(word_devices=["D1000", "D1002"], word_values=[1000, 2000],
dword_devices=["D1004"], dword_values=[655362])
#X0とX10にそれぞれ1と0を書き込み
pymc3e.randomwrite_bitunits(bit_devices=["X0", "X10"], values=[1, 0])
リモート動作
#リモートラン,
#clear_mode=0: デバイスクリアをしません.
#clear_mode=1: ラッチデバイス以外をクリアして起動します.
#clear_mode=2: デバイスをクリアして起動します.
pymc3e.remote_run(clear_mode=2, force_exec=True)
#remote stop
pymc3e.remote_stop()
#リモートラッチクリア(PLCが停止していないとエラーになります)
pymc3e.remote_latchclear()
#リモート一時停止
pymc3e.remote_pause(force_exec=False)
#リモートリセット
pymc3e.remote_reset()
まとめ
poetryでライブラリを作成すると本当に楽なのでおすすめです。