孫明革,關(guān) 波,徐松梅
(1.吉林化工學(xué)院信息與控制工程學(xué)院,吉林 吉林132022;2.中國石油吉林石化公司 化肥廠,吉林 吉林132021;3.吉林中國石油天然氣集團公司染料廠,吉林吉林132021)
HART(Highway Addressable Remote Transducer)協(xié)議,是一項4~20mA信號與數(shù)字通信技術(shù)兼容的過渡性標準,現(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)點,使它成為全球應(yīng)用最為廣泛的現(xiàn)場通信協(xié)議[1].
目前國內(nèi)外許多著名的儀表生產(chǎn)廠家都生產(chǎn)支持HART協(xié)議的智能現(xiàn)場儀表,但是不同廠家各自采用自己開發(fā)的便攜式編程器組態(tài)各自的儀表,這樣存在操作不方便、通用性差等缺陷.雖然在PC機上開發(fā)了相應(yīng)的組態(tài)軟件,但是也存在通用性差、功能少等缺點.本文主要通過對HART命令的解析來闡述HART組態(tài)軟件的工作原理,以及依據(jù)HART協(xié)議,利用C#高級語言編寫一種支持HART協(xié)議的通用組態(tài)軟件,實現(xiàn)HART命令對現(xiàn)場智能設(shè)備的控制,并闡述了基本編程思路[2-3].
HART儀表組態(tài)軟件通過USB-HART轉(zhuǎn)換器與現(xiàn)場智能儀表連接,當HART儀表組態(tài)軟件發(fā)送命令至現(xiàn)場設(shè)備時,現(xiàn)場智能儀表會立即回應(yīng)主機,根據(jù)其應(yīng)答的數(shù)據(jù)信息可以得到當前儀表的工作狀態(tài)以及儀表本身存儲的各種信息.系統(tǒng)通訊連接示意圖如圖1所示[4-5].
圖1 系統(tǒng)通訊連接示意圖
在HART協(xié)議中,實體間的數(shù)據(jù)傳輸是以幀的形式實現(xiàn)的.HART協(xié)議幀由用戶數(shù)據(jù)和地址信息封裝而成,它由前導(dǎo)符、定界符、地址域、命令域、字節(jié)長度域、數(shù)據(jù)域、狀態(tài)域以及校驗位組成[4-5].具體如表1 ~2 所示.
表1 請求幀
表2 響應(yīng)幀
(1)前導(dǎo)符一般是5~20個FF十六進制字節(jié).它實際上是同步信號,各通訊設(shè)備可以據(jù)此略做調(diào)整,保證信息的同步;
(2)定界符可以用來表示使用的結(jié)構(gòu)是“長”結(jié)構(gòu)或者“短”結(jié)構(gòu)、消息源是否是“突發(fā)”模式消息.主機到從機為短結(jié)構(gòu)時,起始位為02,長幀時為82.從機到主機的短結(jié)構(gòu)值為06,長結(jié)構(gòu)值為86.而為“突發(fā)”模式的短結(jié)構(gòu)值為01,長結(jié)構(gòu)為81;
(3)地址域包含了主機地址和從機地址,短結(jié)構(gòu)中占1字節(jié),長結(jié)構(gòu)中占5字節(jié).無論長結(jié)構(gòu)還是短結(jié)構(gòu),HART協(xié)議中允許2個主機存在,用首字節(jié)的最高位來進行區(qū)分,值為1表示第一主機地址,第二主機用0表示.短結(jié)構(gòu)用首字節(jié)的0~4位表示值為0~15的從機地址,第5、6位賦0;而長結(jié)構(gòu)用后6位表示從機的生產(chǎn)廠商的代碼,第2個字節(jié)表示從機設(shè)備型號代碼,后3~5個字節(jié)表示從機的設(shè)備序列號,構(gòu)成“唯一”標志碼;
(4)命令域的范圍為253個,用HEX的0~FD表示;
(5)字節(jié)長度域的值表示自下一個字節(jié)到最后字節(jié)(不包括校驗字節(jié))的字節(jié)數(shù);
(6)響應(yīng)碼只存在于從機響應(yīng)主機消息的時候,用2個字節(jié)表示.它將報告通訊中的錯誤、接收命令的狀態(tài)(如:設(shè)備忙、無法識別命令等)和從機的操作狀態(tài);
(7)數(shù)據(jù)域表示傳送和接收的數(shù)據(jù),一般不超過25個字節(jié);
(8)校驗方式采用縱向奇偶校驗,從起始字節(jié)開始到奇偶校驗前一個字節(jié)為止.
通過對HART協(xié)議的請求幀和響應(yīng)幀的結(jié)構(gòu)分析,得出正式進行儀表通訊之前需進行儀表測試,來確定制造商的設(shè)備類型、廠商的代碼、設(shè)備的版本號及標識.
系統(tǒng)功能結(jié)構(gòu)圖包括用戶注冊模塊、發(fā)送HART命令模塊、接收數(shù)據(jù)顯示模塊、通訊狀態(tài)顯示模塊及接收發(fā)送字節(jié)數(shù).具體如圖2所示[2-3,6].
圖2 系統(tǒng)功能結(jié)構(gòu)圖
用戶注冊模塊:只有注冊用戶才能正常使用該軟件;
發(fā)送HART命令:串口打開后,用戶可通過發(fā)送HART命令與智能儀表進行通訊,獲取或設(shè)置現(xiàn)場設(shè)備的狀態(tài);
接收數(shù)據(jù)顯示:把接收來的字節(jié)轉(zhuǎn)化為文字信息或數(shù)字信息顯示在屏幕上,表示用戶所需要的狀態(tài)信息;
傳輸狀態(tài)顯示:反映響應(yīng)碼所對應(yīng)的通訊信息,只有響應(yīng)碼首字節(jié)為零時才說明通訊正常,其它情況都表示通訊沒有正確執(zhí)行,根據(jù)響應(yīng)碼的數(shù)值顯示相應(yīng)的出錯信息,有助于維護設(shè)備正常的運行;
接收發(fā)送字節(jié)數(shù):顯示當前接收或發(fā)送的字節(jié)數(shù).
本組態(tài)軟件系統(tǒng)在經(jīng)過設(shè)備測試后確定現(xiàn)場智能儀表的地址域,并且等待主機發(fā)送HART命令,當獲取具體的HART命令后,根據(jù)命令的具體含義執(zhí)行相應(yīng)的操作.具體的系統(tǒng)流程圖如圖3 所示[7-15].
圖3 系統(tǒng)流程圖
組態(tài)軟件的主操作界面如圖4所示,這里不做說明.
圖4 主操作界面
組態(tài)軟件主界面上的每一個按鈕對應(yīng)一個特定的HART發(fā)送命令,每個命令的發(fā)送字節(jié)數(shù)與接收字節(jié)數(shù)都不一樣,發(fā)送前必須實現(xiàn)串口連接,本軟件通過創(chuàng)建SerialPort對象來實現(xiàn)串口通信的全過程.
程序中用到的SerialPort類的方法[2-3]:
ReadLine():從輸入緩沖區(qū)讀一新行的值,如果沒有,會返回NULL;
WriteLine(char
buffer,int offset,int count):寫入輸出緩沖;
Open():打開一個新的串口連接;
Close():關(guān)閉.
具體實現(xiàn)過程如下:
(1)添加引用
using System.IO.Ports;//串口類
(2)定義SerialPort類實例
private SerialPort SpCom = new SerialPort();//建立類實例
(3)超時設(shè)置
SpCom.WriteTimeout=2000;//寫入超時
SpCom.ReadTimeout=2000;//讀取超時
(4)設(shè)置通訊端口號及波特率、數(shù)據(jù)位、停止位和校驗位
SpCom.PortName=this.comboBox1.SelectedItem.ToString();//獲取通訊端口號
SpCom.BaudRate=1200;//HART為固定波特率=1200HZ
SpCom.Parity = System.IO.Ports.Parity.Odd;//奇偶校驗位,這里是奇校驗
SpCom.DataBits=8;//8個數(shù)據(jù)位
SpCom.StopBits=System.IO.Ports.StopBits.One;//一個停止位
SpCom.ParityReplace=0;//當發(fā)生奇偶校驗錯誤時,設(shè)置并返回替換數(shù)據(jù)流中一個非法字符的字符.
(5)打開串口
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ù)先準備好的輸液架上,在不影響手術(shù)操作以及不違反無菌原則的情況下對患者進行被動活動。由遠心端向近心端按摩患者小腿部肌肉,每小時按摩一次,每次5-10分鐘,直至手術(shù)結(jié)束。
(7)添加接受事件
在運行時將事件與事件處理程序相關(guān)聯(lián)(通過委托實現(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)//錯誤信息提示
{MessageBox.Show(err.Message);}}
(8)關(guān)閉串口
SpCom.Close();
數(shù)據(jù)顯示需要把接收到的字節(jié)數(shù)組經(jīng)過轉(zhuǎn)換得到用戶需要的數(shù)據(jù)形式,這種轉(zhuǎn)換包括多種數(shù)據(jù)類型的轉(zhuǎn)換[2-3].
(1)四個字節(jié)數(shù)組轉(zhuǎn)化單精度浮點數(shù)
byte
word=new byte[4];
word[0]=Rcommand[firstdata+3];//接收字節(jié)數(shù)組的第四個字節(jié)
word[1]=Rcommand[firstdata+2];//接收字節(jié)數(shù)組的第三個字節(jié)
word[2]=Rcommand[firstdata+1];//接收字節(jié)數(shù)組的第二個字節(jié)
word[3]=Rcommand[firstdata];//接收字節(jié)數(shù)組的第一個字節(jié)
this.textBox5.Text= System.BitConverter.ToSingle(word,0).ToString();
//將四個字節(jié)數(shù)組轉(zhuǎn)化成單精度浮點數(shù)并顯示在textBox5中
(2)指定字節(jié)數(shù)組序列解碼為字符串
this.textBox18.Text= System.Text.Encoding.ASCII.GetString(data,0,24);
//將data數(shù)組從0到開始的24個字節(jié)轉(zhuǎn)化成字符串
(3)將字符序列編碼為字節(jié)數(shù)組
data=System.Text.Encoding.ASCII.Get-Bytes(str);
//將字符串str轉(zhuǎn)化為字節(jié)存入data數(shù)組中
(4)以字節(jié)數(shù)組形式返回指定的雙精度浮點值
order.data= System.BitConverter.GetBytes(da);//將浮點數(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的子集,它通過去掉每個ASCII字符的高2位而產(chǎn)生.這就允許4個壓縮的ASCII字符占用3個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ā)送前都要進入該程序,用以確定要發(fā)送的字節(jié)數(shù)組,然后再通過 Serialport類的Write屬性將字節(jié)發(fā)送給智能設(shè)備.該命令有兩個參數(shù):儀表檢測時得到的設(shè)備定界符(是長幀還是短幀)和要發(fā)送的字節(jié)數(shù)組(該字節(jié)由系統(tǒng)根據(jù)用戶提供的數(shù)字或文字信息轉(zhuǎn)化而來)[2-3].
為了方便讀者,這里沒有給出程序框圖,而是直接給出了實現(xiàn)代碼.
具體代碼實現(xiàn)如下:
本軟件包括了HART協(xié)議中的所有通用命令、普通命令和一些特殊命令,實現(xiàn)了PC機與各類支持HART協(xié)議的現(xiàn)場智能設(shè)備的遠程通訊.具有操作界面友好、狀態(tài)顯示清晰、操作方便、價格低廉等優(yōu)點,并且本軟件增加了自編命令用來支持某些具有特殊命令的HART儀表,提高了軟件的通用性.
[1] 丁穎,盛惠興.HART協(xié)議解析[J].現(xiàn)代電子技術(shù).2004,27(1):14-17.
[2] 熊輝,馬占德,牛耀林,等.基于HART協(xié)議的PC組態(tài)軟件設(shè)計[J].石油化工自動化,2007(1):59-68.
[3] 張夏,魏文雄,余淼,等.基于Windows的HART組態(tài)軟件設(shè)計[J].計算機系統(tǒng)工程,2012,38(16):241-244.
[4] 郭福田,姜軍,劉賢梅,等.基于HART協(xié)議的通信技術(shù)[J].大慶石油學(xué)院學(xué)報,2000,24(1):55-77.
[5] 孫廣軍.HART現(xiàn)場通訊協(xié)議[J].微計算機信息,2002(2):4-12.
[6] 曹慶年,胡欣欣,孟開元,等.基于HART協(xié)議的工業(yè)無線監(jiān)控系統(tǒng)設(shè)計[J].西安石油大學(xué)學(xué)報,2012,27(1):99-103.
[7] 趙昀,魏祥毓,龐彥斌,等.符合HART協(xié)議的現(xiàn)場儀表通信卡軟件研究開發(fā)[J].儀器儀表學(xué)報,2006,22(z2):428-431.
[8] 孔祥偉,周杏鵬.基于HART協(xié)議的智能壓力變送器的設(shè)計與實現(xiàn)[J].儀表技術(shù)與傳感器,2010(2):15-17.
[9] 郝靖,李擎,楊磊.基于HART協(xié)議的智能壓力變送器[J].儀表技術(shù)與傳感器,2007(2):17-22.
[10]王忠民,梁玉偉.基于HART協(xié)議的礦用信號轉(zhuǎn)換器的設(shè)計[J].工礦自動化,2011(8):116-118.
[11]鄭永軍,李文軍,梁國偉等.基于HART協(xié)議的金屬管浮子流量計[J].傳感器與微系統(tǒng),2010,25(2):95-97.
[12]陳東宇,施一明,金建祥.基于HART協(xié)議的智能擴散硅壓力變送器[J].自動化儀表,2001,22(6):17-19.
[13]劉軍華.HART協(xié)議通訊器在智能變送器實際測量中的應(yīng)用[J].化工自動化及儀表,2010,37(2):93-94.
[14]馬小永,黃玲.傳統(tǒng)變送器的HART改造[J].自動化儀表,2005,26(1):22-24.
[15]陳衛(wèi)兵,束慧.基于HART協(xié)議和模糊PID控制的智能氧量分析儀[J].計算機測量與控制,2010,18(11):2671-2674.