Pythonでキーエンス製PLC上位リンク通信機能のやり方は簡単にソケット通信でできる
PLCとPCのデータ連携
PLC内のデータをPCから読み出してデータ活用をする機会が増えました。そこで、今回は、キーエンス製のPLCとPCとのデータ連携を可能にする機能である「上位リンク通信」でのTCP通信をpython言語で試してみた。
python言語でTCP/IP通信
以外と簡単にPLCとの通信ができることがわかりました。下記の通り今回は3つのやり方についてソースコードを載せました。
- 機種問合せコマンド
- 読み出しコマンド
- 書き込みコマンド
下記は、機種の問合せを行うコマンドを投げて応答を返すソースコードです。
import logging import socket logging.basicConfig(level=logging.DEBUG, format='%(threadName)s: %(message)s') host_ip = '198.168.50.14' # PLCのIPアドレス host_port = 8501 # 上位リンク通信のポート番号(デフォルト値) logging.debug('start') client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socket.AF_INETでip4を使うことを指定。socket.SOCK_STREAMでTCPを使うことを指定。 try: #クライアント接続 client.connect((host_ip,host_port)) # サーバーに接続(kv-7500にTCP接続/上位リンク通信) except: print("PLC接続NG") comand = "?K\r" # 上位リンク通信のコマンド(これは機種の問い合わせコマンド) client.send(comand.encode("ascii")) # 上位リンク通信のデータコードがASCIIなのでエンコード print("send : " + comand) response = client.recv(64) #受信用バイト配列を定義しておく(responseのバイト数以上を設定しておく) response = response.decode("UTF-8") # PLCからの返答がbyteデータなのでUTF-8にデコード client.close() print("Received :" ,response) logging.debug('end') #-------------# #PLC機種問合せ# #-------------# ###--response--### ###--正常終了時--### #MainThread: start #send : ?K #Received : 55 #MainThread: end ###--接続NG終了時--### #MainThread: start #PLC接続NG
次に、データの読み出しコマンドのやり方を載せます。
PLC内のデバイス値の値は下記通りに適当に入れてたとします。
デバイス値 | 値 | 表示 | コメント |
DM53000 | 7 | ±10進数32Bit | データ1 |
DM53002 | 1203 | ±10進数32Bit | データ2 |
import logging import socket logging.basicConfig(level=logging.DEBUG, format='%(threadName)s: %(message)s') host_ip = '198.168.50.14' # PLCのIPアドレス host_port = 8501 # 上位リンク通信のポート番号(デフォルト値) logging.debug('start') client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socket.AF_INETでip4を使うことを指定。socket.SOCK_STREAMでTCPを使うことを指定。 try: #クライアント接続 client.connect((host_ip,host_port)) # サーバーに接続(kv-7500にTCP接続/上位リンク通信) except: print("PLC接続NG") comand = "RD DM53000.D\r" # 上位リンク通信のコマンド(データ読み出しコマンド) #comand = "RDS DM53000.D 2\r" # 上位リンク通信のコマンド(データ連続読み出しコマンド) #[.D]⇒±10進数32BIT表示・・・返り値は10桁の0埋め数値 client.send(comand.encode("ascii")) # 上位リンク通信のデータコードがASCIIなのでエンコード print("send : " + comand) response = client.recv(64) #受信用バイト配列を定義しておく response = response.decode("UTF-8") # PLCからの返答がbyteデータなのでUTF-8にデコード client.close() print("Received :" ,response) logging.debug('end') #------------# #データ読出し# #------------# ###--response--### ###--正常終了時--### #MainThread: start #send : RD DM53000.D #Received : 0000000007 #MainThread: end ###--接続NG終了時--### #MainThread: start #PLC接続NG #----------------# #データ連続読出し# #----------------# #MainThread: start #send : RD DM53000.D 2 #Received : 0000000007 0000001203 #MainThread: end
responseで返ってくる値は、10桁0埋めなので、データ処理する際はご注意下さい。
ちなみに、コマンドの
comand = "RD DM53000.D\r" #comand = "RDS DM53000.D 2\r"
のコメント(‘#’)を入れ替えるとデータ連続読み出しになります。
次のコマンドは書き出しコマンドのやり方です。
import logging import socket logging.basicConfig(level=logging.DEBUG, format='%(threadName)s: %(message)s') host_ip = '198.168.50.14' # PLCのIPアドレス host_port = 8501 # 上位リンク通信のポート番号(デフォルト値) logging.debug('start') client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socket.AF_INETでip4を使うことを指定。socket.SOCK_STREAMでTCPを使うことを指定。 try: #クライアント接続 client.connect((host_ip,host_port)) # サーバーに接続(kv-7500にTCP接続/上位リンク通信) except: print("PLC接続NG") comand = "WR DM53000.D 111111\r" # 上位リンク通信のコマンド(データ書き出しコマンド) #comand = "WRS DM53000.D 2 12345 333\r" # 上位リンク通信のコマンド(データ連続書き出しコマンド) #[.D]⇒±10進数32BIT表示・・・返り値は10桁の0埋め数値 client.send(comand.encode("ascii")) # 上位リンク通信のデータコードがASCIIなのでエンコード print("send : " + comand) response = client.recv(64) #受信用バイト配列を定義しておく response = response.decode("UTF-8") # PLCからの返答がbyteデータなのでUTF-8にデコード client.close() print("Received :" ,response) logging.debug('end') #--------------# #データ書き出し# #--------------# ###--response--### ###--正常終了時--### #MainThread: start #send :WR DM53000.D 111111 #Received :OK #MainThread: end ###--接続NG終了時--### #MainThread: start #PLC接続NG #------------------# #データ連続書き出し# #------------------# #MainThread: start #send :WR DM53000.D 12345 333 #Received :OK #MainThread: end
コマンドの詳細は、キーエンスPLCのユーザーマニュアルの「上位リンク通信」を参照して下さい。
以上、Python言語でPLCとTCP通信してみました。これを応用してデータのやりとりやデータ収集などの応用ができますね。
その他、C#でTCP通信のやり方
【PLC】キーエンスKV-7500で上位リンク通信でPCとPLCの通信を確立してデータを読み書きする方法