LoginSignup
1
1

More than 1 year has passed since last update.

ラズパイで三菱シーケンサのデバイスの値をロギング

Last updated at Posted at 2022-05-20

三菱のMCプロトコルでデバイスの値をロギング

ラズパイで定周期で三菱シーケンサのデバイスを読み出してファイルに保存します
(Windowsでも動作します)

環境

Python3.9
Frame3E UDP/IP connection

ディレクトリ構成

.
├─ mcp.py
├─ memlogMCP.py
└─ log
   └ ログファイル

実行例

~ $ python3 memlogMCP

ファンクション

memlogMCP(interval, recnum, logpath)

定周期でlogwriteを実行します

interval : 収集周期

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

recnum : 収集個数

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

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

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

logwrite(filename)

デバイスの値を読み出してcsvファイルに出力します

filename

出力先のファイル名

収集するデバイスの設定方法

まずシーケンサの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

読み出すデバイスのアドレスは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目)

dataWordToBin = plc.WordToBin(data[:4])
f.write(','.join(list(dataWordToBin.rjust(32,"0"))) + ',')

次は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/20 17:05:07.803,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,-1,3,4,-5,7,268435455,0.10999999940395355,-0.13,ABCD12
2022/05/20 17:05:07.902,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,-1,3,4,-5,7,268435455,0.10999999940395355,-0.13,ABCD12
2022/05/20 17:05:08.004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,-1,3,4,-5,7,268435455,0.10999999940395355,-0.13,ABCD12
2022/05/20 17:05:08.012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,-1,3,4,-5,7,268435455,0.10999999940395355,-0.13,ABCD12
1
1
0

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
1
1