鱧技術

hamo_daisukiの技術メモ

三菱のシーケンサ FX5UJ を Python で叩いてみた

製造工場で機械の制御などを行っているシーケンサというコントローラがあります。三菱のシーケンサを多用されている現場で、データの収集を行うためにPythonを使ってみました。今回使用したのは、三菱のFX5UJという機種です。

基本的には参考資料の通りでデータ収集できると思います
ここでは機種やソフトが異なり詰まったことなどを書きます

参考資料

参考資料でうまくいかなかった点

ソケットタイプは SOCK_DGRAM
デフォルトの SOCK_STREAM だと何故かうまくつながりませんでした。送受信ソケットの振る舞い方が違うらしいのですが、正直よく分かりません
三菱のマニュアルでは半二重通信でデータの端を認識する必要があるので、 STREAM では見逃してしまう的な感じなのかと思ってます
GX-WORKS3 では設定画面が違う

参考資料では GX WORKS2 の画面だったので、設定画面が違います

works3_setting1

パラメータ --> Ethernetポート の設定画面を出します
IPアドレスを環境に合わせて設定し、受信データコードもプログラムに合わせて変更します(今回は ASCII_16進 を使いました)
そして、相手機器接続の設定画面を開きます

works3_setting2

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でデータ作っときゃ良いんじゃ?と思わなくもなかったんですが)

その他ぼやき