Ja sam razvio cijeli sustav za uzimanje odvaga i analiza, i kasniji obraćun, skladišne obrade i sl. za silose i žitoprerađivače. Evo, baš sam ovih dana pustio u pogon 4-5 sezonu otkupa žita i radi bezprijekorno. jedini zaheb je što sam projekt pokrenuo učeći Delphi u tadašnjoj verziji / i bazirao se na BDE i paradoxu, i o tako program gura bez problema.
Ja radim sa 4 serijska porta. Radim sa analizacijskom/laboratorijskom vagom, kolnom/mosnom vagom od 60T, analizatorom DickeyJohn i LED displayem za prikaz info rezultata za korisnike koji čekaju. Poprilično je složeno, gledaju se tipovi evidencije tj.r adi li se o ulazu ili izlazu robe, itd itd.. i prema tome program vodi oepratera i sam zna akda uzeti koji podatak (kada broto, akda taru, akda čeka analizu i sl. jesu li svi parametri u tolerancijama i sl.).
Koristio sam boomerang lib za serijsku komunikaciju, tada u verziji 4, kasnije i verziju 5. I radi odlično. Sve sam parametrizirao, njegove tipove enumerirao i "deenumerirao" da ih mogu natrpati u comboboxeve u coltrol panelu program itd, itd...
Vaga ti šalje neprestani niz podataka. Ti trebaš promatrati trenutnu vrijednost, i ako se nova vrijednost razlikuje od prethodne, umeš je u obzir. Ono što je još bitinije je da ti podaci u serijskoj komunikaciji "cure" i izcure kad se prelije buffer, pa možeš uhvatiti svakakvog smeća i budalaština. Zato moraš znati očistiti pdoatke i pročitati ono što ti treba.
Evo jedan primjer gdje čitam podatak sa vage:
Code:
with comVaga do
begin
Baudrate := TSetVaga.Baudrate;
Databits := TSetVaga.Databits;
DeviceName := Enum2str(TypeInfo(TPort), Ord(TSetVaga.DeviceName));
FlowControl := TSetVaga.FlowControl;
Parity := TSetVaga.Parity;
Stopbits := TSetVaga.Stopbits;
ReadBufSize := TSetVaga.ReadBufsize;
WriteBufSize := TSetVaga.WriteBufsize;
ReadTimeout := TSetVaga.ReadTimeout;
WriteTimeout := TSetVaga.WriteTimeout;
procedure TfrmAktOdvaga.comVagaRxChar(Sender: TObject; Count: Integer);
var
br: Integer;
begin
//try
ctemp := comVaga.Retrieve(Count); // string iz ulaznog buffera vage i njegova duljina
for br := 0 to Count do
begin
case cTemp [br] of
#02..#03 : cTempx := '';
#20..#57 :
begin
cTempx := cTempx + cTemp[br];
// niz veći od 7 znakova rastavljamo na faktore
if length(cTempx) >=7 then
begin
Masa := strtofloatdef(midstr(cTempx,1,7),0.00);
abLed1.Checked:= true;
if Modmjer = pocetno then
case ModVage of
Tbrutto:
begin
odvaga.dBrutto := masa;
odvaga.dNetto := 0;
end;
TTara :
begin
odvaga.dTara := masa;
odvaga.dNetto := 0;
end;
TNetto :
begin
odvaga.dBrutto := masa;
odvaga.dNetto := 0;
end
end
else
case ModVage of
Tbrutto:
begin
odvaga.dBrutto := masa;
odvaga.dNetto := ABS(odvaga.dBrutto - odvaga.dTara);
end;
TTara :
begin
odvaga.dTara := masa;
odvaga.dNetto := ABS(odvaga.dTara - odvaga.dBrutto);
end;
TNetto :
begin
odvaga.dBrutto := masa;
odvaga.dNetto := ABS(odvaga.dBrutto - odvaga.dTara);
end
end;
edBrutto.Text := floattostr (odvaga.dBrutto);
ednetto.Text := floattostr (odvaga.dNetto);
edTara.Text := floattostr (odvaga.dTara);
vagaOK.Enabled := true;
vagaok.UpdateControlState;
vagaX.Enabled := true;
end;
end;
end;
end;
except
obradagreske(TGreska.mjerenje:='vaga');
end;
end;
Primjer sa analizatorom (isto serijska komunikacija je malo "umniji":
Code:
procedure TfrmAktOdvaga.comDickRxChar(Sender: TObject; Count: Integer);
var
bra, brb, brclr : integer;
var tmpdlg: string;
begin
try
cTznak := comDick.Retrieve(Count); //string iz buffera i njegova duljina
brb := 0;
while not (cTznak[brb] in [#$0A..#128]) do inc(brb);
// filtriramo smeće koje port ponekad pošalje
for bra := brb to Count do
begin
case cTznak[bra] of
#$0D, #$0A : if length(trim(cListic[brd])) <> 0 then inc(brd);
#20..#128 :
begin
cListic[brd] := cListic[brd] + cTznak[bra];
cListic[brd] := stringReplace ( cListic[brd], #$2E, #$2C, [rfReplaceAll]);
if cListic[brd] = '====================' then
begin
{
ovdje obrađujemo polje stringova i kasnije razbijamo podatke u
zasebne varijable
}
obradiListic;
if Temporium.p3 = 9 then
begin
tmpdlg := '';
for brclr := low(clistic) to high (clistic) do tmpdlg := tmpdlg + cListic[brclr] + #13;
tmpdlg := trim(tmpdlg);
messagedlg (tmpdlg, mtInformation , [mbOk],0);
end;
// praznimo variable zbog prihvata novog podatka
beep;
comDick.PurgeIn;
for brclr := low(clistic) to high (clistic) do cListic[brclr] := '';
brd := 0 ;
abLed2.Checked:= true;
end;
end;
end;
end;
except
MessageDlg('Pogreška u prijemu podataka sa analizatora', mtError , [mbOk],0);
comDick.PurgeIn;
for brclr := low(clistic) to high (clistic) do cListic[brclr] := '';
brd := 0 ; Abort;
raise;
end;
A ima tu još dosta koda, koji čisti podatke, analizira ih, validira, poravnava, slaže po redosljedu jer analizator šalje različit i dinamički skup parametara i sl. a sve je zapravo parsiranja 40-kolonskog duplikata ispisa za serijski termalni printer no te algoritme (iako nisu vruhunska tajna) ipak ne mogu objavljivati zbog poslovne tajne.
God is real unless is declared as integer.