1. OPC基礎(chǔ)概念
-
OPC誕生緣由:OPC誕生之前,軟件工程師是不了解硬件和協(xié)議的
OPC解決的是軟件和硬件之間的問題,讓軟件工程師無需了解協(xié)議及底層硬件,例如串口協(xié)議等 -
OPC起到了橋梁的作用:軟件工程師對接OPC,OPC對接硬件
-
OPC是一種通訊方式,落到實(shí)處就是一個軟件,就需要開發(fā)相應(yīng)的軟件,比較大的公司開發(fā)的OPC軟件有KepServer 、西門子、NI等,有些是對接自己的產(chǎn)品,像KepServer是對接很多自動化公司的產(chǎn)品,采集數(shù)據(jù)到OPC軟件,OPC軟件也是一個服務(wù)器,使得軟件工程師通過對接OPC軟件就可以間接獲取到PLC等硬件數(shù)據(jù)。
-
有了OPC軟件,軟件工程師都可以不用懂PLC,對于軟件工程師就變成了OPC變量
OPC變量是節(jié)點(diǎn)式的,不是一個一個的,而是一節(jié)一節(jié)的,也就是級別,設(shè)備(通道)->組->變量,下圖就是OPC結(jié)構(gòu)的示意圖 -
首先明確OPC != KepServer, KepServer只是一個OPC軟件
上面是一個概念上的認(rèn)識,如果要落到實(shí)處,最好是使用代碼敲出來
2. OPC通信仿真和編程
選擇硬件,但是沒有硬件,可以使用仿真方式進(jìn)行。
2.1 采用Modbus Slave軟件作為模擬實(shí)際設(shè)備進(jìn)行Modbus的通信仿真
此處采用Modbus Slave軟件作為模擬設(shè)備,假設(shè)進(jìn)行Modbus的通信仿真
下圖仿真的就是保持寄存器0開始的10個,40001
是相對地址,通訊一般使用相對地址,說明書中會寫絕對地址,每個寄存器的含義需要查看說明書
2.1.1 Modbus通信中如何存儲不同類型數(shù)據(jù)
(1)浮點(diǎn)數(shù)
Modbus是以寄存器為單位,一個寄存器占16位,當(dāng)想要表示浮點(diǎn)數(shù)時就需要使用兩個寄存器進(jìn)行拼接,下面是表示浮點(diǎn)數(shù)的方法
設(shè)置之后40001
和40002
就用來存儲浮點(diǎn)數(shù),其他寄存器中存儲的數(shù)據(jù)類型不受影響
上圖中44
、3
和1
均是int16
類型,取值范圍為-32768~+32767
(2)double
以下是用來表示double類型
(3)int32
當(dāng)想表示int32的話,設(shè)置如下:
利用這10個寄存器,區(qū)定義如下的5個參數(shù)
2.2 KepServer軟件作為OPC服務(wù)器
現(xiàn)在想要對上面的5個參數(shù)進(jìn)行讀取,就得使用KepServer軟件(學(xué)習(xí)時使用),軟件可以通過“dotNet工控上位機(jī)”公眾號獲取,關(guān)于軟件的安裝破解可以參考OPC底層原理剖析1。
軟件安裝完后的界面如下圖所示:
2.2.1 如何將KepServer與Modbus Slave(模擬實(shí)際設(shè)備)進(jìn)行配置及通信
首先可以看到Modbus Slave是沒有通過報文與其他進(jìn)行交互
在KepServer中添加通道,根據(jù)通信類型選擇對應(yīng)的驅(qū)動
(其中有多種品牌的通訊方式等)如下圖所示
起名字,只是起到標(biāo)識的作用
一直點(diǎn)“下一步”到如下界面
“單擊添加設(shè)備”->起設(shè)備名
填寫設(shè)備IP
和ID
設(shè)備ID的查詢方式如下
一直點(diǎn)“下一頁”至“完成”
創(chuàng)建“組”和“標(biāo)記”:組和標(biāo)記可以是同級,也可以使用組來管理標(biāo)記,一般創(chuàng)建一個組來管理“標(biāo)記”就夠用了
按照Modbus Slave中的名稱、地址、數(shù)據(jù)類型新建標(biāo)記
創(chuàng)建好標(biāo)記之后,界面如下圖所示:
利用上圖中配置的標(biāo)記驗證前面的設(shè)置是否正確,如果正確就可以配置其他的標(biāo)記了。
保存設(shè)置->運(yùn)行->連接->確定,通過下圖中小眼鏡的標(biāo)志可以打開如下界面,再在Modbus Slave中Display->Communication查看是否存在報文,如果存在報文發(fā)送接收,就代表連接成果
由于視頻中介紹的時候,一直連接不上,后期是沒有建組,直接在通道1下創(chuàng)建了設(shè)備1來查看壓力
當(dāng)兩個的數(shù)據(jù)無法對應(yīng)時,可以通過調(diào)整Modbus Slave中數(shù)據(jù)的格式來顯示一致
當(dāng)實(shí)際中Modbus Slave代表的硬件中的數(shù)據(jù)無法修改時,可以在KepServer中雙擊對應(yīng)的設(shè)備1來修改數(shù)據(jù)的大小端順序等
此時就模擬了數(shù)據(jù)從PLC讀取到OPC服務(wù)器中
2.3 基于C#利用VS寫一個客戶端同時讀多個設(shè)備變量值
可以發(fā)現(xiàn),只有打開OPC Quick Client的打開情況下發(fā)送請求后,才會與Modbus Slave通信,當(dāng)關(guān)閉OPC Quick Client通信就會斷開(OPC Quick Client扮演客戶端,Modbus Slave扮演服務(wù)器
),這里就是客戶端OPC Quick Client通過KepServer與Modbus Slave進(jìn)行通信。
此時就需要寫一個客戶端與KepServer進(jìn)行通信。
2.3.1 庫文件導(dǎo)入
基于庫進(jìn)行開發(fā), 視頻提供的dll文件進(jìn)行開發(fā)
將.dll文件復(fù)制到根目錄下
添加引用
2.3.2 如何連接OPC服務(wù)器
首先有個問題:KepServer本質(zhì)上是一個服務(wù),將軟件關(guān)閉之后,OPC是否還在運(yùn)行呢?
關(guān)閉KepServer軟件,使用“新閣教育配置一體化軟件”模仿客戶端(起到的作用與OPC Quick Client是一樣的)進(jìn)行如下測試:
可以發(fā)現(xiàn)值是一值在讀取的,報文也是一直存在的,說明其是一直以服務(wù)的形式存在(軟件可以關(guān),服務(wù)一直在跑)
我們自己寫軟件進(jìn)行連接,其實(shí)連接的是一個服務(wù),服務(wù)是有名字的,連接某個服務(wù)其實(shí)是連接某個計算機(jī)的某個服務(wù),OPC服務(wù)是可以在不同電腦中,只要在一個局域網(wǎng)中,OPC在一個服務(wù)器中,客戶端在另一個電腦中,是可以跨網(wǎng)絡(luò)的。
以前的框架中會有專門的電腦做OPC服務(wù)器,想要連接某個服務(wù)就需去找某個電腦的某個指定服務(wù)名稱
2.3.2.1 服務(wù)名稱查找方法
“我的電腦”右鍵選擇“管理”->“服務(wù)和應(yīng)用程序”->“服務(wù)”,在其中找
此時其實(shí)是看不到服務(wù)名稱的,Kepware.KEPServerEX.V6
這個名字其實(shí)是通過獲取得到的,v6
代表版本號,如果你的KepServer是4.x,那么就是v4
2.3.2.2 寫代碼得到服務(wù)名稱
以下代碼是在一個“combox”中添加OPC服務(wù)節(jié)點(diǎn)
運(yùn)行后在“combox”中可以看到由于博主安裝了很多軟件,所以會添加很多的OPC服務(wù)節(jié)點(diǎn)
一般服務(wù)器名稱和服務(wù)名稱都是寫死的,獲取到之后就可以寫死
以下是此時對應(yīng)的原始界面
2.3.2.2 寫代碼連接OPC服務(wù)器
給“連接OPC服務(wù)器”按鈕下寫代碼
可以看到連接也是使用的OPCServer OPCServer = new OPCServer()
中的OPCServer
,后面的操作都是圍繞著這個去做,相當(dāng)于句柄或者說通信對象。
運(yùn)行之后效果如下:
下來需要讀數(shù)據(jù),驗證確實(shí)是連接成功
2.3.3 讀數(shù)據(jù)驗證是否連接成果
首先我們知道OPC讀取數(shù)據(jù)的3種方式:同步、異步、訂閱
-
同步理解:你到現(xiàn)場去做項目,一步步的在現(xiàn)場去解決問題,這就是同步;異步理解:去現(xiàn)場遇到難得問題,交給別人去做,自己跳過難得問題去解決其他問題,別人把難得問題解決了告訴你,此時項目解決的問題會更多一些,而不會因為難得問題卡??;訂閱理解:不去現(xiàn)場,將項目分配給某個人,他做好之后告訴你,做的過程中不會有任何交互,這就是訂閱
-
通信也是,同步就是讀一次,有返回了才讀第二次;異步就是我只管讀,讀完之后會通過事件告訴我讀好了,你來進(jìn)行解析;訂閱就是有100個變量,我只讀10個變量,如果不發(fā)生變化就不會通知,一旦發(fā)生變化就會通過事件來進(jìn)行通知
-
以其課程為例:采用訂閱,如果課程更新了就會通知學(xué)員課程更新了;如果采用異步,就是安排別人去刷,有更新了再告訴你;同步就是你不停的去刷
顯然以上述理解,訂閱和異步的效率會更高些
- 今天只講效率最高的一種方式:訂閱方式
做訂閱,首先需要有變量,OPC中存在很多集,很多東西,以下是不好理解的
創(chuàng)建對象OPCGroup OPCGroup ; OPCGroups OPCGroups ;
句柄:就是一個整型值,是個代號,Windows底層想要窗體之間傳遞各種信息,靠窗體名稱去傳很浪費(fèi)資源,所以給每個窗體創(chuàng)建一個代號就方便很多
Item ID獲取并寫入代碼中
通過以下代碼會在值發(fā)生變化的時候去觸發(fā)事件,當(dāng)?shù)谝淮芜B接之后,先會將所有值都讀一遍,從而觸發(fā)private void OPCGroup_DataChange(…)``
經(jīng)過實(shí)驗看到觸發(fā)成功
觸發(fā)了成功也就代表訂閱成功,下來就要對事件傳的數(shù)據(jù)根據(jù)句柄進(jìn)行解析
2.3.4 對從OPC服務(wù)器上讀取到的數(shù)據(jù)進(jìn)行解析和顯示
以下代碼實(shí)現(xiàn)變量值解析和顯示在界面中
運(yùn)行效果如下:
2.3.5 新增西門子PLC并讀取其變量值
2.3.5.1 KepServer配置
以下演示假設(shè)增加一個西門子的PLC
下圖通道2中就是新建的西門子s7-1200的PLC
2.3.5.2 仿真實(shí)體西門子PLC s7-1200
利用“新閣教育配置一體化軟件”扮演的角色就是實(shí)體PLC,并給對應(yīng)的地址賦值,具體如何操作可以查看Modbus通信從入門到精通_2_Modbus TCP通信詳解及仿真
可以看到OPC的客戶端“OPC Quick Client”已經(jīng)讀取到對應(yīng)位置值
2.3.5.3 C#+VS代碼讀取PLC的值
如果想要C#+VS代碼讀取到這個新建的PLC的值,應(yīng)該怎么操作呢?
運(yùn)行結(jié)果中可以看到,界面中已經(jīng)顯示兩個通道也就是2個設(shè)備的變量
從上面可以看到,KepServer的好處就是可以對接很多設(shè)備,而對于上位機(jī)只是增加了很少的代碼量文章來源:http://www.zghlxwxcb.cn/news/detail-755421.html
3. 學(xué)習(xí)視頻地址:
OPC底層原理剖析1;OPC底層原理剖析2;OPC底層原理剖析3;OPC底層原理剖析4;OPC底層原理剖析5文章來源地址http://www.zghlxwxcb.cn/news/detail-755421.html
到了這里,關(guān)于OPC通信從入門到精通_2_OPC通信詳解和C#客戶端編程(OPC基礎(chǔ)概念;OPC通信仿真(KepServer作為OPC服務(wù)器;使用Modbus Slave和另外軟件仿真2個PLC設(shè)備);C#程序)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!