李红飞 马俊 陈章龙
摘要:该文介绍了欧陆3504温控仪表基于Delphi平台的串口通讯设计,详细地介绍了欧陆3504的命令格式和基于Delphi的16位循环冗余算法。软件设计以Delphi 2010为开发平台,通过Mscomm控件实现了计算机对欧陆3504串口通信。功能包括读取双色红外线温度计测量的温度、欧陆3504的Auto和Man功能之间相互转换、预设的温度值和功率百分比输入。
关键词:欧陆3504温控仪;Delphi;Mscomm;CRC
中图分类号:TP311 文献标识码: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温控仪表是欧陆公司最新推出的高性能过程温度控制器,它融合了液晶显示及微处理器科技之优点,其以较高的控制精度和良好的适应能力,被广泛应用于各种温度控制过程[1]。温度计采用双色红外测温计,双色红外测温是利用邻近通道两个波段红外辐射能量的比值来决定温度的大小,能够消除水汽、灰尘、检测目标大小变化、部分被遮挡、发射率变化等的影响,即使检测信号衰减95%,也不会对测温结果有任何影响。独特的软件算法,可以克服氧化层的影响。软硬件设计,适用于几十万倍信号的处理,可以满足对仪器精度、重复性、等各方面的要求[2]。本文详细介绍了计算机与欧陆3504温控仪的通信过程,并开发了基于Delphi 2010的平台的通信测试软件。软件实现了实时温度采集、温度显示、欧陆3504温控仪的Auto模式和Man模式转换、以及温度或者功率百分比输入。为欧陆表3504温控仪开发过程提供了良好的方法。
2 通讯协议和通信控件
欧陆3504采用Modbus 通讯协议,在Modbus系统中有2种传输模式可选择,一种模式是ASCII(美国信息交换码),另一种模式是RTU(远程终端设备)。在同样的波特率下,RTU方式可比ASCII方式传送更多的数据[3]。欧陆3504温控仪采用的是RTU传输方式。
使用RTU模式,消息发送至少要以3.5个字符时间为停顿间隔开始。如果一个新消息在小于3.5个字符时间内开始,接收设备将认为是前一消息的延续,这将导致错误产生。RTU典型的消息帧如表1所示。
本软件在Delphi 2010开发平台中采用了Windows通信控件(Mscomm)实现与RS232的串口通信。Mscomm控件是与RS232兼容串行接口控件,欧陆3504温控仪采用485通讯接口,需要由485转232接口与计算机连接,在系统中选用了UPort 1610-8。UPort 1600系列产品可以让计算机可以通过USB ( 通用串行总线) 与8 个串口RS-232 或RS-232/422/ 485 的外设进行通信。在工控中作为扩展口非常实用。Mscomm控件的主要属性为[4]:
1) CommPort:设置和返回串行端口号,缺省为1。MSComm1.CommPort:=1;
2) Setting:设置或者返回串行的波特率、奇偶校验位、数据位数、停止位。
MSComm1.Settings:='19200,n,8,1'; 欧陆3504波特率采用的是19200而不是常用的9600。
3) InputMode:设置从接受缓冲区读取数据格式,有文本格式和二进制格式。
MSComm1.InputMode:=comInputModeBinary;//二进制模式
4) RThreshold:该属性为产生代码为ComEvReceive的OnComm事件的阈值。
MSComm1.RThreshold:=7;欧陆3504返回数据的主要用在对于温度的查询,所以就用温度最小返回的数据个数为阈值。
5) PortOpen:打开或关闭串行端口。MSComm1.PortOpen:=True;
对于Mscomm控件的其他属性在软件中采用了默认值,没有另行设置。
3 循环冗余校验(CRC)
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校驗码,而G(x)叫做这个CRC码的生成多项式[5]。
由表2可知欧陆3504发送数据总长度为64位(N),数据校验位为16位(R). 需要对48(K)位信息码进行校验function QhCRC16(AData:array of Byte):Word;本程序选用多项式G(x) =X16+X15+X2+1即const GENP=$A001;如发送数据定义为sbuf:array[1..8] of byte;对于数组前6位按照发送数据格式和要求填写,然后调用校验函数进行校验。因为函数返回数据类型为Word,应对返回数据进行数据分割校验高低位并转换为16进制。分别对sbuf[6], sbuf[7]赋值,然后调用MSComm1的Output函数进行发送。CRC校验函数如下。
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个字节的校验码
var
j:Integer;
begin
crc:=crc xor AByte; //将数据与CRC寄存器的低8位进行异或
for j:=0 to 7 do //对每一位进行校验
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; //将余数设定为FFFF
for i:=AStart to AEnd do //对每一个字节进行校验
CalOneByte(AData[i]); Result:=crc;
end;
4 功能码和寄存器地址
使用Modbus通讯协议,需要对Modbus功能码进行一定的了解。在本程序中主要用到功能码两个$03、$06。$03读取保持寄存器主要用于读取由双色红外线温度计传给欧陆3504温控仪的温度。$06预置单寄存器,主要用于对Auto(0)、Man(1)相互转换和温度或者功率百分比输入。
寄存器地址,对欧陆3504温控仪进行操作需要预先知道其各个寄存器的地址,比如要读取温度,需要知道存放温度的寄存器地址($01);对于查询寄存器地址可以用欧陆3504配套软件iTools Engineering Studio连接之后可以查询各个寄存器地址。再结合本软件的对于寄存器的操作方法,就可以实现对于欧陆3504的全部操作。
5 软件整体设计
在工业控制设备中串口一般是统一分配的,以便安装操作方便。所以在工业控制软件可以直接给Mscomm控件进行串口号赋值,但是需要先检测串口号是否存在。利用注册表(Registry),检测所有串口号,再用Pos函数检查是否有所需串口。避免串口不存在时发生的错误警告。也可以用ComboBox控件、Button控件和注册表组合使用。用注册表检测所有串口,赋值给ComboBox控件的Items属性。Button按钮作为连接按钮,同时也是设备开始按钮。本程序选用第二种方法,另加了一个刷新按钮,当串口改变时需重新刷新,对ComboBox重新赋值。软件流程图如图1。
在软件流程图中,设定的为检测到温度大于预定上限值时,由手动转换为自动模式。在手动模式中输出为功率百分比,在自动模式中输出的是预设温度。欧陆3504在自动模式下预设温度可以根据反馈信号自动调节输出功率百分比,这样使得对于温度的控制更加精确。本软件为测试软件事先添加了自动和手动按钮,以便模式的转换。由于温度是由双色红外线温度计传给欧陆3504,双色红外线温度计检测范围为1000-3200,所以之前的升温阶段只能输入功率百分比。设立温度上限,来保证当温度达到上限值时的自动转换。转换程序在Mscomm空间Oncomm事件中,将欧陆3504返回的温度数据转换十进制数后进行判断。为避免每次都进行同一种模式写入,可以加入两个标志位来保证在不同模式下才进行模式转换。
测试软件工作流程为先设置串口号,将ComboBox.Text删除COM之后的数字赋值给Mscomm控件作为串口号。因为欧陆3504波特率为19200,所以波特率在不选择的条件下将默认为19200,也可以对波特率改动进行验证,检测是否有数据返回。添加了两个Memo控件,一个是显示发送的数据,一个显示欧陆3504返回的数据。在面板中添加了Timer控件,Timer控件在检测到串口打开后,就会启动发送查询温度程序。Timer默认为1000ms发送一次。
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); //数据校验位
sbuf[8]:=byte($CA); //数据校验位
sendcommend; //发送数据给欧陆3504
ReadTsign:=True;//查询温度的标志当为真时对欧陆3504返回数据进行处理转换为温度
end;
在本程序中CRC算法程序的调用主要用于对功率百分比和预设温度值输入。对于Timer控件下的读取温度、手动和自动模式转换,因为要发送的数据固定不变或者频率较大,所以直接先算出该查询数据的CRC校验位进行赋值。避免每次发送都需要进行校验,减小程序的运行负担。
设置MSComm1.RThreshold:=7; 当接收缓冲区内的字节个数大于等于7个后就产生代码为ComEvReceive的OnComm事件。只有查询温度的时欧陆3504返回的数据需要进行,处理得出温度值。其他数据只是为判断欧陆3504是否得到数据。所以在查询温度时增加了一个标志符号(ReadTsign)。标志符号初始化为假,在查询温度时将其赋值为真。在OnComm事件中检测ReadTsign,如果为真,将返回数据的rbuf[3]和rbuf[4]进行处理得到设备温度的值,其他返回数据不做处理。对于欧陆3504温控仪返回的温度是由双色红外测温仪检测出来返回给欧陆表的。双色红外测温仪为高温计,检测范围为1000-3200。所以当双色红外测温仪检测的温度不在这个范围时欧陆3504温控仪返回的温度始终为3314.0℃,恒定不变。
procedure TForm1.MSComm1Comm(Sender: TObject);
var
i: Integer;
begin
rbuf := MSComm1.Input;
sendstr:='';
if ReadTsign then
begin
ReadTsign:=False;//标志赋值为假,等待下一次查询
T:=(rbuf[3]*256+rbuf[4])/10;//输出温度为小点后一位T为Real类型
sendstr:=FloatToStr(T) ;
Label1.Caption:= sendstr+'℃';//程序窗口显示温度
sendstr:='';
end;
end;
预设温度值或者功率百分比输入,需要先将要输入的值扩大10倍,因为输入的数据在欧陆3504中会自动将最后一位设为小数,所以要将要输入的值增加10倍。而且需要判断欧陆3504工作在Men模式还是Auto模式。因为不但两个要操作的地址不同,而且两个模式下输入值得范围也不同。在Men模式下要输入的值范围为0-40,Auto模式下要输入的值范围为1000-2500,有效数字均为小数点后一位。在范围外的值输入时,设备对于输入的值是不予识别的。
要发送的数据选用了Edit控件的OnKeyDown事件,当Enter按键按下时进行数据传送。
var
Data:array[0..255] of Byte;
i,j:Integer;
Res:Word;
TsData,szData:string;
begin
if Key=13 then //当Enter按键按下时
begin
szData:=IntToHex(round(StrToFloat(Form1.SendData.Text)*10),4);//将Edit的内容扩大10倍四舍五入后//转换为4位16进制,来保证输入框的数字与欧陆3504表要显示的数字相同。
i:=1;
j:=0;
for j:=0 to 1 do
begin
if (i mod 2)=0 then //每2个字符放入一个字节中
i:=i+1;
if i>=Length(szData) then
exit;
Data[j]:=StrToInt('$'+copy(szData,i,2)); //取出字符并转换为16进制数
i:=i+1;
end;
sbuf[1]:=byte($01); //帧头
sbuf[2]:=byte($06); //命令号 预置单寄存器功能码
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]; //數据校验位
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个字符放入一个字节中
i:=i+1;
if i>=Length(szData) then
exit;
Data[j]:=StrToInt('$'+copy(szData,i,2)); //取出字符并转换为16进制数
i:=i+1;
end;
sbuf[7]:=Data[1]; //数据校验位//CRC高地位互换
sbuf[8]:=Data[0]; //数据校验位
sendcommend;
end;
end;
6 结束语
Modbus RTU协议在工业控制中应用非常广泛,其通信方式灵活多变,结构简单,适用于小、中等规模的数据传送,具有很强的兼容性。本文对于欧陆3504温控仪表进行了简单的介绍,对其通讯格式和通讯方法进行了详细的说明。并利用了Delphi 2010作为开发平台,通过Mscomm控件开发了测试软件实现了计算机对于欧陆3504的一些基本控制。在结合Modbus RTU协议通用条件下,通过使用本文方法就能够对于欧陆3504其他寄存器进行的操作处理。
参考文献:
[1] 饶家庭. 欧陆3504温控仪表RS232串口通讯编程[J].四川冶金, 2009(4): 54-57.
[2] 張晓龙, 刘英, 张盈, 等. 红外双色复合仿真系统测温技术研究[J]. 光子学报, 2012(2): 16-18.
[3] 李芳芳. 基于MODBUS协议的人机接口通信研究[D].西安: 长安大学, 2009.
[4] 蓝波, 刘军. 基于VB开发串行通信程序[J]. 煤炭工程, 2013, 29(4): 183-190.
[5] 苑林, 李晓光, 张晓晨. 单片机串行通信中循环冗余校验码的编码设计[J]. 科技传播, 2010(23): 225—226.