PLC-Python TCP/UDP 通信コマンドまとめ1【三菱】

スポンサーリンク

スポンサーリンク

はじめに

今回は 三菱シーケンサ の通信コマンドについてまとめていきます。

コマンドの詳細や様々なレジスタへアクセスしたい場合はマニュアルを参照ください。

この記事では読込、書込命令のみを扱います。

前提条件

  • PLC のポートが開放してあること ※ binary 通信指定
  • PLC と PC の ping 導通確認ができていること

通信用プログラム

通信用プログラムは、以下がベースとなります。

import socket

host, port = 8555, "192.168.0.1"

TCP_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   #TCP通信
TCP_client.settimeout(10)
TCP_client.connect((host, port))

UDP_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)   #UDP通信
UDP_client.settimeout(10)
UDP_client.connect((host, port))

# コマンド通信処理


client.close()

TCP / UDP に応じて使い分けてください。

通信用コマンド

Q Series (TCP, UDP 共通)

QSeries PLC に関しては、こちらの記事を参考にコマンド作成しました。

# ================= Qseries TCP and UDP ===================== #
data = [
    0x50,0x00,      # サブヘッダ
    0x00,           # 要求先ネットワーク番号
    0xFF,           # 要求先局番
    0xFF,0x03,      # 要求先ユニットI/O番号
    0x00,           # 要求先マルチドロップ局番
    0x0C,0x00,      # 要求データ長 (後で設定)
    0x01,0x00,      # 監視タイマ
    0x01,0x04,      # コマンド(0401が一括読出し, 1401が一括書き込み)
    0x00,0x00,      # サブコマンド(0000で)
    0x96,0x00,0x00, # 先頭デバイス番号(000096=150)
    0xB0,           # デバイスコード(ZRレジスタ=0xB0, Dレジスタ=0xA8)
    0x07,0x00       # デバイス点数ZR150からZR156
]

#送信長設定
data[7] = len(data[9:]) & 0xFF
data[8] = (len(data[9:]) >> 16) & 0xFF

#送信
client.send(bytes(data))
#受信
response = client.recv(1024)
#受信文変換(バイナリで返ってくる)
data1 = [format(i,'02X') for i in response]
return_data = [0] * 6
# データを取得
return_data[5] = data1[15]
return_data[4] = data1[17]
return_data[3] = data1[19]
return_data[2] = data1[21]
return_data[1] = data1[23]
return_data[0] = data1[14] + data1[13] + data1[12] + data1[11]
convert_data = [int(s, 16) for s in return_data]

三菱では、デバイスがリトルエンディアンとなるので、
return_data[0] のように、反転が必要です。

FX3 Series (TCP, UDP 共通)

FX3Series は特殊で、必ず try ~ finally を使用して client.close() を実行してください。
他のPLCでは時間が経過すればポートが破棄されますが、FX3 は再起動が必要になります。

# ================= FX3Series TCP and UDP ===================== #
data = [
    0x01,0xFF,            # サブヘッダ
    0x05,0x00,            # 要求先ネットワーク番号
    0x96,0x00,0x00,0x00,  # 先頭デバイス番号(000096=150)
    0x20,0x44,           # デバイスコード(Dレジスタ)
    0x07,0x00             # デバイス点数
]

#送信
client.send(bytes(data))
#受信
response = client.recv(1024)
#受信文変換(バイナリで返ってくる)
data1 = [format(i,'02X') for i in response]
return_data = [0] * 6

return_data[0] = data1[6]
return_data[1] = data1[8]
return_data[2] = data1[10]
return_data[3] = data1[12]
return_data[4] = data1[14]
return_data[5] = data1[3] + data1[2]
convert_data = [int(s, 16) for s in return_data]

FX3Series はコマンドが短くて使いやすいです。

iQ-R Series (TCP, UDP 共通)

# ================= iQ-R TCP and UDP ===================== #
data = [
    0x50,0x00,      # サブヘッダ
    0x00,           # 要求先ネットワーク番号
    0xFF,           # 要求先局番
    0xFF,0x03,      # 要求先ユニットI/O番号
    0x00,           # 要求先マルチドロップ局番
    0x0C,0x00,      # 要求データ長 (後で設定)
    0x01,0x00,      # 監視タイマ
    0x01,0x04,      # コマンド(0401が一括読出し1401が一括書込み)
    0x02,0x00,      # サブコマンド(0000で)

    0x6C,0x20,0x00,0x00, # 先頭デバイス番号(00030D40=200000)
    0xA8,0x00,           # デバイスコード(ZRレジスタ=0xB0, Dレジスタ=0xA8)
    0x02,0x00       # デバイス点数ZR200000からZR200005
]

#送信長設定
data[7] = len(data[9:]) & 0xFF
data[8] = (len(data[9:]) >> 16) & 0xFF

#送信
client.send(bytes(data))
#受信
response = client.recv(1024)
#受信文変換(バイナリで返ってくる)
data1 = [format(i,'02X') for i in response]
return_data = data1[-4:]
return_data = [int(s) for s in return_data]

デバイスの指定方法は FX3 に似ています。それ以外の部分は QSeries と同じです。

client.close() について

どのPLCとの交信にも必須の終了処理となります。
client.close() せずにポートが破棄されると、PLC側でポートの再利用ができるようになるのに数分 ~ 10分以上かかることがあります。

おわりに

今回は三菱シーケンサのプロトコル通信のコマンドについて説明しました。
マニュアルを読み込むと、タッチパネルにFTP通信で画像を飛ばして表示するといったこともできるようになります。

次回はキーエンス、オムロンのPLCについてコマンドを紹介します。

あくまで私の覚書ですので、詳細はマニュアルを確認してください。

コメント

タイトルとURLをコピーしました