国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

OPC技術(shù)在智能倉(cāng)儲(chǔ)系統(tǒng)中的應(yīng)用

2021-08-02 03:35:34成衛(wèi)青
關(guān)鍵詞:數(shù)據(jù)源客戶端對(duì)象

吳 晗,成衛(wèi)青

(南京郵電大學(xué) 計(jì)算機(jī)學(xué)院,江蘇 南京 210023)

0 引 言

當(dāng)今社會(huì)不斷進(jìn)步,工業(yè)上的自動(dòng)化程度也在不斷提高,智能倉(cāng)儲(chǔ)也被逐漸應(yīng)用于各種場(chǎng)景,以達(dá)到減少貨物存放空間,提高效率的目的。而對(duì)各個(gè)設(shè)備狀態(tài)的實(shí)時(shí)監(jiān)控是整個(gè)智能倉(cāng)儲(chǔ)軟件最為關(guān)鍵的一部分,在監(jiān)控、控制整個(gè)智能化立體倉(cāng)儲(chǔ)中發(fā)揮著十分關(guān)鍵的作用。作為整個(gè)系統(tǒng)的核心,WCS(warehouse control system,倉(cāng)庫(kù)控制系統(tǒng))能夠根據(jù)設(shè)備當(dāng)前的狀態(tài),通過(guò)對(duì)數(shù)據(jù)庫(kù)的查詢來(lái)控制任務(wù)信息的下達(dá),可以實(shí)時(shí)監(jiān)控當(dāng)前堆垛機(jī)所處的位置、堆垛機(jī)狀態(tài)、是否報(bào)警以及堆垛機(jī)貨叉上是否有貨的狀態(tài)變化,也能夠?qū)斔途€的狀態(tài)和是否有報(bào)警進(jìn)行監(jiān)控,還能夠查詢到當(dāng)前貨物所存放的位置及庫(kù)位信息等。為了能夠?qū)崿F(xiàn)上述的功能,第一步需要解決PLC和上位機(jī)之間的通信。一般來(lái)說(shuō),對(duì)于一些要求不是很高的設(shè)備,串口通信是最常見的方式,除此以外還有總線通信、串口轉(zhuǎn)以太網(wǎng)通信等。但是根據(jù)實(shí)際使用的情況發(fā)現(xiàn),串口通信和現(xiàn)場(chǎng)總線通信會(huì)受到通信距離的限制,而且通信效率不高,常常會(huì)有信號(hào)延遲或者信號(hào)收不到的問題出現(xiàn)。為了解決上述問題,出現(xiàn)了OPC(OLE for process control)通信。

1 OPC技術(shù)

通信協(xié)議規(guī)定了實(shí)體雙方要實(shí)現(xiàn)通信所必須遵守的規(guī)則或約定?,F(xiàn)階段,隨著工業(yè)自動(dòng)化的快速進(jìn)步,在完成PLC和上位機(jī)的數(shù)據(jù)交互方面,OPC協(xié)議起著至關(guān)重要的作用[1-4]。由于基于OPC通信協(xié)議的交互速度快,性能穩(wěn)定,目前越來(lái)越多的交互方式都采取這種協(xié)議。根據(jù)不同的控制系統(tǒng),OPC服務(wù)器不僅能夠放在PLC上成為上位機(jī)的遠(yuǎn)程OPC服務(wù)器,也能夠放在上位機(jī)上成為本地OPC服務(wù)器。此外,接口作為組件之間通信的橋梁[5],OPC為開發(fā)人員提供了一個(gè)具有開放式的接口,可以對(duì)這個(gè)接口進(jìn)行引用、改寫、擴(kuò)展,從而實(shí)現(xiàn)符合自身需求的接口,完成基于OPC的上位機(jī)與下位機(jī)的數(shù)據(jù)交互。因此,OPC協(xié)議為實(shí)現(xiàn)通過(guò)PLC連接到現(xiàn)場(chǎng)工控電腦的OPC客戶端提供了一個(gè)可行的方式。圖1為數(shù)據(jù)源與WCS的連接結(jié)構(gòu)。

圖1 數(shù)據(jù)源與WCS連接結(jié)構(gòu)

WCS與OPC服務(wù)器的數(shù)據(jù)通信包含兩方面:一方面是WCS從OPC服務(wù)端讀數(shù)據(jù);另一方面是WCS向OPC服務(wù)端寫數(shù)據(jù)[6]。WCS從OPC服務(wù)端讀數(shù)據(jù)有4種方法,分別為:異步讀取、刷新與訂閱、同步讀取[7]。WCS向OPC服務(wù)器寫入數(shù)據(jù)有兩種方法:異步寫入和同步寫入。WSC和OPC服務(wù)器的數(shù)據(jù)通信有3種方式,分別為:異步、同步以及訂閱。

1.1 同步訪問

同步讀和寫都屬于同步訪問,同步訪問指的是WCS(OPC客戶端)調(diào)用OPC服務(wù)器提供的接口,對(duì)服務(wù)器中的內(nèi)容進(jìn)行讀取和寫入,OPC服務(wù)器根據(jù)WCS所請(qǐng)求的內(nèi)容將查找到的數(shù)據(jù)返回給WCS,而在此之前WCS將會(huì)一直處在等待狀態(tài)。

同步訪問的特點(diǎn)是:在WCS讀取特定數(shù)據(jù)塊內(nèi)容時(shí),必須要求WCS讀到數(shù)據(jù)為止;同樣的,WCS在寫入指定的數(shù)據(jù)塊地址之前,會(huì)始終處在等待數(shù)據(jù)的狀態(tài)。因此,當(dāng)數(shù)據(jù)量比較小且WCS與OPC服務(wù)器交互不是很頻繁的時(shí)候可以使用同步訪問的方法。但當(dāng)數(shù)據(jù)量大或者有大量用戶訪問的時(shí)候,同步訪問會(huì)出現(xiàn)延遲情況,造成系統(tǒng)的效率降低。

1.2 異步訪問

異步讀和寫也都屬于異步訪問,異步訪問和同步訪問相似,但異步訪問的操作過(guò)程比同步訪問更加復(fù)雜,先要WCS提出數(shù)據(jù)請(qǐng)求,然后在OPC服務(wù)器接收到這個(gè)數(shù)據(jù)請(qǐng)求后,OPC服務(wù)器會(huì)將這個(gè)請(qǐng)求進(jìn)行“隊(duì)列”排序并且為其編號(hào),WCS所調(diào)用的方法就會(huì)立即返回,使WCS能夠繼續(xù)執(zhí)行其他任務(wù),不再處于等待狀態(tài)。在OPC服務(wù)器操作完成后,WCS會(huì)在一個(gè)專門處理外部事件的代碼塊中處理OPC服務(wù)器發(fā)送過(guò)來(lái)的數(shù)據(jù)。

異步訪問的特點(diǎn)是:在WCS發(fā)出讀取請(qǐng)求后需要馬上返回,然后WCS可執(zhí)行其他任務(wù),當(dāng)OPC服務(wù)器讀取數(shù)據(jù)完成后,調(diào)用WCS的讀取完成事件,完成讀取過(guò)程;同樣的,在WCS發(fā)出寫入請(qǐng)求后需要馬上返回,然后WCS繼續(xù)執(zhí)行其他任務(wù),當(dāng)OPC服務(wù)器把數(shù)據(jù)寫入完成后,再調(diào)用WCS的寫入完成事件,完成寫過(guò)程。所以異步訪問的效率相比較于同步訪問更高,它可以承載更多的用戶請(qǐng)求的數(shù)據(jù),并且在最大程度上節(jié)約通信以及CPU資源。

1.3 訂閱方式

訂閱方式是OPC服務(wù)器與WCS通信中的一種十分特別的數(shù)據(jù)通信模式[8]。OPC服務(wù)器不需要收到來(lái)自WCS的數(shù)據(jù)請(qǐng)求,它是OPC服務(wù)器在每一個(gè)周期內(nèi),對(duì)于在掃描緩沖區(qū)內(nèi)的數(shù)據(jù)進(jìn)行掃描然后對(duì)比,若對(duì)比結(jié)果發(fā)現(xiàn)前后數(shù)據(jù)的變化大于閾值時(shí),則會(huì)更新掃描緩沖區(qū)中的數(shù)據(jù)并且向WMC提供數(shù)據(jù)。這樣一旦出現(xiàn)數(shù)據(jù)變化WCS就能夠及時(shí)地收到變化后的數(shù)據(jù)信息。訂閱方式從本質(zhì)上來(lái)說(shuō)是一種異步方式中的讀取方式。使用訂閱方式采集數(shù)據(jù)是按照固定的周期更新數(shù)據(jù)緩沖區(qū)的值,當(dāng)發(fā)現(xiàn)數(shù)據(jù)出現(xiàn)變化時(shí),則會(huì)通過(guò)數(shù)據(jù)變化事件告訴WCS,并且只有當(dāng)數(shù)據(jù)的變化超過(guò)規(guī)定閾值的時(shí)候才會(huì)更新數(shù)據(jù)緩沖區(qū)的值并且通知WCS,由此可以得出,使用此種方式將會(huì)忽略數(shù)據(jù)微小的變化,以降低WCS與OPC服務(wù)器的負(fù)載。

訂閱方式的特點(diǎn)是:通過(guò)OPC服務(wù)器在每個(gè)固定周期中檢查緩存區(qū)中的數(shù)據(jù),當(dāng)發(fā)現(xiàn)數(shù)據(jù)的變化超過(guò)一個(gè)固定值之后,就會(huì)立即告訴WCS應(yīng)用程序,將數(shù)據(jù)緩存區(qū)的信息傳送過(guò)去。這種技術(shù)是根據(jù)“硬件設(shè)備-服務(wù)器-用戶”的模型,如圖2所示,在服務(wù)器內(nèi)部預(yù)先建立一個(gè)動(dòng)態(tài)緩存區(qū)用來(lái)存儲(chǔ)數(shù)據(jù),當(dāng)數(shù)據(jù)出現(xiàn)變化較大時(shí)對(duì)其進(jìn)行更新且發(fā)送給WCS。這種方式在數(shù)據(jù)變化不大的情況下不會(huì)向WCS發(fā)送信息,從而減少數(shù)據(jù)發(fā)送的次數(shù),也能夠減少WCS對(duì)OPC服務(wù)器的重復(fù)訪問的次數(shù)。在提供數(shù)據(jù)的設(shè)備點(diǎn)十分多的情景中,更能體現(xiàn)出使用這種通信方法的優(yōu)點(diǎn)。

圖2 訂閱數(shù)據(jù)訪問交互方式

2 OPC服務(wù)器的搭建

智能倉(cāng)儲(chǔ)一般都使用C/S的架構(gòu)模式,它包含了OPC服務(wù)器以及WCS(OPC客戶端)兩個(gè)部分,該文主要探討的是OPC服務(wù)器的實(shí)現(xiàn)過(guò)程。

2.1 總體設(shè)計(jì)構(gòu)思

OPC服務(wù)器的設(shè)計(jì)需要根據(jù)智能倉(cāng)儲(chǔ)的實(shí)際情況去考慮,為WCS提供一個(gè)穩(wěn)定、流暢的通信平臺(tái)。具體需要實(shí)現(xiàn)3個(gè)方面的功能。第一,作為一個(gè)數(shù)據(jù)服務(wù)器,OPC服務(wù)器需要向WCS提供OPC服務(wù)器的對(duì)象以及接口,這樣其他軟件才能對(duì)OPC服務(wù)器提供的數(shù)據(jù)進(jìn)行讀操作和寫操作,這是作為OPC服務(wù)器最關(guān)鍵也是最為基本的功能;第二,OPC服務(wù)器應(yīng)當(dāng)能夠?qū)ΜF(xiàn)場(chǎng)采集的實(shí)時(shí)數(shù)據(jù)進(jìn)行數(shù)據(jù)管理;第三,為了能便于維護(hù)人員進(jìn)行操作,OPC服務(wù)器應(yīng)提供靈活多用的交互接口。在開發(fā)設(shè)計(jì)層面,OPC服務(wù)器應(yīng)當(dāng)與WCS的功能模塊相對(duì)獨(dú)立,由數(shù)據(jù)采集、OPC對(duì)象和接口以及數(shù)據(jù)管理三個(gè)子模塊組成。OPC服務(wù)器的總體結(jié)構(gòu)如圖3所示[9]。

圖3 OPC服務(wù)器的總體結(jié)構(gòu)

2.2 數(shù)據(jù)采集模塊

數(shù)據(jù)采集與現(xiàn)場(chǎng)設(shè)備直接連接,獲取到現(xiàn)場(chǎng)設(shè)備的實(shí)際數(shù)值,再將其分配到其對(duì)應(yīng)的通信子模塊中。通常來(lái)說(shuō),每一個(gè)設(shè)備都會(huì)有一個(gè)通信子模塊與其對(duì)應(yīng)。數(shù)據(jù)采集模塊會(huì)有一個(gè)固定的采集周期,在每個(gè)采集周期內(nèi)都會(huì)從現(xiàn)場(chǎng)實(shí)際設(shè)備中采集數(shù)據(jù)。對(duì)于數(shù)據(jù)采集模塊來(lái)說(shuō)有兩種方式可以實(shí)現(xiàn)數(shù)據(jù)采集,第一種為直接通過(guò)I/O驅(qū)動(dòng)實(shí)現(xiàn)現(xiàn)場(chǎng)設(shè)備與通信子模塊之間的通信;第二種為使用數(shù)據(jù)接口,通過(guò)這個(gè)數(shù)據(jù)接口不斷地讀取現(xiàn)場(chǎng)設(shè)備中的數(shù)據(jù)。OPC服務(wù)器數(shù)據(jù)采集模塊的結(jié)構(gòu)如圖4所示。

圖4 OPC服務(wù)器數(shù)據(jù)采集模塊的結(jié)構(gòu)

在實(shí)際開發(fā)應(yīng)用的時(shí)候,工業(yè)上很多的控制軟件都配備了屬于其單獨(dú)擁有的數(shù)據(jù)庫(kù)。通常情況下,都是利用數(shù)據(jù)庫(kù)供應(yīng)商提供的專門的API來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。除此以外,目前市面上經(jīng)常使用的數(shù)據(jù)庫(kù)如SQLServer、Oracle、MySql等,雖然大致相同,但是每個(gè)數(shù)據(jù)庫(kù)都具備其自身的特點(diǎn),如果需要訪問這些數(shù)據(jù)庫(kù)的話,就要對(duì)每個(gè)數(shù)據(jù)庫(kù)單獨(dú)地編寫不同的控制軟件。對(duì)于日后的系統(tǒng)集成來(lái)說(shuō),這將會(huì)是一個(gè)巨大的挑戰(zhàn)[10]。

在本系統(tǒng)中OPC服務(wù)器特別為數(shù)據(jù)采集模塊提供了對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的接口,使得整個(gè)WCS具有OPC服務(wù)器的功能,有效地解決了數(shù)據(jù)庫(kù)版本不統(tǒng)一,需要單獨(dú)編寫的問題。對(duì)于這樣的設(shè)計(jì)方式類似于創(chuàng)建了一個(gè)訪問WCS實(shí)時(shí)數(shù)據(jù)庫(kù)的中間件,對(duì)于其他的開發(fā)商來(lái)說(shuō)就無(wú)需知道這個(gè)數(shù)據(jù)庫(kù)的特有結(jié)構(gòu)了。OPC客戶端(WCS)只需要根據(jù)所提供的OPC通信規(guī)范[11],就可以利用OPC服務(wù)器通過(guò)間接訪問的方式與數(shù)據(jù)源交換數(shù)據(jù)。

對(duì)于不同的數(shù)據(jù)源如輸送線、傳感器、堆垛機(jī)等,OPC服務(wù)器必須能夠取得這些設(shè)施的數(shù)據(jù)。因此在數(shù)據(jù)采集模塊中,通信子模塊中的接口都是以動(dòng)態(tài)鏈接庫(kù)(dynamic-link library,DLL)的形式實(shí)現(xiàn)的。利用動(dòng)態(tài)鏈接庫(kù)能夠制定一個(gè)統(tǒng)一的通信接口格式,這樣就能將OPC服務(wù)器中上層具體功能和下層數(shù)據(jù)采集模塊的功能分隔開,兩部分獨(dú)立開發(fā)降低耦合程度,這樣使得OPC服務(wù)器能夠?qū)Χ喾N不同的設(shè)備實(shí)現(xiàn)兼容。除此以外,將通信接口封裝成DLL來(lái)實(shí)現(xiàn),不僅能夠在很大程度上降低程序運(yùn)行所需的資源,增強(qiáng)系統(tǒng)的安全性和可靠性,也使得用戶對(duì)其二次開發(fā)更加方便。

2.3 OPC對(duì)象和接口

WCS和OPC服務(wù)器之間的數(shù)據(jù)通信依靠對(duì)象的接口來(lái)實(shí)現(xiàn),OPC對(duì)象和接口也是整個(gè)OPC通信規(guī)范的核心。主要有三種結(jié)構(gòu)組成了OPC服務(wù)器:服務(wù)器、組和項(xiàng)[12]。作為所有組對(duì)象的集合,服務(wù)器對(duì)象包含了所有組對(duì)象的數(shù)據(jù)。在同一個(gè)組中,本組的組對(duì)象可以獲得所有信息,同時(shí)也包含了OPC數(shù)據(jù)項(xiàng)。

OPC的組對(duì)象為客戶獲取數(shù)據(jù)信息提供了一種方法。客戶既可以在客戶端當(dāng)中設(shè)置對(duì)數(shù)據(jù)的更新頻率,也可以對(duì)數(shù)據(jù)進(jìn)行讀操作或?qū)懖僮鳌.?dāng)在數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)出現(xiàn)變化后,OPC服務(wù)器會(huì)將變化的數(shù)據(jù)發(fā)送給WCS,它在接收到數(shù)據(jù)后進(jìn)行信息處理,無(wú)需花費(fèi)大量的時(shí)間來(lái)搜索。在OPC定義的規(guī)范當(dāng)中,有兩組對(duì)象:分別是本地組以及公共組。對(duì)于公共組來(lái)說(shuō),它可以被多個(gè)WCS共同擁有,但是本地組只能有一個(gè)WCS客戶。一般情況下,對(duì)于一對(duì)已建立連接的WCS和OPC服務(wù)器來(lái)說(shuō),它們只需要定義唯一的一組對(duì)象。但是在每組對(duì)象中,WCS能夠?qū)⒍鄠€(gè)OPC數(shù)據(jù)項(xiàng)增加進(jìn)來(lái)。

服務(wù)器、組、數(shù)據(jù)項(xiàng)這三類對(duì)象形成了一個(gè)分層式的結(jié)構(gòu)模型。在這個(gè)結(jié)構(gòu)模型中,作為標(biāo)準(zhǔn)的COM對(duì)象,OPC對(duì)象包含了服務(wù)器對(duì)象和組對(duì)象,是OPC服務(wù)器必須實(shí)現(xiàn)的兩個(gè)組件對(duì)象[13],它需要通過(guò)實(shí)現(xiàn)OPC規(guī)范定義的接口,并且將這些接口提供給WCS,WCS再根據(jù)所提供的接口,完成對(duì)OPC服務(wù)器的訪問[14]。服務(wù)器對(duì)象擁有自己的類廠,如果需要使用,就必須先行在系統(tǒng)注冊(cè)表中完成注冊(cè);而由于組對(duì)象沒有類廠,因此不需要向服務(wù)器對(duì)象一樣在注冊(cè)表中注冊(cè),在服務(wù)器對(duì)象創(chuàng)建的同時(shí)也創(chuàng)建了組對(duì)象。組對(duì)象包括了項(xiàng)對(duì)象,它的作用是創(chuàng)建和數(shù)據(jù)存儲(chǔ)區(qū)的聯(lián)系,表明數(shù)據(jù)源的地址和類型。項(xiàng)對(duì)象與數(shù)據(jù)存儲(chǔ)區(qū)的數(shù)據(jù)項(xiàng)這兩個(gè)項(xiàng)是不同的,數(shù)據(jù)存儲(chǔ)區(qū)的數(shù)據(jù)項(xiàng)主要作用是和數(shù)據(jù)源通信,獲取該數(shù)據(jù)源中的數(shù)據(jù);而項(xiàng)對(duì)象主要是和組對(duì)象通信,以及獲得WCS所需要獲得的信息。WCS通過(guò)組對(duì)象獲取到相關(guān)對(duì)象的名稱、屬性、值等信息,然后再將項(xiàng)對(duì)象與數(shù)據(jù)存儲(chǔ)區(qū)的數(shù)據(jù)項(xiàng)進(jìn)行關(guān)聯(lián),從而避免直接操作數(shù)據(jù)存儲(chǔ)區(qū)。

OPC對(duì)象和接口模塊對(duì)外提供OPC接口與WCS進(jìn)行交互,對(duì)內(nèi)則通過(guò)變量連接機(jī)制建立與數(shù)據(jù)源的連接,其結(jié)構(gòu)如圖5所示。

圖5 服務(wù)器中對(duì)象和接口模塊結(jié)構(gòu)

2.4 數(shù)據(jù)管理

WCS需要監(jiān)控很多的變量數(shù)據(jù)信息,其中就包括了堆垛機(jī)的狀態(tài),模式,輸送線的狀態(tài)模型,光電開關(guān),報(bào)警信息,也能夠通過(guò)其他程序來(lái)獲得數(shù)據(jù),以上的數(shù)據(jù)都能作為OPC服務(wù)器中的數(shù)據(jù)項(xiàng),存儲(chǔ)在服務(wù)器的地址空間中。

3 WCS與OPC服務(wù)器通信的實(shí)現(xiàn)

WCS要從OPC服務(wù)器中獲取數(shù)據(jù),是數(shù)據(jù)使用者,而OPC服務(wù)器是數(shù)據(jù)的提供者,將數(shù)據(jù)提供給WCS。它們兩個(gè)之間的數(shù)據(jù)傳遞、交互是通過(guò)OPC協(xié)議來(lái)實(shí)現(xiàn)的,也就是說(shuō)必須要符合OPC的接口規(guī)范。OPC技術(shù)不僅僅適用于WCS和硬件設(shè)備之間,也適用于兩個(gè)軟件之間實(shí)現(xiàn)數(shù)據(jù)互通,它們既可以都配置在同一臺(tái)PC上,也能夠配置在同一個(gè)局域網(wǎng)中的不同PC上。

3.1 WCS與OPC服務(wù)器的通信流程

WCS和OPC服務(wù)器的交互流程如圖6所示。首先,無(wú)論對(duì)于WCS還是OPC服務(wù)器第一步都要做的是初始化COM(組件)庫(kù)。COM是微軟公司為了計(jì)算機(jī)工業(yè)的軟件生產(chǎn)更加符合人類的行為方式開發(fā)的一種新的軟件開發(fā)方式,可以將系統(tǒng)中的組件用新的替換掉,以便于日后的升級(jí),也能夠在多個(gè)系統(tǒng)中使用多次。然后,OPC服務(wù)器將自身的信息注冊(cè)到操作系統(tǒng)的注冊(cè)表中,獲取CLSID,也叫類標(biāo)識(shí)符。接下來(lái)是WCS根據(jù)查詢到的CLSID向OPC服務(wù)器提出構(gòu)建服務(wù)器對(duì)象的請(qǐng)求,將WCS的請(qǐng)求發(fā)送給OPC服務(wù)器后就會(huì)構(gòu)建服務(wù)器組件對(duì)象,并且向客戶端提供返回服務(wù)器接口對(duì)象的指針。當(dāng)服務(wù)器組件對(duì)象構(gòu)建完成后,WCS就能根據(jù)這個(gè)接口指針去調(diào)用OPC服務(wù)器中提供的方法。最后,當(dāng)WCS結(jié)束訪問后就會(huì)將OPC服務(wù)器的資源進(jìn)行釋放,然后卸載COM庫(kù),關(guān)閉程序。在執(zhí)行這一項(xiàng)過(guò)程當(dāng)中,是WCS主動(dòng)連接或者斷開OPC服務(wù)器,但是對(duì)于OPC服務(wù)器本身來(lái)說(shuō),它是并不知道對(duì)于任何訪問它的客戶的信息的。圖6為OPC服務(wù)器和WCS的交互流程。

圖6 OPC服務(wù)器和WCS的交互流程

3.2 組對(duì)象的實(shí)現(xiàn)

WCS是通過(guò)控制組對(duì)象從而實(shí)現(xiàn)更小單位的控制,從本質(zhì)上來(lái)說(shuō),是OPC服務(wù)器將相同類型的數(shù)據(jù)劃分成為一個(gè)組而達(dá)到對(duì)相同類型的數(shù)據(jù)進(jìn)行統(tǒng)一管理的目的。比如說(shuō),有兩個(gè)WCS需要經(jīng)常訪問的數(shù)據(jù),但是它們的數(shù)據(jù)刷新速率是不同的,那么就可以將這兩個(gè)數(shù)據(jù)分別劃分到不同組對(duì)象當(dāng)中,這樣將大大提高WCS讀取數(shù)據(jù)的有效性和效率。

(1)組對(duì)象類的定義和方法。

接口中包含的方法與變量如下:

Class OpcDaCustomGroup

{

public int ServerGroupHandle; //輸出參數(shù),服務(wù)器為新創(chuàng)建的組對(duì)象產(chǎn)生的句柄

public int RevisedUpdateRate; //輸出參數(shù),服務(wù)器返回給客戶端的實(shí)際使用的數(shù)據(jù)更新率

public Guid Riid=typeof(IOPCItemMgt).GUID; //引用參數(shù),客戶端想要的組對(duì)象的接口類型(如 IIDIOPCItemMgt)

public object Group; //輸出參數(shù),用來(lái)存儲(chǔ)返回的接口指針。如果函數(shù)操作出現(xiàn)任務(wù)失敗,此參數(shù)將返回NULL

public Guid Riid; //引用參數(shù),客戶端想要的組對(duì)象的接口類型(如IIDIOPCItemMgt)

public object Group; //輸出參數(shù),用來(lái)存儲(chǔ)返回的接口指針。如果函數(shù)操作出現(xiàn)任務(wù)失敗,此參數(shù)將返回NULL。

public GCHandle TimeBias; //指向Long類型的指針

public GCHandle PercendDeadBand; //一個(gè)項(xiàng)對(duì)象的值變化的百分比,可能引發(fā)客戶端程序的訂閱回調(diào)。此參數(shù)只應(yīng)用于組對(duì)象中有模擬dwEUType(工程單位)類型的項(xiàng)對(duì)象。指針為NULL表示0.0

public int LCID; //當(dāng)用于組對(duì)象上的操作的返回值為文本類型時(shí),服務(wù)器使用的語(yǔ)言

public OpcDaCustomItem[] OpcDataCustomItems; // OPC項(xiàng)數(shù)組

}

(2)組對(duì)象的接口實(shí)現(xiàn)。

組對(duì)象在Opc自定義接口-異步管理類(OpcDaCustomAsync)中的添加OPC項(xiàng)AddOpcGroup中實(shí)現(xiàn),其中部分關(guān)鍵代碼如下:

//添加OPC組

Private void AddOpcGroup(OpcDaCustomGroupopcGroup)

{

InitIoInterfaces(opcGroup); //初始化IO接口

if(opcGroup.OpcDataCustomItems.Length>0)

{

//添加OPC項(xiàng)

AddOpcItem(opcGroup);

//激活訂閱回調(diào)事件

ActiveDataChanged(IOPCGroupStateMgt);

}

opcGroup.TimeBias.Free();

opcGroup.PercendDeadBand.Free(); //釋放組對(duì)象的資源

}

其中IOPCGroupStateMgt為OpcDaCustomAsync類中的成員變量,是Opc組管理器。

//初始化I/O接口方法

public void InitIoInterfaces(OpcDaCustomGroupopcGroup){

int cookie;

//組狀態(tài)管理對(duì)象,改變組的刷新率和激活狀態(tài)

IOPCGroupStateMgt=(IOPCGroupStateMgt)opcGroup.Group;

IConnectionPointContainer=(IConnectionPointContainer)opcGroup.Group;

Guidiid=typeof(IOPCDataCallback).GUID;

IConnectionPointContainer.FindConnectionPoint(ref iid, out IConnectionPoint);

//創(chuàng)建客戶端與服務(wù)端之間的連接

IConnectionPoint.Advise(this,out cookie);}

其中IConnectionPoint為OpcDaCustomAsync類中的成員變量,是連接指針。

3.3 項(xiàng)對(duì)象的實(shí)現(xiàn)

項(xiàng)對(duì)象作為OPC服務(wù)器之中的私有變量,是將WCS和數(shù)據(jù)源連接起來(lái)的核心,又因?yàn)槭撬接凶兞?,但在OPC定義的規(guī)范中并未為其設(shè)定出任何標(biāo)準(zhǔn)接口,WCS只能通過(guò)組對(duì)象對(duì)其進(jìn)行操作,但也正因?yàn)闆]有為項(xiàng)對(duì)象做出規(guī)定,開發(fā)者們就能夠根據(jù)現(xiàn)場(chǎng)的實(shí)際情況以及自身的需求來(lái)對(duì)項(xiàng)對(duì)象進(jìn)行設(shè)計(jì)與開發(fā)[15]。用設(shè)計(jì)類OpcDaCustomItem來(lái)描述項(xiàng)對(duì)象,包含的主要屬性和部分關(guān)鍵代碼有:

///添加OPC項(xiàng)

private void AddOpcItem(OpcDaCustomGroup opcGroup)

{

OpcDaCustomItem[] opcDataCustomItemsService=opcGroup.OpcDataCustomItems;

IntPtrpResults=IntPtr.Zero;

IntPtrpErrors=IntPtr.Zero;

OPCITEMDEF[] itemDefyArray=new OPCITEMDEF[opcGroup.OpcDataCustomItems.Length];

int i=0;

int[] errors=new int[opcGroup.OpcDataCustomItems.Length];

int[] itemServerHandle=new int[opcGroup.OpcDataCustomItems.Length];

//獲取每一個(gè)數(shù)據(jù)項(xiàng)的值,存放在一個(gè)集合中

foreach (OpcDaCustomItem itemService in opcDataCustomItemsService){

if (itemService!=null)

{

itemDefyArray[i].szAccessPath = itemService.AccessPath;

itemDefyArray[i].szItemID = itemService.ItemID;

itemDefyArray[i].bActive = itemService.IsActive;

itemDefyArray[i].hClient = itemService.ClientHandle;

itemDefyArray[i].dwBlobSize = itemService.BlobSize;

itemDefyArray[i].pBlob = itemService.Blob;

itemDefyArray[i].vtRequestedDataType = itemService.RequestedDataType;

}

//添加OPC項(xiàng)組

((IOPCItemMgt)opcGroup.Group).AddItems(opcGroup.OpcDataCustomItems.Length, itemDefyArray, out pResults, out pErrors);

IntPtr Pos = pResults;

Marshal.Copy(pErrors, errors, 0, opcGroup.OpcDataCustomItems.Length);

Pos = new IntPtr(Pos.ToInt32() + Marshal.SizeOf(typeof(OPCITEMRESULT))); }

var result = (OPCITEMRESULT)Marshal.PtrToStructure(Pos, typeof(OPCITEMRESULT));

itemServerHandle[j] = opcDataCustomItemsService[j].ServerHandle = result.hServer;

4 系統(tǒng)實(shí)際應(yīng)用

OPC服務(wù)器在系統(tǒng)實(shí)際應(yīng)用中主要起以下兩個(gè)方面的作用:與電子元器件(主要為PLC)相連獲取外界物理數(shù)據(jù);與上位機(jī)通訊,將獲取來(lái)的數(shù)據(jù)提供給上位機(jī)進(jìn)行讀寫操作,從而實(shí)現(xiàn)對(duì)外部設(shè)備的控制。該系統(tǒng)運(yùn)行需要的軟硬件有:Net Framework 4.0、WinCC_V7.3、西門子300或其他類型PLC。

OPC服務(wù)器從PLC處獲取數(shù)據(jù),需先在本機(jī)上安裝WinCC_V7.3,并對(duì)站組態(tài)編輯器進(jìn)行配置,如圖7所示,需要配置好站名、模式,選擇本機(jī)使用的網(wǎng)卡,以及對(duì)應(yīng)的IP。

圖7 OPC服務(wù)器站組態(tài)編輯器

當(dāng)以上操作都完成后,需要PLC編程人員將程序下載至站組態(tài)編輯器之中,這樣OPC服務(wù)器就能與PLC建立連接,獲取數(shù)據(jù)。

而作為OPC服務(wù)器的上位機(jī)WCS在從OPC中獲取時(shí),通常情況下都是在文本文件中預(yù)先編寫好xml類型的配置文件,如圖8所示。

圖8 xml文件配置示例圖

xml配置文件的第一行為xml的版本(1.0版本),并且使用的是UTF-8字符編碼。其中的標(biāo)簽從大到小分別為OpcServer,OpcGroup和Item,依次對(duì)應(yīng)OPC服務(wù)器配置、OPC組對(duì)象配置以及OPC項(xiàng)對(duì)象配置。在OPC服務(wù)器配置中需要寫明OPC服務(wù)器名及IP地址;在OPC組對(duì)象配置中需要寫明OPC組名、客戶端句柄以及刷新頻率;最后在項(xiàng)對(duì)象中則需要寫明OPC項(xiàng)對(duì)象在PLC中的地址塊、自定義英文名和中文名、客戶端句柄以及刷新頻率。至此,上位機(jī)配置文件基本完成。

由于PLC一般適用于工業(yè)自動(dòng)化設(shè)備,考慮到軟件的穩(wěn)定性和適用性,以及庫(kù)文件的多樣性,上位機(jī)軟件開發(fā)常使用微軟的VS平臺(tái)作為開發(fā)環(huán)境,.NET作為開發(fā)語(yǔ)言。圖9為上位機(jī)軟件WCS的變量監(jiān)控圖。

圖9 WCS監(jiān)控?cái)?shù)據(jù)變量圖

從圖9中可以看出,監(jiān)控的變量為xml配置文件中配置好的項(xiàng)對(duì)象,其中包含了變量描述、變量地址、變量名以及變量值。其中變量值的刷新頻率可以通過(guò)xml文件的刷新頻率(UpdateRate)進(jìn)行設(shè)置,通常情況下數(shù)據(jù)交互模式都是采用訂閱方式進(jìn)行數(shù)據(jù)更新,因?yàn)檫@種方式效率高、穩(wěn)定性好。

5 結(jié)束語(yǔ)

該文為智能倉(cāng)儲(chǔ)系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)了OPC服務(wù)器以及OPC接口,實(shí)現(xiàn)了基于OPC的WCS和PLC之間的通信。使得WCS系統(tǒng)能夠?qū)Χ讯鈾C(jī)、輸送線等進(jìn)行控制并且下發(fā)指令,從而實(shí)現(xiàn)對(duì)貨物以及庫(kù)位的管理。在智能倉(cāng)儲(chǔ)中使用OPC通信,相較于傳統(tǒng)的串口通信,傳輸性能大大提高,提升了WCS下指令的速度、整個(gè)倉(cāng)儲(chǔ)的工作效率以及管理水平。

猜你喜歡
數(shù)據(jù)源客戶端對(duì)象
神秘來(lái)電
睿士(2023年2期)2023-03-02 02:01:09
縣級(jí)臺(tái)在突發(fā)事件報(bào)道中如何應(yīng)用手機(jī)客戶端
孵化垂直頻道:新聞客戶端新策略
基于Vanconnect的智能家居瘦客戶端的設(shè)計(jì)與實(shí)現(xiàn)
Web 大數(shù)據(jù)系統(tǒng)數(shù)據(jù)源選擇*
攻略對(duì)象的心思好難猜
意林(2018年3期)2018-03-02 15:17:24
基于不同網(wǎng)絡(luò)數(shù)據(jù)源的期刊評(píng)價(jià)研究
基于熵的快速掃描法的FNEA初始對(duì)象的生成方法
區(qū)間對(duì)象族的可鎮(zhèn)定性分析
基于真值發(fā)現(xiàn)的沖突數(shù)據(jù)源質(zhì)量評(píng)價(jià)算法
太仓市| 正宁县| 武威市| 吉安县| 宁都县| 山丹县| 云和县| 古浪县| 鸡西市| 潼关县| 枞阳县| 蒙自县| 五原县| 墨玉县| 南靖县| 忻城县| 古蔺县| 安吉县| 商丘市| 当阳市| 剑河县| 克拉玛依市| 双辽市| 阿克| 岳池县| 正蓝旗| 巫溪县| 长垣县| 台东市| 泸溪县| 渭源县| 长治市| 治县。| 宕昌县| 新竹县| 北京市| 寿阳县| 弋阳县| 漳浦县| 曲阳县| 喀什市|