【SiO】pythonによる光電センサ-,電動シリンダー通信制御 | 簡易PLCによるIoT実装

python
  • SiO(簡易PLC)の制御をpythonのソケット通信で実行する方法
  • 光電センサーやスイッチ等の入力信号の受取り、電動シリンダーやランプ,ブザーなどの制御をpythonで実施する方法

SiOとは

SiOとはIoTを簡単に実装することができるコントローラーです。

工場の生産ラインなどではPLC(Programmable logic controller)を用いて各種センサーやブザー、シリンダーなどの制御をするのが一般的です。
ただし、小規模で気軽にこのようなセンサーやシリンダーを使う場合は、高価で不便です。
SiOは「PLCを使うまでもないけれど、ちょっと電動化できたら便利」といったケースで非常に便利なツールです。

この記事では、SiOを使ってPCから光電センサーや電動シリンダーなどの機器を制御してみます。
SiOの設定ソフト「SiO-Programmer」でも制御できますが、機械学習との組み合わせなどを想定して、今回はpythonによる制御を実装します。

使用した部品は以下の通りです。

SiOt 本体XAC-0611SUS
電動ストッパXAK-S0501SUS
電動ストッパ用出力ケーブルSUC-1971SUS
e-CON付光電センサ(PZ-G51N)SUC-2771SUS
ACアダプタSUC-2612SUS
USBケーブルSUC-1211SUS
LANケーブル1

それではやっていきましょう!

IPアドレスの設定

SiOのIPアドレス設定

まずはSiOのIPアドレスを設定していきます。
設定には「SiO-Programmer」が必要です。
↓から無料でダウンロードできます。

開いたらPCとSiOをUSBケーブル(SUC-121)で接続し、「コントローラーから読み込み」を実行します。
USBケーブルはSUC-121などの通信ができるものでないとエラーがでますので注意してください。

その後、右下にある<パラメータ設定>のIPアドレスを下記のように設定し、「コントローラーへ登録」を押します。

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で実施してみました。

他のセンサーや、ライト、ブザーも簡単に実装できますので、ぜひ試してみてください。
お疲れ様でした!

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