国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種基于Delphi歐陸3504溫控儀表通訊設(shè)計(jì)

2017-04-25 13:23:42李紅飛馬俊陳章龍
電腦知識(shí)與技術(shù) 2017年2期

李紅飛 馬俊 陳章龍

摘要:該文介紹了歐陸3504溫控儀表基于Delphi平臺(tái)的串口通訊設(shè)計(jì),詳細(xì)地介紹了歐陸3504的命令格式和基于Delphi的16位循環(huán)冗余算法。軟件設(shè)計(jì)以Delphi 2010為開(kāi)發(fā)平臺(tái),通過(guò)Mscomm控件實(shí)現(xiàn)了計(jì)算機(jī)對(duì)歐陸3504串口通信。功能包括讀取雙色紅外線(xiàn)溫度計(jì)測(cè)量的溫度、歐陸3504的Auto和Man功能之間相互轉(zhuǎn)換、預(yù)設(shè)的溫度值和功率百分比輸入。

關(guān)鍵詞:歐陸3504溫控儀;Delphi;Mscomm;CRC

中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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溫控儀表是歐陸公司最新推出的高性能過(guò)程溫度控制器,它融合了液晶顯示及微處理器科技之優(yōu)點(diǎn),其以較高的控制精度和良好的適應(yīng)能力,被廣泛應(yīng)用于各種溫度控制過(guò)程[1]。溫度計(jì)采用雙色紅外測(cè)溫計(jì),雙色紅外測(cè)溫是利用鄰近通道兩個(gè)波段紅外輻射能量的比值來(lái)決定溫度的大小,能夠消除水汽、灰塵、檢測(cè)目標(biāo)大小變化、部分被遮擋、發(fā)射率變化等的影響,即使檢測(cè)信號(hào)衰減95%,也不會(huì)對(duì)測(cè)溫結(jié)果有任何影響。獨(dú)特的軟件算法,可以克服氧化層的影響。軟硬件設(shè)計(jì),適用于幾十萬(wàn)倍信號(hào)的處理,可以滿(mǎn)足對(duì)儀器精度、重復(fù)性、等各方面的要求[2]。本文詳細(xì)介紹了計(jì)算機(jī)與歐陸3504溫控儀的通信過(guò)程,并開(kāi)發(fā)了基于Delphi 2010的平臺(tái)的通信測(cè)試軟件。軟件實(shí)現(xiàn)了實(shí)時(shí)溫度采集、溫度顯示、歐陸3504溫控儀的Auto模式和Man模式轉(zhuǎn)換、以及溫度或者功率百分比輸入。為歐陸表3504溫控儀開(kāi)發(fā)過(guò)程提供了良好的方法。

2 通訊協(xié)議和通信控件

歐陸3504采用Modbus 通訊協(xié)議,在Modbus系統(tǒng)中有2種傳輸模式可選擇,一種模式是ASCII(美國(guó)信息交換碼),另一種模式是RTU(遠(yuǎn)程終端設(shè)備)。在同樣的波特率下,RTU方式可比ASCII方式傳送更多的數(shù)據(jù)[3]。歐陸3504溫控儀采用的是RTU傳輸方式。

使用RTU模式,消息發(fā)送至少要以3.5個(gè)字符時(shí)間為停頓間隔開(kāi)始。如果一個(gè)新消息在小于3.5個(gè)字符時(shí)間內(nèi)開(kāi)始,接收設(shè)備將認(rèn)為是前一消息的延續(xù),這將導(dǎo)致錯(cuò)誤產(chǎn)生。RTU典型的消息幀如表1所示。

本軟件在Delphi 2010開(kāi)發(fā)平臺(tái)中采用了Windows通信控件(Mscomm)實(shí)現(xiàn)與RS232的串口通信。Mscomm控件是與RS232兼容串行接口控件,歐陸3504溫控儀采用485通訊接口,需要由485轉(zhuǎn)232接口與計(jì)算機(jī)連接,在系統(tǒng)中選用了UPort 1610-8。UPort 1600系列產(chǎn)品可以讓計(jì)算機(jī)可以通過(guò)USB ( 通用串行總線(xiàn)) 與8 個(gè)串口RS-232 或RS-232/422/ 485 的外設(shè)進(jìn)行通信。在工控中作為擴(kuò)展口非常實(shí)用。Mscomm控件的主要屬性為[4]:

1) CommPort:設(shè)置和返回串行端口號(hào),缺省為1。MSComm1.CommPort:=1;

2) Setting:設(shè)置或者返回串行的波特率、奇偶校驗(yàn)位、數(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返回?cái)?shù)據(jù)的主要用在對(duì)于溫度的查詢(xún),所以就用溫度最小返回的數(shù)據(jù)個(gè)數(shù)為閾值。

5) PortOpen:打開(kāi)或關(guān)閉串行端口。MSComm1.PortOpen:=True;

對(duì)于Mscomm控件的其他屬性在軟件中采用了默認(rèn)值,沒(méi)有另行設(shè)置。

3 循環(huán)冗余校驗(yàn)(CRC)

循環(huán)冗余校驗(yàn)碼(CRC)的基本原理是:在K位信息碼后再拼接R位的校驗(yàn)碼,整個(gè)編碼長(zhǎng)度為N位,因此,這種編碼也叫(N,K)碼。對(duì)于一個(gè)給定的(N,K)碼,可以證明存在一個(gè)最高次冪為N-K=R的多項(xiàng)式G(x)。根據(jù)G(x)可以生成K位信息的校驗(yàn)碼,而G(x)叫做這個(gè)CRC碼的生成多項(xiàng)式[5]。

由表2可知?dú)W陸3504發(fā)送數(shù)據(jù)總長(zhǎng)度為64位(N),數(shù)據(jù)校驗(yàn)位為16位(R). 需要對(duì)48(K)位信息碼進(jìn)行校驗(yàn)function QhCRC16(AData:array of Byte):Word;本程序選用多項(xiàng)式G(x) =X16+X15+X2+1即const GENP=$A001;如發(fā)送數(shù)據(jù)定義為sbuf:array[1..8] of byte;對(duì)于數(shù)組前6位按照發(fā)送數(shù)據(jù)格式和要求填寫(xiě),然后調(diào)用校驗(yàn)函數(shù)進(jìn)行校驗(yàn)。因?yàn)楹瘮?shù)返回?cái)?shù)據(jù)類(lèi)型為Word,應(yīng)對(duì)返回?cái)?shù)據(jù)進(jìn)行數(shù)據(jù)分割校驗(yàn)高低位并轉(zhuǎn)換為16進(jìn)制。分別對(duì)sbuf[6], sbuf[7]賦值,然后調(diào)用MSComm1的Output函數(shù)進(jìn)行發(fā)送。CRC校驗(yàn)函數(shù)如下。

function QhCRC16(AData:array of Byte;AStart,AEnd:Integer):Word;

const

GENP=$A001; //多項(xiàng)式公式X16+X15+X2+1(1100 0000 0000 0101)

var

crc:Word;

i:Integer;

tmp:Byte;

procedure CalOneByte(AByte:Byte); //計(jì)算1個(gè)字節(jié)的校驗(yàn)碼

var

j:Integer;

begin

crc:=crc xor AByte; //將數(shù)據(jù)與CRC寄存器的低8位進(jìn)行異或

for j:=0 to 7 do //對(duì)每一位進(jìn)行校驗(yàn)

begin

tmp:=crc and 1; //取出最低位

crc:=crc shr 1; //寄存器向右移一位

crc:=crc and $7FFF; //將最高位置0

if tmp=1 then //檢測(cè)移出的位,如果為1,那么與多項(xiàng)式異或

crc:=crc xor GENP;

crc:=crc and $FFFF;

end;

end;

begin

crc:=$FFFF; //將余數(shù)設(shè)定為FFFF

for i:=AStart to AEnd do //對(duì)每一個(gè)字節(jié)進(jìn)行校驗(yàn)

CalOneByte(AData[i]); Result:=crc;

end;

4 功能碼和寄存器地址

使用Modbus通訊協(xié)議,需要對(duì)Modbus功能碼進(jìn)行一定的了解。在本程序中主要用到功能碼兩個(gè)$03、$06。$03讀取保持寄存器主要用于讀取由雙色紅外線(xiàn)溫度計(jì)傳給歐陸3504溫控儀的溫度。$06預(yù)置單寄存器,主要用于對(duì)Auto(0)、Man(1)相互轉(zhuǎn)換和溫度或者功率百分比輸入。

寄存器地址,對(duì)歐陸3504溫控儀進(jìn)行操作需要預(yù)先知道其各個(gè)寄存器的地址,比如要讀取溫度,需要知道存放溫度的寄存器地址($01);對(duì)于查詢(xún)寄存器地址可以用歐陸3504配套軟件iTools Engineering Studio連接之后可以查詢(xún)各個(gè)寄存器地址。再結(jié)合本軟件的對(duì)于寄存器的操作方法,就可以實(shí)現(xiàn)對(duì)于歐陸3504的全部操作。

5 軟件整體設(shè)計(jì)

在工業(yè)控制設(shè)備中串口一般是統(tǒng)一分配的,以便安裝操作方便。所以在工業(yè)控制軟件可以直接給Mscomm控件進(jìn)行串口號(hào)賦值,但是需要先檢測(cè)串口號(hào)是否存在。利用注冊(cè)表(Registry),檢測(cè)所有串口號(hào),再用Pos函數(shù)檢查是否有所需串口。避免串口不存在時(shí)發(fā)生的錯(cuò)誤警告。也可以用ComboBox控件、Button控件和注冊(cè)表組合使用。用注冊(cè)表檢測(cè)所有串口,賦值給ComboBox控件的Items屬性。Button按鈕作為連接按鈕,同時(shí)也是設(shè)備開(kāi)始按鈕。本程序選用第二種方法,另加了一個(gè)刷新按鈕,當(dāng)串口改變時(shí)需重新刷新,對(duì)ComboBox重新賦值。軟件流程圖如圖1。

在軟件流程圖中,設(shè)定的為檢測(cè)到溫度大于預(yù)定上限值時(shí),由手動(dòng)轉(zhuǎn)換為自動(dòng)模式。在手動(dòng)模式中輸出為功率百分比,在自動(dòng)模式中輸出的是預(yù)設(shè)溫度。歐陸3504在自動(dòng)模式下預(yù)設(shè)溫度可以根據(jù)反饋信號(hào)自動(dòng)調(diào)節(jié)輸出功率百分比,這樣使得對(duì)于溫度的控制更加精確。本軟件為測(cè)試軟件事先添加了自動(dòng)和手動(dòng)按鈕,以便模式的轉(zhuǎn)換。由于溫度是由雙色紅外線(xiàn)溫度計(jì)傳給歐陸3504,雙色紅外線(xiàn)溫度計(jì)檢測(cè)范圍為1000-3200,所以之前的升溫階段只能輸入功率百分比。設(shè)立溫度上限,來(lái)保證當(dāng)溫度達(dá)到上限值時(shí)的自動(dòng)轉(zhuǎn)換。轉(zhuǎn)換程序在Mscomm空間Oncomm事件中,將歐陸3504返回的溫度數(shù)據(jù)轉(zhuǎn)換十進(jìn)制數(shù)后進(jìn)行判斷。為避免每次都進(jìn)行同一種模式寫(xiě)入,可以加入兩個(gè)標(biāo)志位來(lái)保證在不同模式下才進(jìn)行模式轉(zhuǎn)換。

測(cè)試軟件工作流程為先設(shè)置串口號(hào),將ComboBox.Text刪除COM之后的數(shù)字賦值給Mscomm控件作為串口號(hào)。因?yàn)闅W陸3504波特率為19200,所以波特率在不選擇的條件下將默認(rèn)為19200,也可以對(duì)波特率改動(dòng)進(jìn)行驗(yàn)證,檢測(cè)是否有數(shù)據(jù)返回。添加了兩個(gè)Memo控件,一個(gè)是顯示發(fā)送的數(shù)據(jù),一個(gè)顯示歐陸3504返回的數(shù)據(jù)。在面板中添加了Timer控件,Timer控件在檢測(cè)到串口打開(kāi)后,就會(huì)啟動(dòng)發(fā)送查詢(xún)溫度程序。Timer默認(rèn)為1000ms發(fā)送一次。

if MSComm1.PortOpen then

begin

sbuf[1]:=byte($01); //幀頭

sbuf[2]:=byte($03); //命令號(hào)查詢(xún)

sbuf[3]:=byte($00);

sbuf[4]:=byte($01);

sbuf[5]:=byte($00);

sbuf[6]:=byte($01);

sbuf[7]:=byte($D5); //數(shù)據(jù)校驗(yàn)位

sbuf[8]:=byte($CA); //數(shù)據(jù)校驗(yàn)位

sendcommend; //發(fā)送數(shù)據(jù)給歐陸3504

ReadTsign:=True;//查詢(xún)溫度的標(biāo)志當(dāng)為真時(shí)對(duì)歐陸3504返回?cái)?shù)據(jù)進(jìn)行處理轉(zhuǎn)換為溫度

end;

在本程序中CRC算法程序的調(diào)用主要用于對(duì)功率百分比和預(yù)設(shè)溫度值輸入。對(duì)于Timer控件下的讀取溫度、手動(dòng)和自動(dòng)模式轉(zhuǎn)換,因?yàn)橐l(fā)送的數(shù)據(jù)固定不變或者頻率較大,所以直接先算出該查詢(xún)數(shù)據(jù)的CRC校驗(yàn)位進(jìn)行賦值。避免每次發(fā)送都需要進(jìn)行校驗(yàn),減小程序的運(yùn)行負(fù)擔(dān)。

設(shè)置MSComm1.RThreshold:=7; 當(dāng)接收緩沖區(qū)內(nèi)的字節(jié)個(gè)數(shù)大于等于7個(gè)后就產(chǎn)生代碼為ComEvReceive的OnComm事件。只有查詢(xún)溫度的時(shí)歐陸3504返回的數(shù)據(jù)需要進(jìn)行,處理得出溫度值。其他數(shù)據(jù)只是為判斷歐陸3504是否得到數(shù)據(jù)。所以在查詢(xún)溫度時(shí)增加了一個(gè)標(biāo)志符號(hào)(ReadTsign)。標(biāo)志符號(hào)初始化為假,在查詢(xún)溫度時(shí)將其賦值為真。在OnComm事件中檢測(cè)ReadTsign,如果為真,將返回?cái)?shù)據(jù)的rbuf[3]和rbuf[4]進(jìn)行處理得到設(shè)備溫度的值,其他返回?cái)?shù)據(jù)不做處理。對(duì)于歐陸3504溫控儀返回的溫度是由雙色紅外測(cè)溫儀檢測(cè)出來(lái)返回給歐陸表的。雙色紅外測(cè)溫儀為高溫計(jì),檢測(cè)范圍為1000-3200。所以當(dāng)雙色紅外測(cè)溫儀檢測(cè)的溫度不在這個(gè)范圍時(shí)歐陸3504溫控儀返回的溫度始終為3314.0℃,恒定不變。

procedure TForm1.MSComm1Comm(Sender: TObject);

var

i: Integer;

begin

rbuf := MSComm1.Input;

sendstr:='';

if ReadTsign then

begin

ReadTsign:=False;//標(biāo)志賦值為假,等待下一次查詢(xún)

T:=(rbuf[3]*256+rbuf[4])/10;//輸出溫度為小點(diǎn)后一位T為Real類(lèi)型

sendstr:=FloatToStr(T) ;

Label1.Caption:= sendstr+'℃';//程序窗口顯示溫度

sendstr:='';

end;

end;

預(yù)設(shè)溫度值或者功率百分比輸入,需要先將要輸入的值擴(kuò)大10倍,因?yàn)檩斎氲臄?shù)據(jù)在歐陸3504中會(huì)自動(dòng)將最后一位設(shè)為小數(shù),所以要將要輸入的值增加10倍。而且需要判斷歐陸3504工作在Men模式還是Auto模式。因?yàn)椴坏珒蓚€(gè)要操作的地址不同,而且兩個(gè)模式下輸入值得范圍也不同。在Men模式下要輸入的值范圍為0-40,Auto模式下要輸入的值范圍為1000-2500,有效數(shù)字均為小數(shù)點(diǎn)后一位。在范圍外的值輸入時(shí),設(shè)備對(duì)于輸入的值是不予識(shí)別的。

要發(fā)送的數(shù)據(jù)選用了Edit控件的OnKeyDown事件,當(dāng)Enter按鍵按下時(shí)進(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按鍵按下時(shí)

begin

szData:=IntToHex(round(StrToFloat(Form1.SendData.Text)*10),4);//將Edit的內(nèi)容擴(kuò)大10倍四舍五入后//轉(zhuǎn)換為4位16進(jìn)制,來(lái)保證輸入框的數(shù)字與歐陸3504表要顯示的數(shù)字相同。

i:=1;

j:=0;

for j:=0 to 1 do

begin

if (i mod 2)=0 then //每2個(gè)字符放入一個(gè)字節(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); //命令號(hào) 預(yù)置單寄存器功能碼

sbuf[3]:=byte($00);

if commflg=true then//在A(yíng)uto模式下

begin

sbuf[4]:=byte($02);

end

else//在Man模式下

begin

sbuf[4]:=byte($03);

end;

sbuf[5]:=Data[0];

sbuf[6]:=Data[1]; //數(shù)據(jù)校驗(yàn)位

Res:= QhCRC16(sbuf,0,5);//CRC檢驗(yàn)

szData:=IntToHex(Res,4) ;

i:=1;

j:=0;

for j:=0 to 1 do

begin

if (i mod 2)=0 then //每2個(gè)字符放入一個(gè)字節(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ù)校驗(yàn)位//CRC高地位互換

sbuf[8]:=Data[0]; //數(shù)據(jù)校驗(yàn)位

sendcommend;

end;

end;

6 結(jié)束語(yǔ)

Modbus RTU協(xié)議在工業(yè)控制中應(yīng)用非常廣泛,其通信方式靈活多變,結(jié)構(gòu)簡(jiǎn)單,適用于小、中等規(guī)模的數(shù)據(jù)傳送,具有很強(qiáng)的兼容性。本文對(duì)于歐陸3504溫控儀表進(jìn)行了簡(jiǎn)單的介紹,對(duì)其通訊格式和通訊方法進(jìn)行了詳細(xì)的說(shuō)明。并利用了Delphi 2010作為開(kāi)發(fā)平臺(tái),通過(guò)Mscomm控件開(kāi)發(fā)了測(cè)試軟件實(shí)現(xiàn)了計(jì)算機(jī)對(duì)于歐陸3504的一些基本控制。在結(jié)合Modbus RTU協(xié)議通用條件下,通過(guò)使用本文方法就能夠?qū)τ跉W陸3504其他寄存器進(jìn)行的操作處理。

參考文獻(xiàn):

[1] 饒家庭. 歐陸3504溫控儀表RS232串口通訊編程[J].四川冶金, 2009(4): 54-57.

[2] 張曉龍, 劉英, 張盈, 等. 紅外雙色復(fù)合仿真系統(tǒng)測(cè)溫技術(shù)研究[J]. 光子學(xué)報(bào), 2012(2): 16-18.

[3] 李芳芳. 基于MODBUS協(xié)議的人機(jī)接口通信研究[D].西安: 長(zhǎng)安大學(xué), 2009.

[4] 藍(lán)波, 劉軍. 基于VB開(kāi)發(fā)串行通信程序[J]. 煤炭工程, 2013, 29(4): 183-190.

[5] 苑林, 李曉光, 張曉晨. 單片機(jī)串行通信中循環(huán)冗余校驗(yàn)碼的編碼設(shè)計(jì)[J]. 科技傳播, 2010(23): 225—226.

临洮县| 康保县| 桂东县| 邵阳市| 佛冈县| 革吉县| 周口市| 嘉峪关市| 长沙市| 天气| 连城县| 保靖县| 蒙自县| 车致| 二连浩特市| 任丘市| 无棣县| 邵阳县| 方城县| 滨州市| 西丰县| 尼勒克县| 白河县| 小金县| 石首市| 彰化县| 三门峡市| 麦盖提县| 林州市| 兰州市| 安远县| 波密县| 启东市| 芦山县| 收藏| 铁岭市| 莱西市| 剑川县| 北流市| 定结县| 内黄县|