ScadaPy Modbusプロトコル機能

ここ、 ここ、 ここ ここの記事の続き 、ホームオートメーションと産業企業の両方の分野で、ScadaPyシリーズのpythonスクリプトを簡単に使用する例を示したいと思います。







1. AdvantechおよびScadaPyのADAMモジュール。



Advantech 4000シリーズモジュールをポーリングするための簡単なpythonの例。







データの読み取りと制御コマンドの送信には、独自のDCONプロトコルが使用されます。 むかしむかし、このメーカーのプログラムが配布され、私が間違えなければ、Adam ViewまたはGeniDAQと呼ばれました。 私たちは一度彼女と一緒に始めました、それはとても面白かったです。 今日まで、私はまだ実行可能ないくつかのモジュールを手に入れました。







画像



ポーリング用のコマンドのリストは、各モジュールのドキュメントに記載されています。 ここで読むことができます







ポーリングには、rs485インターフェースが使用されます。 4050 I / O入力モデルのみが利用可能であったため、このモデルの処理を記述しました。 入力ライン7ビット、出力ライン8ビット。







データを読み取るには、コマンド ' $ 016 \ r 'をポートに送信します



$-制御文字

01-デバイスアドレス

6-チーム

serialPort.write( '$ 016 \ r')

dataIn = serialPort.read(8)

serialPort.flushInput()







応答として、 !007F00の形式の8バイトが受信されます。 情報バイト3と4はデジタル入力DIのステータスを報告し、バイト1と2はデジタル出力DOのステータスを報告します。 復号化コードを以下に示します。







if(dataIn[0]=='!'): byteDI = str(bin(int('0x'+dataIn[3]+dataIn[4],16))[2:] ).zfill(7) byteCoil = str(bin(int('0x'+dataIn[1]+dataIn[2],16))[2:] ).zfill(8)
      
      





さらに、ADAM-4050のデジタル入力のステータスは、プログラムのスレーブ部分のDISCRETE_INPUTSレジスタにあり、デジタル出力のステータスはCOILSレジスタに転送されます。



画像



github.comにあるライブラリ







2. ScadaPyおよびmaster_ping.pyモジュール。



リモートサイトのスレーブサーバーとの通信の損失を検出するために使用されます。 ICMPパケットは定期的にリモートサーバーに送信され、通信がない場合は模倣が表示されます。 もちろん、確認を伴う何らかの種類の音声アラームを追加することをお勧めします。







画像



github.comにあるライブラリ







3. ScadaPyおよびSmartgenジェネレーターモジュール。



これについては以前にここで書いた。



ジェネレーターとその現在の状態のエラー制御プログラムの実装オプションとして。 すべての非常に重要なパラメーターは、燃料レベル、負荷電流、エンジン温度条件です。 原則として、発電機の運転中に定期的にチェックされるのはこれらのパラメーターです。







画像



コンソールオプションが可能です、私はそれが好きです







画像



github.comにあるライブラリ







4. ScadaPyおよびmaster_httpモジュール。



最近の実装例を説明します。



I-8831デバイスは施設に設置され、Modbus TCPプロトコルを使用して動作します。 32個のデジタル入力があります。 変電所の発信フィーダーのセルの「ブリンカー」の状態を監視する必要があります。 リアルタイムモードには厳しい要件はありません。リアルタイムモードは山から遠く離れているため、15分ごとに情報を受信するのに十分です。







画像



Modbus_tkを使用して実装され、ライブラリを要求します。 原理は簡単です。ModbusTCPプロトコルを使用してデータを受信し、GETメソッドを使用してhttp経由でサーバーに送信します。 すべてが非常に簡単です。







 import requests.packages.urllib3 resp = requests.get('http://myserver.ru/alive.php?v='+val+'&d='+d+'&r='+reg+'&s='+st+'&dv='+device, timeout=5 )
      
      





SSL、ログイン、パスワードを追加することで実装が可能です。



 from requests.auth import HTTPBasicAuth import requests.packages.urllib3 requests.packages.urllib3.disable_warnings() #       resp = requests.get('https://myserver.ru/alive.php?v='+val+'&d='+d+'&r='+reg+'&s='+st+'&dv='+device, timeout=3, verify=False ,auth=HTTPBasicAuth(login, password)) # verify=False –     # login, password –    
      
      





サーバー側では、データベースに保存する機能を備えた1つのPHPスクリプトに制限できます。 例として、ファイルへの保存を指定しました。



 $val=$_GET['v']; $ind=$_GET['d']; $reg=$_GET['r']; $state=$_GET['s']; $device=$_GET['dv']; $dt=Date("dmY"); $now = DateTime::createFromFormat('U.u', microtime(true)); $tm = $now->format("mdY H:i:su"); $getData=$tm.' '.$state.' '.$device.' '.$reg.' '.$val; $fp=fopen('./alive.log','a+'); if($fp) { fputs($fp,$getData."\n"); } fclose($fp);
      
      





github.comにあるライブラリ








All Articles