Pythonでキーエンス製PLC上位リンク通信機能のやり方は簡単にソケット通信でできる

Python

ad2

Pythonでキーエンス製PLC上位リンク通信機能のやり方は簡単にソケット通信でできる

PLCとPCのデータ連携

PLC内のデータをPCから読み出してデータ活用をする機会が増えました。そこで、今回は、キーエンス製のPLCとPCとのデータ連携を可能にする機能である「上位リンク通信」でのTCP通信をpython言語で試してみた。

python言語でTCP/IP通信

以外と簡単にPLCとの通信ができることがわかりました。下記の通り今回は3つのやり方についてソースコードを載せました。

  1. 機種問合せコマンド
  2. 読み出しコマンド
  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】PCとリンクしてリアルタイムデータを読み書きして連携する

【PLC】キーエンスKV-7500で上位リンク通信でPCとPLCの通信を確立してデータを読み書きする方法