opc ua 用哪種語言編寫 OPC UA 的本質

2021-10-12 13:47:45 字數 3584 閱讀 8864

接觸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,可以在下面的位址找到

編譯工具

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的許多概念。至少我是這樣的。

這使我想起了《數學的語言》中關於數學的定義,數學是研究模型的學科,數學靠自然和物理的手腳架搭建的,當自然和物理的手腳架撤離之後,人們卻無法理解數學宮殿是如何建造的了。

識別文字用哪種語言寫成

原文 aspn python cookbook 提到了乙個使用 zlib 庫識別文字用哪種語言寫成的程式.其核心 不超過20行,據我觀察,識別精度不低於95 我略做了一下修改,把聯合國聯合國人權宣言作為語料庫,目前從 wikipedia 上隨便抓一篇爪哇文的文章下來,都能識別得九不離十。classe...

D語言 用D語言編寫Ruby擴充套件

ruby語言的官方解釋程式是使用c語言開發的,一般用c語言來編寫擴充套件。d語言和c語言是二進位制相容的,所以可以使用d語言編寫ruby擴充套件。一 移植c庫到d的一般過程 c使用標頭檔案來處理符號依賴,在d裡面鏈結外部庫檔案時,要使用extern c 宣告來引入符號,這是乙個轉換過程。如何轉換乙個...

用C語言編寫通訊錄

include include define null 0 define len sizeof struct student struct student int n struct student creat void p2 next null return head void print stru...