3
0

More than 1 year has passed since last update.

ラズパイでOMRONのPLCのメモリの値をロギング

Last updated at Posted at 2022-05-20

OMRONのFINSコマンドを使ってPLCのメモリをロギング

ラズパイで定周期でOMRON PLCのメモリを読み出してファイルに保存します
(Windowsでも動作します)

環境

Python3.9
PLC OMRON CJ/NJ/NX series

ディレクトリ構成

.
├─ finsudp.py
├─ memlogFINS.py
└─ log
   └ ログファイル

実行例

~ $ python3 memlogFINS

ファンクション

memlogFINS(interval, recnum, logpath)

interval : 収集周期

収集する周期を入力します 単位は秒
例:0.1

recnum : 収集個数

設定した個数を収集するとプログラムを終了してファイルを閉じます

logpath : 収集ファイル出力ディレクトリ

ロギングするファイルの出力先です
ここで指定したディレクトリの下にファイル名は"logYYYYMMDD_HHSS.csv"で出力します

logwrite(filename)

メモリの値を読み出してcsvファイルに出力します

filename

出力先のファイル名

収集するメモリの設定方法

まずPLCのD0から20ワードにロギングするデータを下表のように揃えてあると想定します

D0,1 2 3 4 5,6 7,8 9,10 11,12 13.14,15,16 17,18,19
BitData INT16 INT16 UINT16 INT32 INT32 UINT32 FLOAT DOUBLE STRING

インスタンス作成

plc = finsudp.fins(host, srcFinsAdr, dstFinsAdr)

読み出すメモリのアドレスはlogwrite()のここで指定します

data = plc.read('D0', 20)           # 読み出すメモリのアドレスとワード数

次に書き込むデータを順番に作っていきます

最初の列には読み出した日付時刻

now = datetime.now()
f.write(now.strftime('%Y/%m/%d %H:%M:%S.') + "%03d" % (now.microsecond // 1000) + ',')

次はビットデータ32ビット (0-3 byte目)

f.write(','.join(list(plc.WordToBin(data[:4]))) + ',')

次はINT16データ2個 (4-7 byte目)

data16 = plc.toInt16(data[4:8])
datastr = [str(n) for n  in data16]
f.write(','.join(datastr) + ',')

次はUINT16データ1個 (8-9 byte目)

data16 = plc.toUInt16(data[8:10])
datastr = [str(n) for n  in data16]
f.write(','.join(datastr) + ',')

次はINT32データ2個(10-18 byte目)

data32 = plc.toInt32(data[10:18])
datastr = [str(n) for n  in data32]
f.write(','.join(datastr) + ',')

次はUINT32データ1個 (18-21 byte目)

data32 = plc.toUInt32(data[18:22])
datastr = [str(n) for n  in data32]
f.write(','.join(datastr) + ',')

次は単精度浮動小数点1個 (22-25 byte目)

dataFloat = plc.toFloat(data[22:26])
datastr = [str(n) for n  in dataFloat]
f.write(','.join(datastr) + ',')

次は倍精度浮動小数点1個 (26-33 byte目)

dataDouble = plc.toDouble(data[26:34])
datastr = [str(n) for n  in dataDouble]
f.write(','.join(datastr) + ',')

最後に文字列6文字 (34-39 byte目)

dataStr = plc.toString(data[34:40])
f.write(dataStr + '\n')  

最後には'\n'で改行を入れます

出力データ例

2022/05/21 11:24:08.342,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,341,351,33795,-286250,161303021,100444,34.200050354003906,37.24000000000026,ABC341
2022/05/21 11:24:08.445,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,341,351,33795,-286250,161303021,100444,34.200050354003906,37.24000000000026,ABC341
2022/05/21 11:24:08.542,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,341,351,33795,-286250,161303021,100444,34.200050354003906,37.24000000000026,ABC341
2022/05/21 11:24:08.642,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,341,351,33795,-286250,161303021,100444,34.200050354003906,37.24000000000026,ABC341
3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0