應(yīng)用
首先我認(rèn)為,C#上位機(jī)并不是為了取代組態(tài)軟件,而是對(duì)組態(tài)軟件的補(bǔ)充,C#上位機(jī)與組態(tài)軟件有各自應(yīng)用的場(chǎng)合。
如果你懂組態(tài),不會(huì)C#編程,愿意購(gòu)買組態(tài)授權(quán),項(xiàng)目沒(méi)有特殊的需求,比如自定義協(xié)議、復(fù)雜業(yè)務(wù)、對(duì)接第三方系統(tǒng)等,組態(tài)軟件從功能和界面上能夠滿足需求,那么,組態(tài)軟件無(wú)疑是適合的。
如果你可以獨(dú)立開發(fā)上位機(jī),不愿意購(gòu)買組態(tài)軟件,那么你肯定會(huì)選擇自主開發(fā)上位機(jī)。
技術(shù)本質(zhì)上沒(méi)有好壞之分,技術(shù)是為了服務(wù)于項(xiàng)目,結(jié)合自身情況,結(jié)合不同場(chǎng)合選擇合理的技術(shù)方案,才是技術(shù)人的意義所在。
那么,有沒(méi)有一種場(chǎng)合,可以將C#上位機(jī)與組態(tài)軟件聯(lián)合起來(lái)使用呢?下面就以西門子的WinCC為例,談?wù)勆衔粰C(jī)如何聯(lián)合組態(tài)軟件實(shí)現(xiàn)通信。
我打算從兩個(gè)方面來(lái)說(shuō)明,一種是上位機(jī)通過(guò)WinCC來(lái)獲取數(shù)據(jù),另一種是上位機(jī)如何彌補(bǔ)WinCC的一些功能不足。
上位機(jī)讀取WinCC
我們首先看下上位機(jī)如何通過(guò)WinCC來(lái)獲取到數(shù)據(jù),有這么幾種方案,可以參考一下:
前提是WinCC項(xiàng)目已經(jīng)開發(fā)好,并且處于運(yùn)行狀態(tài),運(yùn)行WinCC畫面,這里連接了一個(gè)S7-1500的PLC,如下圖所示:
WinCC安裝目錄中有兩個(gè)dll,分別是CCHMIRuntime.dll和CCHMITags.dll,位置默認(rèn)處于C:\Program Files (x86)\Common Files\Siemens\Bin,將這兩個(gè)dll復(fù)制到debug根目錄下并手動(dòng)添加引用,然后創(chuàng)建通信對(duì)象。
CCHMIRUNTIME.HMIRuntime hmi = new CCHMIRUNTIME.HMIRuntime();
通過(guò)調(diào)用讀取方法即可實(shí)現(xiàn)讀取。
hmi.Tags["data1"].Read()
WinCC從V7.2版本開始支持OPC服務(wù)器,可以支持OPCDA和OPCUA,我們直接通過(guò)一個(gè)OPC客戶端來(lái)連接測(cè)試一下:
WinCC的數(shù)據(jù)庫(kù)使用的是SQLServer,WinCC變量歸檔數(shù)據(jù)是以壓縮的形式存儲(chǔ)在數(shù)據(jù)庫(kù)中的,第三方開發(fā)的應(yīng)用程序可以通過(guò)WinCC提供的OLE-DB接口解壓并訪問(wèn)這些數(shù)據(jù)。
上位機(jī)嵌入WinCC
我們?cè)倏纯瓷衔粰C(jī)如何彌補(bǔ)WinCC的一些功能不足,比如自定義協(xié)議或WinCC不支持的一些協(xié)議,WinCC從7.0版本開始支持.NET自定義控件,所以我們可以將一些業(yè)務(wù)和通信封裝在自定義控件中,然后嵌入到WinCC中來(lái)實(shí)現(xiàn)一些WinCC實(shí)現(xiàn)不了的功能。
這里以ModbusRTU協(xié)議為例,其他自定義協(xié)議類似,我們都知道,WinCC是不能直接支持ModbusRTU通信的。
這里我做了一個(gè)測(cè)試,開發(fā)了一個(gè)自定義控件,里面集成了串口連接及ModbusRTU通信協(xié)議讀取溫濕度,僅為測(cè)試使用,因此功能做的很簡(jiǎn)單:
我將這個(gè)控件集成到WinCC中,和一個(gè)單片機(jī)連接,成功讀取到了溫濕度數(shù)據(jù)。