Pythonでキーエンス製PLC上位リンク通信機能のやり方は簡単にソケット通信でできる
PLCとPCのデータ連携
PLC内のデータをPCから読み出してデータ活用をする機会が増えました。そこで、今回は、キーエンス製のPLCとPCとのデータ連携を可能にする機能である「上位リンク通信」でのTCP通信をpython言語で試してみた。
python言語でTCP/IP通信
以外と簡単にPLCとの通信ができることがわかりました。下記の通り今回は3つのやり方についてソースコードを載せました。
- 機種問合せコマンド
- 読み出しコマンド
- 書き込みコマンド
下記は、機種の問合せを行うコマンドを投げて応答を返すソースコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
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 |
ちなみに、コマンドの
1 2 3 |
comand = "RD DM53000.D\r" #comand = "RDS DM53000.D 2\r" |
のコメント(‘#’)を入れ替えるとデータ連続読み出しになります。
次のコマンドは書き出しコマンドのやり方です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
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通信のやり方