Доброго времени суток! Ребят, если не сложно, подскажите пожалуйста... По срабатыванию датчика в БД должно писаться время, все бы ничего, но 1-я проблема - почему-то записи иногда дублируются (в первой таблице). А вторая - не всегда срабатывает условие i=1, причем только в процедуре DSR, CTS отрабатывается на ура.
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
ComPort1.Open;
i:=0;
q:=0;
Sleep(15000);
ADOConnection1.Connected:=true;
end;
procedure TForm1.ComPort1DSRChange(Sender: TObject; OnOff: Boolean);
begin
if OnOff=true then
begin
Edit1.Text:='on';
Timer1.Enabled:=false;
if i=1 then
begin
try
ADOQuery1.Close;
ADOQuery1.Open;
ADOQuery1.Edit;
ADOQuery1.FieldByName('Stop').AsDateTime:=now();
ADOQuery1.Post;
except
ADOConnection1.Close;
end;
try
ADOQuery3.Close;
ADOQuery3.Open;
ADOQuery3.Insert;
ADOQuery3.FieldByName('Time').AsDateTime:=now();
ADOQuery3.FieldByName('Shop').AsInteger:=1;
ADOQuery3.FieldByName('Unit').AsInteger:=1;
ADOQuery3.FieldByName('Shift').AsInteger:=1;
ADOQuery3.FieldByName('Brigade').AsInteger:=1;
ADOQuery3.Post;
except
ADOConnection1.Close;
end;
end;
if i=0 then
begin
try
ADOQuery3.Close;
ADOQuery3.Open;
ADOQuery3.Insert;
ADOQuery3.FieldByName('Time').AsDateTime:=now();
ADOQuery3.FieldByName('Shop').AsInteger:=1;
ADOQuery3.FieldByName('Unit').AsInteger:=1;
ADOQuery3.FieldByName('Shift').AsInteger:=1;
ADOQuery3.FieldByName('Brigade').AsInteger:=1;
ADOQuery3.Post;
except
ADOConnection1.Close;
end;
end;
end
else
begin
Edit1.Text:='off';
Timer1.Enabled:=true;
i:=0;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
try
ADOQuery2.Close;
ADOQuery2.Open;
ADOQuery2.Insert;
ADOQuery2.FieldByName('Start').AsDateTime:=now()-5/24/60; //5min-
ADOQuery2.FieldByName('Shop').AsInteger:=1;
ADOQuery2.FieldByName('Unit').AsInteger:=1;
ADOQuery2.Post; //интервал таймера, длительность, означающая начало простоя.
except
ADOConnection1.Close;
end;
i:=1;
Timer1.Enabled:=false;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ComPort1.Close;
ADOConnection1.Close;
end;
procedure TForm1.ComPort1CTSChange(Sender: TObject; OnOff: Boolean);
begin
if OnOff=true then
begin
Edit2.Text:='on';
Timer2.Enabled:=false;
if q=1 then
begin
try
ADOQuery4.Close;
ADOQuery4.Open;
ADOQuery4.Edit;
ADOQuery4.FieldByName('Stop').AsDateTime:=now();
ADOQuery4.Post;
except
ADOConnection1.Close;
end;
ADOQuery3.SQL.Add('SELECT * from Ready');
try
ADOQuery3.Close;
ADOQuery3.Open;
ADOQuery3.Insert;
ADOQuery3.FieldByName('Time').AsDateTime:=now();
ADOQuery3.FieldByName('Shop').AsInteger:=1;
ADOQuery3.FieldByName('Unit').AsInteger:=2;
ADOQuery3.FieldByName('Shift').AsInteger:=1;
ADOQuery3.FieldByName('Brigade').AsInteger:=1;
ADOQuery3.Post;
except
ADOConnection1.Close;
end;
end;
if q=0 then
begin
try
ADOQuery3.Close;
ADOQuery3.Open;
ADOQuery3.Insert;
ADOQuery3.FieldByName('Time').AsDateTime:=now();
ADOQuery3.FieldByName('Shop').AsInteger:=1;
ADOQuery3.FieldByName('Unit').AsInteger:=2;
ADOQuery3.FieldByName('Shift').AsInteger:=1;
ADOQuery3.FieldByName('Brigade').AsInteger:=1;
ADOQuery3.Post;
except
ADOConnection1.Close;
end;
end;
end
else
begin
Edit2.Text:='off';
Timer2.Enabled:=true;
q:=0;
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
try
ADOQuery2.Close;
ADOQuery2.Open;
ADOQuery2.Insert;
ADOQuery2.FieldByName('Start').AsDateTime:=now()-5/24/60; //5 min-интервал
ADOQuery2.FieldByName('Shop').AsInteger:=1;
ADOQuery2.FieldByName('Unit').AsInteger:=2;
ADOQuery2.Post; // таймера, длительность, означающая начало простоя.
except
ADOConnection1.Close;
end;
q:=1;
Timer2.Enabled:=false;
end;
procedure TForm1.Timer3Timer(Sender: TObject);
begin
if TimeToStr(now) = '19:00:00' then
begin
if i=0 then
begin
try
ADOQuery1.Close;
ADOQuery1.Open;
ADOQuery1.Edit;
ADOQuery1.FieldByName('Stop').AsDateTime:=now();
ADOQuery1.Post;
except
ADOConnection1.Close;
end;
Timer1.Enabled:=true;
end;
if q=0 then
begin
try
ADOQuery4.Close;
ADOQuery4.Open;
ADOQuery4.Edit;
ADOQuery4.FieldByName('Stop').AsDateTime:=now();
ADOQuery4.Post;
except
ADOConnection1.Close;
end;
Timer1.Enabled:=true;
end;
end;
end;
end.
З.Ы. Дам любую дополнительную инфу, простите, если не учел все сразу.