📄 wenducaiji.pas
字号:
unit wenducaiji;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Buttons, Grids, DBGrids, ExtCtrls,
OleCtrls, MSCommLib_TLB,StrUtils,math, sgr_def, sgr_data;
type
Twdcj = class(TForm)
Panel1: TPanel;
DBGrid1: TDBGrid;
Panel2: TPanel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
CS_Edit: TEdit;
SpeedButton5: TSpeedButton;
DataSource1: TDataSource;
ADOConnectionwdcj: TADOConnection;
ADOQuerywdcj: TADOQuery;
Comm1: TMSComm;
Timer1: TTimer;
Label3: TLabel;
Edit2: TEdit;
Timer2: TTimer;
Label4: TLabel;
Edit3: TEdit;
Timer3: TTimer;
ADOQuerywdcj1: TADOQuery;
Memo1: TMemo;
sp_XYPlot1: Tsp_XYPlot;
sp_XYLine1: Tsp_XYLine;
Bevel1: TBevel;
Label5: TLabel;
Label6: TLabel;
procedure outhere;
procedure SpeedButton5Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Comm1Comm(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Timer3Timer(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
wdcj: Twdcj;
implementation
var
Datah, Datal:Byte;
runtime,m:integer;
x:integer;
{$R *.dfm}
function myround(const yuan: double;const pp: Integer):double;
//yuan:原浮点数,PP保留 小数点后第几位
var
p,l,m,l2:Longint;
s:string; // 原浮点数
sq:string; // 小数点前
sh:string;//小数点后
begin
if yuan=0 then exit;// 原浮点数 0
if pp<0 then exit; //非法小数点后第几位
s:=floattostr(yuan);
p:=pos('.',s); //小数点位置
sq:=midstr(s,1,p-1);
sh:=midstr(s,p+1,length(s)-length(sq)-1);
l:=length(sh);//小数位数
l2:=length(sq);//整数位数
if pp>=l then
begin//0
result:=strtofloat(s);
exit;//比如 11。06 要保留到 小数点后第3位显然 不合理
end;//
{ if pp=l then //比如 11。06 要保留到 小数点后第2位不用处理 直接返回
begin//1
Result:=s;
exit;
end;//1 }
if pp<l then //比如 11。06 要保留到 小数点后第1位 ,。。。
begin//2
m:=strtoint(sh[pp+1]);
if m>=5 then
begin
if pp>=1 then //保留到 小数点后第1,2。。。位
begin//3
sh:=midstr(sh,1,pp);
sh := inttostr(strtoint(sh)+1);
if length(sh)>pp then
begin
sh:= midstr(sh,2,pp);
sq:= inttostr(strtoint(sq)+1);
end;
Result:=strtofloat(sq+'.'+sh);
exit;
end//3
else //保留到 小数点后第0位
begin//4
sq[l2]:=chr(ord(sq[l2])+1);
Result:=strtofloat(sq);
exit;
end;//4
end
else
begin
if pp>=1 then //保留到 小数点后第1,2。。。位
begin//3
sh:=midstr(sh,1,pp);
Result:=strtofloat(sq+'.'+sh);
exit;
end//3
else //保留到 小数点后第0位
begin//4
Result:=strtofloat(sq);
exit;
end;//4
end;
end;//2
end;
procedure Twdcj.SpeedButton5Click(Sender: TObject);
begin
close;
end;
procedure Twdcj.SpeedButton1Click(Sender: TObject);
begin
If Comm1.PortOpen = True Then
showmessage('串口已打开,勿重复操作!')
Else
begin
Comm1.PortOpen := True ;
showmessage('串口已打开!');
Timer2.Enabled := False;
Timer1.Enabled:= True;
end;
end;
procedure Twdcj.SpeedButton4Click(Sender: TObject);
begin
If Comm1.PortOpen = False Then
showmessage('串口已关闭,勿重复操作!')
else
begin
Comm1.PortOpen := False;
showmessage('串口已关闭!');
Timer1.Enabled:= False;
end;
Timer2.Enabled:= True;
end;
procedure Twdcj.FormShow(Sender: TObject);
begin
m:=0;
ADOQuerywdcj.Close;
ADOQuerywdcj.SQL.Clear;
ADOQuerywdcj.SQL.Add('Select * from 采集表');
ADOQuerywdcj.Open;
DBGrid1.Fields[0].DisplayLabel:='编号';
DBGrid1.Fields[1].DisplayLabel:='时间';
DBGrid1.Fields[2].DisplayLabel:='温度';
DBGrid1.Fields[3].DisplayLabel:='温度单位';
DBGrid1.Fields[0].DisplayWidth:=10;
DBGrid1.Fields[1].DisplayWidth:=20;
DBGrid1.Fields[2].DisplayWidth:=18;
DBGrid1.Fields[3].DisplayWidth:=18;
If Comm1.PortOpen = True Then
showmessage('请关闭串口!');
Comm1.CommPort := 1; //设置串口1
Comm1.Settings := '9600,n,8,1' ; //波特率:9600 奇校验,8位数据,1位停止位
Comm1.InputLen := 6 ; //一次读取接收缓冲区的一个字符
Comm1.InputMode := comInputModeBinary; //设置位二进制格式
Comm1.InBufferSize := 4096; //设置接收缓冲区为256字节
Comm1.OutBufferSize := 4096; //设置发送缓冲区为256字节
Comm1.InBufferCount := 0 ; //清空输入缓冲区
Comm1.OutBufferCount := 0 ; //清空输出缓冲区
Comm1.SThreshold := 1 ; //发送缓冲区空触发发送事件
Comm1.RThreshold := 5 ; //每X个字符到接收缓冲区引起触发接收事件
Comm1.PortOpen := True ; //打开串口1
Edit1.Text:=inttostr(5);
CS_Edit.Text:=inttostr(5);
Comm1.PortOpen := False;
end;
procedure Twdcj.Comm1Comm(Sender: TObject);
var
temp:Byte;
DataFromCom:Integer ;//从串口读过来的实时值
DataFromComLast:Integer;//上次的串口值
TimeCount:Integer;
Inbyte:array of byte;
run_Time, set_Time:Longint;
cir,i,n,f:Integer;
flag : Boolean ;
begin
f:=0;
n:=10;
if Comm1.CommEvent=comEvReceive then //在CommEvent中接收数据
begin
Timer2.Enabled := False;
SetLength(Inbyte,n);
Inbyte:=Comm1.Input;
For i:= 1 To 4 do
begin
If (Inbyte[0]=$7E) And (Inbyte[1]=$7E) Then
begin
Datah := Inbyte[2] And 3;
Datal := Inbyte[3];
Outhere;
f:=1;
break;
end
Else
begin
temp:= Inbyte[0];
Inbyte[0]:= Inbyte[1];
Inbyte[1]:= Inbyte[2];
Inbyte[2]:= Inbyte[3];
Inbyte[3]:= temp;
end;
end;
if f=0 then
begin
showmessage('数据错误!');
end;
end;
end;
procedure Twdcj.Outhere;
var
temp_run :string;
t:string;
f,y:double;
begin
m:=m+1;
f:=myround(((Datah * 256 + Datal)*0.0625), 1);
t:=floattostr(myround(((Datah * 256 + Datal)*0.0625), 1)) + '℃';
edit2.Text:=t;
if m<=strtoint(CS_edit.Text) then
begin
with ADOQuerywdcj do
begin
close;
sql.clear;
sql.add('insert into 采集表(时间,温度,温度单位)'
+'values (:1,:2,:3)');
parameters.parambyname('1').value:=''+Edit3.Text+'';
parameters.parambyname('2').value:=f;
parameters.parambyname('3').value:='℃';
execsql;
end;
memo1.Lines.Add(edit3.Text+' '+floattostr(f)) ;
if f<30 then
begin
y:=f ;
sp_XYLine1.LineAttr.Width:=4;
sp_XYLine1.LineAttr.Color:=clgreen;
sp_XYLine1.InsertXY(0,x,y);
x:=x+1;
end
else
begin
y:=f ;
sp_XYLine1.LineAttr.Width:=4;
sp_XYLine1.LineAttr.Color:=clred;
sp_XYLine1.InsertXY(0,x,y);
x:=x+1;
end;
end
else
begin
Comm1.PortOpen:= False;
showmessage('已采集完温度,串口关闭!');
edit2.Text:='无法收到温度';
end;
end;
procedure Twdcj.Timer1Timer(Sender: TObject);
begin
runtime:=runtime+1;
if runtime=strtoint(Edit1.Text) then
begin
runtime:=0;
end;
end;
procedure Twdcj.Timer2Timer(Sender: TObject);
begin
Edit2.Text:='无法收到温度';
end;
procedure Twdcj.Timer3Timer(Sender: TObject);
begin
edit3.text:=datetimetostr(now);
end;
procedure Twdcj.SpeedButton2Click(Sender: TObject);
begin
with ADOQuerywdcj do
begin
Close;
SQL.Clear;
SQL.Add('delete from 采集表 where 1=1');
ExecSQL;
end;
end;
procedure Twdcj.SpeedButton3Click(Sender: TObject);
begin
Self.OnShow(Sender);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -