机器人技术——基于DELPHI的数据采集类上位机软件的编写
在机器人系统中往往会有大量的传感器连接到系统中来,在系统设计或者调试的过程中,经常需要采集各个传感器的数据进行分析,通常的做法是在PC端使用串口调试助手,将数据log下来然后再进行离线分析,但是,如果需要动态的实时采集各个传感器的数据并进行在线分析,串口调试助手就无能为力了,有人会说可以使用数据采集卡呀!好吧!我只能说你是土豪!另外并非所有的传感器信号都能使用模拟信号输出,数据采集卡的PC端软件也不是那么的灵活,本文将给大家讲讲如何使用DELPHI7,快速编写数据采集类上位机软件(别问博主为什么要使用老掉牙的DELPHI,而且还是n年前的版本7,我只想说博主我B格很高)。
先来看一张博主花了20分钟弄出来的一个demo,可以通过串口接收单片机传上来的传感器数据,并将数据分别保存到图片、TXT、EXCEL、数据库中:
如果你开始鄙视博主了,好吧,您可以离开了……
接下来我们来看这个demo是如何一步步做出来的:
1、 用到的控件
l 数据通信组件
编写数据采集上位机软件就得让上位机能否接收到下位机传输上来的数据,大家比较熟悉的接口就是串口,所以本文就使用串口连接上位机和下位机(电脑上没有串口的可以使用USB转串口,比较常用的有FT232、CP2102、PL2303等,FT232最稳定,但是比较贵,本文使用相对便宜和稳定的CP2102),DELPHI上比较常用的串口组件有spcomm和CPortv3.0,spcomm只能通过时间来区分不同数据包,在波特率比较高的时候非常的不方便,所以本文使用CPort,CPort可以设置数据头、数据尾、包长,而且这些是通过控件自己去处理,不需要编写任何代码,非常方便。
ComPort组件+ComDataPacket组件配合使用:
l 曲线绘制组件
本文使用DELPHI自带的chart组件,功能简单但是比较稳定,如果需要实现更强大的功能,推荐大家使用第三方组件TeeChart,功能非常丰富,另外推荐一本关于TeeChart的参考书:屈景辉著的《TeeChart应用技术详解—快速图标制作工具》。
l 按钮组件
l Edit组件
l OpenDialog组件
l 数据库组件
l 放置好组件的界面如下:
2、 控件设置及代码编写
l 数据通信组件
ComDataPacket组件的ComPort属性设置成ComPort1,这样ComPort组件与ComDataPacket就建立了链接。
假设单片机上传上来的数据格式是:
设置ComDataPacket以下属性:
在“打开串口”Button中添加如下代码:
ComPort1.ShowSetupDialog;
form1.ComPort1.Open;
if form1.ComPort1.Connected = true then
begin
form1.Shape1.Brush.Color:=clgreen;
end;
这样在程序运行时,鼠标单击“打开串口”Button时就会以下对话框,就可以完成对串口的设置:
l 曲线绘制组件
双击Chart组件,添加5条曲线sensor1- sensor5:
l 数据库组件
双击控件,在弹出的对话框中选择Jet 4.0 OLE,点击下一步,在Build中选择要保存的数据库文件(此处只支持Microsoft Access2007),点击OK,在弹出的对话框中点击测试连接,当出现测试连接成功的时候表明数据库连接成功。
将控件的Connection属性设置为ADOConnection,这样与就建立了连接,方便通过ADO组件对数据库进行“增加”、“删减”等操作。
l 保存为图片
在保存按钮中添加如下代码,即可将波形截图,并保存为.bmp文件:
form1.Chart1.SaveToBitmapFile(form1.Edit1.Text);
l 保存到TXT
AssignFile(F, form1.Edit3.Text);
Append(F);
Writeln(F, data) ;
Closefile(F) ;
l 保存到EXCEL
ExcelApp := CreateOleObject('Excel.Application' );
ExcelApp.WorkBooks.Open(form1.Edit3.Text);
ExcelApp.workbooks[1].sheets[1].name:='数据采集demo';
ExcelApp.workbooks[1].sheets[1].CELLS[1,2]:='DATA';
ExcelApp.workbooks[1].sheets[1].CELLS[1,3]:='TIME';
ExcelApp.workbooks[1].sheets[1].CELLS[1,4]:='sensor1';
ExcelApp.workbooks[1].sheets[1].CELLS[1,5]:='sensor2';
ExcelApp.workbooks[1].sheets[1].CELLS[1,6]:='sensor3';
ExcelApp.workbooks[1].sheets[1].CELLS[1,7]:='sensor4';
ExcelApp.workbooks[1].sheets[1].CELLS[1,8]:='sensor5';
ExcelApp.ActiveSheet.Rows[2].Insert ;
ExcelApp.workbooks[1].sheets[1].CELLS[2,2]:=datetostr(now);
ExcelApp.workbooks[1].sheets[1].CELLS[2,3]:=timetostr(now);
ExcelApp.workbooks[1].sheets[1].CELLS[2,4]:=sensor1;
ExcelApp.workbooks[1].sheets[1].CELLS[2,5]:=sensor2;
ExcelApp.workbooks[1].sheets[1].CELLS[2,6]:=sensor3;
ExcelApp.workbooks[1].sheets[1].CELLS[2,7]:=sensor4;
ExcelApp.workbooks[1].sheets[1].CELLS[2,8]:=sensor5;
ExcelApp.workbooks[1].SAVE;
ExcelApp.QUIT;
l 绘制曲线
form1.Series1.Add(sensor1);
form1.Series2.Add(sensor2);
form1.Series3.Add(sensor3);
form1.Series4.Add(sensor4);
form1.Series5.Add(sensor5);
l 完整串口中断函数
在ComDataPacket控件的OnPacketEvents中添加如下代码:
procedureTForm1.ComDataPacket1Packet(Sender: TObject; const Str: String);
var
a:byte;
rev:array[1..25]ofuchar;
DateTime:TDateTime;
F:Textfile;
sensor1,sensor2,sensor3,sensor4,sensor5:integer;
ExcelApp:Variant;
begin
move(Str[1],rev,20);
sensor1:=rev[3]*256+rev[4];//在这里只取了16位有效数据,如果想传输浮点数需要4个字节,读者可以思考一下处理的方法
sensor2:=rev[7]*256+rev[8];
sensor3:=rev[11]*256+rev[12];
sensor4:=rev[15]*256+rev[16];
sensor5:=rev[19]*256+rev[20];
form1.Series1.Add(sensor1);
form1.Series2.Add(sensor2);
form1.Series3.Add(sensor3);
form1.Series4.Add(sensor4);
form1.Series5.Add(sensor5);
ExcelApp := CreateOleObject('Excel.Application' );
ExcelApp.WorkBooks.Open(form1.Edit3.Text);
ExcelApp.workbooks[1].sheets[1].name:='数据采集demo';
ExcelApp.workbooks[1].sheets[1].CELLS[1,2]:='DATA';
ExcelApp.workbooks[1].sheets[1].CELLS[1,3]:='TIME';
ExcelApp.workbooks[1].sheets[1].CELLS[1,4]:='sensor1';
ExcelApp.workbooks[1].sheets[1].CELLS[1,5]:='sensor2';
ExcelApp.workbooks[1].sheets[1].CELLS[1,6]:='sensor3';
ExcelApp.workbooks[1].sheets[1].CELLS[1,7]:='sensor4';
ExcelApp.workbooks[1].sheets[1].CELLS[1,8]:='sensor5';
ExcelApp.ActiveSheet.Rows[2].Insert ;
ExcelApp.workbooks[1].sheets[1].CELLS[2,2]:=datetostr(now);
ExcelApp.workbooks[1].sheets[1].CELLS[2,3]:=timetostr(now);
ExcelApp.workbooks[1].sheets[1].CELLS[2,4]:=sensor1;
ExcelApp.workbooks[1].sheets[1].CELLS[2,5]:=sensor2;
ExcelApp.workbooks[1].sheets[1].CELLS[2,6]:=sensor3;
ExcelApp.workbooks[1].sheets[1].CELLS[2,7]:=sensor4;
ExcelApp.workbooks[1].sheets[1].CELLS[2,8]:=sensor5;
ExcelApp.workbooks[1].SAVE;
ExcelApp.QUIT;
AssignFile(F, form1.Edit3.Text);
Append(F);
Writeln(F, data) ;
Closefile(F) ;
end;
6、总结
本文介绍了一下如何用DELPHI编写数据采集类上位机软件,当然写的比较简单,也比较啰嗦,仅仅适合硬件工程师为了工作方便而编写的工具类软件,也想强调一下,作为硬件工程师如果能够掌握一种上位机编程语言会让工作得到事半功倍的效果,也是一个机器人设计工作者处理各种传感器数据时需要用到的必备技能。