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の通信を確立してデータを読み書きする方法