李紅飛 馬俊 陳章龍
摘要:該文介紹了歐陸3504溫控儀表基于Delphi平臺的串口通訊設(shè)計,詳細(xì)地介紹了歐陸3504的命令格式和基于Delphi的16位循環(huán)冗余算法。軟件設(shè)計以Delphi 2010為開發(fā)平臺,通過Mscomm控件實現(xiàn)了計算機對歐陸3504串口通信。功能包括讀取雙色紅外線溫度計測量的溫度、歐陸3504的Auto和Man功能之間相互轉(zhuǎn)換、預(yù)設(shè)的溫度值和功率百分比輸入。
關(guān)鍵詞:歐陸3504溫控儀;Delphi;Mscomm;CRC
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2017)02-0226-04
Communication Programming Based on Delphi for Eurotherm 3504 Temperature Controller
LI Hong-fei, MA Jun, CHEN Zhang-long
(Qinghai Normal University,College of Computer Science, Xining 810000, China)
Abstract: The paper introduces Eurotherm 3504 temperature control instrumentals serial port communication programming based on the Delphi platform ,and detail introduces that the Eurotherm 3504 typical command form and the 16 bit cyclic redundancy algorithm(CRC) based on Delphi 2010 .The software design using Delphi 2010 as the development platform ,through the Mscomm control to achieve the computer on the Eurotherm 3504 serial communication . The function mainly includes read temperature that the double color infrared thermometer measure、the function transformation between Auto and Man of the Eurotherm 3504 and the input value of the preset temperature and the percentage of power.
Key words: Eurotherm 3504; Delphi; Mscomm; CRC
1 背景
歐陸3504溫控儀表是歐陸公司最新推出的高性能過程溫度控制器,它融合了液晶顯示及微處理器科技之優(yōu)點,其以較高的控制精度和良好的適應(yīng)能力,被廣泛應(yīng)用于各種溫度控制過程[1]。溫度計采用雙色紅外測溫計,雙色紅外測溫是利用鄰近通道兩個波段紅外輻射能量的比值來決定溫度的大小,能夠消除水汽、灰塵、檢測目標(biāo)大小變化、部分被遮擋、發(fā)射率變化等的影響,即使檢測信號衰減95%,也不會對測溫結(jié)果有任何影響。獨特的軟件算法,可以克服氧化層的影響。軟硬件設(shè)計,適用于幾十萬倍信號的處理,可以滿足對儀器精度、重復(fù)性、等各方面的要求[2]。本文詳細(xì)介紹了計算機與歐陸3504溫控儀的通信過程,并開發(fā)了基于Delphi 2010的平臺的通信測試軟件。軟件實現(xiàn)了實時溫度采集、溫度顯示、歐陸3504溫控儀的Auto模式和Man模式轉(zhuǎn)換、以及溫度或者功率百分比輸入。為歐陸表3504溫控儀開發(fā)過程提供了良好的方法。
2 通訊協(xié)議和通信控件
歐陸3504采用Modbus 通訊協(xié)議,在Modbus系統(tǒng)中有2種傳輸模式可選擇,一種模式是ASCII(美國信息交換碼),另一種模式是RTU(遠(yuǎn)程終端設(shè)備)。在同樣的波特率下,RTU方式可比ASCII方式傳送更多的數(shù)據(jù)[3]。歐陸3504溫控儀采用的是RTU傳輸方式。
使用RTU模式,消息發(fā)送至少要以3.5個字符時間為停頓間隔開始。如果一個新消息在小于3.5個字符時間內(nèi)開始,接收設(shè)備將認(rèn)為是前一消息的延續(xù),這將導(dǎo)致錯誤產(chǎn)生。RTU典型的消息幀如表1所示。
本軟件在Delphi 2010開發(fā)平臺中采用了Windows通信控件(Mscomm)實現(xiàn)與RS232的串口通信。Mscomm控件是與RS232兼容串行接口控件,歐陸3504溫控儀采用485通訊接口,需要由485轉(zhuǎn)232接口與計算機連接,在系統(tǒng)中選用了UPort 1610-8。UPort 1600系列產(chǎn)品可以讓計算機可以通過USB ( 通用串行總線) 與8 個串口RS-232 或RS-232/422/ 485 的外設(shè)進(jìn)行通信。在工控中作為擴展口非常實用。Mscomm控件的主要屬性為[4]:
1) CommPort:設(shè)置和返回串行端口號,缺省為1。MSComm1.CommPort:=1;
2) Setting:設(shè)置或者返回串行的波特率、奇偶校驗位、數(shù)據(jù)位數(shù)、停止位。
MSComm1.Settings:='19200,n,8,1'; 歐陸3504波特率采用的是19200而不是常用的9600。
3) InputMode:設(shè)置從接受緩沖區(qū)讀取數(shù)據(jù)格式,有文本格式和二進(jìn)制格式。
MSComm1.InputMode:=comInputModeBinary;//二進(jìn)制模式
4) RThreshold:該屬性為產(chǎn)生代碼為ComEvReceive的OnComm事件的閾值。
MSComm1.RThreshold:=7;歐陸3504返回數(shù)據(jù)的主要用在對于溫度的查詢,所以就用溫度最小返回的數(shù)據(jù)個數(shù)為閾值。
5) PortOpen:打開或關(guān)閉串行端口。MSComm1.PortOpen:=True;
對于Mscomm控件的其他屬性在軟件中采用了默認(rèn)值,沒有另行設(shè)置。
3 循環(huán)冗余校驗(CRC)
循環(huán)冗余校驗碼(CRC)的基本原理是:在K位信息碼后再拼接R位的校驗碼,整個編碼長度為N位,因此,這種編碼也叫(N,K)碼。對于一個給定的(N,K)碼,可以證明存在一個最高次冪為N-K=R的多項式G(x)。根據(jù)G(x)可以生成K位信息的校驗碼,而G(x)叫做這個CRC碼的生成多項式[5]。
由表2可知歐陸3504發(fā)送數(shù)據(jù)總長度為64位(N),數(shù)據(jù)校驗位為16位(R). 需要對48(K)位信息碼進(jìn)行校驗function QhCRC16(AData:array of Byte):Word;本程序選用多項式G(x) =X16+X15+X2+1即const GENP=$A001;如發(fā)送數(shù)據(jù)定義為sbuf:array[1..8] of byte;對于數(shù)組前6位按照發(fā)送數(shù)據(jù)格式和要求填寫,然后調(diào)用校驗函數(shù)進(jìn)行校驗。因為函數(shù)返回數(shù)據(jù)類型為Word,應(yīng)對返回數(shù)據(jù)進(jìn)行數(shù)據(jù)分割校驗高低位并轉(zhuǎn)換為16進(jìn)制。分別對sbuf[6], sbuf[7]賦值,然后調(diào)用MSComm1的Output函數(shù)進(jìn)行發(fā)送。CRC校驗函數(shù)如下。
function QhCRC16(AData:array of Byte;AStart,AEnd:Integer):Word;
const
GENP=$A001; //多項式公式X16+X15+X2+1(1100 0000 0000 0101)
var
crc:Word;
i:Integer;
tmp:Byte;
procedure CalOneByte(AByte:Byte); //計算1個字節(jié)的校驗碼
var
j:Integer;
begin
crc:=crc xor AByte; //將數(shù)據(jù)與CRC寄存器的低8位進(jìn)行異或
for j:=0 to 7 do //對每一位進(jìn)行校驗
begin
tmp:=crc and 1; //取出最低位
crc:=crc shr 1; //寄存器向右移一位
crc:=crc and $7FFF; //將最高位置0
if tmp=1 then //檢測移出的位,如果為1,那么與多項式異或
crc:=crc xor GENP;
crc:=crc and $FFFF;
end;
end;
begin
crc:=$FFFF; //將余數(shù)設(shè)定為FFFF
for i:=AStart to AEnd do //對每一個字節(jié)進(jìn)行校驗
CalOneByte(AData[i]); Result:=crc;
end;
4 功能碼和寄存器地址
使用Modbus通訊協(xié)議,需要對Modbus功能碼進(jìn)行一定的了解。在本程序中主要用到功能碼兩個$03、$06。$03讀取保持寄存器主要用于讀取由雙色紅外線溫度計傳給歐陸3504溫控儀的溫度。$06預(yù)置單寄存器,主要用于對Auto(0)、Man(1)相互轉(zhuǎn)換和溫度或者功率百分比輸入。
寄存器地址,對歐陸3504溫控儀進(jìn)行操作需要預(yù)先知道其各個寄存器的地址,比如要讀取溫度,需要知道存放溫度的寄存器地址($01);對于查詢寄存器地址可以用歐陸3504配套軟件iTools Engineering Studio連接之后可以查詢各個寄存器地址。再結(jié)合本軟件的對于寄存器的操作方法,就可以實現(xiàn)對于歐陸3504的全部操作。
5 軟件整體設(shè)計
在工業(yè)控制設(shè)備中串口一般是統(tǒng)一分配的,以便安裝操作方便。所以在工業(yè)控制軟件可以直接給Mscomm控件進(jìn)行串口號賦值,但是需要先檢測串口號是否存在。利用注冊表(Registry),檢測所有串口號,再用Pos函數(shù)檢查是否有所需串口。避免串口不存在時發(fā)生的錯誤警告。也可以用ComboBox控件、Button控件和注冊表組合使用。用注冊表檢測所有串口,賦值給ComboBox控件的Items屬性。Button按鈕作為連接按鈕,同時也是設(shè)備開始按鈕。本程序選用第二種方法,另加了一個刷新按鈕,當(dāng)串口改變時需重新刷新,對ComboBox重新賦值。軟件流程圖如圖1。
在軟件流程圖中,設(shè)定的為檢測到溫度大于預(yù)定上限值時,由手動轉(zhuǎn)換為自動模式。在手動模式中輸出為功率百分比,在自動模式中輸出的是預(yù)設(shè)溫度。歐陸3504在自動模式下預(yù)設(shè)溫度可以根據(jù)反饋信號自動調(diào)節(jié)輸出功率百分比,這樣使得對于溫度的控制更加精確。本軟件為測試軟件事先添加了自動和手動按鈕,以便模式的轉(zhuǎn)換。由于溫度是由雙色紅外線溫度計傳給歐陸3504,雙色紅外線溫度計檢測范圍為1000-3200,所以之前的升溫階段只能輸入功率百分比。設(shè)立溫度上限,來保證當(dāng)溫度達(dá)到上限值時的自動轉(zhuǎn)換。轉(zhuǎn)換程序在Mscomm空間Oncomm事件中,將歐陸3504返回的溫度數(shù)據(jù)轉(zhuǎn)換十進(jìn)制數(shù)后進(jìn)行判斷。為避免每次都進(jìn)行同一種模式寫入,可以加入兩個標(biāo)志位來保證在不同模式下才進(jìn)行模式轉(zhuǎn)換。
測試軟件工作流程為先設(shè)置串口號,將ComboBox.Text刪除COM之后的數(shù)字賦值給Mscomm控件作為串口號。因為歐陸3504波特率為19200,所以波特率在不選擇的條件下將默認(rèn)為19200,也可以對波特率改動進(jìn)行驗證,檢測是否有數(shù)據(jù)返回。添加了兩個Memo控件,一個是顯示發(fā)送的數(shù)據(jù),一個顯示歐陸3504返回的數(shù)據(jù)。在面板中添加了Timer控件,Timer控件在檢測到串口打開后,就會啟動發(fā)送查詢溫度程序。Timer默認(rèn)為1000ms發(fā)送一次。
if MSComm1.PortOpen then
begin
sbuf[1]:=byte($01); //幀頭
sbuf[2]:=byte($03); //命令號查詢
sbuf[3]:=byte($00);
sbuf[4]:=byte($01);
sbuf[5]:=byte($00);
sbuf[6]:=byte($01);
sbuf[7]:=byte($D5); //數(shù)據(jù)校驗位
sbuf[8]:=byte($CA); //數(shù)據(jù)校驗位
sendcommend; //發(fā)送數(shù)據(jù)給歐陸3504
ReadTsign:=True;//查詢溫度的標(biāo)志當(dāng)為真時對歐陸3504返回數(shù)據(jù)進(jìn)行處理轉(zhuǎn)換為溫度
end;
在本程序中CRC算法程序的調(diào)用主要用于對功率百分比和預(yù)設(shè)溫度值輸入。對于Timer控件下的讀取溫度、手動和自動模式轉(zhuǎn)換,因為要發(fā)送的數(shù)據(jù)固定不變或者頻率較大,所以直接先算出該查詢數(shù)據(jù)的CRC校驗位進(jìn)行賦值。避免每次發(fā)送都需要進(jìn)行校驗,減小程序的運行負(fù)擔(dān)。
設(shè)置MSComm1.RThreshold:=7; 當(dāng)接收緩沖區(qū)內(nèi)的字節(jié)個數(shù)大于等于7個后就產(chǎn)生代碼為ComEvReceive的OnComm事件。只有查詢溫度的時歐陸3504返回的數(shù)據(jù)需要進(jìn)行,處理得出溫度值。其他數(shù)據(jù)只是為判斷歐陸3504是否得到數(shù)據(jù)。所以在查詢溫度時增加了一個標(biāo)志符號(ReadTsign)。標(biāo)志符號初始化為假,在查詢溫度時將其賦值為真。在OnComm事件中檢測ReadTsign,如果為真,將返回數(shù)據(jù)的rbuf[3]和rbuf[4]進(jìn)行處理得到設(shè)備溫度的值,其他返回數(shù)據(jù)不做處理。對于歐陸3504溫控儀返回的溫度是由雙色紅外測溫儀檢測出來返回給歐陸表的。雙色紅外測溫儀為高溫計,檢測范圍為1000-3200。所以當(dāng)雙色紅外測溫儀檢測的溫度不在這個范圍時歐陸3504溫控儀返回的溫度始終為3314.0℃,恒定不變。
procedure TForm1.MSComm1Comm(Sender: TObject);
var
i: Integer;
begin
rbuf := MSComm1.Input;
sendstr:='';
if ReadTsign then
begin
ReadTsign:=False;//標(biāo)志賦值為假,等待下一次查詢
T:=(rbuf[3]*256+rbuf[4])/10;//輸出溫度為小點后一位T為Real類型
sendstr:=FloatToStr(T) ;
Label1.Caption:= sendstr+'℃';//程序窗口顯示溫度
sendstr:='';
end;
end;
預(yù)設(shè)溫度值或者功率百分比輸入,需要先將要輸入的值擴大10倍,因為輸入的數(shù)據(jù)在歐陸3504中會自動將最后一位設(shè)為小數(shù),所以要將要輸入的值增加10倍。而且需要判斷歐陸3504工作在Men模式還是Auto模式。因為不但兩個要操作的地址不同,而且兩個模式下輸入值得范圍也不同。在Men模式下要輸入的值范圍為0-40,Auto模式下要輸入的值范圍為1000-2500,有效數(shù)字均為小數(shù)點后一位。在范圍外的值輸入時,設(shè)備對于輸入的值是不予識別的。
要發(fā)送的數(shù)據(jù)選用了Edit控件的OnKeyDown事件,當(dāng)Enter按鍵按下時進(jìn)行數(shù)據(jù)傳送。
var
Data:array[0..255] of Byte;
i,j:Integer;
Res:Word;
TsData,szData:string;
begin
if Key=13 then //當(dāng)Enter按鍵按下時
begin
szData:=IntToHex(round(StrToFloat(Form1.SendData.Text)*10),4);//將Edit的內(nèi)容擴大10倍四舍五入后//轉(zhuǎn)換為4位16進(jìn)制,來保證輸入框的數(shù)字與歐陸3504表要顯示的數(shù)字相同。
i:=1;
j:=0;
for j:=0 to 1 do
begin
if (i mod 2)=0 then //每2個字符放入一個字節(jié)中
i:=i+1;
if i>=Length(szData) then
exit;
Data[j]:=StrToInt('$'+copy(szData,i,2)); //取出字符并轉(zhuǎn)換為16進(jìn)制數(shù)
i:=i+1;
end;
sbuf[1]:=byte($01); //幀頭
sbuf[2]:=byte($06); //命令號 預(yù)置單寄存器功能碼
sbuf[3]:=byte($00);
if commflg=true then//在Auto模式下
begin
sbuf[4]:=byte($02);
end
else//在Man模式下
begin
sbuf[4]:=byte($03);
end;
sbuf[5]:=Data[0];
sbuf[6]:=Data[1]; //數(shù)據(jù)校驗位
Res:= QhCRC16(sbuf,0,5);//CRC檢驗
szData:=IntToHex(Res,4) ;
i:=1;
j:=0;
for j:=0 to 1 do
begin
if (i mod 2)=0 then //每2個字符放入一個字節(jié)中
i:=i+1;
if i>=Length(szData) then
exit;
Data[j]:=StrToInt('$'+copy(szData,i,2)); //取出字符并轉(zhuǎn)換為16進(jìn)制數(shù)
i:=i+1;
end;
sbuf[7]:=Data[1]; //數(shù)據(jù)校驗位//CRC高地位互換
sbuf[8]:=Data[0]; //數(shù)據(jù)校驗位
sendcommend;
end;
end;
6 結(jié)束語
Modbus RTU協(xié)議在工業(yè)控制中應(yīng)用非常廣泛,其通信方式靈活多變,結(jié)構(gòu)簡單,適用于小、中等規(guī)模的數(shù)據(jù)傳送,具有很強的兼容性。本文對于歐陸3504溫控儀表進(jìn)行了簡單的介紹,對其通訊格式和通訊方法進(jìn)行了詳細(xì)的說明。并利用了Delphi 2010作為開發(fā)平臺,通過Mscomm控件開發(fā)了測試軟件實現(xiàn)了計算機對于歐陸3504的一些基本控制。在結(jié)合Modbus RTU協(xié)議通用條件下,通過使用本文方法就能夠?qū)τ跉W陸3504其他寄存器進(jìn)行的操作處理。
參考文獻(xiàn):
[1] 饒家庭. 歐陸3504溫控儀表RS232串口通訊編程[J].四川冶金, 2009(4): 54-57.
[2] 張曉龍, 劉英, 張盈, 等. 紅外雙色復(fù)合仿真系統(tǒng)測溫技術(shù)研究[J]. 光子學(xué)報, 2012(2): 16-18.
[3] 李芳芳. 基于MODBUS協(xié)議的人機接口通信研究[D].西安: 長安大學(xué), 2009.
[4] 藍(lán)波, 劉軍. 基于VB開發(fā)串行通信程序[J]. 煤炭工程, 2013, 29(4): 183-190.
[5] 苑林, 李曉光, 張曉晨. 單片機串行通信中循環(huán)冗余校驗碼的編碼設(shè)計[J]. 科技傳播, 2010(23): 225—226.