Raspberry Pi(以下Raspi)とPLCをつなぐ方法は、大きく (A) ネットワーク通信(ソケット/各種産業プロトコル) と (B) I/O連携(SSRなどのリレー経由) の2系統です。
ここでは両方の手順・サンプルコード・注意点をまとめます。
1. まずはPLCの通信機能を確認
- ソケット通信(TCP/UDP) をサポートしているか
- EtherNet/IP、Modbus TCP、MCプロトコル、PROFINET などの産業プロトコルに対応しているか
- IPアドレス、ポート番号、データ形式を把握
👉 いずれかに対応していれば、LANケーブル接続でRaspiと直接通信可能です。
2. Raspi側:Pythonでのネットワーク通信
汎用ソケット通信(TCP)の例
送信(Raspi → PLC)
import socket
HOST = "192.168.0.10" # PLCのIP
PORT = 502 # 例: Modbus TCPのデフォルト
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(5.0)
s.connect((HOST, PORT))
s.sendall(b"Hello PLC") # PLCが期待するバイト列に合わせて送信
data = s.recv(1024) # 応答を受信
print("受信:", data)
受信(PLC → Raspi)
import socket
HOST = "0.0.0.0"
PORT = 502
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(1)
print("待ち受け開始")
conn, addr = s.accept()
with conn:
print("接続:", addr)
while True:
buf = conn.recv(1024)
if not buf:
break
print("受信:", buf)
conn.sendall(b"OK")
3. ソケット通信が使えない場合:I/O連携(SSR利用)
3.1 電圧・絶縁の要点(超重要)
- RaspiのGPIO出力は 3.3V
- PLCのデジタル入力は通常 24V系
- 直接接続は厳禁。必ず SSR(ソリッドステートリレー) や フォトカプラ で電気的に分離する。
👉 物理リレーは接点摩耗で故障しやすいため、SSR推奨。
3.2 おすすめ例:SSR-25DD(DC-DC)
- 入力:3–32V DC(Raspi GPIOでも駆動可能。ただしGPIO電流の余裕に注意)
- 出力:5–220V DC(PLCの24V入力を開閉可能)
- 大電流品のため 発熱・放熱 に注意。小電流用途なら小型のフォトカプラモジュールの方が扱いやすい。
3.3 I/Oの構成例
- 1本目のIO:Raspi → PLC(結果の出力)
- 2本目のIO:Raspi → PLC(死活監視信号)
3.4 プログラムの構成
1.画像取得
2.判定結果を1本目のIOに出力
3.2本目のIOのStateを変える(0->1->0)
1.-3.をwhile文で無限ループする
PLCは決まったタイミングで1本目の出力を読み取り
2本目の立ち上がり(立ち下がりでも良し)が前回稼働時と比べて一度も無ければ、Raspiとの通信不良エラーを出力する
まとめ
- PLCにソケット通信機能があればLANケーブルで接続し、Pythonで通信可能
- 通信機能がなければSSRを使い、I/O制御で連携
- 物理リレーよりSSRを推奨
RaspiとPLCを組み合わせることで、低コストかつ柔軟に自動化や監視システムを構築できます。