本記事の適用シーン
まず、SiOとは
誰でも簡単にPLC=制御装置を作ることができるものです。
非常に安価であり、簡単な改善であれば高級なPLCを使わずに安く装置を導入することが可能です。
その中のシリーズでSiOtはイーサネット通信が可能なタイプなのでPCとの相性が非常に良いです。
SiOt(簡易PLC)をpythonで制御することでPCが苦手なセンサー、モーター制御はSiOtがやり、PC側は得意な画像処理や信号処理をすることができます。
本記事はwindows PCを使い、python言語でSiOtを制御する方法を紹介するものです。
今回は準備・確認編です。
SiOtとPC接続の概要
SiOtとPCの接続はLANケーブルで行います。そして、ソケット通信という技術を用いてコマンドをPCからSiOtへ送信し、返信されたコマンドを確認することで様々なことができます。
代表的にできることとして2つあります。
①SiOtに接続されている機器の状態を確認する
以下の例はPCがSiOtにつながっているボタンが押されているかどうかを確認しています。
ボタンが押されていることがPCが確認できるとそれをトリガーでPC側で制御しているカメラで撮像して判定したり、センサー値を読み取ってcsvに保存したりすることができます。
②SiOtに接続されている機器を動作させる
以下の例はPCがSiOtにつながっているランプを点けています。
PC側からSiOtの機器を動作させられるとPCでの処理が終了した後にランプを点灯して人に次の作業を促したり、ストッパーやローラーを動作させて対象物を次の工程へ運ぶことができます。
準備するもの
- windows OSのPC
- SiOt
- スイッチボックス(2点/照光)SUC-515
- LANケーブル
PCとSiOtの通信設定
LANケーブルを使って、ソケット通信をするためにはPC側とSiOt側両方に設定が必要です。
そして、その際に必要な設定が以下の通りです。
PC側
IP、サブネットマスク
SiOt
IP、サブネットマスク、ポート
それぞれの設定値は以下の通りになります。
windowsPCの設定方法は以下のサイトを参考にしてみてください。
DNSサーバーの部分は設定は必要ありません。
SiOの設定方法については以下の通りとなります。
①SiOtとPCをUSBケーブルで接続
②SiO-Programmerで設定変更
SiO-Programmerをインストールしていない方は
https://fa.sus.co.jp/products/files/SIO_m353.pdf
を参考にインストールしてください。
インストール後はSiO-Programmerを起動後、
「コントローラーから読み込み」を行ってからパラメーターを入力
→「コントローラーへ登録」を忘れずクリックしてください
③通信ができているか確認
1.左下の検索窓で「cmd」と入力
2.コマンドプロンプトで「ping 100.100.1.100」と入力してエンター
3.以下の通りに結果表示されたらOKです
ソケット通信でSiOtの制御トライ
今回はSiOtに押しボタンを接続して、その押しボタンの状態をPCから確認してみましょう。
まずは機器の接続図です。
ポイントは押しボタンの入力ケーブル(Green)を入力側の1番に差し込んでください。
その状態で緑のボタンを押したり話したりするとSiOtのオレンジ色のランプが光ると思います。
これをPCからpythonで検知してみます。
ソケット通信の確立
以下のようにコーディングするとSiOtへの接続の確立ができ、「cilent」という変数に格納されます。
後は「client」を使ってコマンドを送ればランプの状態を確認することができます。
#ソケット通信のライブラリの読み込み
import socket
#SiOtで設定したIP
host = "100.100.1.100"
#SiOtで設定したポート
port = 40001
#クライアントの定義
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#SiOtへの接続
client.connect((host, port))
IOの状態確認
https://fa.sus.co.jp/products/files/siot_ethernet_manual_1_4.pdf
上記の取説を読めば、どのようなコマンドを送ればいいかわかります。
その部分を確認すると、
@R01CRLF
というコマンドを送ればIO(押しボタンの状態)を確認することができると書いてあります。
先ほどの「client」を使って
client.send(b"@R01CRLF")
コマンドを送ります。
その次にSiOtからの返信を受け取ります。
受け取るためには受信予定の文字列数分だけ受け取るまで受信を続けないといけないです。
取説では今回のIOのケースだと14文字列返ってくることがわかります。
従いまして、以下のような関数を定義して、それを使ってください。
受信予定の文字列数を引数として入力してあげると受信結果を返してくれる関数です。
def receive(msglen):
"""
ソケット通信の送信結果を受信する
Parameters
----------
msglen : int
受信メッセージの長さ
Returns
-------
output : int
受信メッセージ
"""
output = ""
#返信メッセージの長さが指定の長さまで受信
while len(output) < msglen:
response = client.recv(24).decode()
output = output + response
return output
これを使って以下のコードを実行すると「response」にIOの状態が格納されます。
response = receive(14)
緑ボタンを押さない状態ではresponseには
'@R0100000000\r\n'
が、押した状態では
'@R0110000000\r\n'
が格納されます。
取説を見ると以下のようにIOの状態を読み取ることができます。
読み取り方が少し難しいですので解説します。
以下のようにINPUTの場所によって受信する文字列の数字が変わります。
INPUTの1~4のどれか1つがONの場合は以下の図の通りの数値が受信されます。
複数のINPUTがONしている場合には以下の図の数値の足し算した結果が受信されます。
ここで、重要なポイントとしてはその数値は16進数となっているということです。
IN4とIN3がONの場合は
8+4=12
となりますが、16進数なので
C
という値が受信されます。
今回ケースはIN1にボタンを接続していますので単純に1という数値を受信していることになります。
試しに以下のコードを実行するとリアルタイムでボタンのON/OFFすると数値が変わることが確認できると思います。
try:
while True:
#OUT1の監視
time.sleep(0.5)
client.send(b"@R01CRLF")
response = receive(14)
print(response)
except KeyboardInterrupt:
print("終了")
終わりに
SiOは非常にコスパの良い制御装置で特にSiOtはラズパイ等の安価なPCとも相性が良いのですが、いかんせん情報が少ないと感じましたので記事させていただきました。
次は今回のコードをクラス化してモジュールして使いやすくしようと思います。
コメント
[…] […]
[…] […]