C#與宇電溫控表自定義協(xié)議通信實(shí)例

寫在前面
通信協(xié)議是做上位機(jī)開發(fā)經(jīng)常會聽到的一個(gè)詞。無論是單片機(jī)開發(fā)常用的串口通信協(xié)議,還是上位機(jī)開發(fā)常用TCP/IP通信協(xié)議,以及網(wǎng)絡(luò)通信常用的Http協(xié)議,可以這么說,通信協(xié)議無處不在。
對于通信協(xié)議,官方性解釋是指計(jì)算機(jī)通信網(wǎng)絡(luò)中兩臺計(jì)算機(jī)之間進(jìn)行通信所必須共同遵守的規(guī)定或規(guī)則。通俗地說,為了保證機(jī)器與機(jī)器之間能夠正常對話,兩者之間需要共同使用同一種語言,這種語言就是通信協(xié)議,就和中國人之間溝通使用普通話、本地人之間溝通使用方言、不同國家的人之間溝通使用英語是一個(gè)道理。【dotNet工控上位機(jī):thinger_swj】
1 、通信協(xié)議剖析
本文主要針對的硬件是國內(nèi)儀表市場占有率比較高的一個(gè)品牌——廈門宇電AI系列儀表。廈門宇電自動(dòng)化科技有限公司專門為AI 系列顯示控制儀表開發(fā)了一個(gè)通訊協(xié)議——AIBUS,這個(gè)AIBUS會有一系列的協(xié)議說明,對上位機(jī)開發(fā)人員來說,這就是一個(gè)自定義協(xié)議。
如果要和一個(gè)自定義協(xié)議的儀表進(jìn)行通信,我們需要從以下幾個(gè)環(huán)節(jié)著手去做:通信協(xié)議剖析、硬件配置及環(huán)境搭建、根據(jù)協(xié)議編寫通信庫、編寫測試軟件進(jìn)行測試。
這里首先找到了該儀表的通信協(xié)議說明書,一般儀表或者PLC的通信協(xié)議可以通過供應(yīng)商提供或者官網(wǎng)下載,宇電儀表通信協(xié)議下載鏈接:
http://www.yudian.com/Download/11904/List.html
在協(xié)議說明書中,找到通信的核心報(bào)文部分:
AI 儀表采用 16 進(jìn)制數(shù)據(jù)格式來表示各種指令代碼及數(shù)據(jù)。AI 儀表軟件通訊指令經(jīng)過優(yōu)化設(shè)計(jì),標(biāo)準(zhǔn)的通訊指令只有兩條,一條為讀指令,一條為寫指令,兩條指令使得上位機(jī)軟件編寫容易,但能 100%完整地對儀表進(jìn)行操作;標(biāo)準(zhǔn)讀和寫指令分別如下:
讀: 地址代號+52H(82)+要讀的參數(shù)代號+00+00+校驗(yàn)碼
寫: 地址代號+43H(67)+要寫的參數(shù)代號+寫入低字節(jié)+寫入高字節(jié)+校驗(yàn)碼
地址代號:為了在一個(gè)通訊接口上連接多臺 AI 儀表,需要給每臺 AI 儀表編一個(gè)互不相同的通訊地址,有效的地址為 0-80(部分型號為 0-100),所以一條通訊線路上最多可連接 81 臺 AI 儀表,儀表的通訊地址由參數(shù) Addr 決定。儀表內(nèi)部采用兩個(gè)重復(fù)的 128-208(16 進(jìn)制為 80H-D0H)之間數(shù)值來表示地址代號,由于大于 128的數(shù)較少用到(如 ASC 方式的協(xié)議通常只用 0-127 之間的數(shù)),因此可降低因數(shù)據(jù)與地址重復(fù)造成沖突的可能性。
參數(shù)代號:AI 儀表通訊協(xié)議規(guī)定,地址代號為兩個(gè)相同的字節(jié),數(shù)值為(儀表地址+80H)。 例如:儀表參數(shù) Addr=10(16 進(jìn)制數(shù)為0AH,0A+80H=8AH),則該地址代號: 8AH 8AH 參數(shù)代號:儀表的參數(shù)用1個(gè)8位二進(jìn)制數(shù)(一個(gè)字節(jié),寫為 16 進(jìn)制數(shù))的參數(shù)代號來表示,它在指令中表示要讀/寫的參數(shù)名。
校驗(yàn)碼:校驗(yàn)碼采用 16 位求和校驗(yàn)方式,其中讀指令的校驗(yàn)碼計(jì)算方法為:
要讀參數(shù)的代號×256+82+ADDR
寫指令的校驗(yàn)碼計(jì)算方法為:
要寫的參數(shù)代號×256+67+要寫的參數(shù)值+ADDR
公式中 ADDR為儀表地址參數(shù)值,范圍是 0~80(注意不要加上 80H)。校驗(yàn)碼為以上公式做二進(jìn)制16位整數(shù)加法后得到的余數(shù),余數(shù)為2 個(gè)字節(jié),其低字節(jié)在前,高字節(jié)在后。要寫的參數(shù)值用16位二進(jìn) 制整數(shù)表示。
返回?cái)?shù)據(jù):無論是讀還是寫,儀表都返回以下 10 個(gè)字節(jié)數(shù)據(jù):
測量值 PV+給定值 SV+輸出值MV及報(bào)警狀態(tài)+所讀/寫參數(shù)值+校驗(yàn)碼
其中 PV、SV 及所讀參數(shù)值均各占 2 個(gè)字節(jié),代表一個(gè) 16 位二進(jìn)制有符號補(bǔ)碼整數(shù),低位字節(jié)在前,高位字節(jié)在后,整數(shù)無法表示小數(shù)點(diǎn),要求用戶在上位機(jī)處理;MV 占一個(gè)字節(jié),按 8 位有符號二進(jìn)制數(shù)格式,數(shù)值范圍-110~+110,狀態(tài)位占一個(gè)字節(jié),校驗(yàn)碼占 2個(gè)字節(jié),共 10個(gè)字節(jié)。
通過以上說明,可以發(fā)現(xiàn)AIBUS這個(gè)通信協(xié)議相對來說還是比較簡單的,我們只需要按照規(guī)定,將組織好的報(bào)文發(fā)送給控制器,即可獲取到測量值、給定值、輸出值、報(bào)警狀態(tài)及參數(shù)值。
2、硬件環(huán)境搭建
將整個(gè)環(huán)境搭建起來,需要涉及以下硬件:
Pt100鉑熱電阻
宇電溫控表

RS485轉(zhuǎn)USB

工控機(jī)電腦

·?根據(jù)宇電溫控表的接線圖,整體硬件接線如下圖所示:

注意:接線完成后,需要按照宇電溫控表說明書,對宇電儀表進(jìn)行相關(guān)的設(shè)置,包含通信參數(shù)設(shè)置、從站地址、輸入類型等。
3、通信庫開發(fā)
通信庫開發(fā)是本文的核心內(nèi)容,這里需要有一定的C#編程基礎(chǔ),同時(shí)對通信協(xié)議有一定的認(rèn)識和了解。
初始化通訊:初始化通信主要是進(jìn)行串口連接及斷開連接方法的編寫:

為了方便進(jìn)行報(bào)文的組織,編寫了一個(gè)報(bào)文拼接類ByteArray:

校驗(yàn):AIBUS協(xié)議中的校驗(yàn)采用校驗(yàn)和的方式:
讀指令的校驗(yàn)碼計(jì)算方法為:要讀參數(shù)的代號×256+82+ADDR
寫指令的校驗(yàn)碼計(jì)算方法為:要寫的參數(shù)代號×256+67+要寫的參數(shù)值+ADDR

讀取參數(shù):AIBUS讀取參數(shù)報(bào)文格式如下:

寫入?yún)?shù):AIBUS寫入?yún)?shù)報(bào)文格式如下:

4、通信軟件開發(fā)
完成通信庫開發(fā)后,再寫通信軟件就非常簡單了,直接通過創(chuàng)建通信對象,調(diào)用相關(guān)的方法即可獲取到相應(yīng)的數(shù)據(jù)。

5、寫在最后
本文主要針對C#與廈門宇電溫控表之間的自定義協(xié)議通信做了較為詳細(xì)的描述,相信對于很多電氣工程師,尤其是以西門子PLC為主的電氣工程師來說,會有很大幫助。近幾年隨著人工智能、物聯(lián)網(wǎng)的流程,工控行業(yè)發(fā)生了很大的變化,每一位電氣工程師都應(yīng)該及時(shí)作出調(diào)整,至少學(xué)習(xí)一門高級編程語言,未雨綢繆,以更好的姿態(tài)來應(yīng)對即將到來的智能制造2025。
