PYTHON工業網際網路監控項目實戰2—OPC
OPC(OLE for Process Control)定義:指為了給工業控制系統應用程式之間的通信建立一個接口标準,在工業控制裝置與控制軟體之間建立統一的資料存取規範。它給工業控制領域提供了一種标準資料通路機制,将硬體與應用軟體有效地分離開來,是一套與廠商無關的軟體資料交換标準接口和規程,主要解決過程控制系統與其資料源的資料交換問題,可以在各個應用之間提供透明的資料通路。實際項目中“裝置”就變成一個可以通路的OPC Server和它的Tag位号值,更多的詳情請參考OPC基金會官網:
http://opcfoundation.cn/。
上一小節我們首先通過一個簡單的json格式來完成資料到UI端的傳輸,UI端解析Json資料,并通過JQuery渲染到div上來完成資料的顯示,最後ajax輪詢實作了資料的實時重新整理。本小節我們把Domo進一步疊代改進,首先規範資料傳輸的格式,然後,實作實時讀取模拟OPC Server的tag位号值。
1.1. 界面UI與Json資料結構
采用面向對象的模式來定義資料傳輸Json格式,“裝置”對象包含多個“tag”屬性值。上一小節例子中,我們從背景擷取的資料格式是一個Json字元串,隻定義了tank4C9的相關屬性。
tank4C9={
'Status': random.randint(0,1), #裝置運作狀态
'OverheadFlow':random.randint(1,10) ,#'頂流量',
'ButtomsFlow': random.randint(1,10), #'低流量'
'Power': random.randint(10000,100000), #功率
}
實際項目中的監控界面會涉及到多個裝置和多個監控tag位号,為了便于資料的規範管理和更新,Json資料格式構造采用面向對象的模式進行建構如下:
tank4C9={
'DeviceId': 1,
'DeviceName':'1#反應罐',
'Status': random.randint(0,1), #裝置運作狀态
'OverheadFlow':random.randint(1,10) ,#'頂流量',
'ButtomsFlow': random.randint(1,10), #'低流量'
'Power': random.randint(10000,100000), #功率
}
Json代碼就建構了一個圖例反應罐主要監控資料,注意多出來的裝置狀态點,也就是用來展現裝置是運作狀态還是停機狀态。另外,為了展現這個裝置來自那個一個OPC Server服務,更好地展現現場裝置與采集器(OPC Server)的關系,再增加一層關于采集器的Json結構python代碼如下:
tank4C9={
'DeviceId': 1,
'DeviceName':'1#反應罐',
'Status': random.randint(0,1), #裝置運作狀态
'OverheadFlow':random.randint(1,10) ,#'頂流量',
'ButtomsFlow': random.randint(1,10), #'低流量'
'Power': random.randint(10000,100000), #功率
}
Collector={
'CollectorId': 1,
'CollectorName':'1#采集器',
'Status': 0,
'DeviceList':[tank4C9],
}
從上述代碼的資料關系上,我們能看出來裝置“1#反應罐”屬于“1#采集器”,資料采集器本身也有自己的裝置運作狀态位号,來辨別采集裝置自身是否正常運作。
1.2. 重構Collector APP代碼
接下來我們重構Collector APP代碼,增加一個getCollectorData函數來傳回連接配接器資料。
1.Collector APP views 增加函數getCollectorData代碼如下:
def getCollectorData(request):
tank4C9={
'DeviceId': 1,
'DeviceName':'1#反應罐',
'Status': random.randint(0,1), #裝置運作狀态
'OverheadFlow':random.randint(1,10) ,#'頂流量',
'ButtomsFlow': random.randint(1,10), #'低流量'
'Power': random.randint(10000,100000), #功率
}
Collector={
'CollectorId': 1,
'CollectorName':'1#采集器',
'Status': 0,
'DeviceList':[tank4C9],
}
return HttpResponse( json.dumps(Collector));
2.修改項目urls檔案urlpatterns ,釋出getCollectorData path
from django.urls import path
from Collector import views
urlpatterns = [
# Uncomment the next line to enable the admin:
#path('admin/', admin.site.urls)
path('getTank4C9Data/', views.getTank4C9Data),
path('getCollectorData/', views.getCollectorData),
]
項目調試狀态我們可以通過浏覽器直接通路url檢視webAPI結果。
http://127.0.0.1:8090/getCollectorData/注意:Json資料格式的變化,圖中資料展現出了基于面向對象模式的層次結構“1#采集器”下面有一個包含的“裝置對象清單”DeviceList屬性。
1.3. 修改UI代碼
現在修改tank4C9.html檔案裡面的getData異步擷取資料函數代碼修改為讀取上面getCollectorData函數如下:
//JQuery 代碼入口
$(document).ready(function(){
setInterval("getData()",1000);
});
function getData() {
//模拟異步從背景獲得值
$.ajax({
url: "/getCollectorData/", success: function (result) {
data = JSON.parse(result);
tank4C9=data.DeviceList[0]
$("#OverheadFlow").html(tank4C9.OverheadFlow);
$("#ButtomsFlow").html(tank4C9.ButtomsFlow);
$("#Power").html(tank4C9.Power);
}});
}
</script>
調試運作
http://127.0.0.1:8090/tank4C9/UI同樣的實時自動重新整理背景資料的浏覽效果。
重點:代碼重構的要點的功能不變的情況下,優化代碼結構。
代碼的結構優化,優先保證功能不變,盡量不要試圖在一次疊代中引入過多的變量,這樣隻會導緻程式設計工作雜亂無章的進行。Json格式代碼重構完成後,接下來我們把代碼調整成讀取OPC Server服務的Tag點。
1.4. 從OPC Server讀取Tag值
現在我們重構getCollectorData函數代碼,通過OPC服務讀取真正的裝置值,當然dome的例子是讀取一個模拟OPC服務,實際項目中讀取裝置釋出的OPC服務即可,代碼如下:
tank4C9={
'DeviceId': 1,
'DeviceName':'1#反應罐',
'Status': 0, #裝置運作狀态
'OverheadFlow':0 ,#'頂流量',
'ButtomsFlow': 0, #'低流量'
'Power': 0, #功率
}
import OpenOPC
opc = OpenOPC.client()
opc.connect('Matrikon.OPC.Simulation')
tank4C9['OverheadFlow']= opc['Random.Int1']
tank4C9['ButtomsFlow']= opc['Random.Int2']
tank4C9['Power']= opc['Random.Int4']
opc.close()
Collector={
'CollectorId': 1,
'CollectorName':'1#采集器',
'Status': 0,
'DeviceList':[tank4C9],
}
return HttpResponse( json.dumps(Collector));
現在重新調試運作并浏覽監控界面
動态效果如下:
1.5. 小結
本小節我們示範了如何在功能不變的模式下重構代碼來實作功能的疊代和推進,過程中始終貫穿功能不變的前提下重構代碼的結構來滿足新疊代功能的要求,然後再改變代碼功能讀取OPC服務tag位号值。最終調整了Json的資料封裝格式和實時裝置資料從裝置OPC Server中擷取,也示範了從技術探索原型到生産原型的代碼疊代過程。下一節我們将把ajax輪詢演進到通過websocket來實作UI端的資料重新整理,提高資料重新整理的效率。
原文位址
https://www.cnblogs.com/haozi0804/p/12696459.html