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回、デバイスにリクエストを送信し、模倣図にレスポンスを表示します。



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



All Articles