PLC-Python 通信コマンドまとめ3 【オムロン、RS232C】

スポンサーリンク

スポンサーリンク

はじめに

前回はオムロン、キーエンスの 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 通信についても説明できればと思います。

コメント

タイトルとURLをコピーしました