製造工場で機械の制御などを行っているシーケンサというコントローラがあります。三菱のシーケンサを多用されている現場で、データの収集を行うためにPythonを使ってみました。今回使用したのは、三菱のFX5UJという機種です。
基本的には参考資料の通りでデータ収集できると思います
ここでは機種やソフトが異なり詰まったことなどを書きます
参考資料
- PLCとRaspberry Piはとっても相性がいい。(通信の行い方)
- PythonでPLCのレジスタアクセスを試す
- [続] PythonでPLCのレジスタアクセスを試す
- 三菱のマニュアル sh080003ah(アカウント作ってダウンロードの事)
参考資料でうまくいかなかった点
ソケットタイプは SOCK_DGRAM
デフォルトの SOCK_STREAM だと何故かうまくつながりませんでした。送受信ソケットの振る舞い方が違うらしいのですが、正直よく分かりません
三菱のマニュアルでは半二重通信でデータの端を認識する必要があるので、 STREAM では見逃してしまう的な感じなのかと思ってます
GX-WORKS3 では設定画面が違う
参考資料では GX WORKS2 の画面だったので、設定画面が違います
パラメータ --> Ethernetポート の設定画面を出します
IPアドレスを環境に合わせて設定し、受信データコードもプログラムに合わせて変更します(今回は ASCII_16進 を使いました)
そして、相手機器接続の設定画面を開きます
SLMPの機器を一つ追加します
PLCのプロトコル(UDP)とポートを設定します
Python を動かすパソコンのIPアドレスを設定します
これらの設定を反映させて保存します
資料には RUN中書き込みの許可が要るなどありましたが、自分がテストしたときは不要でした
この辺りは使用するPLCの機種などもからむと思います
送信データは .encode("ascii") する
伝文の送信に sendto(<伝文>, (host, port)) を使ったのですが、<伝文>.encode("ascii") しないと蹴られました
同様に受信は <データ>.decode("utf-8", "ignore") して受信しました
帰ってくるデータが16進
16進のデータが帰ってくるので、int(("0x" + <データ(word)>), 16) などで10進に直しました
PLC側で何とかならないか・・・と探したんですが、ダメでした(BCDでデータ作っときゃ良いんじゃ?と思わなくもなかったんですが)
その他ぼやき
- pymcprotocol を使った方が良かったのかも(環境汚せなかったんよ)
- いや、Node-REDでもできるよね・・・
- C言語インテリジェント機能ユニット で debian が動くんで、お金に余裕があるならこっちで良くね?
- 今回は古っるい事務用のPC(core2duo !!) でデータ収集を目論んでおり、なるべく軽い処理を目指したらこの有様ですよ