孫明革,關(guān) 波,徐松梅
(1.吉林化工學(xué)院信息與控制工程學(xué)院,吉林 吉林132022;2.中國(guó)石油吉林石化公司 化肥廠,吉林 吉林132021;3.吉林中國(guó)石油天然氣集團(tuán)公司染料廠,吉林吉林132021)
HART(Highway Addressable Remote Transducer)協(xié)議,是一項(xiàng)4~20mA信號(hào)與數(shù)字通信技術(shù)兼容的過(guò)渡性標(biāo)準(zhǔn),現(xiàn)已有 Rosemount,ABB,F(xiàn)uji,Moore,E+H,Honeywell,F(xiàn)isher Controls 等 70 多家公司參加了HART協(xié)議基金HCF.由于HART協(xié)議眾多不容置疑的優(yōu)點(diǎn),使它成為全球應(yīng)用最為廣泛的現(xiàn)場(chǎng)通信協(xié)議[1].
目前國(guó)內(nèi)外許多著名的儀表生產(chǎn)廠家都生產(chǎn)支持HART協(xié)議的智能現(xiàn)場(chǎng)儀表,但是不同廠家各自采用自己開(kāi)發(fā)的便攜式編程器組態(tài)各自的儀表,這樣存在操作不方便、通用性差等缺陷.雖然在PC機(jī)上開(kāi)發(fā)了相應(yīng)的組態(tài)軟件,但是也存在通用性差、功能少等缺點(diǎn).本文主要通過(guò)對(duì)HART命令的解析來(lái)闡述HART組態(tài)軟件的工作原理,以及依據(jù)HART協(xié)議,利用C#高級(jí)語(yǔ)言編寫一種支持HART協(xié)議的通用組態(tài)軟件,實(shí)現(xiàn)HART命令對(duì)現(xiàn)場(chǎng)智能設(shè)備的控制,并闡述了基本編程思路[2-3].
HART儀表組態(tài)軟件通過(guò)USB-HART轉(zhuǎn)換器與現(xiàn)場(chǎng)智能儀表連接,當(dāng)HART儀表組態(tài)軟件發(fā)送命令至現(xiàn)場(chǎng)設(shè)備時(shí),現(xiàn)場(chǎng)智能儀表會(huì)立即回應(yīng)主機(jī),根據(jù)其應(yīng)答的數(shù)據(jù)信息可以得到當(dāng)前儀表的工作狀態(tài)以及儀表本身存儲(chǔ)的各種信息.系統(tǒng)通訊連接示意圖如圖1所示[4-5].

圖1 系統(tǒng)通訊連接示意圖
在HART協(xié)議中,實(shí)體間的數(shù)據(jù)傳輸是以幀的形式實(shí)現(xiàn)的.HART協(xié)議幀由用戶數(shù)據(jù)和地址信息封裝而成,它由前導(dǎo)符、定界符、地址域、命令域、字節(jié)長(zhǎng)度域、數(shù)據(jù)域、狀態(tài)域以及校驗(yàn)位組成[4-5].具體如表1 ~2 所示.

表1 請(qǐng)求幀

表2 響應(yīng)幀
(1)前導(dǎo)符一般是5~20個(gè)FF十六進(jìn)制字節(jié).它實(shí)際上是同步信號(hào),各通訊設(shè)備可以據(jù)此略做調(diào)整,保證信息的同步;
(2)定界符可以用來(lái)表示使用的結(jié)構(gòu)是“長(zhǎng)”結(jié)構(gòu)或者“短”結(jié)構(gòu)、消息源是否是“突發(fā)”模式消息.主機(jī)到從機(jī)為短結(jié)構(gòu)時(shí),起始位為02,長(zhǎng)幀時(shí)為82.從機(jī)到主機(jī)的短結(jié)構(gòu)值為06,長(zhǎng)結(jié)構(gòu)值為86.而為“突發(fā)”模式的短結(jié)構(gòu)值為01,長(zhǎng)結(jié)構(gòu)為81;
(3)地址域包含了主機(jī)地址和從機(jī)地址,短結(jié)構(gòu)中占1字節(jié),長(zhǎng)結(jié)構(gòu)中占5字節(jié).無(wú)論長(zhǎng)結(jié)構(gòu)還是短結(jié)構(gòu),HART協(xié)議中允許2個(gè)主機(jī)存在,用首字節(jié)的最高位來(lái)進(jìn)行區(qū)分,值為1表示第一主機(jī)地址,第二主機(jī)用0表示.短結(jié)構(gòu)用首字節(jié)的0~4位表示值為0~15的從機(jī)地址,第5、6位賦0;而長(zhǎng)結(jié)構(gòu)用后6位表示從機(jī)的生產(chǎn)廠商的代碼,第2個(gè)字節(jié)表示從機(jī)設(shè)備型號(hào)代碼,后3~5個(gè)字節(jié)表示從機(jī)的設(shè)備序列號(hào),構(gòu)成“唯一”標(biāo)志碼;
(4)命令域的范圍為253個(gè),用HEX的0~FD表示;
(5)字節(jié)長(zhǎng)度域的值表示自下一個(gè)字節(jié)到最后字節(jié)(不包括校驗(yàn)字節(jié))的字節(jié)數(shù);
(6)響應(yīng)碼只存在于從機(jī)響應(yīng)主機(jī)消息的時(shí)候,用2個(gè)字節(jié)表示.它將報(bào)告通訊中的錯(cuò)誤、接收命令的狀態(tài)(如:設(shè)備忙、無(wú)法識(shí)別命令等)和從機(jī)的操作狀態(tài);
(7)數(shù)據(jù)域表示傳送和接收的數(shù)據(jù),一般不超過(guò)25個(gè)字節(jié);
(8)校驗(yàn)方式采用縱向奇偶校驗(yàn),從起始字節(jié)開(kāi)始到奇偶校驗(yàn)前一個(gè)字節(jié)為止.
通過(guò)對(duì)HART協(xié)議的請(qǐng)求幀和響應(yīng)幀的結(jié)構(gòu)分析,得出正式進(jìn)行儀表通訊之前需進(jìn)行儀表測(cè)試,來(lái)確定制造商的設(shè)備類型、廠商的代碼、設(shè)備的版本號(hào)及標(biāo)識(shí).
系統(tǒng)功能結(jié)構(gòu)圖包括用戶注冊(cè)模塊、發(fā)送HART命令模塊、接收數(shù)據(jù)顯示模塊、通訊狀態(tài)顯示模塊及接收發(fā)送字節(jié)數(shù).具體如圖2所示[2-3,6].

圖2 系統(tǒng)功能結(jié)構(gòu)圖
用戶注冊(cè)模塊:只有注冊(cè)用戶才能正常使用該軟件;
發(fā)送HART命令:串口打開(kāi)后,用戶可通過(guò)發(fā)送HART命令與智能儀表進(jìn)行通訊,獲取或設(shè)置現(xiàn)場(chǎng)設(shè)備的狀態(tài);
接收數(shù)據(jù)顯示:把接收來(lái)的字節(jié)轉(zhuǎn)化為文字信息或數(shù)字信息顯示在屏幕上,表示用戶所需要的狀態(tài)信息;
傳輸狀態(tài)顯示:反映響應(yīng)碼所對(duì)應(yīng)的通訊信息,只有響應(yīng)碼首字節(jié)為零時(shí)才說(shuō)明通訊正常,其它情況都表示通訊沒(méi)有正確執(zhí)行,根據(jù)響應(yīng)碼的數(shù)值顯示相應(yīng)的出錯(cuò)信息,有助于維護(hù)設(shè)備正常的運(yùn)行;
接收發(fā)送字節(jié)數(shù):顯示當(dāng)前接收或發(fā)送的字節(jié)數(shù).
本組態(tài)軟件系統(tǒng)在經(jīng)過(guò)設(shè)備測(cè)試后確定現(xiàn)場(chǎng)智能儀表的地址域,并且等待主機(jī)發(fā)送HART命令,當(dāng)獲取具體的HART命令后,根據(jù)命令的具體含義執(zhí)行相應(yīng)的操作.具體的系統(tǒng)流程圖如圖3 所示[7-15].

圖3 系統(tǒng)流程圖
組態(tài)軟件的主操作界面如圖4所示,這里不做說(shuō)明.

圖4 主操作界面
組態(tài)軟件主界面上的每一個(gè)按鈕對(duì)應(yīng)一個(gè)特定的HART發(fā)送命令,每個(gè)命令的發(fā)送字節(jié)數(shù)與接收字節(jié)數(shù)都不一樣,發(fā)送前必須實(shí)現(xiàn)串口連接,本軟件通過(guò)創(chuàng)建SerialPort對(duì)象來(lái)實(shí)現(xiàn)串口通信的全過(guò)程.
程序中用到的SerialPort類的方法[2-3]:
ReadLine():從輸入緩沖區(qū)讀一新行的值,如果沒(méi)有,會(huì)返回NULL;
WriteLine(char
buffer,int offset,int count):寫入輸出緩沖;
Open():打開(kāi)一個(gè)新的串口連接;
Close():關(guān)閉.
具體實(shí)現(xiàn)過(guò)程如下:
(1)添加引用
using System.IO.Ports;//串口類
(2)定義SerialPort類實(shí)例
private SerialPort SpCom = new SerialPort();//建立類實(shí)例
(3)超時(shí)設(shè)置
SpCom.WriteTimeout=2000;//寫入超時(shí)
SpCom.ReadTimeout=2000;//讀取超時(shí)
(4)設(shè)置通訊端口號(hào)及波特率、數(shù)據(jù)位、停止位和校驗(yàn)位
SpCom.PortName=this.comboBox1.SelectedItem.ToString();//獲取通訊端口號(hào)
SpCom.BaudRate=1200;//HART為固定波特率=1200HZ
SpCom.Parity = System.IO.Ports.Parity.Odd;//奇偶校驗(yàn)位,這里是奇校驗(yàn)
SpCom.DataBits=8;//8個(gè)數(shù)據(jù)位
SpCom.StopBits=System.IO.Ports.StopBits.One;//一個(gè)停止位
SpCom.ParityReplace=0;//當(dāng)發(fā)生奇偶校驗(yàn)錯(cuò)誤時(shí),設(shè)置并返回替換數(shù)據(jù)流中一個(gè)非法字符的字符.
(5)打開(kāi)串口
SpCom.Open();
(6)發(fā)送數(shù)據(jù)
SpCom.Write(char
buffer,int offset,int count);
1.2.2 術(shù)中腿部按摩。術(shù)前調(diào)整器械托盤的高度,利于操作,術(shù)中用卵圓鉗夾住手術(shù)蓋單邊緣內(nèi)側(cè),將蓋單掀起并將鉗子尾端掛于預(yù)先準(zhǔn)備好的輸液架上,在不影響手術(shù)操作以及不違反無(wú)菌原則的情況下對(duì)患者進(jìn)行被動(dòng)活動(dòng)。由遠(yuǎn)心端向近心端按摩患者小腿部肌肉,每小時(shí)按摩一次,每次5-10分鐘,直至手術(shù)結(jié)束。
(7)添加接受事件
在運(yùn)行時(shí)將事件與事件處理程序相關(guān)聯(lián)(通過(guò)委托實(shí)現(xiàn)).
+=new SerialData-
EventHandler(this.DataReceived);
函數(shù)程序?qū)崿F(xiàn)及轉(zhuǎn)化如下:
private void DataReceived(object sender,SerialDataReceivedEventArgs e)
{try{this.SpCom.BaseStream.Flush();//清除緩沖區(qū)
int j=this.SpCom.BytesToRead;
byte
Rdata=new byte[j];
count+=j;
for(int i=0;i<j;i++)
{Rcommand[count-j+i]=Rdata[i];}//數(shù)據(jù)轉(zhuǎn)移
this.SpCom.BaseStream.Flush();}
catch(Exception err)//錯(cuò)誤信息提示
{MessageBox.Show(err.Message);}}
(8)關(guān)閉串口
SpCom.Close();
數(shù)據(jù)顯示需要把接收到的字節(jié)數(shù)組經(jīng)過(guò)轉(zhuǎn)換得到用戶需要的數(shù)據(jù)形式,這種轉(zhuǎn)換包括多種數(shù)據(jù)類型的轉(zhuǎn)換[2-3].
(1)四個(gè)字節(jié)數(shù)組轉(zhuǎn)化單精度浮點(diǎn)數(shù)
byte
word=new byte[4];
word[0]=Rcommand[firstdata+3];//接收字節(jié)數(shù)組的第四個(gè)字節(jié)
word[1]=Rcommand[firstdata+2];//接收字節(jié)數(shù)組的第三個(gè)字節(jié)
word[2]=Rcommand[firstdata+1];//接收字節(jié)數(shù)組的第二個(gè)字節(jié)
word[3]=Rcommand[firstdata];//接收字節(jié)數(shù)組的第一個(gè)字節(jié)
this.textBox5.Text= System.BitConverter.ToSingle(word,0).ToString();
//將四個(gè)字節(jié)數(shù)組轉(zhuǎn)化成單精度浮點(diǎn)數(shù)并顯示在textBox5中
(2)指定字節(jié)數(shù)組序列解碼為字符串
this.textBox18.Text= System.Text.Encoding.ASCII.GetString(data,0,24);
//將data數(shù)組從0到開(kāi)始的24個(gè)字節(jié)轉(zhuǎn)化成字符串
(3)將字符序列編碼為字節(jié)數(shù)組
data=System.Text.Encoding.ASCII.Get-Bytes(str);
//將字符串str轉(zhuǎn)化為字節(jié)存入data數(shù)組中
(4)以字節(jié)數(shù)組形式返回指定的雙精度浮點(diǎn)值
order.data= System.BitConverter.GetBytes(da);//將浮點(diǎn)數(shù)da轉(zhuǎn)化為字節(jié)數(shù)組
(5)將指定區(qū)域的數(shù)值字符串轉(zhuǎn)化為等效的32位數(shù)值整數(shù)
data[0]=(byte)int.Parse(this.textBox32.Text);//將textBox32中的內(nèi)容轉(zhuǎn)化為整數(shù)
(6)壓縮ASCII(6位ASCII)
壓縮ASCII數(shù)據(jù)格式是HART協(xié)議中特別之處.壓縮的ASCII是ASCII的子集,它通過(guò)去掉每個(gè)ASCII字符的高2位而產(chǎn)生.這就允許4個(gè)壓縮的ASCII字符占用3個(gè)ASCII字符的空間.由HART字符集可以看出,HART協(xié)議不允許有小寫英文字母出現(xiàn).由于篇幅,這里就不給出壓縮ASCII數(shù)據(jù)轉(zhuǎn)化非壓縮ASCII數(shù)據(jù)子程序和非壓縮ASCII數(shù)據(jù)轉(zhuǎn)化壓縮ASCII數(shù)據(jù)子程序[2-3].
所有命令發(fā)送前都要進(jìn)入該程序,用以確定要發(fā)送的字節(jié)數(shù)組,然后再通過(guò) Serialport類的Write屬性將字節(jié)發(fā)送給智能設(shè)備.該命令有兩個(gè)參數(shù):儀表檢測(cè)時(shí)得到的設(shè)備定界符(是長(zhǎng)幀還是短幀)和要發(fā)送的字節(jié)數(shù)組(該字節(jié)由系統(tǒng)根據(jù)用戶提供的數(shù)字或文字信息轉(zhuǎn)化而來(lái))[2-3].
為了方便讀者,這里沒(méi)有給出程序框圖,而是直接給出了實(shí)現(xiàn)代碼.
具體代碼實(shí)現(xiàn)如下:


本軟件包括了HART協(xié)議中的所有通用命令、普通命令和一些特殊命令,實(shí)現(xiàn)了PC機(jī)與各類支持HART協(xié)議的現(xiàn)場(chǎng)智能設(shè)備的遠(yuǎn)程通訊.具有操作界面友好、狀態(tài)顯示清晰、操作方便、價(jià)格低廉等優(yōu)點(diǎn),并且本軟件增加了自編命令用來(lái)支持某些具有特殊命令的HART儀表,提高了軟件的通用性.
[1] 丁穎,盛惠興.HART協(xié)議解析[J].現(xiàn)代電子技術(shù).2004,27(1):14-17.
[2] 熊輝,馬占德,牛耀林,等.基于HART協(xié)議的PC組態(tài)軟件設(shè)計(jì)[J].石油化工自動(dòng)化,2007(1):59-68.
[3] 張夏,魏文雄,余淼,等.基于Windows的HART組態(tài)軟件設(shè)計(jì)[J].計(jì)算機(jī)系統(tǒng)工程,2012,38(16):241-244.
[4] 郭福田,姜軍,劉賢梅,等.基于HART協(xié)議的通信技術(shù)[J].大慶石油學(xué)院學(xué)報(bào),2000,24(1):55-77.
[5] 孫廣軍.HART現(xiàn)場(chǎng)通訊協(xié)議[J].微計(jì)算機(jī)信息,2002(2):4-12.
[6] 曹慶年,胡欣欣,孟開(kāi)元,等.基于HART協(xié)議的工業(yè)無(wú)線監(jiān)控系統(tǒng)設(shè)計(jì)[J].西安石油大學(xué)學(xué)報(bào),2012,27(1):99-103.
[7] 趙昀,魏祥毓,龐彥斌,等.符合HART協(xié)議的現(xiàn)場(chǎng)儀表通信卡軟件研究開(kāi)發(fā)[J].儀器儀表學(xué)報(bào),2006,22(z2):428-431.
[8] 孔祥偉,周杏鵬.基于HART協(xié)議的智能壓力變送器的設(shè)計(jì)與實(shí)現(xiàn)[J].儀表技術(shù)與傳感器,2010(2):15-17.
[9] 郝靖,李擎,楊磊.基于HART協(xié)議的智能壓力變送器[J].儀表技術(shù)與傳感器,2007(2):17-22.
[10]王忠民,梁玉偉.基于HART協(xié)議的礦用信號(hào)轉(zhuǎn)換器的設(shè)計(jì)[J].工礦自動(dòng)化,2011(8):116-118.
[11]鄭永軍,李文軍,梁國(guó)偉等.基于HART協(xié)議的金屬管浮子流量計(jì)[J].傳感器與微系統(tǒng),2010,25(2):95-97.
[12]陳東宇,施一明,金建祥.基于HART協(xié)議的智能擴(kuò)散硅壓力變送器[J].自動(dòng)化儀表,2001,22(6):17-19.
[13]劉軍華.HART協(xié)議通訊器在智能變送器實(shí)際測(cè)量中的應(yīng)用[J].化工自動(dòng)化及儀表,2010,37(2):93-94.
[14]馬小永,黃玲.傳統(tǒng)變送器的HART改造[J].自動(dòng)化儀表,2005,26(1):22-24.
[15]陳衛(wèi)兵,束慧.基于HART協(xié)議和模糊PID控制的智能氧量分析儀[J].計(jì)算機(jī)測(cè)量與控制,2010,18(11):2671-2674.