タスクは、ディーゼル発電機を監視するように設定されています。 燃料レベル、油圧、温度、バッテリー充電、電流、電圧、労働時間などの1時間ごとのパラメーターを示すジャーナルを保持する必要があります。
発電機はオフィスから0.5キロメートルの距離にあり、時間が経つにつれて、これらの歩行は、特に悪天候のときに緊張し始めました。
判明したように、Modbus RTU交換プロトコルをサポートするコントローラーがジェネレーターにインストールされています。つまり、ツイストペアケーブルを敷設してRS-485経由で接続できます。
アドレステーブルを調べた後、簡単なプログラムを自分で作成することにしました。
結果はScadaPyです。
Modbus TCP
共有インターフェース。 最初にmodbusライブラリを接続します。
import modbus_tk import modbus_tk.defines as cst import modbus_tk.modbus_tcp as modbus_tcp
接続するオブジェクトへのリンクを作成し、以下を示します。
host =「接続を確立しているデバイスのIPアドレス」
port =「接続先のデバイスのポート」
master = modbus_tcp.TcpMaster(host=slaveIP, port=int(slavePort)) master.set_timeout(1.0)
デバイスからデータを取得しようとしています。この場合、レジスタ0のアドレスから始めて、10個の離散信号(TS)レジスタを取得します。
getDI=master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 10)
他のタイプのレジスタの場合、他の名前を示す必要があります。
master.execute(1,st.READ_COILS, 0, 10) master.execute(1,cst.READ_INPUT_REGISTERS, 100, 3) master.execute(1,cst.READ_HOLDING_REGISTERS, 100, 12)
今あなたがするなら:
print getDi
アドレス0からアドレス9のデバイスからデータ配列を取得します。
(0,1,0,1,0,0,0,0,0)
このようなものが表示された場合、デバイスは通信中です。 他のタイプのレジスタからデータを取得することも同様です。
プログラムウィンドウの形成
ライブラリを接続します。
from Tkinter import *
オブジェクト(ウィンドウ)へのリンクを作成します。
root = Tk()
ウィンドウの背景画像を設定します。
im = PhotoImage(file=backGroundPath)
キャンバスオブジェクトを作成します。
canv = Canvas(root,width=1900,height=950,bg="black",bd=0, highlightthickness=0, relief='ridge')
窓に置きます。
canv.place(x=0, y=25)
背景を表示します。
canv.create_image(1, 1,anchor=NW, image=im)
サイクルを開始します。
root.mainloop()
ポーリング機能
modbusTCPプロトコルを使用してデバイスを継続的にポーリングするには、tkinterにはafterおよびmainloopメソッドがありますが、最初にjobModbusTCPプロシージャを作成する必要があります。
def jobModbusTCP(): getDI=master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 10) if(int(getDI[0]) == 1): canv.itemconfig(diFig1,fill='red') if(int(getDI[0]) == 0): canv.itemconfig(diFig1,fill='green') if(int(getDI[1]) == 1): canv.itemconfig(diFig2,fill='red') if(int(getDI[1]) == 0): canv.itemconfig(diFig2,fill='green') root.after(1000, jobModbusTCP)
プログラムコード
以下は、レジスタ[0]および[1]のステータスを表示するプログラムコードです。レジスタの論理状態が0の場合、キャンバス上の正方形は論理状態が1-赤の場合、緑色になります。
from Tkinter import * import modbus_tk import modbus_tk.defines as cst import modbus_tk.modbus_tcp as modbus_tcp import math def jobModbusTCP(): getDI=master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 10) if(int(getDI[0]) == 1): canv.itemconfig(diFig1,fill='red') if(int(getDI[0]) == 0): canv.itemconfig(diFig1,fill='green') if(int(getDI[1]) == 1): canv.itemconfig(diFig2,fill='red') if(int(getDI[1]) == 0): canv.itemconfig(diFig2,fill='green') root.after(1000, jobModbusTCP) master = modbus_tcp.TcpMaster(host='192.168.0.1', port=502) master.set_timeout(1.0) root = Tk() im = PhotoImage(file='bg.gif') canv = Canvas(root,width=1900,height=950,bg="black",bd=0, highlightthickness=0, relief='ridge') canv.place(x=0, y=25) canv.create_image(1, 1,anchor=NW, image=im) diFig1=canv.create_rectangle(10,10,30,30,fill='gray', outline='black') diFig2=canv.create_oval(50,50,80,80,fill='gray', outline='black') root.after(1, jobModbusTCP) root.mainloop()
これで、プログラムは1秒間に1回、デバイスにリクエストを送信し、模倣図にレスポンスを表示します。
その他の例については、 こちらをご覧ください 。