unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, RzPanel, RzBorder, RzBckgnd, RzSplit, Menus,
Grids, ImgList, ComCtrls, RzListVw, DB, DBTables, RzCommon, RzLabel, mmsystem,
RzTabs, TeeProcs, TeEngine, Chart, DBChart, Series, RzButton, Buttons,
TeeEdit, Mask, RzEdit, RzRadChk, RzDTP, RzRadGrp, DBGrids, frxClass,
frxCross, TeeTools, ScktComp;
const
//xxxRef_Max=10; //количество холодильников
Ref_Max=12; //количество холодильников
TemperTableName='temper.db';
DoorTableName='door.db';
TimerTableName='timer.db';
type
TMainForm = class(TForm)
RzPanel2: TRzPanel;
RzSizePanel1: TRzSizePanel;
ReportList: TRzListView;
ReportImageList: TImageList;
CreateQuery: TQuery;
RegIniFile: TRzRegIniFile;
TempTimer: TTimer;
DoorTimer: TTimer;
InsertTempQuery: TQuery;
RzLabel1: TRzLabel;
InsertDoorQuery: TQuery;
RzPageControl1: TRzPageControl;
TabSheet1: TRzTabSheet;
TabSheet2: TRzTabSheet;
RzPanel1: TRzPanel;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Image4: TImage;
Image5: TImage;
Image6: TImage;
Image7: TImage;
Image8: TImage;
Image9: TImage;
Image10: TImage;
Image11: TImage;
Image12: TImage;
Image13: TImage;
Image14: TImage;
Image15: TImage;
Image16: TImage;
Image17: TImage;
Image18: TImage;
Image19: TImage;
Image20: TImage;
PageImageList: TImageList;
Chart1: TChart;
Series1: TLineSeries;
Series3: TLineSeries;
Series4: TLineSeries;
Series5: TLineSeries;
Series6: TLineSeries;
Series7: TLineSeries;
Series8: TLineSeries;
Series9: TLineSeries;
Series10: TLineSeries;
Series2: TLineSeries;
RzPanel3: TRzPanel;
RzSeparator1: TRzSeparator;
TabSheet3: TRzTabSheet;
Chart2: TChart;
LineSeries1: TLineSeries;
LineSeries2: TLineSeries;
LineSeries3: TLineSeries;
LineSeries4: TLineSeries;
LineSeries5: TLineSeries;
LineSeries6: TLineSeries;
LineSeries7: TLineSeries;
LineSeries8: TLineSeries;
LineSeries9: TLineSeries;
LineSeries10: TLineSeries;
RzPanel4: TRzPanel;
RzSeparator2: TRzSeparator;
rbNow: TRzRadioButton;
rbFromTo: TRzRadioButton;
tpFrom: TRzDateTimePicker;
RzLabel2: TRzLabel;
tpTo: TRzDateTimePicker;
rbNow1: TRzRadioButton;
tpFrom1: TRzDateTimePicker;
tpTo1: TRzDateTimePicker;
rbFromTo1: TRzRadioButton;
RzLabel3: TRzLabel;
Image21: TImage;
Image22: TImage;
Image23: TImage;
Image24: TImage;
btPrintChart1: TRzButton;
ChartPreviewer1: TChartPreviewer;
RzButton1: TRzButton;
ChartPreviewer2: TChartPreviewer;
ControlTimer: TTimer;
Image25: TImage;
cbSound: TRzCheckBox;
Image26: TImage;
btReset: TRzButton;
RzPanel5: TRzPanel;
RzToolbarButton1: TRzToolbarButton;
frxCrossObject1: TfrxCrossObject;
RzButton2: TRzButton;
frxReport1: TfrxReport;
Image27: TImage;
RzLabel4: TRzLabel;
edStartShift: TRzDateTimeEdit;
ChartTool1: TMarksTipTool;
ChartTool2: TMarksTipTool;
Query: TQuery;
Server: TServerSocket;
Image28: TImage;
Image29: TImage;
Image30: TImage;
Image31: TImage;
Series11: TLineSeries;
Series12: TLineSeries;
LineSeries11: TLineSeries;
LineSeries12: TLineSeries;
procedure DoorTimerTimer(Sender: TObject);
procedure TempTimerTimer(Sender: TObject);
procedure RzSizePanel1HotSpotClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormActivate(Sender: TObject);
procedure Program_Initialization;
procedure Log(Index:integer; Text:string);
procedure RefDraw;
procedure DeleteRecords;
procedure UpdateRecords;
procedure FillChart;
procedure rbNowClick(Sender: TObject);
procedure rbFromToClick(Sender: TObject);
procedure tpFromChange(Sender: TObject);
procedure rbNow1Click(Sender: TObject);
procedure rbFromTo1Click(Sender: TObject);
procedure tpFrom1Change(Sender: TObject);
procedure btPrintChart1Click(Sender: TObject);
procedure RzButton1Click(Sender: TObject);
procedure btResetClick(Sender: TObject);
procedure ControlTimerTimer(Sender: TObject);
procedure cbSoundClick(Sender: TObject);
procedure RzPageControl1TabClick(Sender: TObject);
procedure edStartShiftDateTimeChange(Sender: TObject;
DateTime: TDateTime);
procedure RzToolbarButton1Click(Sender: TObject);
procedure RzButton2Click(Sender: TObject);
procedure frxReport1BeforePrint(c: TfrxReportComponent);
procedure ServerClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Process_Message(var S: AnsiString; var Socket: TCustomWinSocket);
procedure SendDoor(fromdate,todate:string; var Socket: TCustomWinSocket);
procedure SendTemp(fromdate,todate:string; var Socket: TCustomWinSocket);
procedure SendTimer(fromdate,todate:string; var Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
Refrigerator=record //запись для отображения состояния холодильника
State:integer;
Image:TImage;
Timer:TTime;
Temp:Real;
TimerAdd:integer;
TempAdd:Integer
end;
var
MainForm: TMainForm;
Exe_Path:string; //путь к директории исполняемого файла
Log_File:TextFile;
Top_R, Door_Open, Door_Close:TImage; //составные изображения холодильника
Ref:array[1..Ref_Max] of Refrigerator; //массив холодильников
TemperTable, //таблица для хранения температур
DoorTable:TTable; //таблица для хранения положения дверей
//xxxTempLED, TimerLED:array[1..10] of TRzLabel;
TempLED, TimerLED:array[1..Ref_Max] of TRzLabel;
TemperCount, DoorCount, TimerCount:integer;
DoorThreshold:Integer;
COMNumber, COMSpeed: integer;
Simulate:boolean;
Port:integer;
DBVersion:integer;
implementation
type
TProcOpenPort=function (n,speed,part,bits,stop,vid:DWORD):integer;stdcall;
TProcClosePort=function :integer;stdcall;
TProcReadIEEE32=function (adr,adr_type:DWORD;command:pchar;var val:single;var tm:integer;index:integer):integer;stdcall;
TProcLastErrToStr=procedure (res:pchar);stdcall;
var
OpenPort:TProcOpenPort;
ClosePort:TProcClosePort;
ReadIEEE32:TProcReadIEEE32;
LastErrToStr:TProcLastErrToStr;
hLibInst:cardinal;
{$R *.dfm}
function InitLib:boolean;
begin
hLibInst:=LoadLibrary('owen_io.dll');
if(hLibInst=INVALID_HANDLE_VALUE) then begin result:=false;exit;end;
OpenPort:=GetProcAddress(hLibInst,'OpenPort');
if(not Assigned(OpenPort)) then begin result:=false;exit;end;
ClosePort:=GetProcAddress(hLibInst,'ClosePort');
if(not Assigned(ClosePort)) then begin result:=false;exit;end;
ReadIEEE32:=GetProcAddress(hLibInst,'ReadIEEE32');
if(not Assigned(ReadIEEE32)) then begin result:=false;exit;end;
LastErrToStr:=GetProcAddress(hLibInst,'LastErrToStr');
if(not Assigned(LastErrToStr)) then begin result:=false;exit;end;
result:=true;
end;
procedure FreeLib;
begin
FreeLibrary(hLibInst);
end;
procedure TMainForm.FillChart;
var
Table:TTable;
i:integer;
begin
//xxxFor I := 0 To 9
For I := 0 To Ref_Max-1
Do // Iterate
Begin
Chart1.Series[i].Clear;
Chart2.Series[i].Clear;
End; // for
Table:=TTable.Create(self);
Table.DatabaseName:=Exe_Path+'Data';
Table.TableName:=TemperTableName;
Table.Open;
Table.First;
while not Table.Eof do
begin
If Table.FieldByName('Val').AsFloat<>-274 Then
Chart1.Series[Table.FieldByName('Sensor').AsInteger-1].AddXY(Table.FieldByName('DateTime').AsDateTime,Table.FieldByName('Val').AsFloat)
else
begin
Chart1.Series[Table.FieldByName('Sensor').AsInteger-1].AddXY(Table.FieldByName('DateTime').AsDateTime,Chart1.Series[Table.FieldByName('Sensor').AsInteger-1].MaxYValue);
Chart1.Series[Table.FieldByName('Sensor').AsInteger-1].SetNull(Chart1.Series[Table.FieldByName('Sensor').AsInteger-1].Count-1);
end;
Table.Next;
end;
Table.Close;
Table.TableName:=DoorTableName;
Table.Open;
Table.First;
While not Table.Eof
Do
Begin
If Table.FieldByName('Val').AsInteger<>-1 Then
Chart2.Series[Table.FieldByName('Sensor').AsInteger-1].AddXY(Table.FieldByName('DateTime').AsDateTime,Table.FieldByName('Val').AsInteger)
else
begin
Chart2.Series[Table.FieldByName('Sensor').AsInteger-1].AddXY(Table.FieldByName('DateTime').AsDateTime,0);
Chart2.Series[Table.FieldByName('Sensor').AsInteger-1].SetNull(Chart2.Series[Table.FieldByName('Sensor').AsInteger-1].Count-1);
end;
Table.Next;
End; // while
Table.Close;
Table.Free;
end;
procedure TMainForm.UpdateRecords;
var
counter:integer;
Table:TTable;
begin
Counter:=0;
Table:=TTable.Create(nil);
Table.DatabaseName:=Exe_Path+'Data';
Table.TableName:='temper.db';
Table.Open;
Table.First;
While not Table.Eof
Do
Begin
inc(Counter);
Table.Edit;
Table.FieldByName('Id').AsInteger:=Counter;
Table.Post;
Table.Next
End; // while
Table.Close;
TemperCount:=Counter;
Counter:=0;
Table.DatabaseName:=Exe_Path+'Data';
Table.TableName:='door.db';
Table.Open;
Table.First;
While not Table.Eof
Do
Begin
inc(Counter);
Table.Edit;
Table.FieldByName('Id').AsInteger:=Counter;
Table.Post;
Table.Next
End; // while
Table.Close;
DoorCount:=Counter;
Counter:=0;
Table.DatabaseName:=Exe_Path+'Data';
Table.TableName:='timer.db';
Table.Open;
Table.First;
While not Table.Eof
Do
Begin
inc(Counter);
Table.Edit;
Table.FieldByName('Id').AsInteger:=Counter;
Table.Post;
Table.Next
End; // while
Table.Close;
TimerCount:=Counter;
Table.Free;
end;
procedure TMainForm.DeleteRecords;
var
DeleteQuery:TQuery;
begin
DeleteQuery:=TQuery.Create(nil);
DeleteQuery.DatabaseName:=Exe_Path+'Data';
DeleteQuery.Active:=False;
DeleteQuery.SQL.Clear;
DeleteQuery.SQL.Text:='delete from "temper.db" where ("'+DateTimeToStr(Now)+'"-DateTime)>90';
DeleteQuery.ExecSQL;
DeleteQuery.Active:=False;
DeleteQuery.SQL.Clear;
DeleteQuery.SQL.Text:='delete from "door.db" where ("'+DateTimeToStr(Now)+'"-DateTime)>90';
DeleteQuery.ExecSQL;
DeleteQuery.Active:=False;
DeleteQuery.SQL.Clear;
DeleteQuery.SQL.Text:='delete from "timer.db" where ("'+DateToStr(Date)+'"-Data)>90';
DeleteQuery.ExecSQL;
DeleteQuery.Free;
end;
procedure TMainForm.RefDraw; //процедура прорисовки холодильников
var i,LeftT,TopT,OldBkMode:integer;
Im:TImage;
begin
Im:=TImage.Create(nil);
for i:=1 to Ref_Max do
begin
if Ref[i].State=1 then
begin
Im.Picture.Bitmap:=Door_Open.Picture.Bitmap;
Im.Picture.Bitmap.Canvas.Font.Size:=30;
Im.Picture.Bitmap.Canvas.Font.Style:=[fsBold];
Im.Picture.Bitmap.Canvas.Font.Name:='Arial';
Im.Picture.Bitmap.Canvas.Font.Color := $00EFECE9;
TopT:=10+40-trunc(Im.Picture.Bitmap.Canvas.TextHeight(IntToStr(i))/2)+10;
LeftT:=90+40-trunc(Im.Picture.Bitmap.Canvas.TextWidth(IntToStr(i))/2);
OldBkMode := SetBkMode(Im.Picture.Bitmap.Canvas.Handle, TRANSPARENT);
Im.Picture.Bitmap.Canvas.TextOut(LeftT,TopT,IntToStr(i));
SetBkMode(Im.Picture.Bitmap.Canvas.Handle, OldBkMode);
Ref[i].Image.Picture.Bitmap:=Im.Picture.Bitmap;
end
else
begin
Im.Picture.Bitmap:=Door_Close.Picture.Bitmap;
Im.Picture.Bitmap.Canvas.Font.Size:=30;
Im.Picture.Bitmap.Canvas.Font.Style:=[fsBold];
Im.Picture.Bitmap.Canvas.Font.Name:='Arial';
Im.Picture.Bitmap.Canvas.Font.Color := $00EFECE9;
TopT:=10+40-trunc(Im.Picture.Bitmap.Canvas.TextHeight(IntToStr(i))/2)+10;
LeftT:=20+40-trunc(Im.Picture.Bitmap.Canvas.TextWidth(IntToStr(i))/2);
OldBkMode := SetBkMode(Im.Picture.Bitmap.Canvas.Handle, TRANSPARENT);
Im.Picture.Bitmap.Canvas.TextOut(LeftT,TopT,IntToStr(i));
SetBkMode(Im.Picture.Bitmap.Canvas.Handle, OldBkMode);
Ref[i].Image.Picture.Bitmap:=Im.Picture.Bitmap;
end;
end;
Im.Free;
end;
procedure TMainForm.Log(Index:integer; Text:string);
begin
//записываем лог в файл
WriteLn(Log_File,'['+DateTimeToStr(Now)+'] '+Text);
Flush(Log_File);
//Добавляем строку в репорт
ReportList.Items.Add;
ReportList.Items[ReportList.Items.Count-1].ImageIndex:=Index;
ReportList.Items[ReportList.Items.Count-1].SubItems.Add(DateTimeToStr(Now));
ReportList.Items[ReportList.Items.Count-1].SubItems.Add(Text);
SendMessage(ReportList.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
end;
procedure TMainForm.Program_Initialization; //процедура инициализации программы
var i:integer;
Table:TTable;
Data:TDate;
begin
MainForm.WindowState:=wsMaximized;
//======определяем путь к директории исполняемого файла
Exe_Path:=ExtractFilePath(Paramstr(0));
//======начинаем создавать log-файл
AssignFile(Log_File,Exe_Path+'Log\'+DateToStr(Date)+'.log');
//Проверяем есть ли log-файл текущего дня
If not(FileExists(Exe_Path+'Log\'+DateToStr(Date)+'.log')) then Rewrite(Log_File)
else Append(Log_File);
MainForm.Log(2,'======Запуск программы======');
//======Читаем ini-файл
RegIniFile.Path:=Exe_Path+'Ref_Mon.ini';
if not RegIniFile.ValueExists('Sensors','TempInterval') then RegIniFile.WriteInteger('Sensors','TempInterval',30000);
if not RegIniFile.ValueExists('Sensors','DoorInterval') then RegIniFile.WriteInteger('Sensors','DoorInterval',5000);
If not RegIniFile.ValueExists('Sensors','DoorThreshold') then RegIniFile.WriteInteger('Sensors','DoorThreshold',5);
DoorThreshold:=RegIniFile.ReadInteger('Sensors','DoorThreshold',5);
//Применяем значения к форме
if not RegIniFile.ReadBool('Form','HotSpotClosed',false) then RZSizePanel1.RestoreHotSpot else RZSizePanel1.CloseHotSpot;
If not RegIniFile.ReadBool('Form','EnableSound',True) then cbSound.Checked:=False else cbSound.Checked:=True;
RzPageControl1.ActivePageIndex:=RegIniFile.ReadInteger('Form','ActivePage',0);
edStartShift.Time:=RegIniFile.ReadTime('Form','StartShift',StrToTime('08:00:00'));
//Проверяем верисю БД
if not RegIniFile.ValueExists('DB','Version') then RegIniFile.WriteInteger('DB','Version',1);
DBVersion := RegIniFile.ReadInteger('DB','Version',1);
//======Загружаем ресурсы
Log(1,'Загружаем ресурсы...');
//Выделяем пямять
Top_R:=TImage.Create(self);
Door_Open:=TImage.Create(self);
Door_Close:=TImage.Create(self);
//Загружаем битмапы
try
Top_R.Picture.LoadFromFile(Exe_Path+'Images\Top.bmp');
except
Application.MessageBox('Невозможно загрузить файл ..\Images\Top.bmp'+#13#13+'Программа будет остановлена!','Ошибка!',MB_OK);
Log(0,'Невозможно загрузить файл ..\Images\Top.bmp. Программа будет остановлена!');
MainForm.Close;
end;
try
Door_Open.Picture.LoadFromFile(Exe_Path+'Images\Door_Open.bmp');
except
Application.MessageBox('Невозможно загрузить файл ..\Images\Door_Open.bmp'+#13#13+'Программа будет остановлена!','Ошибка!',MB_OK);
Log(0,'Невозможно загрузить файл ..\Images\Door_Open.bmp. Программа будет остановлена!');
MainForm.Close;
end;
try
Door_Close.Picture.LoadFromFile(Exe_Path+'Images\Door_Close.bmp');
except
Application.MessageBox('Невозможно загрузить файл ..\Images\Door_Close.bmp'+#13#13+'Программа будет остановлена!','Ошибка!',MB_OK);
Log(0,'Невозможно загрузить файл ..\Images\Door_Close.bmp. Программа будет остановлена!');
MainForm.Close;
end;
Log(1,'Ресурсы успешно загружены');
//======Начальное состояние холодильников
//xxxfor i:=1 to Ref_Max do
for i:=1 to Ref_Max-2 do
begin
Ref[i].State:=0;
Ref[i].Image:=Findcomponent('Image'+IntToStr(i)) as TImage;
(Findcomponent('Image'+IntToStr(i+10)) as TImage).Picture.Bitmap:=Top_R.Picture.Bitmap;
end;
//xxx
Ref[11].State:=0;
Ref[11].Image:=Image28;
Image29.Picture.Bitmap:=Top_R.Picture.Bitmap;
Ref[12].State:=0;
Ref[12].Image:=Image30;
Image31.Picture.Bitmap:=Top_R.Picture.Bitmap;
//xxx
//Раздаем адреса каналов
Ref[1].TempAdd:=8;
Ref[1].TimerAdd:=16;
Ref[2].TempAdd:=9;
Ref[2].TimerAdd:=17;
Ref[3].TempAdd:=10;
Ref[3].TimerAdd:=18;
Ref[4].TempAdd:=11;
Ref[4].TimerAdd:=19;
Ref[5].TempAdd:=0;
Ref[5].TimerAdd:=4;
Ref[6].TempAdd:=1;
Ref[6].TimerAdd:=5;
Ref[7].TempAdd:=2;
Ref[7].TimerAdd:=6;
Ref[8].TempAdd:=3;
Ref[8].TimerAdd:=7;
Ref[9].TempAdd:=12;
Ref[9].TimerAdd:=21;
Ref[10].TempAdd:=13;
Ref[10].TimerAdd:=20;
Ref[11].TempAdd:=4*8+1-1;
Ref[11].TimerAdd:=4*8+2-1;
Ref[12].TempAdd:=4*8+3-1;
Ref[12].TimerAdd:=4*8+4-1;
//Рисуем холодильники
RefDraw;
//Размещаем LED
for i:=1 to Ref_Max do
begin
TempLED[i]:=TRzLabel.Create(self);
TempLED[i].Parent:=RzPanel1;
TempLED[i].AutoSize:=False;
TempLED[i].Alignment:=taCenter;
TempLED[i].Layout:=tlCenter;
TempLED[i].Transparent:=True;
TempLED[i].Font.Size:=16;
TempLED[i].Font.Color:=clWhite;
TempLED[i].Font.Style:=[fsItalic];
TempLED[i].Font.Name:='Trebuchet MS';
TempLED[i].Width:=105;
TempLED[i].Height:=35;
TempLED[i].Top:=Ref[i].Image.Top-40;
TempLED[i].Left:=Ref[i].Image.Left+85;
TimerLED[i]:=TRzLabel.Create(self);
TimerLED[i].Parent:=RZPanel1;
TimerLED[i].AutoSize:=False;
TimerLED[i].Alignment:=taCenter;
TimerLED[i].Layout:=tlCenter;
TimerLED[i].Transparent:=True;
TimerLED[i].Font.Size:=16;
TimerLED[i].Font.Color:=clWhite;
TimerLED[i].Font.Style:=[fsItalic];
TimerLED[i].Font.Name:='Trebuchet MS';
TimerLED[i].Width:=65;
TimerLED[i].Height:=35;
TimerLED[i].Top:=Ref[i].Image.Top-40;
TimerLED[i].Left:=Ref[i].Image.Left+10;
end;
//======Проверяем базу данных
Log(1,'Проверяем БД');
CreateQuery.DatabaseName:=Exe_Path+'Data\';
if not FileExists(Exe_Path+'Data\'+TemperTableName) then
begin
Log(0,'Не найдена таблица температур! Будет создана новая таблица.');
Log(1,'Создаем таблицу температур...');
CreateQuery.Active:=False;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('CREATE TABLE "'+TemperTableName+'"');
CreateQuery.SQL.Add('(Id Integer, DateTime TimeStamp, Sensor Integer, Val Float(5),');
CreateQuery.SQL.Add('Primary Key (Id))');
try
CreateQuery.ExecSQL;
Log(4,'Таблица успешно создана');
except
// Application.MessageBox('Невозможно создать таблицу! Программа будет закрыта.','Ошибка',mb_OK);
Log(0,'Невозможно создать таблицу! Программа будет закрыта.');
MainForm.Close;
end;
Log(1,'Создаем индексы...');
try
CreateQuery.Active:=False;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('CREATE INDEX idxDateTime ON "'+TemperTableName+'"(DateTime)');
CreateQuery.ExecSQL;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('CREATE INDEX idxSensor ON "'+TemperTableName+'"(Sensor)');
CreateQuery.ExecSQL;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('CREATE INDEX idxVal ON "'+TemperTableName+'"(Val)');
CreateQuery.ExecSQL;
Log(1,'Индексы успешно созданы');
except
Log(0,'Невозможно создать индексы!');
//Application.MessageBox('Невозможно создать индексы!','Ошибка',mb_Ok);
end;
end;
if not FileExists(Exe_Path+'Data\'+DoorTableName) then
begin
Log(0,'Не найдена таблица положений двери! Будет создана новая таблица.');
Log(1,'Создаем таблицу...');
CreateQuery.Active:=False;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('CREATE TABLE "'+DoorTableName+'"');
CreateQuery.SQL.Add('(Id Integer, DateTime TimeStamp, Sensor Integer, Val Integer,');
CreateQuery.SQL.Add('Primary Key (Id))');
try
CreateQuery.ExecSQL;
Log(4,'Таблица успешно создана');
except
//Application.MessageBox('Невозможно создать таблицу! Программа будет закрыта.','Ошибка',mb_OK);
Log(0,'Невозможно создать таблицу! Программа будет закрыта.');
MainForm.Close;
end;
Log(1,'Создаем индексы...');
try
CreateQuery.Active:=False;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('CREATE INDEX idxDateTime ON "'+DoorTableName+'"(DateTime)');
CreateQuery.ExecSQL;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('CREATE INDEX idxSensor ON "'+DoorTableName+'"(Sensor)');
CreateQuery.ExecSQL;
Log(1,'Индексы успешно созданы');
except
Log(0,'Невозможно создать индексы!');
//Application.MessageBox('Невозможно создать индексы!','Ошибка',mb_Ok);
end;
end;
If not FileExists(Exe_Path+'Data\'+TimerTableName)then
begin
Log(0,'Не найдена таблица значений таймеров! Будет создана новая таблица.');
Log(1,'Создаем таблицу...');
CreateQuery.Active:=False;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('CREATE TABLE "'+TimerTableName+'"');
CreateQuery.SQL.Add('(Id Integer, Data Date, Sensor1 char(8), Sensor2 char(8), Sensor3 char(8), Sensor4 char(8), Sensor5 char(8), Sensor6 char(8), Sensor7 char(8), Sensor8 char(8), Sensor9 char(8), Sensor10 char(8), Sensor11 char(8), Sensor12 char(8)');
CreateQuery.SQL.Add('Primary Key (Id))');
try
CreateQuery.ExecSQL;
Log(4,'Таблица успешно создана');
except
//Application.MessageBox('Невозможно создать таблицу! Программа будет закрыта.','Ошибка',mb_OK);
Log(0,'Невозможно создать таблицу! Программа будет закрыта.');
MainForm.Close;
end;
CreateQuery.Active:=False;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('CREATE INDEX idxData ON "'+TimerTableName+'"(Data)');
try
CreateQuery.ExecSQL;
except
Log(0,'Невозможно создать индекс таблицы значений таймеров!');
end;
end;
if DBVersion=1 then
begin
Log(1,'Обновляем таблицу значений таймеров...');
CreateQuery.Active:=False;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('ALTER TABLE "'+TimerTableName+'"');
CreateQuery.SQL.Add('ADD Sensor11 char(8)');
try
CreateQuery.ExecSQL;
except
//Application.MessageBox('Невозможно обновить таблицу! Программа будет закрыта.','Ошибка',mb_OK);
Log(0,'Невозможно обновить таблицу! Программа будет закрыта.');
MainForm.Close;
end;
CreateQuery.Active:=False;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('ALTER TABLE "'+TimerTableName+'"');
CreateQuery.SQL.Add('ADD Sensor12 char(8)');
try
CreateQuery.ExecSQL;
except
//Application.MessageBox('Невозможно обновить таблицу! Программа будет закрыта.','Ошибка',mb_OK);
Log(0,'Невозможно обновить таблицу! Программа будет закрыта.');
MainForm.Close;
end;
CreateQuery.Active:=False;
CreateQuery.SQL.Clear;
CreateQuery.SQL.Add('UPDATE "'+TimerTableName+'"');
CreateQuery.SQL.Add('SET Sensor11="0:00:00", Sensor12="0:00:00"');
try
CreateQuery.ExecSQL;
Log(4,'Таблица успешно обновлена');
RegIniFile.WriteInteger('DB','Version',2);
except
//Application.MessageBox('Невозможно обновить таблицу! Программа будет закрыта.','Ошибка',mb_OK);
Log(0,'Невозможно обновить таблицу! Программа будет закрыта.');
MainForm.Close;
end;
end;
//Удаляем записи с датой ранее 3 месяцев
DeleteRecords;
//Перенумеровыаем записи
UpdateRecords;
InsertTempQuery.DatabaseName:=Exe_Path+'Data\';
InsertDoorQuery.DatabaseName:=Exe_Path+'Data\';
Query.DatabaseName:=Exe_Path+'Data\';
If Time<edStartShift.Time then Data:=Date-1 else Data:=Date;
Table:=TTable.Create(nil);
Table.DatabaseName:=Exe_Path+'Data\';
Table.TableName:=TimerTableName;
Table.Open;
Table.IndexName:='idxData';
Table.SetRangeStart;
Table.FieldByName('Data').AsDateTime:=Data;
Table.SetRangeEnd;
Table.ApplyRange;
If Table.Eof=Table.Bof Then
begin
For I := 1 To Ref_MAx Do
Begin
Ref[i].Timer:=StrToTime('00:00:00');
End; // for
end
else
begin
For I := 1 To Ref_Max Do
Ref[i].Timer:=Table.Fields[i+1].AsDateTime;
end;
Table.CancelRange;
Table.Close;
Table.Free;
//заполняем график
FillChart;
//Инициализируем библиотеку
Log(1,'Инициализируем библиотеку owen_io.dll');
If not InitLib then
begin
Log(0,'Невозможно инициализировать библиотеку owen_io.dll');
MessageDlg('Невозможно инициализировать библиотеку owen_io.dll!'+#13#10 +'Программа будет закрыта',mtError,[mbOk],0);
MainForm.Close;
end;
//Открываем COM-порт
Log(1,'Открываем СОМ-порт');
If not RegIniFile.ValueExists('COM','Number') then RegIniFile.WriteInteger('COM','Number',1);
ComNumber:=RegIniFile.ReadInteger('COM','Number',1)-1;
if(OpenPort(ComNumber,2,0,1,0,0)=-1) then
begin
Log(0,'Ошибка открытия СОМ'+IntToStr(ComNumber+1));
messagedlg('Ошибка открытия СОМ'+IntToStr(ComNumber+1),mtError,[mbok],0);
MainForm.Close;
end;
//Открываем сокет
if not RegIniFile.ValueExists('LAN','Port') then RegIniFile.WriteInteger('LAN','Port',30000);
Port:=RegIniFile.ReadInteger('LAN','Port',30000);
Log(1,'Открываем порт '+IntToStr(Port));
Server.Port:=Port;
try
Server.Open;
except
Log(0,'Невозможно открыть порт '+IntToStr(Port));
end;
//Запускаем процесс мониторинга
Simulate:=false;
TempTimer.Interval:=RegIniFile.ReadInteger('Sensors','TempInterval',30000);
DoorTimer.Interval:=RegIniFile.ReadInteger('Sensors','DoorInterval',5000);
TempTimer.Enabled:=True;
rbNow.OnClick(self);
DoorTimer.Enabled:=True;
rbNow1.OnClick(self);
tpTo.Date:=Date;
tpFrom.Date:=Date;
tpTo1.Date:=Date;
tpFrom1.Date:=Date;
end;
procedure TMainForm.FormActivate(Sender: TObject);
begin
MainForm.Program_Initialization;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
I: Integer;
Query:TQuery;
begin
Log(1,'===Остановка программы===');
//Освобождаем пямять
Log(1,'Освобождаем память');
Top_R.Free;
Door_Close.Free;
Door_Open.Free;
FreeLib;
//INSERT INTO "temper.db" VALUES (:Id, :DateTime, :Sensor, :Val)
Query:=TQuery.Create(nil);
Query.DatabaseName:=Exe_Path+'Data\';
For I := 1 To Ref_Max
Do // Iterate
Begin
Query.Active:=False;
Query.SQL.Clear;
inc(TemperCount);
Query.SQL.Text:='insert into "temper.db" values('+IntToStr(TemperCount)+','+''''+DateTimeToStr(Now)+''''+','+IntToStr(i)+',-274)';
Query.ExecSQL;
End; // for
For I := 1 To Ref_Max
Do // Iterate
Begin
Query.Active:=False;
Query.SQL.Clear;
inc(DoorCount);
Query.SQL.Text:='insert into "door.db" values('+IntToStr(DoorCount)+','+''''+DateTimeToStr(Now)+''''+','+IntToStr(i)+',-1)';
Query.ExecSQL;
End; // for
//Закрываем Log-файл
Log(1,'======Программа остановлена======');
CloseFile(Log_File);
end;
procedure TMainForm.RzSizePanel1HotSpotClick(Sender: TObject);
begin
RegIniFile.WriteBool('Form','HotSpotClosed',RZSizePanel1.HotSpotClosed);
end;
procedure TMainForm.TempTimerTimer(Sender: TObject);
function ReadTemp(SensorNumber:integer):real; //читаем температуру датчика SensorNumber
var
res:integer;
val:single;
tm:integer;
begin
If Simulate then if random(10000)<9000 then Result:=SensorNumber else Result:=-274
else
begin
res:=ReadIEEE32(Ref[SensorNumber].TempAdd,0,'rEAd',val,tm,-1);
If res=1 Then Result:=val else Result:=-274;
end;
end;
var i:integer;
CurrTemp:real;
error:array [0..300] of char;
begin
for i:=1 to Ref_Max do
begin
CurrTemp:=ReadTemp(i);
If abs(Ref[i].Temp-CurrTemp)>=0.5 then
begin
inc(TemperCount);
InsertTempQuery.Active:=False;
InsertTempQuery.ParamByName('Id').AsInteger:=TemperCount;
InsertTempQuery.ParamByName('DateTime').AsDateTime:=Now;
InsertTempQuery.ParamByName('Sensor').AsInteger:=i;
InsertTempQuery.ParamByName('Val').AsFloat:=CurrTemp;
try
InsertTempQuery.ExecSQL;
except
Log(0,'Невозможно записать данные в таблицу температур!');
end;
end;
If CurrTemp<>-274
Then
begin
TempLED[i].Blinking:=false;
TempLED[i].Font.Color:=clWhite;
TempLED[i].Caption:=FloatToStrF(CurrTemp,ffGeneral,5,1)+'°C';
Chart1.Series[i-1].AddXY(Now,CurrTemp);
end
else
begin
If cbSound.Checked Then
try
sndPlaySound('chord',SND_ASYNC);
except
end;
TempLED[i].Font.Color:=clRed;
TempLED[i].Blinking:=True;
TempLED[i].Caption:='n/a';
Chart1.Series[i-1].AddXY(Now,Chart1.Series[i-1].MaxYValue);
Chart1.Series[i-1].SetNull(Chart1.Series[i-1].Count-1);
LastErrToStr(error);
Log(0,'Невозможно получить температуру в камере №'+IntToStr(i)+': '+error+'!');
end;
Ref[i].Temp:=CurrTemp;
end;
end;
procedure TMainForm.DoorTimerTimer(Sender: TObject);
function ReadState(i:integer):integer;
var
res,tm:integer;
val:single;
begin
If Simulate Then
begin
if random(1000)<900 then Result:=0 else Result:=1;
if random(100000)>99000 then Result:=-1;
end
else
begin
res:=ReadIEEE32(Ref[i].TimerAdd,0,'rEAd',val,tm,-1);
If res=1 then
begin
If Val<DoorThreshold then Result:=0 else Result:=1;
end
else Result:=-1;
end;
end;
var i:integer;
State:Integer;
error:array [0..300] of char;
begin
for i:=1 to Ref_Max do
begin
State:=ReadState(i);
if Ref[i].State=1 then Ref[i].Timer:=Ref[i].Timer+EncodeTime(0,0,round(DoorTimer.Interval/1000),0);
if Ref[i].State<>State then
begin
inc(DoorCount);
InsertDoorQuery.Active:=False;
InsertDoorQuery.ParamByName('Id').AsInteger:=DoorCount;
InsertDoorQuery.ParamByName('DateTime').AsDateTime:=Now;
InsertDoorQuery.ParamByName('Sensor').AsInteger:=i;
InsertDoorQuery.ParamByName('Val').AsInteger:=State;
try
InsertDoorQuery.ExecSQL;
except
Log(0,'Невозможно записать даные в таблицу положений дверей!');
end;
end;
If State<>-1
Then
begin
TimerLED[i].Blinking:=false;
TimerLED[i].Font.Color:=clWhite;
TimerLED[i].Caption:=FormatDateTime('hh:nn',Ref[i].Timer);
Chart2.Series[i-1].AddXY(Now,State);
end
else
begin
If cbSound.Checked Then
try
sndPlaySound('chord',SND_ASYNC);
except
end;
TimerLED[i].Font.Color:=clRed;
TimerLED[i].Blinking:=false;
TimerLED[i].Caption:='n/a';
Chart2.Series[i-1].AddXY(Now,0);
Chart2.Series[i-1].SetNull(Chart2.Series[i-1].Count-1);
LastErrToStr(error);
Log(0,'Невозможно получить состояние двери №'+IntToStr(i)+': '+error+'!');
end;
Ref[i].State:=State;
end;
MainForm.RefDraw;
end;
procedure TMainForm.rbNowClick(Sender: TObject);
begin
If rbNow.Checked
Then
begin
tpFrom.Enabled:=false;
tpTo.Enabled:=false;
end;
If Time>=edStartShift.Time
Then
begin
Chart1.Axes.Bottom.SetMinMax(Date+edStartShift.Time,Date+1+edStartShift.Time);
Chart1.Title.Caption:=DateToStr(Chart1.Axes.Bottom.Minimum)+' - '+DateToStr(Chart1.Axes.Bottom.Maximum);
end
else
begin
Chart1.Axes.Bottom.SetMinMax(Date-1+edStartShift.Time,Date+edStartShift.Time);
Chart1.Title.Caption:=DateToStr(Chart1.Axes.Bottom.Minimum)+' - '+DateToStr(Chart1.Axes.Bottom.Maximum);
end;
end;
procedure TMainForm.rbFromToClick(Sender: TObject);
begin
If rbFromTo.Checked
Then
begin
tpFrom.Enabled:=True;
tpTo.Enabled:=True;
end;
Chart1.Axes.Bottom.SetMinMax(tpFrom.Date,tpTo.Date);
Chart1.Title.Caption:=DateToStr(Chart1.Axes.Bottom.Minimum)+' - '+DateToStr(Chart1.Axes.Bottom.Maximum);
end;
procedure TMainForm.tpFromChange(Sender: TObject);
begin
Chart1.Axes.Bottom.SetMinMax(tpFrom.Date,tpTo.Date);
Chart1.Title.Caption:=DateToStr(Chart1.Axes.Bottom.Minimum)+' - '+DateToStr(Chart1.Axes.Bottom.Maximum);
end;
procedure TMainForm.rbNow1Click(Sender: TObject);
begin
If rbNow1.Checked
Then
begin
tpFrom1.Enabled:=false;
tpTo1.Enabled:=false;
end;
If Time>=edStartShift.Time
Then
begin
Chart2.Axes.Bottom.SetMinMax(Date+edStartShift.Time,Date+1+edStartShift.Time);
Chart2.Title.Caption:=DateToStr(Chart2.Axes.Bottom.Minimum)+' - '+DateToStr(Chart2.Axes.Bottom.Maximum);
end
else
begin
Chart2.Axes.Bottom.SetMinMax(Date-1+edStartShift.Time,Date+edStartShift.Time);
Chart2.Title.Caption:=DateToStr(Chart2.Axes.Bottom.Minimum)+' - '+DateToStr(Chart2.Axes.Bottom.Maximum);
end;
end;
procedure TMainForm.rbFromTo1Click(Sender: TObject);
begin
If rbFromTo1.Checked
Then
begin
tpFrom1.Enabled:=True;
tpTo1.Enabled:=True;
end;
Chart2.Axes.Bottom.SetMinMax(tpFrom1.Date,tpTo1.Date);
Chart2.Title.Caption:=DateToStr(Chart2.Axes.Bottom.Minimum)+' - '+DateToStr(Chart2.Axes.Bottom.Maximum);
end;
procedure TMainForm.tpFrom1Change(Sender: TObject);
begin
Chart2.Axes.Bottom.SetMinMax(tpFrom1.Date,tpTo1.Date);
Chart2.Title.Caption:=DateToStr(Chart2.Axes.Bottom.Minimum)+' - '+DateToStr(Chart2.Axes.Bottom.Maximum);
end;
procedure TMainForm.btPrintChart1Click(Sender: TObject);
begin
ChartPreviewer1.Execute;
end;
procedure TMainForm.RzButton1Click(Sender: TObject);
begin
ChartPreviewer2.Execute;
end;
procedure TMainForm.btResetClick(Sender: TObject);
var
i:integer;
begin
DoorTimer.Enabled:=false;
TempTimer.Enabled:=False;
For I := 1 To Ref_Max
Do // Iterate
Begin
Ref[i].Timer:=StrToTime('00:00:00');
TimerLED[i].Caption:='00:00:00';
End; // for
DoorTimer.Enabled:=True;
TempTimer.Enabled:=True;
end;
procedure TMainForm.ControlTimerTimer(Sender: TObject);
var i:integer;
j:Integer;
Data:TDate;
Table:TTable;
begin
If not Chart1.Zoomed then
If rbNow.Checked
Then rbNow.OnClick(self);
If not Chart2.Zoomed then
If rbNow1.Checked
Then rbNow1.OnClick(self);
If Time<edStartShift.Time then Data:=Date-1 else Data:=Date;
{Table:=TTable.Create(nil);
Table.DatabaseName:=Exe_Path+'Data\';
Table.TableName:=TimerTableName;
Table.Open;
Table.IndexName:='idxData';
Table.SetRangeStart;
Table.FieldByName('Data').AsDateTime:=Data;
Table.SetRangeEnd;
Table.ApplyRange;
If Table.Eof=Table.Bof Then
begin
Table.Insert;
inc(TimerCount);
Table.Fields[0].AsInteger:=TimerCount;
Table.Fields[1].AsDateTime:=Data;
Table.Post;
end;
Table.Edit;
For I := 2 To 11 Do
Table.Fields[i].AsString:=TimeToStr(Ref[i-1].Timer);
Table.Post;
Table.CancelRange;
Table.Free;}
Query.Active:=False;
Query.SQL.Clear;
Query.SQL.Text:='select * from "timer.db" where Data='+''''+DateToStr(Data)+'''';
Query.Open;
If Query.Eof=Query.Bof then
begin
inc(TimerCount);
Query.Active:=False;
Query.SQL.Clear;
Query.SQL.Text:='insert into "timer.db" values('+IntToStr(TimerCount)+','+''''+DateTimeToStr(Data)+'''';
For I := 1 To Ref_Max
Do // Iterate
Begin
Query.SQL.Text:=Query.SQL.Text+','+''''+TimeToStr(Ref[i].Timer)+'''';
End; // for
Query.SQL.Text:=Query.SQL.Text+')';
Query.ExecSQL;
end
else
begin
Query.Active:=False;
Query.SQL.Clear;
Query.SQL.Text:='update "timer.db" set';
For I := 1 To Ref_Max-1
Do // Iterate
Begin
Query.SQL.Text:=Query.SQL.Text+'Sensor'+IntToStr(i)+'='+''''+TimeToStr(Ref[i].Timer)+''''+',';
End; // for
Query.SQL.Text:=Query.SQL.Text+'Sensor'+IntToStr(i)+'='+''''+TimeToStr(Ref[i].Timer)+'''' +' where Data='+''''+DateToStr(Data)+'''';
Query.ExecSQL;
end;
if FormatDateTime('hh:nn:ss',Time)=FormatDateTime('hh:nn:ss',edStartShift.Time+StrToTime('00:00:01')) then
begin
TempTimer.Enabled:=False;
DoorTimer.Enabled:=False;
DeleteRecords;
UpdateRecords;
FillChart;
btReset.Click;
TempTimer.Enabled:=True;
DoorTimer.Enabled:=True;
end;
if Server.Active then
for I := 1 to Ref_Max do // Iterate
for j := 0 to Server.Socket.ActiveConnections-1 do // Iterate
begin
try
Server.Socket.Connections[j].SendText('Ref#'+IntToStr(i)+'#'+FloatToStr(Ref[i].Temp)+'#'+IntToStr(Ref[i].State)+'#'+TimeToStr(Ref[i].Timer)+#13#10);
except
end;
end;
end;
procedure TMainForm.cbSoundClick(Sender: TObject);
begin
RegIniFile.WriteBool('Form','EnableSound',cbSound.Checked);
end;
procedure TMainForm.RzPageControl1TabClick(Sender: TObject);
begin
RegIniFile.WriteInteger('Form','ActivePage',RzPageControl1.ActivePageIndex);
end;
procedure TMainForm.edStartShiftDateTimeChange(Sender: TObject;
DateTime: TDateTime);
begin
RegIniFile.WriteTime('Form','StartShift',edStartShift.Time);
If rbNow.Checked then rbNow.OnClick(self);
If rbNow1.Checked then rbNow1.OnClick(self);
end;
procedure TMainForm.RzToolbarButton1Click(Sender: TObject);
begin
MainForm.Close;
end;
procedure TMainForm.RzButton2Click(Sender: TObject);
begin
frxReport1.ShowReport;
end;
procedure TMainForm.frxReport1BeforePrint(c: TfrxReportComponent);
var
Cross: TfrxCrossView;
Memo:TfrxMemoView;
i, j: Integer;
Table1:TTable;
DisplayLabel:String;
begin
If (c Is TfrxMemoView) And ((C as TfrxMemoView).Name='Memo2') then
begin
Memo:=TfrxMemoView(c);
Memo.Lines.Clear;
Memo.Lines.Add('Показания таймеров');
Memo.Lines.Add('с '+DateToStr(tpFrom1.Date)+' по '+DateToStr(tpTo1.Date));
end;
if c is TfrxCrossView then
begin
Table1:=TTable.Create(nil);
Table1.DatabaseName:=Exe_Path+'Data\';
Table1.TableName:='timer.db';
Table1.Active:=True;
Table1.IndexName:='idxData';
Table1.SetRange([tpFrom1.Date],[tpTo1.Date]);
Table1.ApplyRange;
Cross := TfrxCrossView(c);
Table1.First;
i := 0;
while not Table1.Eof do
begin
for j := 0 to Table1.Fields.Count - 1 do
begin
If j=0 then DisplayLabel:='№ п/п';
If j=1 Then DisplayLabel:='Дата';
If (j<>0) And (j<>1) then DisplayLabel:='Камера №'+IntToStr(j-1);
Cross.AddValue([i], [DisplayLabel], [Table1.Fields[j].AsString]);
end;
Table1.Next;
Inc(i);
end;
Table1.CancelRange;
Table1.Close;
Table1.Free;
end;
end;
procedure TMainForm.ServerClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Log(1,'Подключился '+Socket.RemoteAddress);
end;
procedure TMainForm.ServerClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Log(1,'Отключился '+Socket.RemoteAddress);
end;
procedure TMainForm.ServerClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
errorcode:=0;
end;
procedure TMainForm.SendTemp(fromdate,todate:string; var Socket: TCustomWinSocket);
var SendTemp:TQuery;
begin
SendTemp:=TQuery.Create(nil);
SendTemp.DatabaseName:=Exe_Path+'Data\';
SendTemp.SQL.Text:='select * from "temper.db" where DateTime>='+''''+fromdate+' 00:00:00'+''''+' and datetime<='+''''+todate+' 23:59:59'+'''';
SendTemp.Open;
SendTemp.First;
try
Socket.SendText('Temp#Begin#'+#13#10);
except
end;
While not SendTemp.Eof
Do
Begin
try
Socket.SendText('Temp#Data#'+SendTemp.FieldByName('DateTime').AsString+'#'+SendTemp.fieldByName('Sensor').AsString+'#'+SendTemp.FieldByName('Val').AsString+#13#10);
except
end;
SendTemp.Next
End; // while
try
Socket.SendText('Temp#OK#'+#13#10);
except
end;
SendTemp.Close;
SendTemp.Free;
end;
procedure TMainForm.SendTimer(fromdate,todate:string; var Socket: TCustomWinSocket);
var SendTimer:TQuery;
begin
SendTimer:=TQuery.Create(nil);
SendTimer.DatabaseName:=Exe_Path+'Data\';
SendTimer.SQL.Text:='select * from "Timer.db" where Data>='+''''+fromdate+' 00:00:00'+''''+' and data<='+''''+todate+' 23:59:59'+'''';
SendTimer.Open;
SendTimer.First;
try
Socket.SendText('Timer#Begin#'+#13#10);
except
end;
While not SendTimer.Eof
Do
Begin
try
Socket.SendText('Timer#Data#'+SendTimer.fieldbyname('data').AsString+'#'+SendTimer.FieldByName('Sensor1').AsString+'#'+SendTimer.FieldByName('Sensor2').AsString+'#'+SendTimer.FieldByName('Sensor3').AsString+'#'+SendTimer.FieldByName('Sensor4').AsString+'#'+SendTimer.FieldByName('Sensor5').AsString+'#'+SendTimer.FieldByName('Sensor6').AsString+'#'+SendTimer.FieldByName('Sensor7').AsString+'#'+SendTimer.FieldByName('Sensor8').AsString+'#'+SendTimer.FieldByName('Sensor9').AsString+'#'+SendTimer.FieldByName('Sensor10').AsString+#13#10);
except
end;
SendTimer.Next
End; // while
try
Socket.SendText('Timer#OK#'+#13#10);
except
end;
SendTimer.Close;
SendTimer.Free;
end;
procedure TMainForm.SendDoor(fromdate,todate:string; var Socket: TCustomWinSocket);
var SendDoor:TQuery;
begin
SendDoor:=TQuery.Create(nil);
SendDoor.DatabaseName:=Exe_Path+'Data\';
SendDoor.SQL.Text:='select * from "door.db" where DateTime>='+''''+fromdate+' 00:00:00'+''''+' and datetime<='+''''+todate+' 23:59:59'+'''';
SendDoor.Open;
SendDoor.First;
try
Socket.SendText('Door#Begin#'+#13#10);
except
end;
While not SendDoor.Eof
Do
Begin
try
Socket.SendText('Door#Data#'+SendDoor.FieldByName('DateTime').AsString+'#'+SendDoor.fieldByName('Sensor').AsString+'#'+SendDoor.FieldByName('Val').AsString+#13#10);
except
end;
SendDoor.Next
End; // while
try
Socket.SendText('Door#OK#'+#13#10);
except
end;
SendDoor.Close;
SendDoor.Free;
end;
procedure TMainForm.Process_Message(var S: AnsiString; var Socket: TCustomWinSocket);
var
title, fromdate, todate:string;
begin
title:=copy(s,1,Pos('#',s)-1);
delete(s,1,Pos('#',s));
If title='Door' Then
begin
fromdate:=copy(s,1,Pos('#',s)-1);
delete(s,1,Pos('#',s));
todate:=s;
SendDoor(fromdate,todate,socket);
end;
If title='Temp' Then
begin
fromdate:=copy(s,1,Pos('#',s)-1);
delete(s,1,Pos('#',s));
todate:=s;
SendTemp(fromdate,todate,socket);
end;
If title='Timer' Then
begin
fromdate:=copy(s,1,Pos('#',s)-1);
delete(s,1,Pos('#',s));
todate:=s;
SendTimer(fromdate,todate,socket);
end;
end;
procedure TMainForm.ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
S1, S2: AnsiString;
I: Integer;
begin
S1 := Socket.ReceiveText; {Присваиваем S1 полученную строку из Socket}
I := 0;
repeat {Разделяем строку, если одновременно пришло несколько}
I := Pos(#13#10, S1); {Ищем раздлелитель Delitel в строке S1}
if I <> 0 then {Если найден делитель, тогда ...
Если не найден, то вы не добавили в конце отсылаемой строки Delitel !}
begin
S2 := Copy(S1, 1, I - 1); {Копируем одну пришедшую строку в S2}
Delete(S1, 1, I + Length(#13#10) - 1); {Удаляем уже скопированную строку}
Process_Message(S2, Socket);
{Вызываем процедуру обработки полученных строк,
где S2 наша выделенная строка}
end;
until I = 0; {Повторять, пока будет не найден разделитель Delitel}
end;
end.