はじめに
前回はオムロン、キーエンスの PLC と TCP/UDP で通信する方法について説明しました。
今回はオムロンの PLC と RS232C で通信する方法について説明します。
RS232C での交信には専用のケーブルが必要です。
オムロンから直接購入するか、ミスミで結線方式を指定して購入する必要があります。
前提条件
前提条件は以下の通りです。
- PLC と PC を RS232C で接続してあること
- PC側で RS232C の接続が確認できていること (デバイスマネージャ
- PC に USB ポートしかない場合はこちらの変換器をご使用ください。
(Windows, ラズパイで実績あり)
通信用プログラム
通信用プログラムは、以下がベースとなります。
import serial
import time
Serial_client = serial.Serial(
'/dev/ttyUSB0',
baudrate=115200,
timeout=3,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE
)
# フレームチェックシーケンス計算
def getfcs(data):
list_data = list(data)
t_data = list(hex(ord(list_data[0])))
u_data = int(t_data[2])
l_data = int(t_data[3])
for i in range(len(data)-1):
t_data = list(hex(ord(list_data[i+1])))
u_data = u_data ^ int(t_data[2])
l_data = l_data ^ int(t_data[3])
u_data = list(hex(u_data))
l_data = list(hex(l_data))
fcs_data = u_data[2].upper() + l_data[2].upper()
data = fcs_data
return data
# コマンド送信受信処理
open() や close() がなくても動いてくれます。
正確に記述したい場合はこちらの公式サイトをご参考ください。
ボーレートやバイトサイズ、パリティ、ストップビットはお使いの PLC の設定に合わせてください。
getfcs 関数は、データの欠損等を検出するために必要です。
受信したプロトコルにも適用した方が確実です。
ですが、ノイズの少ない環境下であれば気にしなくていいと思います。
CJ Series (CJ1, CJ2)
CJ シリーズはペリフェラルポートでも通信可能です。
その場合、PLC 前面スイッチ (4番?) をいじるのでメンテナンスが手間になります。
# ================= CJ Series Serial ===================== #
# command = "@00FA500000000"
# + read("0101") or write ("0102")
# + register_class
# + register_number (HEX)
# + read_length
# Dレジスタ7D4400=32068番 - 32074番の読込
command = "@00FA5000000000101" + "82" + "7D4400" + "0007"
fcs = getfcs(command)
command += fcs + '*' + '\r'
command = command.encode()
Serial_client.write(command)
time.sleep(0.09)
data = Serial_client.read_all()
data1 =data[23:]
data1 = data1[:-4]
return_data = [0] * 6
return_data[0] = data1[8:10] + data1[10:12]
return_data[1] = data1[12:16]
return_data[2] = data1[16:20]
return_data[3] = data1[20:24]
return_data[4] = data1[20:28]
return_data[5] = data1[4:8] + data1[:4]
if "DEVICE_IS_DEC":
convert_data = [int(s) for s in return_data]
elif "DEVICE_IS_HEX":
convert_data = [int(s, 16) for s in return_data]
交信コマンドの末尾には * と \r が必須です。これがないと PLC はずっと待機状態になってしまいます。
先頭には @ を付けることで、PLC が待機状態に入ります。
write 指令の後の time.sleep(0.09) は PLC からの回答が来るまでの待機時間です。
これがないと、read_all() を実行しても空です。
待機時間は RS232C ケーブルの長さによって変わります。ケーブルが短ければ待機時間も短いです。
CPM2
CPM2 も RS232C で交信可能です。
注意点としては
- DM レジスタのみ対応
- レジスタ番号は 10 進数で指定
# ================= CPM2 Series Serial ===================== #
# command = "@00"
# + read("RD") or write ("WR"??)
# + register_number (DEC)
# + read_length
# Dレジスタ8000番 - 8006番の読込
command = "@00RD" + "8000" + "0007"
fcs = getfcs(command)
command += fcs + '*' + '\r'
command = command.encode()
Serial_client.write(command)
time.sleep(0.09)
data = Serial_client.read_all()
data1 =data[7:]
data1 = data1[:-4]
return_data = [0] * 6
return_data[0] = data1[8:12]
return_data[1] = data1[12:16]
return_data[2] = data1[16:20]
return_data[3] = data1[20:24]
return_data[4] = data1[20:28]
return_data[5] = data1[4:8] + data1[:4]
if "DEVICE_IS_DEC":
convert_data = [int(s) for s in return_data]
elif "DEVICE_IS_HEX":
convert_data = [int(s, 16) for s in return_data]
おわりに
今回はオムロンのシーケンサと RS232C で通信する方法について説明しました。
この方法を使用すれば、古いシーケンサとも通信することが可能です。
需要があれば CIP 通信についても説明できればと思います。
コメント