LoginSignup
35
36

More than 1 year has passed since last update.

PythonでMCプロトコルを使用してPLCのデータを取り出す

Last updated at Posted at 2020-12-01

三菱電機株式会社製の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でライブラリを作成すると本当に楽なのでおすすめです。

35
36
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
36