《OPC統一架構》 [德] 馬科等著的讀書筆記,同時參考了華北電力大學的一篇碩士學位論文《OPC UA服務器數據管理與訂閱功能模塊研究與開發》以及互聯網上的一些資料。太長不看直接跳到總結部分,可以對OPC UA有一個整體上的認知。
OPC
1. 三個主要的OPC規范:
-
數據訪問:DA Data Access
- 規范描述了訪問過程數據的當前值
-
報警和事件:A&E Alarms And Events
- 描述了寄予時間的信息接口,包括過程報警確認
-
歷史數據訪問:HDA History Data Access
- 描述了訪問歷史數據的函數
所有接口提供通過地址空間瀏覽的方法,並提供可用數據的信息。
2. OPC采用C/S方式進行信息交換。
服務器封裝了過程信息來源(如設備),使信息可以通過它的接口訪問。客戶端連接到服務器后,可以訪問和使用它所提供的的數據。數據可以被C&S使用。
3. 經典的OPC接口是基於微軟的COM和DCOM。
OPC UA(OPC Unified Architecture)總覽
可跨平台,提供更高的可靠性,安全性和數據集成,能顯著改進企業信息的連通性。
相比於傳統的OPC,OPC UA有如下四個特點:
統一的地址空間與信息模型。
-
傳統OPC的DA、A&E、HDA各自有相對獨立的地址空間,相應也有不同的訪問方式;
-
而OPC UA定義了統一數據和服務模型。包括:
- 行為和語義信息模型
- 使應用程序相互作用的消息模型
- 在終端之間傳輸數據的通信模型
- 保證系統之間實現互操作性的一致性模型
-
可以實現DA、A&E、HDA、控制命令、復雜數據的交互通信。
松耦合性。
- 參考了SOA(Service-oriented architecture),以單元為最基本粒度的服務。
- 通過網絡組合形成不同的功能。
- 使用HTTP協議在TCP信道上傳輸。
多平台性。
- 由於采用SOA架構,服務可以是任何語言,只要有統一的通信方式。
更高的安全性。
- UA的用戶認證及加密可以采用現在以及未來出現的各種方式,非常靈活。
Summary 優勢:
- 平台無關
- 所有級別的直接設備連接
- 身份驗證和加密
- 語義服務
地址空間簡介
是以一組引用行駛連接起來的節點構成網狀結構,節點是一個世紀設備在地址空間中的映射,節點包括了屬性和引用。地址空間為不同的實際設備提供了一個統一的抽象模型,利用此模型便於對節點的管理及服務集實現對其統一的訪問方式。同時利用引用可以通過基本的節點搭建出復雜的節點模型,滿足世紀設備需要多樣性的描述的要求。
節點。
節點由屬性和引用兩部分組成:
- 屬性:描述節點的一些特性
- 引用:指向另一個與之相關的節點。
BrowseName瀏覽名稱,僅用於瀏覽目的,不用於顯示節點名稱。
節點的屬性集由OPC UA規定的,不能被擴展。
ReferenceType層次結構只支持單一繼承,保證每個引用類型要么是一個層次化引用類型,要么是非層次化引用類型。
節點的主要(重要)類別:
- 對象
- 對象可以擁有變變量和方法
- 用於地址空間結構,對象使用變量對外提供值,對象不像變量一樣擁有Value屬性。
- 變量
- 代表一個值,客戶端可以對這個值進行讀取、寫入和訂閱其變化
- 分為
- 特性:服務器定義的對象、數據變量和其他節點的特征。
- 數據變量:代表了對象的內容。
- 方法
- 代表服務器中一個由客戶端調用並返回結果的方法。
地址空間組織形式。
- 在地址空間中,節點與節點之間通過引用連接到一起形成網狀結構,一般節點數量非常龐大,客戶端經常只對某個指定的子集的數據感興趣。
- 服務器通過視點的篩選參數屬性,篩選相應的引用特性構成的區域稱之為視域。視域由視域節點類定義。視域指定了一個地址空間的子集。
- OPC UA服務器對客戶端可用的對象幾何及其相關信息被稱為地址空間。
OPC UA屬性服務。
提供了對節點屬性的訪問功能,包括:
- 讀取 Read
- 歷史數據讀取 HistoryRead
- 寫入 Write
- 歷史數據更新 HistoryUpdate
對於監控項服務需要通過其讀取函數對所訂閱的節點屬性進行讀取,並對監控項實例中的數據進行更新。 - OPC UA訂閱與監控項服務及總攬
狀態機
是OPC UA的一個基本概念。這個基本概念被服務器用來描述特定狀態機的應用程序,同時也被OPC信息模型使用。有兩個狀態:空閑(Idle)和讀(Reading),並在其間轉換。
訂閱數據變化和事件
客戶端能從OPC UA服務器訂閱3種不同類型的信息。
- 訂閱用於對信息源進行分組
- 監控項用於管理一個信息源
- 一條信息被稱作一個通知
一個訂閱可能含有所有的3種類型的監控項,服務器將傳遞通知給這些件是想直到訂閱或監控項被刪除。
監控項服務集
-
客戶端通過監控項訂閱數據或事件。
-
監控項保存需要監控的節點項目,節點項目可以是任意節點屬性。
-
提醒是由於描述數據改變和事件的數據結構。通過訂閱打包生產提醒消息被發送到客戶端。
-
訂閱根據用戶定義的發布間隔,周期性允許發送提醒消息。
-
監控項的主要參數用來設定數據的采樣,評價和上報。分別是:
- 采樣間隔
- 監控模式
- 過濾器
- 隊列參數
-
-
服務器可能以加快於客戶端支持的速度采樣,同時由於過濾器服務器會發送少於采樣間隔設定的數值量。當應用數據改變過濾器時,最新的采樣值會與隊列中上一周期生成數據進行比對。
-
觸發模式。在監控項服務中允許設置當某一數據觸發項發送辯護后引起其他項目數據上報。該服務可以由在觸發項和上報項之間建立鏈接來完成。
四種策略設置:
- 引起觸發項監控模式設定為上報禁止。此時引起觸發項不會被上報。
- 引起觸發項監控模式設定為上報允許。此時引起觸發項被上報。
- 上報項監控模式設定為上報禁止。此時上報項被上報。
- 上報項監控模式設定為上報允許。此時上報項只會被上報一次。
另外:客戶端可以創建或刪除觸發項與上報項之間的鏈接。如果上報項所指的監控項在出發鏈接刪除之前被刪除,則鏈接也會被刪除,但觸發項不受影響。
三種類型的監控項
- 用來訂閱變量值的變化,是最常見的。
- 用於訂閱時間。通過定義一個事件通知器來監視,同時可以為事件定義一個事件過濾器。
- 用於訂閱聚合值。聚合值是根據客戶端定義的時間間隔,對獲取到的變量值進行計算得出的。
監控項服務
-
建立監控項
用於為訂閱建立或增加一個或多個監控項。
-
訂閱刪除,關聯的監控項也會被自動刪除。
-
刪除監控項將引起其所指向到上報項的鏈接被刪除,但膳寶香不會受到影響。
-
多次調用創建監控項服務來創建多個監控項將影響到服務器的運行,應該一次為訂閱創建多個監控項。
-
-
更改監控項
用於更改訂閱中的監控項。對采樣間隔和過濾器的更改在下一個周期生效。
-
設置監控項模式
用於設置訂閱中一個或多個監控項的監控模式。若設置禁用模式將導致所有的提醒被刪除。
-
設置觸發
用於創建和刪除觸發項的觸發鏈接。觸發項和上報項應屬於同一訂閱。
-
刪除監控項
用於刪除訂閱中一個或多個監控項。
一個監控項被刪除,其觸發鏈接也被刪除。
但刪除監控項可以不回刪除已經發送到訂閱的提醒,客戶端肯能收到已刪除的監控項上報的數據。
訂閱服務集
訂閱模型
用於向客戶端發送提醒。本質是要求服務器到客戶端的一個異常報告。
其實是相當於(設計模式中)一個擴展后的觀察者模式。
- 包含了一組由客戶端定制的監控項。
- 定義了發布間隔。
- 提醒消息由客戶端調用發布服務來返回。
- 發布周期初始,如果提醒隊列不為空,發布請求隊列為空,服務器進入等待狀態直到接收到發布請求。接收到后,服務器理科發送提醒消息不必等到發布時刻。
- 定義有存在計數器,用來記錄連續的發布周期內提醒隊列為空次數。達到最大存在計數時,服務器產生一個返回發布請求的存在消息,用於通知客戶端服務仍然有效。
- 定義有生存時間計數器,用於記錄在發布周期內客戶端未發送發布請求的次數。該數值大於最大計數時,該訂閱將被刪除,相關的監控項也會被刪除。
- 訂閱是否發布提醒消息可以由服務器在創建時設定,或調用設定發布模式來更改。當設定為禁用時,服務器任然進行采樣,並發送存在消息。
- 訂閱將緩存已發送的提醒消息知道客戶端確認或到達存在消息發送時間。
當訂閱被創建后,在第一個發周期結束時,服務器將向客戶端發送消息用於告知客戶端訂閱正在運行,此時若待發送提醒則一並發送,否則發送存在消息。
狀態表用來描述訂閱操作。當完成訂閱的創建后,服務器初始化發布計數器,並當其到期時進行重置。如果計數器超過創建訂閱時設定的無客戶端訂閱服務請求次數值,服務器將認為客戶端已經不存在,而注銷該訂閱。
請求不直接指向某一訂閱,可以被任一訂閱使用,每個請求包含對上一發布周期內發布提醒的訂閱的“收到”應答。所有請求被服務器直接存入被所有訂閱共享的對列表中,除了:
-
無新的客戶端發布請求,而上一服務器向客戶端發送的提醒消息還未發送完儲存在隊列中的提醒。
-
訂閱計時器已經到期,且有提醒或存在消息需要發送。
以上兩種情況,服務器將不會把請求存入隊列,而是直接交由處在以上兩種情況中的訂閱予以處理。
訂閱服務
-
創建訂閱
用於建立訂閱。訂閱監控了一組監控項並當客戶端發送發布請求時返回提醒消息到客戶端。
-
更改訂閱
用於更改訂閱的設置。
-
更改訂閱模式
用於准許訂閱發送提醒消息。
-
發布服務
- 用於通知服務器已收到訂閱發布的提醒消息。
- 用於請求服務器返回提醒消息或生存消息。
確保服務器周期性上報。
-
重新發布
該服務要求訂閱能從重傳隊列中發送提醒消息。如果服務器沒有客戶端所要求的的,則返回一個錯誤響應。
-
傳送訂閱
用於吧一個會話中的訂閱及其相關監控項傳送到另一個會話。
-
刪除訂閱
由客戶端用於刪除一個或多個由該客戶端創建或傳送的訂閱。
該服務執行后,會刪除所有與該訂閱相關的監控項。
訪問歷史數據和歷史事件
用Read、Write、Subscriptions的方法訪問當前數據和訪問歷史的主要不同在於對於時間域歷史請求定義和當前數據或事件的時間域信息歸檔數組的返回。歷史的可用性被變量的AccessLevel屬性或者一個對象的EventNotifier(事件通知器)屬性指定。
歷史訪問服務HistoryRead和 HistoryUpdate是被廣泛應用的兩種服務,它們通過多樣性的可擴展參數( extended parameter)來覆蓋不同的歷史訪問用例。
歷史讀取服務
HistoryRead 服務請求利用一個可擴充可修改的參數定義讀取原始數據、修改的數據( modified data)、已處理的數據( processed data)、指定時間戳的數據和事件的歷史。HistoryRead響應利用一個可擴展參數來傳輸兩種類型的請求信息:數據和事件。HistoryUpdate 服務請求利用一個可擴展參數來插入、替換、更新、刪除數據或事件。
-
讀取raw或modified數據
儲存在歷史數據庫中的raw數據可以直接被返回,一個更改的(modified)數據是在歷史數據庫中被相同的時間戳的其他值所覆蓋的數據。如果同一時間戳有多個覆蓋值,服務器必須全部返回。
-
讀processed(已處理)數據
HistoryRead 服務被Read Processed類型的可擴展參數調用來讀取在歷史數據庫中基於Raw數據的指定聚合所計算出來的processed 數據。它讀取processed值、狀態和時間戳在一個或多個指定時間域上的變量。
-
讀時間戳序列數據
如果在特定的時間戳沒有值,將會從周圍值中插值計算出一個值。讀取一個或多個變量的值、狀態和時間戳
-
讀取歷史事件
使用讀事件的類型的擴展參數閱讀指定的時間域的事件。參數用來過濾返回那些歷史事件並選擇返回的字段。
歷史更新服務
用來插入、替換、更新或刪除歷史值或事件。
- 插入、替換或更新數據
- 插入、替換或更新事件
- 刪除原始數據或修改數據
- 刪除特定時間戳的數據
- 刪除事件
簡單創建一個OPCUA服務器
下載地址 提取碼:i5zd
點開.msi文件傻瓜式安裝,直接next就行。
安裝之后打開OPC UA DashBoard.exe,出現如下界面。
1:開啟按鍵
2:幫助文檔
開始搭建
- 啟動 OPC UA Server & Client,變成如下界面
- 復制DA服務器端的endpoint URL到客戶端,點擊客戶端endpoint右邊的connect
OPC的一個強大功能是客戶端可以瀏覽服務器並查看可用的數據(節點),下一部分將只是用客戶端。
客戶端使用
-
讀取數據。
點擊客戶端左側欄各節點,將在右側欄中顯示節點中的值。
實際上,很多OPC服務器在將值返回給客戶端前會先從底層設備/底層系統獲取數據。所以此時讀取的數據相當於是該節點在某一時刻的數據快照。
-
寫數據。
在左側導航欄中找到你想寫數據的節點,單機右鍵—Write,即可寫入。
這里我選擇寫的值是開始時間,單機OK之后彈出一個對話框
這是因為OPC UA中一些節點是只讀的,對這些節點寫入數據會觸發異常。
-
訂閱數據
訂閱可以連續采集數據,訂閱是使服務器端代表客戶端輪詢底層設備,當服務器檢測到節點值更改,向客戶端發送一條新的消息。與連續讀取操作相比,訂閱減少了客戶機端、服務器端和底層設備上的負載,特別是當多個客戶機(以相同頻率)同時訂閱相同的節點時。
具體操作:對你想訂閱的節點單機右鍵—Monitor。
當訂閱值更新時,將在底部欄中顯示。
在底部欄中對訂閱項單機右鍵,可以按需選擇是否刪除訂閱項,寫數據,設置監控模式,采樣間隔,死區等操作。
技術映射
數據編碼
數據編碼是將服務消息包括它自身的輸入、輸出參數序列化到網絡格式中。目前兩種主要編碼:OPC UA二進制和XML。
XML在此不做贅述,只說與XML相比,OPC UA二進制的不同之處。
即,其基本概念是基於一個定義好的規則,將特定的基本數據類型集合(內建數據類型)轉譯成二進制的表示形式,並寫入一個流,將服務參數序列化與反序列化到二進制流中。由於大部分復雜數據類型都由基本數據類型結合產生,可以順序地將他們包含的基本數據類型轉譯到二進制格式。因為這是基於在數據鏈路上較小的體積和高效的編碼格式,所以可以提供快速數據編解碼。
安全協議
兩類安全協議,都基於一個基於證書的連接建立。
WS-SecureConversation
為通信定制的協議,對XML進行加密和簽名。
UA-SecureConversation
WS-SecureConversation + TLS
傳輸協議
- UA TCP 簡單,提供特殊錯誤恢復,允許會話在網絡中斷時保持存活。
- SOAP/HTTP 防火牆友好,高層。
總結
OPC UA首先是一個架構,這個架構的主體是地址空間。地址空間其實就是一個網狀圖,由一些可以互相引用到的節點組成。節點可以類比成數據結構鏈表中的節點,即由兩部分組成,數據和指針(在OPC UA中是引用),數據部分存放節點相關的信息。
對節點的讀寫操作可以通過數據庫,這樣可以比較好的解決同步異步問題,因為數據庫本身就有一個原子性的特點嘛。對於訂閱操作,其實是設計模式中一個拓展后的觀察者模式,數據一旦發生變化,就由服務器端直接發送一條消息給客戶端,這樣可以節省一些資源。不過在數據庫設計中可能需要增加trigger觸發器,再通知客戶機,並將改變的數據添加到歷史消息隊列中(用於維護歷史數據集)。
如果不通過數據庫,對於讀寫操作,就需要手動控制同步異步和進程/線程互斥,可以用synchronized、lock或者更自由的PV信號燈之類的。然后訂閱操作就是由服務器端監測到底層設備的某個值發生改變,發送一條消息給客戶機,同時進行歷史數據的維護。
對於數據編碼,安全協議,傳輸協議在實際工程中考慮較少,我了解得也有限就不寫了。
《OPC統一架構》 [德] 馬科等著的讀書筆記,同時參考了華北電力大學的一篇碩士學位論文《OPC UA服務器數據管理與訂閱功能模塊研究與開發》以及互聯網上的一些資料。太長不看直接跳到總結部分,可以對OPC UA有一個整體上的認知。推薦使用支持瀏覽大綱的Markdown編輯器如Typora瀏覽本文檔(當然也可以選擇不,記事本也能打開)。
OPC
1. 三個主要的OPC規范:
-
數據訪問:DA Data Access
- 規范描述了訪問過程數據的當前值
-
報警和事件:A&E Alarms And Events
- 描述了寄予時間的信息接口,包括過程報警確認
-
歷史數據訪問:HDA History Data Access
- 描述了訪問歷史數據的函數
所有接口提供通過地址空間瀏覽的方法,並提供可用數據的信息。
2. OPC采用C/S方式進行信息交換。
服務器封裝了過程信息來源(如設備),使信息可以通過它的接口訪問。客戶端連接到服務器后,可以訪問和使用它所提供的的數據。數據可以被C&S使用。
3. 經典的OPC接口是基於微軟的COM和DCOM。
OPC UA(OPC Unified Architecture)總覽
可跨平台,提供更高的可靠性,安全性和數據集成,能顯著改進企業信息的連通性。
相比於傳統的OPC,OPC UA有如下四個特點:
統一的地址空間與信息模型。
-
傳統OPC的DA、A&E、HDA各自有相對獨立的地址空間,相應也有不同的訪問方式;
-
而OPC UA定義了統一數據和服務模型。包括:
- 行為和語義信息模型
- 使應用程序相互作用的消息模型
- 在終端之間傳輸數據的通信模型
- 保證系統之間實現互操作性的一致性模型
-
可以實現DA、A&E、HDA、控制命令、復雜數據的交互通信。
松耦合性。
- 參考了SOA(Service-oriented architecture),以單元為最基本粒度的服務。
- 通過網絡組合形成不同的功能。
- 使用HTTP協議在TCP信道上傳輸。
多平台性。
- 由於采用SOA架構,服務可以是任何語言,只要有統一的通信方式。
更高的安全性。
- UA的用戶認證及加密可以采用現在以及未來出現的各種方式,非常靈活。
Summary 優勢:
- 平台無關
- 所有級別的直接設備連接
- 身份驗證和加密
- 語義服務
地址空間簡介
是以一組引用行駛連接起來的節點構成網狀結構,節點是一個世紀設備在地址空間中的映射,節點包括了屬性和引用。地址空間為不同的實際設備提供了一個統一的抽象模型,利用此模型便於對節點的管理及服務集實現對其統一的訪問方式。同時利用引用可以通過基本的節點搭建出復雜的節點模型,滿足世紀設備需要多樣性的描述的要求。
節點。
節點由屬性和引用兩部分組成:
- 屬性:描述節點的一些特性
- 引用:指向另一個與之相關的節點。
BrowseName瀏覽名稱,僅用於瀏覽目的,不用於顯示節點名稱。
節點的屬性集由OPC UA規定的,不能被擴展。
ReferenceType層次結構只支持單一繼承,保證每個引用類型要么是一個層次化引用類型,要么是非層次化引用類型。
節點的主要(重要)類別:
- 對象
- 對象可以擁有變變量和方法
- 用於地址空間結構,對象使用變量對外提供值,對象不像變量一樣擁有Value屬性。
- 變量
- 代表一個值,客戶端可以對這個值進行讀取、寫入和訂閱其變化
- 分為
- 特性:服務器定義的對象、數據變量和其他節點的特征。
- 數據變量:代表了對象的內容。
- 方法
- 代表服務器中一個由客戶端調用並返回結果的方法。
地址空間組織形式。
- 在地址空間中,節點與節點之間通過引用連接到一起形成網狀結構,一般節點數量非常龐大,客戶端經常只對某個指定的子集的數據感興趣。
- 服務器通過視點的篩選參數屬性,篩選相應的引用特性構成的區域稱之為視域。視域由視域節點類定義。視域指定了一個地址空間的子集。
- OPC UA服務器對客戶端可用的對象幾何及其相關信息被稱為地址空間。
OPC UA屬性服務。
提供了對節點屬性的訪問功能,包括:
- 讀取 Read
- 歷史數據讀取 HistoryRead
- 寫入 Write
- 歷史數據更新 HistoryUpdate
對於監控項服務需要通過其讀取函數對所訂閱的節點屬性進行讀取,並對監控項實例中的數據進行更新。 - OPC UA訂閱與監控項服務及總攬

狀態機
是OPC UA的一個基本概念。這個基本概念被服務器用來描述特定狀態機的應用程序,同時也被OPC信息模型使用。有兩個狀態:空閑(Idle)和讀(Reading),並在其間轉換。
訂閱數據變化和事件
客戶端能從OPC UA服務器訂閱3種不同類型的信息。
- 訂閱用於對信息源進行分組
- 監控項用於管理一個信息源
- 一條信息被稱作一個通知
一個訂閱可能含有所有的3種類型的監控項,服務器將傳遞通知給這些件是想直到訂閱或監控項被刪除。
監控項服務集
-
客戶端通過監控項訂閱數據或事件。
-
監控項保存需要監控的節點項目,節點項目可以是任意節點屬性。
-
提醒是由於描述數據改變和事件的數據結構。通過訂閱打包生產提醒消息被發送到客戶端。
-
訂閱根據用戶定義的發布間隔,周期性允許發送提醒消息。
-
監控項的主要參數用來設定數據的采樣,評價和上報。分別是:
- 采樣間隔
- 監控模式
- 過濾器
- 隊列參數
-
-
服務器可能以加快於客戶端支持的速度采樣,同時由於過濾器服務器會發送少於采樣間隔設定的數值量。當應用數據改變過濾器時,最新的采樣值會與隊列中上一周期生成數據進行比對。
-
觸發模式。在監控項服務中允許設置當某一數據觸發項發送辯護后引起其他項目數據上報。該服務可以由在觸發項和上報項之間建立鏈接來完成。
四種策略設置:
- 引起觸發項監控模式設定為上報禁止。此時引起觸發項不會被上報。
- 引起觸發項監控模式設定為上報允許。此時引起觸發項被上報。
- 上報項監控模式設定為上報禁止。此時上報項被上報。
- 上報項監控模式設定為上報允許。此時上報項只會被上報一次。
另外:客戶端可以創建或刪除觸發項與上報項之間的鏈接。如果上報項所指的監控項在出發鏈接刪除之前被刪除,則鏈接也會被刪除,但觸發項不受影響。
三種類型的監控項
- 用來訂閱變量值的變化,是最常見的。
- 用於訂閱時間。通過定義一個事件通知器來監視,同時可以為事件定義一個事件過濾器。
- 用於訂閱聚合值。聚合值是根據客戶端定義的時間間隔,對獲取到的變量值進行計算得出的。
監控項服務
-
建立監控項
用於為訂閱建立或增加一個或多個監控項。
-
訂閱刪除,關聯的監控項也會被自動刪除。
-
刪除監控項將引起其所指向到上報項的鏈接被刪除,但膳寶香不會受到影響。
-
多次調用創建監控項服務來創建多個監控項將影響到服務器的運行,應該一次為訂閱創建多個監控項。
-
-
更改監控項
用於更改訂閱中的監控項。對采樣間隔和過濾器的更改在下一個周期生效。
-
設置監控項模式
用於設置訂閱中一個或多個監控項的監控模式。若設置禁用模式將導致所有的提醒被刪除。
-
設置觸發
用於創建和刪除觸發項的觸發鏈接。觸發項和上報項應屬於同一訂閱。
-
刪除監控項
用於刪除訂閱中一個或多個監控項。
一個監控項被刪除,其觸發鏈接也被刪除。
但刪除監控項可以不回刪除已經發送到訂閱的提醒,客戶端肯能收到已刪除的監控項上報的數據。
訂閱服務集
訂閱模型
用於向客戶端發送提醒。本質是要求服務器到客戶端的一個異常報告。
其實是相當於(設計模式中)一個擴展后的觀察者模式。
- 包含了一組由客戶端定制的監控項。
- 定義了發布間隔。
- 提醒消息由客戶端調用發布服務來返回。
- 發布周期初始,如果提醒隊列不為空,發布請求隊列為空,服務器進入等待狀態直到接收到發布請求。接收到后,服務器理科發送提醒消息不必等到發布時刻。
- 定義有存在計數器,用來記錄連續的發布周期內提醒隊列為空次數。達到最大存在計數時,服務器產生一個返回發布請求的存在消息,用於通知客戶端服務仍然有效。
- 定義有生存時間計數器,用於記錄在發布周期內客戶端未發送發布請求的次數。該數值大於最大計數時,該訂閱將被刪除,相關的監控項也會被刪除。
- 訂閱是否發布提醒消息可以由服務器在創建時設定,或調用設定發布模式來更改。當設定為禁用時,服務器任然進行采樣,並發送存在消息。
- 訂閱將緩存已發送的提醒消息知道客戶端確認或到達存在消息發送時間。
當訂閱被創建后,在第一個發周期結束時,服務器將向客戶端發送消息用於告知客戶端訂閱正在運行,此時若待發送提醒則一並發送,否則發送存在消息。
狀態表用來描述訂閱操作。當完成訂閱的創建后,服務器初始化發布計數器,並當其到期時進行重置。如果計數器超過創建訂閱時設定的無客戶端訂閱服務請求次數值,服務器將認為客戶端已經不存在,而注銷該訂閱。
請求不直接指向某一訂閱,可以被任一訂閱使用,每個請求包含對上一發布周期內發布提醒的訂閱的“收到”應答。所有請求被服務器直接存入被所有訂閱共享的對列表中,除了:
-
無新的客戶端發布請求,而上一服務器向客戶端發送的提醒消息還未發送完儲存在隊列中的提醒。
-
訂閱計時器已經到期,且有提醒或存在消息需要發送。
以上兩種情況,服務器將不會把請求存入隊列,而是直接交由處在以上兩種情況中的訂閱予以處理。
訂閱服務
-
創建訂閱
用於建立訂閱。訂閱監控了一組監控項並當客戶端發送發布請求時返回提醒消息到客戶端。
-
更改訂閱
用於更改訂閱的設置。
-
更改訂閱模式
用於准許訂閱發送提醒消息。
-
發布服務
- 用於通知服務器已收到訂閱發布的提醒消息。
- 用於請求服務器返回提醒消息或生存消息。
確保服務器周期性上報。
-
重新發布
該服務要求訂閱能從重傳隊列中發送提醒消息。如果服務器沒有客戶端所要求的的,則返回一個錯誤響應。
-
傳送訂閱
用於吧一個會話中的訂閱及其相關監控項傳送到另一個會話。
-
刪除訂閱
由客戶端用於刪除一個或多個由該客戶端創建或傳送的訂閱。
該服務執行后,會刪除所有與該訂閱相關的監控項。
訪問歷史數據和歷史事件
用Read、Write、Subscriptions的方法訪問當前數據和訪問歷史的主要不同在於對於時間域歷史請求定義和當前數據或事件的時間域信息歸檔數組的返回。歷史的可用性被變量的AccessLevel屬性或者一個對象的EventNotifier(事件通知器)屬性指定。
歷史訪問服務HistoryRead和 HistoryUpdate是被廣泛應用的兩種服務,它們通過多樣性的可擴展參數( extended parameter)來覆蓋不同的歷史訪問用例。
歷史讀取服務
HistoryRead 服務請求利用一個可擴充可修改的參數定義讀取原始數據、修改的數據( modified data)、已處理的數據( processed data)、指定時間戳的數據和事件的歷史。HistoryRead響應利用一個可擴展參數來傳輸兩種類型的請求信息:數據和事件。HistoryUpdate 服務請求利用一個可擴展參數來插入、替換、更新、刪除數據或事件。
-
讀取raw或modified數據
儲存在歷史數據庫中的raw數據可以直接被返回,一個更改的(modified)數據是在歷史數據庫中被相同的時間戳的其他值所覆蓋的數據。如果同一時間戳有多個覆蓋值,服務器必須全部返回。
-
讀processed(已處理)數據
HistoryRead 服務被Read Processed類型的可擴展參數調用來讀取在歷史數據庫中基於Raw數據的指定聚合所計算出來的processed 數據。它讀取processed值、狀態和時間戳在一個或多個指定時間域上的變量。
-
讀時間戳序列數據
如果在特定的時間戳沒有值,將會從周圍值中插值計算出一個值。讀取一個或多個變量的值、狀態和時間戳
-
讀取歷史事件
使用讀事件的類型的擴展參數閱讀指定的時間域的事件。參數用來過濾返回那些歷史事件並選擇返回的字段。
歷史更新服務
用來插入、替換、更新或刪除歷史值或事件。
- 插入、替換或更新數據
- 插入、替換或更新事件
- 刪除原始數據或修改數據
- 刪除特定時間戳的數據
- 刪除事件
簡單創建一個OPCUA服務器
下載地址 提取碼:i5zd
點開.msi文件傻瓜式安裝,直接next就行。
安裝之后打開OPC UA DashBoard.exe,出現如下界面。
1:開啟按鍵
2:幫助文檔
開始搭建
- 啟動 OPC UA Server & Client,變成如下界面
- 復制DA服務器端的endpoint URL到客戶端,點擊客戶端endpoint右邊的connect
OPC的一個強大功能是客戶端可以瀏覽服務器並查看可用的數據(節點),下一部分將只是用客戶端。
客戶端使用
-
讀取數據。
點擊客戶端左側欄各節點,將在右側欄中顯示節點中的值。
實際上,很多OPC服務器在將值返回給客戶端前會先從底層設備/底層系統獲取數據。所以此時讀取的數據相當於是該節點在某一時刻的數據快照。
-
寫數據。
在左側導航欄中找到你想寫數據的節點,單機右鍵—Write,即可寫入。
這里我選擇寫的值是開始時間,單機OK之后彈出一個對話框
這是因為OPC UA中一些節點是只讀的,對這些節點寫入數據會觸發異常。
-
訂閱數據
訂閱可以連續采集數據,訂閱是使服務器端代表客戶端輪詢底層設備,當服務器檢測到節點值更改,向客戶端發送一條新的消息。與連續讀取操作相比,訂閱減少了客戶機端、服務器端和底層設備上的負載,特別是當多個客戶機(以相同頻率)同時訂閱相同的節點時。
具體操作:對你想訂閱的節點單機右鍵—Monitor。
當訂閱值更新時,將在底部欄中顯示。
在底部欄中對訂閱項單機右鍵,可以按需選擇是否刪除訂閱項,寫數據,設置監控模式,采樣間隔,死區等操作。
技術映射
數據編碼
數據編碼是將服務消息包括它自身的輸入、輸出參數序列化到網絡格式中。目前兩種主要編碼:OPC UA二進制和XML。
XML在此不做贅述,只說與XML相比,OPC UA二進制的不同之處。
即,其基本概念是基於一個定義好的規則,將特定的基本數據類型集合(內建數據類型)轉譯成二進制的表示形式,並寫入一個流,將服務參數序列化與反序列化到二進制流中。由於大部分復雜數據類型都由基本數據類型結合產生,可以順序地將他們包含的基本數據類型轉譯到二進制格式。因為這是基於在數據鏈路上較小的體積和高效的編碼格式,所以可以提供快速數據編解碼。
安全協議
兩類安全協議,都基於一個基於證書的連接建立。
WS-SecureConversation
為通信定制的協議,對XML進行加密和簽名。
UA-SecureConversation
WS-SecureConversation + TLS
傳輸協議
- UA TCP 簡單,提供特殊錯誤恢復,允許會話在網絡中斷時保持存活。
- SOAP/HTTP 防火牆友好,高層。
總結
OPC UA首先是一個架構,這個架構的主體是地址空間。地址空間其實就是一個網狀圖,由一些可以互相引用到的節點組成。節點可以類比成數據結構鏈表中的節點,即由兩部分組成,數據和指針(在OPC UA中是引用),數據部分存放節點相關的信息。
對節點的讀寫操作可以通過數據庫,這樣可以比較好的解決同步異步問題,因為數據庫本身就有一個原子性的特點嘛。對於訂閱操作,其實是設計模式中一個拓展后的觀察者模式,數據一旦發生變化,就由服務器端直接發送一條消息給客戶端,這樣可以節省一些資源。不過在數據庫設計中可能需要增加trigger觸發器,再通知客戶機,並將改變的數據添加到歷史消息隊列中(用於維護歷史數據集)。
如果不通過數據庫,對於讀寫操作,就需要手動控制同步異步和進程/線程互斥,可以用synchronized、lock或者更自由的PV信號燈之類的。然后訂閱操作就是由服務器端監測到底層設備的某個值發生改變,發送一條消息給客戶機,同時進行歷史數據的維護。
對於數據編碼,安全協議,傳輸協議在實際工程中考慮較少,我了解得也有限就不寫了。
2021.2.7