OPCサーバーセンサーをnarodmon.ruプロジェクトに単純に接続する方法

こんにちは。



ごく最近、私は1つのシンプルだが有用なプロジェクト「People’s Monitoring」があることを学びました。要するに、その意味は、環境モニタリングのための多くの異種センサーを1か所にまとめることです。 たとえば、インターネットで天気予報を見るということと、気温、湿度、気圧、およびそれらの経時変化が実際にどこにあるかを見るということは、まったく別のことです。



または、例えば、立ち上がって窓の外の温度計を見るのが面倒な場合)







このプロジェクトでは、データの変更履歴を「保存」、表示、および監視できます。 一般に、幸福に必要なものはすべてそこにあります。 センサーをパブリックまたはプライベートにすることができます。



参加したい人のために、既製のデバイスがあり、サイトでそれらを取得する方法を見つけることができます。 すべてが開始された投稿へのリンクと、同じ場所にあるデバイスの例です。



さらに、SCADAシステムには多くのセンサーがあり、それらの多くはさまざまな地理的位置の環境パラメーターを反映できます。 これが私がお伝えしたいことです。SCADAシステムのOPCサーバーセンサーを上記のサービスに固定する方法です。



必要なのは:



1. Python 2.7

2. Python用のOPCを開きます

3. Python for Windows拡張機能



これらはすべて、OPCサーバーが回転しているマシンに、またはリモートでインストールされます。 ローカルにインストールしました。



次に、スクリプトを実行するだけで、その複雑さは驚くほどです。



import OpenOPC import time import socket while True: try: opc = OpenOPC.client() opc.connect("OWEN.RS485") s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) # UDP addr = ('narodmon.ru',1234) # ip:port    " " val = opc['Com1/TRM138(8bit adr=24)/ChannelData3/rEAd'] buf = "#123456789ABCDE\n#123456789ABCDE10#" +"%.1f#"%val + "\n##" s.sendto(buf,addr) opc.close() s.close() except : pass time.sleep(180)
      
      







ご覧のとおり、OPCサーバー「OWEN.RS485」に接続し、「アイテム」の値「Com1 / TRM138(8bit adr = 24)/ ChannelData3 / rEAd」を読み取ります。 したがって、OPCサーバーの「アイテム」の値を読み取ることができます。



ところで、OpenOPCのドキュメントを調べると、たとえば小さな視覚化を作成するのに十分な多くの便利な機能が見つかります。



送信用のパッケージは、一意のデバイスID 123456789ABCDE(独自のものを考えることができますが、センサーまたは入力モジュールのシリアル番号を使用することをお勧めします)と一意のセンサーIDから形成されます。 デバイスIDに0x10を追加することで後者を受け取りました。これは、温度センサーであることを意味します。 詳細については、プロジェクトWebサイトの開発者向けセクションを参照してください。



サービス自体への接続は非常に簡単です。 サイトに登録して、パッケージの送信を開始する必要があります。 システムが複数のパケットを受信すると、新しいデバイスを作成してセンサーを追加できます。 デバッグのために、開発者向けのセクションにIPからのパケット監視があります。 SSarサービスの作成者に、サービスに関するすべての質問、感謝、提案を連絡できます



簡単な方法を探していない人のために、同じことを行うWindowsサービスリストを追加します。



 # -*- coding: utf-8 -*- import win32serviceutil import win32service import win32event import servicemanager import OpenOPC import socket class AppServerSvc (win32serviceutil.ServiceFramework): _svc_name_ = "ServiceForNarodmon" _svc_display_name_ = "ServiceForNarodmon" _svc_description_ = "Service For Narodmon.ru" def __init__(self,args): win32serviceutil.ServiceFramework.__init__(self,args) self.hWaitStop = win32event.CreateEvent(None,0,0,None) self.hWaitResume = win32event.CreateEvent(None, 0, 0, None) self.timeout = 60000 #        self.resumeTimeout = 1000 self._paused = False def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) #servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, #servicemanager.PYS_SERVICE_STOPPED, #(self._svc_name_, '')) def SvcPause(self): self.ReportServiceStatus(win32service.SERVICE_PAUSE_PENDING) self._paused = True self.ReportServiceStatus(win32service.SERVICE_PAUSED) #servicemanager.LogInfoMsg("The %s service has paused." % (self._svc_name_, )) def SvcContinue(self): self.ReportServiceStatus(win32service.SERVICE_CONTINUE_PENDING) win32event.SetEvent(self.hWaitResume) self.ReportServiceStatus(win32service.SERVICE_RUNNING) #servicemanager.LogInfoMsg("The %s service has resumed." % (self._svc_name_, )) def SvcDoRun(self): #servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, # servicemanager.PYS_SERVICE_STARTED, # (self._svc_name_,"")) self.main() #      def main(self): #       #servicemanager.LogInfoMsg("Hello! Im a Narodmon.ru Service.") while 1: #      #servicemanager.LogInfoMsg("I'm still here.") try: opc = OpenOPC.client() opc.connect("OWEN.RS485") s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) # UDP addr = ('narodmon.ru',1234) # ip:port    " " val = opc['Com1/TRM138(8bit adr=24)/ChannelData3/rEAd'] buf = "#123456789ABCDE\n#123456789ABCDE10#" +"%.1f#"%val + "\n##" s.sendto(buf,addr) opc.close() s.close() except : pass #        rc = win32event.WaitForSingleObject(self.hWaitStop, self.timeout) if rc == win32event.WAIT_OBJECT_0: #       #servicemanager.LogInfoMsg("Bye!") break #       if self._paused: pass #servicemanager.LogInfoMsg("I'm paused... Keep waiting...") #   while self._paused: #        rc = win32event.WaitForSingleObject(self.hWaitResume, self.resumeTimeout) if rc == win32event.WAIT_OBJECT_0: self._paused = False #        #servicemanager.LogInfoMsg("Yeah! Let's continue!") break if __name__ == '__main__': win32serviceutil.HandleCommandLine(AppServerSvc)
      
      







システムログにメッセージを書き込もうとする試みはすべて、WinXPでは機能しないためコメント化されています。 Win7ではすべて問題ないので、これ以上理解しませんでした。 「ブラックジャックと簡単な摂理の女性」でサービスを「ギャッシュ」できます。



頑張って



All Articles