📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls, Buttons, ComCtrls,StrUtils,
IdTCPServer, IdComponent, IdTCPConnection, IdTCPClient, IdBaseComponent,
IdAntiFreezeBase, IdAntiFreeze,unit2,iniFiles, CheckLst, SocketProtocolServer, // FileCtrl,
ExtCtrls, jpeg;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQry: TADOQuery;
StatusBar: TStatusBar;
BitInt: TBitBtn;
BitFix: TBitBtn;
BitOver: TBitBtn;
Timer: TTimer;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ListData: TListBox;
ListSys: TListBox;
ListNet: TListBox;
GroupBox2: TGroupBox;
Label4: TLabel;
Label5: TLabel;
TLogin: TTimer;
OnLine: TListBox;
LeaveLine: TListBox;
GroupBox3: TGroupBox;
Label6: TLabel;
ImageOnLine: TImage;
ImageOffLine: TImage;
Label7: TLabel;
ImageDBOn: TImage;
ImageDBOff: TImage;
LogResOutTime: TTimer;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure BitFixClick(Sender: TObject);
procedure BitOverClick(Sender: TObject);
procedure BitIntClick(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure TLoginTimer(Sender: TObject);
procedure LogResOutTimeTimer(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
procedure LogMsg0(LogDesc: string; LogCode: Byte);
procedure LogMsg1(LogDesc: string; LogCode: Byte);
procedure LogMsg2(LogDesc: string; LogCode: Byte);
procedure LogMsg3(LogDesc: string; LogCode: Byte);
procedure OthersOnLine(Sender: TObject; Client: string);
procedure OthersOffLine(Sender: TObject; Client: string);
procedure LoginResult(Sender: TObject; Status: Boolean);
procedure WriteData(Sender: TObject; Src, Dst: string; Cmd, PkCnt, PkNO: Byte; PkData: array of Byte; PkDataLen: integer) ;
procedure REcQust();
public
end;
type
InfoRec=record //信息记录
ShName:string; //表名
str1:string;
str2:string;
str3:string;
str4:string;
str5:string;
str6:string;
str7:string;
str8:string;
str9:string;
str10:string;
str11:string;
end;
var
Form1: TForm1;
SPClient: TSocketProtocolServer;
qsrcAddr1,qsrcAddr2,qsrcAddr3,qsrcAddr4:string; //全局存放源地址 用来判断是不是统一机器给我发数据
qDatByte1: T1KBytesBuf; //用来组织记录数组
qDatByte2: T1KBytesBuf;
qDatByte3: T1KBytesBuf;
qDatByte4: T1KBytesBuf;
qDataLen1:integer; //用来存放数据记录字节数
qDataLen2:integer;
qDataLen3:integer;
qDataLen4:integer;
qFirstCl:Byte;
implementation
{$R *.dfm}
procedure WriteLog(s:string); //写日志表
var
time:string;
Day:string;
FileName:string;
Log:textfile;
begin
ShortDateFormat:='yyyymmdd';
time:=DateTimetostr((now()));
Day:=leftstr(time,8);
filename:=ExtractFilePath(paramstr(0))+'\log\Log'+Day+'.log';
try
AssignFile(Log,filename);
reset(Log);
append(Log);
writeln(Log,time+' '+s);
closeFile(Log);
except
;
end
end;
procedure CreateLog();
var fileName:string;
s:string;
Day:string;
Log:textfile;
begin
ShortDateFormat:='yyyymmdd';
s:=DateTimetostr((now()));
Day:=leftstr(s,8);
filename:=ExtractFilePath(paramstr(0))+'\log\Log'+Day+'.log';
if false=fileExists(filename) then
begin
AssignFile(Log,filename);
rewrite(Log);
closeFile(Log); //构建日志表
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer.Enabled:=true;
timer.Interval:=3600000; // 30000;
qsrcAddr1:='';
qsrcAddr2:=''; //地址字符串清零
qsrcAddr3:='';
qsrcAddr4:='';
qDataLen1:=0; //用来存放数据记录字节数
qDataLen2:=0;
qDataLen3:=0;
qDataLen4:=0;
CreateLog();
WriteLog('系统成功启动');
ListSys.Items.Add(datetimetostr(now())+' 系统成功启动');
end;
procedure TForm1.BitFixClick(Sender: TObject);
begin
FConfig.Show;
BitInt.Enabled:=true;
end;
procedure TForm1.BitOverClick(Sender: TObject);
var
s:string;
filename:string;
LvIni: TIniFile;
SoftName:string;
begin
ShortDateFormat:='yyyymmdd';
s:=Datetimetostr((now()));
filename:=ExtractFilePath(paramstr(0))+'\ini\myini.ini';
LVIni:=TInifile.create(filename);
SoftName:=LvIni.ReadString('DataGate', 'GDG','');
SPClient.ClientLogout(SoftName);
WriteLog(s+' 注销网络');
WriteLog(s+' 系统成功关闭');
Close;
end;
procedure TForm1.BitIntClick(Sender: TObject);
var
s:string;
LvIni: TIniFile;
Password,UserID,InitialCatalog,DataSource:string;
Day:string;
FileName:string;
counter:integer;
Addr,Port,SoftName:string;
begin
filename:=ExtractFilePath(paramstr(0))+'\ini\myini.ini';
LVIni:=TInifile.create(filename);
Addr:=LvIni.ReadString('DataGate', 'GIP','');
Port:=LvIni.ReadString('DataGate', 'GPort','');
SoftName:=LvIni.ReadString('DataGate', 'GDG','');
SPClient:= TSocketProtocolServer.Create(SoftName);
SPClient.FSPCOnLogLv0:= LogMsg0;
SPClient.FSPCOnLogLv1:= LogMsg1;
SPClient.FSPCOnLogLv2:= LogMsg2;
SPClient.FSPCOnLogLv3:= LogMsg3;
//SPClient.ClientLogin(SoftName);
SPClient.FSPCRspOnOthersOnLine:= OthersOnLine;
SPClient.FSPCRspOnOthersOffLine:= OthersOffLine;
SPClient.FSPCRspOnLogin:= LoginResult;
SPClient.FSPCRspOnTransData:= WriteData;
SPClient.OpenSocket(Addr,strtoint(Port));
ShortDateFormat:='yyyymmdd';
s:=Datetimetostr((now()));
Day:=leftstr(s,8);
BitInt.Enabled:=false;
ADOConnection1.Connected:=false;
filename:=ExtractFilePath(paramstr(0))+'\ini\myini.ini';
LVIni:=TInifile.create(filename);
InitialCatalog:=LvIni.ReadString('server', 'Initial Catalog','');
DataSource:=LvIni.ReadString('server', 'Data Source','');
UserID:=LvIni.ReadString('server', 'User ID','');
Password:=LvIni.ReadString('server', 'Password','');
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password='+Password+';Persist Security Info=True;User ID='+UserID+';Initial Catalog='+InitialCatalog+';Data Source='+DataSource;
try
ADOConnection1.Connected:=true;
ImageDBOn.Visible:=true;
ImageDBOff.Visible:=false;
ListSys.Items.Add(s+' 数据库初始化成功');
WriteLog('数据库初始化成功');
except
ImageDBOn.Visible:=false;
ImageDBOff.Visible:=true;
ListSys.Items.Add(s+' 数据库初始化失败');
filename:=ExtractFilePath(paramstr(0))+'Log'+Day+'.log';
WriteLog('数据库初始化失败')
end;
ADOqry.SQL.Clear;
ADOqry.SQL.Add('create table JFSH_VEH_BASICDATA(VIN varchar(30) PRIMARY KEY,');
ADOqry.SQL.Add('Trucktype varchar(30),Pdate datetime,EIN varchar(30),BOM varchar(30),');
ADOqry.SQL.Add('Manuinfor varchar(30))');
ADOqry.SQL.Add('create table JFSH_VEH_ETYPE(Trucktype varchar(30) PRIMARY KEY,');
ADOqry.SQL.Add('Pdate datetime,Enginetype varchar(30),ABSTYPE varchar(30),ECASTYPE');
ADOqry.SQL.Add('varchar(30),CANLINTYPE varchar(30))');
ADOqry.SQL.Add('create table JFSH_VEH_MOTOROLA(Trucktype varchar(30) PRIMARY KEY,');
ADOqry.SQL.Add('Cruise_Control_Enable varchar(30),');
ADOqry.SQL.Add('Max_Road_Speed_Trim varchar(30),LSI_Breakpoint_Speed varchar(30),');
ADOqry.SQL.Add('Rear_Axle_Ratio_Low varchar(30),Tire_Size_varcha varchar(30))');
ADOqry.SQL.Add('create table JFSH_VEH_ECAS(Trucktype varchar(30) PRIMARY KEY,');
ADOqry.SQL.Add('Scpzwjm varchar(30),content varchar(512))');
ADOqry.SQL.Add('create table JFSH_VEH_CANLIN(Trucktype varchar(30) PRIMARY KEY,');
ADOqry.SQL.Add('Jdpzwjm varchar(30),content varchar(512))');
ADOqry.SQL.Add('create table JFSH_ENG_BASICDATA (EIN varchar(30) PRIMARY KEY,') ;
ADOqry.SQL.Add('EMVN varchar(30),VTNO varchar(30),ECSID varchar(30),ECUID varchar(30),');
ADOqry.SQL.Add('ECUName varchar(30),PFName varchar(30),TCFName varchar(50),CrtDate datetime)');
ADOqry.SQL.Add('create table JFSH_ENG_ECSMap(ECSID varchar(30) PRIMARY KEY,');
ADOqry.SQL.Add('ECSTN varchar(30) Not Null)');
ADOqry.SQL.Add('create table JFSH_ENG_BOSCH498(EIN varchar(30) PRIMARY KEY,');
ADOqry.SQL.Add('FuelComp varchar(30))');
ADOqry.SQL.Add('create table JFSH_ENG_DEUTZ(EIN varchar(30) PRIMARY KEY,' );
ADOqry.SQL.Add('FuelComp varchar(30),OCAdjust varchar(30))');
ADOqry.SQL.Add('create table JFSH_ENG_MOTOROLA(EIN varchar(30) PRIMARY KEY,');
ADOqry.SQL.Add('FuelComp varchar(30),OCAdjust varchar(30))');
ADOqry.SQL.Add('create table JFSH_ENG_PFileMap(PFName varchar(30),PFileTableName varchar(30),');
ADOqry.SQL.Add('ECSID varchar(30),DriveFName varchar(255),DemDataFName varchar(255),');
ADOqry.SQL.Add('OriginPFName varchar(255),TCFName varchar(50),ECUManufacturer varchar(255),');
ADOqry.SQL.Add('SoftVersionNO varchar(30),CrtDate varchar(255),FileExplain varchar(255))');
ADOqry.SQL.Add('create table LogIndex(IndexName varchar(20) primary key)');
try
ADOqry.ExecSQL;
ListSys.Items.Add(s+' 数据表成功建立');
WriteLog('数据表成功建立')
except
ListSys.Items.Add(s+' 数据表已存在');
WriteLog('数据表已存在')
end;
//下面代码用来操作日志表 在软件故障时可能零点不会触发timmer 当程序再次打开时
// 在初始化中新建和删除日志,并对索引进行操作
FileName:='log'+Day;
ADOqry.SQL.Clear;
ADOqry.SQL.Add('insert LogIndex values ('''+FileName+''')');
try
ADOqry.ExecSQL;
ListSys.Items.Add(s+' 日志索引记录添加成功');
except
ListSys.Items.Add(s+' 日志索引记录已存在');
end;
ADOqry.SQL.Clear;
ADOqry.SQL.Add('select * from LogIndex');
ADOqry.Open;
counter:=ADOqry.RecordCount;
if counter>5 then
begin
ADOqry.SQL.Clear;
ADOqry.SQL.Add('select Top 1 IndexName from LogIndex Order By IndexName ASC');
ADOqry.Open;
s:=ADOqry.FieldByName('IndexName').AsString; //需要删除的日志索引文件名
ADOqry.SQL.Clear;
ADOqry.SQL.Add('delete from LogIndex where IndexName not in (select Top 5 IndexName from LogIndex Order By IndexName DESC)');
ADOqry.ExecSQL; //删除日志索引
end;
filename:=ExtractFilePath(paramstr(0))+'\log\'+s+'.log';
deletefile(FileName);
end;
procedure TForm1.TimerTimer(Sender: TObject);
var
s:string;
Day:string;
FileName:string;
counter:integer;
H,M,Se,Z : word;
begin
ShortDateFormat:='yyyymmdd';
s:=DateTimetostr((now()));
Day:=Datetostr((now()));
s:=rightstr(s,8);
DecodeTime(now(), H, M, Se, Z);
if H=22 then
begin
timer.Interval:=1800000; //最大值是22:59 时间间隔为30分
end;
if H=23 then
begin
timer.Interval:=600000; //最大值是23:29 时间间隔为10分
end;
if ( H=23) and (M>40) then
begin
timer.Interval:=60000; //最大值是23:59 时间间隔为1分
end;
if H=0 then //零点时刻到达
begin
timer.Interval:=3600000;// 零点过后 时间间隔为一小时
CreateLog();
ListSys.Clear;
ListData.Clear;
ListNet.Clear; //三个日志信息表清空
FileName:='log'+Day;
ADOqry.SQL.Clear;
ADOqry.SQL.Add('insert LogIndex values ('''+FileName+''')');
try
ADOqry.ExecSQL;
except
ListSys.Items.Add(s+' 日志记录已存在或数据库异常');
end;
ADOqry.SQL.Clear;
ADOqry.SQL.Add('select * from LogIndex');
ADOqry.Open;
counter:=ADOqry.RecordCount;
if counter>5 then
begin
ADOqry.SQL.Clear;
ADOqry.SQL.Add('select Top 1 IndexName from LogIndex Order By IndexName ASC');
ADOqry.Open;
s:=ADOqry.FieldByName('IndexName').AsString; //需要删除的日志索引文件名
showmessage(s);
ADOqry.SQL.Clear;
ADOqry.SQL.Add('delete from LogIndex where IndexName not in (select Top 5 IndexName from LogIndex Order By IndexName DESC)');
ADOqry.ExecSQL; //删除日志索引
end;
filename:=ExtractFilePath(paramstr(0))+'\log\'+s+'.log';
deletefile(FileName);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -