- SiO(簡易PLC)の制御をpythonのソケット通信で実行する方法
- 光電センサーやスイッチ等の入力信号の受取り、電動シリンダーやランプ,ブザーなどの制御をpythonで実施する方法
SiOとは
SiOとはIoTを簡単に実装することができるコントローラーです。
工場の生産ラインなどではPLC(Programmable logic controller)を用いて各種センサーやブザー、シリンダーなどの制御をするのが一般的です。
ただし、小規模で気軽にこのようなセンサーやシリンダーを使う場合は、高価で不便です。
SiOは「PLCを使うまでもないけれど、ちょっと電動化できたら便利」といったケースで非常に便利なツールです。
この記事では、SiOを使ってPCから光電センサーや電動シリンダーなどの機器を制御してみます。
SiOの設定ソフト「SiO-Programmer」でも制御できますが、機械学習との組み合わせなどを想定して、今回はpythonによる制御を実装します。
使用した部品は以下の通りです。
① | SiOt 本体 | XAC-061 | 1 | SUS |
---|---|---|---|---|
② | 電動ストッパ | XAK-S050 | 1 | SUS |
③ | 電動ストッパ用出力ケーブル | SUC-197 | 1 | SUS |
④ | e-CON付光電センサ(PZ-G51N) | SUC-277 | 1 | SUS |
⑤ | ACアダプタ | SUC-261 | 2 | SUS |
⑥ | USBケーブル | SUC-121 | 1 | SUS |
⑦ | LANケーブル | ー | 1 | ー |
それではやっていきましょう!
IPアドレスの設定
SiOのIPアドレス設定
まずはSiOのIPアドレスを設定していきます。
設定には「SiO-Programmer」が必要です。
↓から無料でダウンロードできます。
開いたらPCとSiOをUSBケーブル(SUC-121)で接続し、「コントローラーから読み込み」を実行します。
USBケーブルはSUC-121などの通信ができるものでないとエラーがでますので注意してください。
SiOの設定はこれだけです。
PCのIPアドレス設定
SiOのネットワークに合わせてPCのIPアドレスを「192.168.0.101」に設定します。
下記はWindowsによるIPの設定を記載します。
コントロールパネルを開き、以下の手順で設定します。
Sioの入出力(I/O)状態読み込み
IPアドレスの設定が完了したら、SiOとPCをLANケーブルで接続します。
まずは、SiOの入出力I/Oの状態を確認してみます。
取説より、I/O状態のコマンドを確認します。
「@R01CRLF」というコマンドで確認できるようなので、これをpythonで実装します。
import socket
# サーバー設定
HOST = '192.168.0.100' # SiOのIPアドレス(ローカルホスト)
PORT = 40001 # SiOと同じポート番号を指定
# ソケット作成
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT)) #Sioに接続
s.sendall(b'@R01CRLF') #Sioにコメント送信 | I/O状態読み出し
data = s.recv(1024) #Sioから最大1024バイトのデータを受信
print(f'受信したデータ: {data.decode()}')
受信したデータ: @R0100000000
このように出力されました。
なにも接続してないので、入力も出力も0となっているのがわかります。
光電センサーの取り付けと情報読み込み
次に、光電センサーを取り付けてI/Oの状態を確認してみます。
このように、IN1にセンサーを取り付けます。
この状態で再度、先ほどのpythonコードを実行します。
・センサーOFF字の出力
受信したデータ: @R0100000000
・センサーON時の出力
受信したデータ: @R0110000000
取説の通り、IN1の場所の出力が、センサーの入力によって0,1と変化しているのがわかります。
5行目の数値が変化するので、下記のコードで光電センサーの出力を取り出せます。
print(data.decode()[4])
電動シリンダーの制御
次に電動ストッパーの制御をしてみます。
↓のように、電動ストッパーとDCMコントローラーをSiOに接続します。
今回は入力ケーブルは使用せず、出力ケーブルのFW(前進)ラベルがあるのケーブルをSiOのOUT1に、BK(後退)ラベルのあるほうをOUT2に接続します。
その後、再度取説より、OUTの変更コマンドを探します。
「@W031000CRLF」というコマンドでシリンダーの前進、「@W032000CRLF」というコマンドで後退ができそうです。
pythonで実装します。
import socket
import time
# サーバー設定
HOST = '192.168.0.100' # SiOのIPアドレス(ローカルホスト)
PORT = 40001 # SiOと同じポート番号を指定
# ソケット作成
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT)) #Sioに接続
s.sendall(b'@W031000CRLF') #Sioにコメント送信 | シリンダー前進
time.sleep(5)
s.sendall(b'@W032000CRLF') #Sioにコメント送信 | シリンダー後退
シリンダーが前進し、5秒後に後退させることができました。
光電センサーと電動シリンダーの連携
最後に、これまでの方法を組み合わせて、光電センサーと電動シリンダーを連携して制御してみます。
1秒毎に、光電センサーのON/OFFを確認し、OFFであればシリンダー後退、ONであれば前進させてみます。
以下のコードで実行します。
import socket
import time
# サーバー設定
HOST = '192.168.0.100' # SiOのIPアドレス(ローカルホスト)
PORT = 40001 # SiOと同じポート番号を指定
# ソケット作成
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT)) #Sioに接続
while True: #1秒ごとにI/Oの状態を確認
time.sleep(1)
s.sendall(b'@R01CRLF')
data = s.recv(1024)
print(data.decode()[4])
if data.decode()[4] == '0': #光電センサーOFF
s.sendall(b'@W031000CRLF') #Sioにコメント送信 | シリンダー前進
if data.decode()[4] == '1': #光電センサーON
s.sendall(b'@W032000CRLF') #Sioにコメント送信 | シリンダー後退
狙い通り動作することが確認できました。
今回はSiOを使って、光電センサーや電動シリンダーの制御をpythonで実施してみました。
他のセンサーや、ライト、ブザーも簡単に実装できますので、ぜひ試してみてください。
お疲れ様でした!