|
[ dogriz @ 31.05.2005. 08:09 ] @
| Firma za koju radim neke softvere je napravila kolsku vagu koja se preko COM porta povezuje na displej.
U celoj priči nema računara i moja ideja je da umesto sa displejom, vagu povežem sa PC računarom i napravim jednostavan softver (bruto, neto masa, štampa...).
Ono što vaga šalje je praktično samo jedan podatak, tj. masa. Mene interesuje kako da u Delphi programu hvatam signal koji se šalje na COM port?
Ostalo ću već lako rešiti (eventualne konverzije, provere itd.).
Do sada sam samo slao podatke na COM port pomoću npr. ovakvog koda:
Code:
var
FPort: Integer; //koristi se kao Handle Com porta
...
begin
FPort := CreateFile (pchar('COM1'), GENERIC_READ or GENERIC_WRITE,0,NIl, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
EscapeCommFunction(FPort, SETDTR);
//odredjeni vremenski interval...
EscapeCommFunction(FPort, CLRDTR);
end
a neka elektronika bi dalje radila svoj deo posla, što, mislim, nema nikakve veze sa onim što mi sada treba.
Svaka konstruktivna ideja je dobrodošla. 
tnx unapred
PS: Ne znam koji je tip vage, niti bilo šta drugo, jedino sam video digitalni displej, vagu i COM port. A Win na PC računaru treba da je XP. |
[ sasas @ 31.05.2005. 08:21 ] @
Ako ti treba pouzdana komunikacija s COM portom, pokušaj s TurboPower Async komponentama. Ima ih na sourceforge-u, i besplatne su.
ss.
[ dogriz @ 31.05.2005. 08:28 ] @
OK, probaću, ali interesuje me da li kako da rešim problem bez dodavanja novih komponenata, korišćenjem recimo Timera i sl?
[ morlic @ 31.05.2005. 09:17 ] @
Ako hoces bez komponenti pogledaj u MSDN-u odlican clanak:
ms-help://MS.MSDNQTR.2003FEB.1033/dnfiles/html/msdn_serial.htm
Ali bolje je da uzmes neku komponentu, nema potrebe da izmisljas toplu vodu, pogotovo ako ne znas kakvi su podaci koje vaga salje.
Pogledaj SynaSer na http://www.ararat.cz/synapse/ . Komponenta je lagana, i lako se koristi.
[ mP-programer @ 04.06.2005. 19:47 ] @
Jos jedna odlicna komponenta za serijski port autora Dejana Crnile pod
nazivom comport sa raznim primerima.
Link: http://sourceforge.net/projects/comport/
Bavim se programiranjem pic mikrokontrolera i povezujem se sa PC-jem
preko serijskog porta. PIC se na PC kaci preko usarta. Verujem da je vaga
uradjena sa PIC-om(ili nekim drugim mikrokontrolerom). Pogledaj uputstvo za
vagu i koje su komande za iscitavanje zeljenih vrednosti. Ova komponenta
se vrlo lako koristi i ja je dosta koristim.
Pozdrav.
[ dogriz @ 06.06.2005. 07:23 ] @
Nisam još došao do uputstva za vagu, ali pretpostavljam da će [url]http://sourceforge.net/projects/comport[/url] komponenta dobro da obavi posao. Pregledao sam malo i sviđa mi se kako je čovek odradio posao.
Hvala svima,
pozdrav!
[ bego_26 @ 01.06.2008. 23:27 ] @
Evo nadam se da moderatori nece ljutiti sto sam ozivio ovu temu.
Ja pokusavam napraviti program za vagu do 50000 kg.
Onaj glavni modul vage je prikopcan COM port racunara, ja sam se odluco da koristim TComPort komponentu.
Eh sad sa onim primjerom sto je dosao uz komponentu uspijem ocitavati sta stize na COM Port.
Dolazi sljedece: "(| 00" ovo 00 je kilaza do sam provjerio. ali modul vage salje svake 0,5 sec rezultat vaganja.
Ja kad stavim da se to ispisuje na nekoj Label ono ispisuje ali treperi svaki put kad dobije novo osvjezenje na COM port.
Mene zanima: - kako da se novi rezultat ispisuje na istoj Labeli "glatko" znaci da nema onog treptanja vec da prelazi sa
jednog broja na drugi kada teret nailazi na vagu.
- koko se rjesiti ovih ludih znakova na pocetku (to su sigurno Start-Bit-ovi)
Eto toliko.
Unapred zahvaljujem.
Pozz.
[ juha5803 @ 02.06.2008. 05:51 ] @
Ja sam to radiona dva načina. Elektronika jedne vage je imala mogućnost da radi na način kao kod tebe (kontinuirano slanje) ali i po "prozivci". Ovaj drugi način je lakši jer biraš trenutak uzimanja težine. Kod druge je bio slučaj da radi kao kod tebe i tu sam "lovio" uzorak i iz njega vadio šta mi treba. U nizu koji ti šalje vaga imaš i zaglavlje u kojem je obično adresa vage pa tek onda težina. Kod nekih tipova (npr. vagonske) imaš u zaglavlju i adresu mjernog mjesta (mali, beliki vagon ili sl.). Je li ti problem samo treperenje?
[ Deep|Blue @ 02.06.2008. 08:34 ] @
ako ti je problem samo treperenje,
dodaj proveru i ispisuj tezinu samo pri promeni tezine. ako postoje varijacije dodaj granicnu kontrolu od par kg.
[ bego_26 @ 02.06.2008. 09:20 ] @
Citat: juha5803: Je li ti problem samo treperenje?
Evo treperenje cu pokusati rijesiti kako mi je @Deep|Blue predlozio.
Ostaje jos da iz citavog String-a "(| 00" koj istize na COM port izdvojim samo "00" jer je to dio koji ispisuje tezinu.
Hvala na brzom odgovoru.
[ savkic @ 02.06.2008. 09:24 ] @
> Eh sad sa onim primjerom sto je dosao uz komponentu uspijem ocitavati sta stize na COM Port.
> Dolazi sljedece: "(| 00" ovo 00 je kilaza do sam provjerio. ali modul vage salje svake 0,5 sec rezultat vaganja.
Šalje čak i kada se ništa ne meri?
> Ja kad stavim da se to ispisuje na nekoj Label ono ispisuje ali treperi svaki put kad dobije novo osvjezenje na COM port.
Label se iscrtava samo kada se promeni njen sadržaj, kako vaga ne može slati različite težine dok traje jedno merenje zaključak je da nešto ne radiš dobro, šta tačno možemo samo nagađati bez koda.
> - koko se rjesiti ovih ludih znakova na pocetku (to su sigurno Start-Bit-ovi)
Kojih ludih znakova? Daj nam primer šta je to što dobijaš. Imaj u vidu da ako to šalje sama vaga, samo ona može i prestati da šalje, ti jedino možeš filtrirati (ignorisati) ono što te ne zanima.
[ juha5803 @ 02.06.2008. 13:50 ] @
> - koko se rjesiti ovih ludih znakova na pocetku (to su sigurno Start-Bit-ovi
Niz koji stiže sa vage je vjerovatno fiksne dužine (ako nije tajna, koji model vage?), nije problem to staviti u string i čitati od pozicije koja ti treba! Kod mene je niz dugačak 12 bajtova,
konkretno prva tri bajta su adresa vage i mjernog mjesta, a od 4 do 11 bajta je težina u Kg.
[ bego_26 @ 02.06.2008. 14:58 ] @
Citat: juha5803: >
Niz koji stiže sa vage je vjerovatno fiksne dužine (ako nije tajna, koji model vage?)
Nije tajna model indikatora je: http://www.averyweigh-tronix.c...E1105+multi-function+indicator
Citat: savkic: > Eh sad sa onim primjerom sto je dosao uz komponentu uspijem ocitavati sta stize na COM Port.
> Dolazi sljedece: "(| 00" ovo 00 je kilaza do sam provjerio. ali modul vage salje svake 0,5 sec rezultat vaganja.
Šalje čak i kada se ništa ne meri?
Kojih ludih znakova? Daj nam primer šta je to što dobijaš. Imaj u vidu da ako to šalje sama vaga, samo ona može i prestati da šalje, ti jedino možeš filtrirati (ignorisati) ono što te ne zanima.
Da vaga šalje i kad nema opterecenja znaci kad je 0 kg ona salje "(| 00" kad je konstantno opterecenje recimo 100 kg ona salje: "(| 100" svakih 0,5 sec.
Sutra saljem screenshot.
poz..
[ Deep|Blue @ 19.06.2008. 22:20 ] @
pa dobro, ali sto ti se javlja treperenje, ako radis osvezavanje na promenu tezine?
[ komplikator @ 07.07.2008. 11:35 ] @
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.
[ mret @ 23.07.2008. 09:50 ] @
postovanje,
evo malo da se ukljucim u temu...
firma u kojoj radim se vec dve godine bavi aplikacijama za nagazne vage i moje
iskustvo govori da se preko COMPORT komponente mogu resiti sve varijante vagi.
posto mi isporucujemo samo softver u kombinaciji COMPORT komponente + definicija u INI
fajlu, onda ne brinemo cak ni o modelu mernog uredjaja i distribuiramo uvek istu varijantu programa.
ako ne postoji ogranicenje u koriscenju komponenti, svakako je najbolje resenje ovo gorenavedeno, jer je
softver nezavisan od tipa mernog instrumenta.
u svim ostalim varijantama smo imali puno problema i glavobolje (verujte mi) sa drzanjem jedne verzije zbog razlicitih sekvenci koje stizu sa razlicitih mernih instrumenata
pozdrav
[ juha5803 @ 23.07.2008. 20:40 ] @
Pametno rješenje, nisam se toga sjetio
[ Megaspark @ 16.12.2008. 12:26 ] @
Poštovani,
Našao sam ovu temu i upravo je to ono što me zaokupiralo ovih dana. Radi se o vazi od 60t i digitalnom indikatoru Avery Barkel L225 i L115 (montaža Vage d.d.). nisam imao priliku proučiti šta konkretno vaga šalje putem rs232 pa bih zamolio za pojašnjenje. Da li vaga podatke šalje u običnom, ASCII ili Hex obliku? Kako bi bilo najjednostavnije preuzeti podatak odvage (problem je što ne znam Delphi pomoću kojega ste opisivali, radim u Clipperu DOS i pomalo u Visual Basic). Zamolio bih ako je moguće principijalno objašnjenje a ako neko ima i konkretno (recimo da se podatak prikazuje u nekom .txt ili sl), bio bih jako zahvalan!
Hvala
[ juha5803 @ 16.12.2008. 19:19 ] @
Citat: Megaspark: Poštovani,
Našao sam ovu temu i upravo je to ono što me zaokupiralo ovih dana. Radi se o vazi od 60t i digitalnom indikatoru Avery Barkel L225 i L115 (montaža Vage d.d.). nisam imao priliku proučiti šta konkretno vaga šalje putem rs232 pa bih zamolio za pojašnjenje. Da li vaga podatke šalje u običnom, ASCII ili Hex obliku? Kako bi bilo najjednostavnije preuzeti podatak odvage (problem je što ne znam Delphi pomoću kojega ste opisivali, radim u Clipperu DOS i pomalo u Visual Basic). Zamolio bih ako je moguće principijalno objašnjenje a ako neko ima i konkretno (recimo da se podatak prikazuje u nekom .txt ili sl), bio bih jako zahvalan!
Hvala
Morao bi ipak za početak znati u kom obliku vaga šalje podatke iako je najvjerovanije ASCII. Drugo da li je u pitanju kontinuirani niz podataka ili radi na principu prozivke tj. vraća odgovor na komandu. Ovo drugo je malo jednostavnije, mada i prvo se rješava lako. U svako slučaju moraš znati format podataka, obično je to string koji sadrži adresu vage, težinu, kod nekih modela i mjerno mjesto (obično vagonske), oznaku za kraj niza i sl. Može se ovo utvrditi i eksperimentalno, pokupiš podatake pa pogađaš šta je šta. Ostatak zavisi kakva je dalja obrada i šta ćeš dalje sa podacima o težini. Koristio sam Clipper mada sam već zaboravio kako ide čitanje sa rs232, a VB nisam nikad. Ako kreneš u konkrentu realizaciju zapomagaj pa ćemo nešto smisliti
[ mret @ 23.12.2008. 11:27 ] @
Pozdrav svima,
malo cu pokusati pojasniti kako se najlakse moze srediti sve ovo oko nagaznih vaga.
Moja firma ima resenje za SVE tipove nagaznih vaga sa kojima smo se sretali do sada (LEON, SHEKEL MERAV2000, MX100, Tufco, HBM,Nikal....)
Preko 80 firmi je reseno sa istom varijantom programa, samo se konfigurise ini fajl
Poenta cele price je da se koristi COMPORT komponenta koja radi jako dobro + ini fajl da bi ste imali samo jednu verziju programa zbog lakseg odrzavanja.
Kada se radi sa odredjenim tipom mernog instrumenta preko hyper terminala se moze videti sta on salje na COM port (podesi se BoudRate).
Medjutim za*** nastaje kada se neki skriveni znakovi salju sa intrumenta. Tada se na huperterminalu oni ne vide.
Jedno zgodno resenje je www.free-port-monitor.com aplikacija koja lepo i uredno prati saobracaj na portovima.
Nakon toga se vidi koja se sekvenca TACNO dobija i onda je lako isprogramirati sve sto treba.
Fakti su sledeci:
1. skroro svaki merni instrument salje fiksnu duzinu sekvence
2. uglavnom se sekvence zavrsasvaju sa carriage return-om
3. prvi znak sekvence je cesto neki znak ili slovo (ovo se uvek lako parsira)
4. nas kod za akviziciju sa mernog instrumenta ima 2 linije - koristi se vagapacket procedura i ona resava sve glavobolje
nadam se da je nekome ovo pomoglo. za ovakve stvari je jedino presudno iskustrvo i cucanje u
vagarskim kucicama sirom Balkana. :)
pozdrav
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|