————————————————
版權聲明:本文為CSDN博主「姚家灣」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yaojiawan/article/details/88990351
————————————————
接觸OPC UA 已經有一段時間了,開始只知道它將是工業4.0 中一個重要的通信協議(IEC 62541)。出於好奇,就了解一下。我看的主要內容包括:Open62541 庫和uaExpert,uamodeler等工具軟件。同時也閱讀了OPC UA 的標准文本和網絡上的許多文章。但是總覺得雲里霧里,神龍見首不見尾。
俗話說”不識廬山真面目,只緣身在此山中”。在學習電腦新技術時,我們往往會被劈頭蓋腦的各種術語,數據結構,函數,協議,模型帶到溝里去了。而忘卻了思考它是什么?它解決上什么問題?為什么這樣做?這些根本的問題。有時真的搞不懂,這么復雜的東西是這么想出來的?是大公司用來故弄玄虛的么?
有一個早上,我突然頓悟,OPC UA 就是在分布式系統中實現對象的描述,什么Node呀,variable呀,reference呀,無非是想描述一個對象!OPC UA 在工業4.0 中的重要性就是通過面向對象的技術,將物理設備,傳感器,電機描述成一個個對象,形成數字化模型。讓不同的軟件可以像調用對象那樣來控制設備。
於是,我放慢心情,順着面向對象的思路,來探究OPC UA 的本質。
面向對象程序設計
軟件設計的重要一環就是將物理世界的物體抽象成數字化模型。其中最重要的技術就是面向對象的程序設計技術。例如,對於一個馬達,我們可以抽象成下面的類
class motor {
float speed;
int direction;
float current;
float voltage;
float temperature;
void start();
void stop();
}
這個類描述了電機的基本特性,它們包括 速度,轉動方向,工作的電流,電壓和溫度。其中方法包括了啟動和停止。
在程序中,我們可以將motor 類實例化,並且對實例的參數參數和控制。例如:
motor motor1,motor2; motor1.speed=1200; motor.direction=CCW; motor.start(); delay(10) motor.stop();
面向對象程序設計是最流行的程序設計方法,流行的OPP 語言是C++。面向對象程序設計的最大好處是突出了接口,屏蔽了細節。提高了軟件的模塊化和重用性。
分布式對象
類的應用和定義是在一個程序中的。如果將面向對象的概念擴展到程序之間,或者是網絡中的不同程序之間會怎么樣呢?人們的確是這么做了。
分布式計算環境下,程序之間的相互調用最早采用RPC(遠程過程調用) 方式。但是對於更加復雜的情況下,更好的方式是采用分布式對象技術。計算機程序可以調用網絡中的任何一個對象。這也符合實際應用的需要,比如自動控制SCADA程序啟動注塑機上的主電機(motorA),就演變成為調用注塑機控制器中的對象motorA的start 函數。所以將面向對象程序設計中的對象概念衍生到分布式系統中,就產生了分布式對象的概念。
常見的分布式對象技術包括了
微軟的COM/DCOM (Distributed Component Object Model)
國家組織OMG的CORBA(Common Object Request Broker Architecture)
OPC
在了解OPC UA 的之前,我們首先了解一些它的前身OPC 協議。這樣更有利於了解OPC UA 的本質和由來。
OPC 是基於微軟的DCOM 技術,用於設備和軟件之間交換數據。 這也意味着OPC 只能在window 系統上運行.在運行OPC 之前需要配置Window 的COM/DCOM.在運行命名行 鍵入”DCOMCNFG”可以看見window的服務組件的配置(細節我並不了解).不過有一點可以確實,就是OPC 是在運行windows的工業PC 和上位機上方可運行.這在window 一統天下的年代的不二選擇.一台PLC 如果要和OPC 上位機軟件通信,必需通過Windows 工業電腦來完成.

重新認識OPC UA
現在,我們來重新來認識OPC UA 的本質吧! OPC UA 是OPC 的后繼標准,只是后面增加了UA ,意指”統一架構”(Unified Architecture).它的主要目的是擺脫windows! 實現與平台無關的OPC.
從OPC 演進到OPC UA,它的目的並沒有改變,依然是為了實現分布式控制系統中的分布式對象技術.但是它的方式變成了與平台無關.面向了開放系統.這也就意味着我們可以在一個Arm /linux平台上實現OPC 的server,或者在雲端linux平台上實現Client 程序.
opc ua 的代碼足夠地小,事實上已經可以將OPC UA 的server 端直接集成到PLC ,傳感器或者小型網關中.
一旦了解了事物的本質,就可以高屋建瓴地理解許多細節.現在我們在來看看OPC UA 的許多概念.
1 信息模型(Information model)
OPC UA 使用了對象(objects)作為過程系統表示數據和活動的基礎。對象包含了變量,事件和方法,它們通過引用(reference)來互相連接。這個概念和面向對象程序設計方法非常相似。
OPC UA 信息模型是節點的網絡(Network of Node,),或者稱為結構化圖(graph),由節點(node)和引用(References)組成,這種結構圖稱之為OPC UA 的地址空間。這種圖形結構可以描述各種各樣的結構化信息(對象)。

節點(nodes) : 共計有8種節點(對象,對象類型,變量,變量類型,視圖,方法,引用,數據類型)

也許我們通過一些實例能夠更加容易理解這種節點圖描述對象的能力。
視圖節點(view node)
假如我們要為一個設備建立opc ua 模型,這個設備具有一個模擬量輸入,一個數字輸出,兩個方法 ,分別是readAnalog和ReadDigital。這個模型如果使用C++的類來描述,是下面的樣子。
class sensor {
public :
double analog;
uint32_t digital
double readAnalog(int port)
uint32_t readDigital(int port)
}
如果使用節點圖來描述首先要區分不同的節點類型

相應的節點圖是下面的樣子

如果你熟悉C++面向對象程序設計,可以將C++的類與OPCUA 的節點圖對應起來,這樣比較容易理解OPC UA 信息模型是如何構建的。
opc ua model 的設計工具:
opc ua 的模型采用XML 文件描述,然后通過一個編譯工具可以將XML 編譯成C++語言的程序。
為了方便地建立 opc ua 的信息模型,需要使用模型編輯軟件,它們會產生XML 的小型模型,然后編譯成C語言程序。
比較流行的是uaModeler 不過這是一個商業化的軟件。免費的軟件有 在python的opcua-modeler,可以在下面的地址找到
https://github.com/FreeOpcUa/opcua-modeler
編譯工具
python ./nodeset_compiler.py --types-array=UA_TYPES --existing ../../deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml --xml myNS.xml myNS
使用面向對象程序設計的概念去看待OPC UA 的信息模型,有助於理解OPC UA的許多概念。至少我是這樣的。
這使我想起了《數學的語言》中關於數學的定義,數學是研究模型的學科,數學靠自然和物理的手腳架搭建的,當自然和物理的手腳架撤離之后,人們卻無法理解數學宮殿是如何建造的了。
