Softvérová časť parkovacieho systému

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání

Softvérová časť parkovacieho systému

Softvér parkoviska zabezpečuje bezpečnú prevádzku celého systému. Softvér je programovaný v jazyku object Pascal vo vývojovom prostredí Delphi. Navrhnutý softvér sme pomenovali parkovisko 1.0

Požiadavky na softvér parkovisko 1.0

Parkovací systém má byť plne automatický okrem platenia za parkovné. Má spĺňať bezpečnostné predpisy a byť jednoduchý na ovládanie zákazníkom ako aj obsluhou. Systém má byť použiteľný pre viac prevádzok, čiže sa majú dať meniť nastavenia a popisy lístkov.

[6]

Používateľské prostredie programu pre obsluhu parkovacieho systému

Mpbc40.jpg

Obr. 4.1 Používateľské prostredie parkovacieho systému

Obr. 4.2 Používateľské prostredie po skenovaní lístka

Obsluha používa na ovládanie parkovacieho systému 6 tlačidlo. Tlačidlo zadaj kód lístka nám slúži na manuálne zadávanie vygenerovaného kódu, ak sa nám pokazí skener čiarového kódu. Tlačidlá otvor vstup, zatvor vstup, otvor výstup, zatvor výstup slúžia na manuálne ovládanie rámp. Rampy sa ovládajú manuálne kvôli bezpečnosti parkoviska. Tieto tlačidlá sa využívajú hlavne pri vjazde RZP, hasičov a podobne. Tlačidlo blok stláčame ak nám zákazník vyplatil parkovné. Po stlačení tlačidla blok sa nám vytlačí pokladničný doklad a otvorí výstupnú rampu.

Administratívne prostredie pre nastavovanie správnej funkčnosti systému

Mpbc42.jpg

Obr. 4.3 Nastavenia lístka s čiarovým kódom

V nastavení lístka nastavujeme ako prvé tlačiareň ktorou budeme tlačiť. Potom nastavujeme bod odkiaľ nám začne tlačiť a to pomocou ľavého a pravého okraju. Tlačidlo tlač je na testovanie nastavovania okrajov. Nastavenie ceny parkovného za jednu hodinu, čas opätovného vytlačenia lístka, otváraciu dobu, popisy lístka a zvýraznenie určitých riadkov v popise pomocou zaškrtávacích okienok.


Mpbc43.jpg

Obr. 4.4 Nastavenie bloku

V prvom rade nastavujeme tlačiareň ktorú používame. Nastavíme ľavý a pravý okraj tlače. Tlačidlo tlač je skúšobná tlač pri nastavovaní okrajov. Do popisu napíšeme popis bloku.

Mpbc44.jpg

Obr. 4.5 Nastavenie času motorov a nastavenie comportu

V tomto okne sa nastavuje doba chodu motora, čas koľko má byť rampa otvorená a nastavenie prenosu cez Comport.

Vjazd automobilu na parkovisko

Stlačením tlačidla pri vstupe sa pošle signál cez RS232, čím aktivuje otvárací cyklus. Otvárací cyklus začína v procedúre ComPort1Ring. Cyklus na začiatku testuje, či skončila pauza medzi vydávaním lístkov. Ak je ukončený cyklus, aktivuje procedúru na vytlačenie lístka, nastaví cyklus vstup na True, aktivuje procedúru otvor vstupnú rampu, aktivuje časovač pauzy na lístok na prednastavenú hodnotu a časovač vstupu.

Zdrojový kód 4.1 Procedúra ComPort1Ring

procedure TForm1.ComPort1Ring(Sender: TObject);
begin
if not (tim_listok.Enabled and cyklus_vst)
begin
vytlac_listok;
cyklus_vst:=True;
otvor_in;
tim_listok.Enabled:=true;
tim_vstup.Enabled:=true;
end;
end;

Tlač parkovacieho lístka

V procedúre sa ako prvé nastaví horný a ľavý okraj začiatku tlače a horný a ľavý okraj umiestnia čiarového kódu. Do reťazca kód nahráme ako prvé znak x a potom dátum a čas vo formáte rok, mesiac, deň, hodina, minúta, sekunda. Znak x nám slúži pri skenovaní čiarového kódu, ako začiatok skenovania. Text z reťazca kód nahráme do premennej barcode1 ako text, s ktorého nám automaticky vytvorí čiarový kód. Potom sa nám začne tlačenie lístka. Do tlačiarne sa údaje posielajú po riadkoch. Texty sa nám automaticky ukladajú do ini súboru, odkiaľ si ich automaticky načítava.

Zdrojový kód 4.2 Procedúra vytlac_listok

procedure vytlac_listok:
var ho,lo:integer;
DateTime : TDateTime;
kod:string;
begin
with form1 do
begin
ho:=StrToInt(hornyokraj.Text);
lo:=strtoint(lol.Text);
barcode1.Left:=100+strtoint(lol.Text);
barcode1.top:=250+ho;
kod:=’x’+formatdatetime(’yymmddhhmmss’,now); //kod barkodu rokmesacden..
barcode1.text:=kod;
with printer do
begin
PrinterIndex:=ctlac; {index tlaciarne na ktoru chcem tlacit 1,2,3,4..}

Title:=’Listok’;
BeginDoc;
Canvas.Pen.Color:= 0;
Canvas.Font.Name:= ’Times New Roman’;
Canvas.Font.Size:= 10;
if cb1.Checked then canvas.Font.Style :=[fsbold];
Canvas.TextOut(80+lo,100+ho,pl1.text);
Canvas.Font.Style :=[];
Canvas.MoveTo(50+lo,100+ho);
Canvas.Pen.Width:=5;
Canvas.LineTo(1600+lo,100+ho);
barcode1.DrawBarcode(Canvas);
Canvas.Font.Size:= 16;
Canvas.TextOut(180+lo,700+ho,kod);
Canvas.Font.Size:= 10;
Canvas.Font.Name:= ’Times New Roman’;
Canvas.MoveTo(50+lo,960+ho);
Canvas.LineTo(1600+lo,960+ho);
if cb2.Checked then canvas.Font.Style :=[fsbold];
Canvas.TextOut(80+strtoint(lol.Text),1000+ho,pl2.text);
canvas.Font.Style :=[];
. . . . . .
enddoc;
end;
end;
end;


Obr. 4.6 Lístok s čiarovým kódom

Procedúra Otvor vstupnú rampu

Procedúra nám otvára vstupnú rampu. Ak sa vstupná rampa zatvára, zastaví ju. Skontroluje či sa výstupná brána otvára, zatvára, alebo je bez pohybu a pošle zodpovedajúce bajty tomuto stavu. Ak sa vstupná rampa nezatvára, ide z kludového stavu, skontroluje stav druhej rampy, pošlem zodpovedajúce bajty a vstupná rampa sa otvorí. Kontrolovať stav druhej rampy musíme preto, lebo každá kombinácia vstupnej a výstupnej rampy má iné bajty, ktoré sa posielajú do mikroprocesora. Do mikroprocesora posielame vždy 5 bajtov. Prvý bajt nám hovorí, či ide o displej alebo rampy. Ak ide o rampy, prijímaný prvý bajt je číslo 5. Druhý bajt je stav obidvoch rámp v akej sa práve nachádzajú (Tab.). Ďalšie 3 bajty sú slepé, posielam 0. Posledné 3 bajty posielam kvôli zjednodušeniu programu mikroprocesora. Na rampy potrebujeme 2 bajty, na displej potrebujeme 5 bajtov, z toho hľadiska by som musel nastavovať v mikroprocesory koľko bajtov má prijať.

Tabuľka 4.1 Hodnoty bajtov posielané do mikroprocesora v dekadickom tvare

Vstupná rampa v kľude    
Výstupná rampa v kľude Otvára sa Zatvára sa
Posielam 2.bit 11110000 11110001 11110010
Vstupná rampa sa otvára    
Výstupná rampa v kľude Otvára sa Zatvára sa
Posielam 2.bit 11110100 11110101 11110110
Vstupná rampa sa zatvára    
Výstupná rampa v kľude Otvára sa Zatvára sa
Posielam 2.bit 11111000 11111001 11111010
Výstupná rampa v kľude    
Vstupná rampa v kľude Otvára sa Zatvára sa
Posielam 2.bit 11110000 11110100 11111000
Výstupná rampa sa otvára    
Vstupná rampa v kľude Otvára sa Zatvára sa
Posielam 2.bit 11110001 11110101 11111001
Výstupná rampa sa zatvára    
Vstupná rampa v kľude Otvára sa Zatvára sa
Posielam 2.bit 11110010 11110110 11111010


Zdrojový kód 4.3 Procedúra Otvor_in

procedure otvor_in;
begin
with form1 do
begin
if rid then
begin
tim_in.Enabled:=false;
rid:=false;
comport1.writestr(chr(5));
if (roh=false) and (rod=false)then comport1.writestr(chr(240));
if (roh=false) and (rod=True)then comport1.writestr(chr(242));
if (roh=True) and (rod=false)then comport1.writestr(chr(241));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
sleep(200);
end;
rih:=True;
comport1.writestr(chr(5));
if (roh=false) and (rod=false)then comport1.writestr(chr(244));
if (roh=false) and (rod=True)then comport1.writestr(chr(246));
if (roh=True) and (rod=false)then comport1.writestr(chr(245));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
tim_in.Enabled:=true;
end;
end;

Procedúra časovača vstupu

V časovači sa nám nastaví časovač tim_vstup na False. Kontroluje či skončil cyklus vstupu a súčasne je premenná fotobunka vstupu nastavená na False. Ak sú tieto dve podmienky splnené, zavolá sa procedúra zatvor vstup (zatvor_in).

Zdrojový kód 4.4 Procedúra tim_vstup

procedure TForm1.TIM_VSTUPTimer(Sender: TObject);
begin
tim_vstup.Enabled:=false;
if (cyklus_vst) and (fotobunka_vst=false) then zatvor_in;
end;

Procedúra zatvorenia vstupnej rampy

Kontroluje či ide vstupná rampa hore. Ak ide vstupná rampa hore zastaví ju, skontroluje čo robí výjazdová rampa a podľa toho pošle bajty do procesora. Ak vstupná rampa je zastavená, alebo bola v klude, skontroluje činnosť výjazdovej rampy, pošle odpovedajúce bajty mikroprocesoru a vstupná rampa sa zavrie.

Zdrojový kód 4.5 Procedúra zatvor_in

procedure zatvor_in;
begin
with form1 do
begin
if rih then
begin
tim_in.Enabled:=false;
rih:=false;
comport1.writestr(chr(5));
if (roh=false) and (rod=false)then comport1.writestr(chr(240));
if (roh=false) and (rod=True)then comport1.writestr(chr(242));
if (roh=True) and (rod=false)then comport1.writestr(chr(241));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
sleep(200);
end;
rid:=True;
comport1.writestr(chr(5));
if (roh=false) and (rod=false)then comport1.writestr(chr(248));
if (roh=false) and (rod=True)then comport1.writestr(chr(250));
if (roh=True) and (rod=false)then comport1.writestr(chr(249));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
tim_in.Enabled:=true;
end;
end;

Procedúra na zastavenie rampy ak vojde automobil do fotobunky

Ak je fotobunka aktívna, nastaví premennú fotobunka_vst na True. Kontroluje činnosť vstupnej rampy. Ak sa vstupná rampa zatvára, aktivuje procedúru na otvorenie vstupnej rampy. Fotobunka nie je aktívna a cyklus vstup je aktívny, potom aktivuje procedúru na zatvorenie vstupnej rampy.

Zdrojový kód 4.6 ComPort1DSRChange

procedure TForm1.ComPort1DSRChange(Sender: TObject; OnOff: Boolean);
begin
if onoff=true then
begin
fotobunka_vys:=true;
if rod then
begin
otvor_out;
end;
end
else
begin
fotobunka_vys:=false;
if cyklus_vys then zatvor_out;
end;
end;

Procedúra zatvor vstupnú rampu

Táto procedúra nám zabezpečuje zatváranie vstupnej rampy. Ak automobil prejde cez fotobunku alebo ak uplynie stanovená doba , koľko má byť rampa otvorená, tak sa nám rampa zavrie.

Zdrojový kód 4.7 Procedúra zatvor_in

procedure zatvor_in;
begin
with form1 do
begin
if rih then
begin
tim_in.Enabled:=false;
rih:=false;
comport1.writestr(chr(5));
if (roh=false) and (rod=false)then comport1.writestr(chr(240));
if (roh=false) and (rod=True)then comport1.writestr(chr(242));
if (roh=True) and (rod=false)then comport1.writestr(chr(241));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
sleep(200);
end;
rid:=True;
comport1.writestr(chr(5));
if (roh=false) and (rod=false)then comport1.writestr(chr(248));
if (roh=false) and (rod=True)then comport1.writestr(chr(250));
if (roh=True) and (rod=false)then comport1.writestr(chr(249));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
comport1.writestr(chr(0));
tim_in.Enabled:=true;
end;
end;

Procedúra na vytlačenie bloku pri výjazde z parkoviska

Ako prvé sa v procedúre nastaví horný a ľavý okraj lístka. Je to z dôvodu, aby sa mohla pripojiť akákoľvek tlačiareň s rôznymi šírkami kotúča a v nastaveniach sa doladí správne tlačenie. Skenerom sa skenuje lístok. Ak program zachytí znak X, tak od neho nasledujúcich 12 znakov načíta. V znakoch je zakódovaný čas a dátum príjazdu automobilu. Vypočíta sa doba strávená na parkovisku, ktorá sa vynásobí nastavenou cenou. Blok sa tlačí po riadkoch. Keď obsluha od klikne tlačidlo vytlač blok, aktivuje sa procedúra na otvorenie výjazdovej rampy. Princíp procedúry na otvorenie a zatvorenie rampy je rovnaká ako pri vstupnej rampe

Zdrojový kód 4.8 Procedúra tlac_blok

procedure tlac_blok;
var lob,hob:integer;
DateTime2: TDateTime;
begin
with form1 do
begin
lob:=StrToInt(loblok.text);
hob:=StrToInt(hoblok.text);
with printer do
begin
PrinterIndex:=ctlacb;
Title:=’Blok’;
beginDoc;
Canvas.Pen.Color:=0;
Canvas.Font.Name:=’Times New Roman’;
Canvas.Font.Size:=10;
Canvas.TextOut(80+lob,100+hob,pb1.text);
. . . . . . .
Canvas.LineTo(1600+lob,850+hob);
DateTime2:=Time;
Canvas.TextOut(80+lob,930+hob,Label10.Caption);
Canvas.TextOut(750+lob,930+hob,TimeToStr(DateTime2));
Canvas.TextOut(80+lob,1040+hob,Label11.Caption);
DateTime2:=Date;
Canvas.TextOut(750+lob,1040+hob,DateToStr(DateTime2));
. . . . . . .
Canvas.MoveTo(80+lob,1520+hob);
canvas.LineTo(1600+lob,1520+hob);
enddoc;
end;
end;
end;


Obr. 4.7 Pokladničný blok

Záver