PythonのシンプルなScada

以下は、彼らが通常「ひざまずく」と言っているように実行される単純なSCADAプログラムの私自身の実装の例です。

タスクは、ディーゼル発電機を監視するように設定されています。 燃料レベル、油圧、温度、バッテリー充電、電流、電圧、労働時間などの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回、デバイスにリクエストを送信し、模倣図にレスポンスを表示します。

その他の例については、 こちらをご覧ください

Source: https://habr.com/ru/post/J339008/


All Articles