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.


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

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

[Image:mpbc41.jpg|center|framed|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

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.

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.

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.


Štatistika parkovacieho systému

Obr. 4.6 Štatistika

Štatistika parkovacieho systému sa ukladá automaticky pri vytlačení pokladničného bloku. V prvom stĺpci štatistiky sa nachádza kód lístka, ktorý bol pridelení zákazníkovi pri vjazde na parkovisko a vytlačený na parkovací lístok. V druhom a tretom stĺpci sú údaje o čase a dátumu výstupu z parkoviska. V štvrtom a piatom stĺpci sú údaje o dátume a čase vstupu na parkovisko. V šiestom stĺpci je vypočítaná doba parkovania. V siedmom stĺpci je sadzba aká bola nastavená na parkovisku. V siedmom stĺpci je cena za parkovanie. Štatistika sa zobrazuje len na vybraný dátum. Vždy sa nám tvorí s aktuálnym dátumom. Dátum sa dá ľahko vyberať (pozri Obr. 4.6). V štatistike sa nám v pravom dolnom rohu zobrazuje tržba a počet zákazníkov za vybraný deň.

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

V práci som sa zaoberal riešením poloautomatického parkovacieho systému. Navrhol som hardvér a softvér na riadenie a nastavovanie poloautomatického parkovacieho systému a model parkoviska 1:10, na ktorom som simuloval situácie, ktoré mohli nastať. Hardvér sa zaoberá problematikou automatizácie parkovacích systémov. V tejto časti som musel riešiť ovládanie rámp a displeja. Ovládanie rámp mi zabezpečuje mikroprocesor, ktorý je prepojený s počítačom cez RS232, od ktorého dostáva inštrukcie a po spracovaní ich posiela na dosku ovládania rámp a spína nám relé rámp. Mikroprocesor riadi aj displej, ktorý nás informuje o cene parkovného. Softvér sa zaoberá ovládaním parkovacieho systému. Systém je plne automatický okrem platenia za parkovné, ktoré ovláda obsluha parkovacieho systému. Systém je univerzálny, dá sa použiť aj pre podobné parkovacie systémy. V systéme sa dajú nastavovať všetky popisy, ceny a aj časy chodu motorov. V systéme som dbal na ovládanie rámp, ktoré bolo najdôležitejšie, kvôli bezpečnosti automobilov. V práci mi chýba dorobiť displej na zobrazovanie ceny a databázu na archiváciu príjazdov a platieb za parkovné.

Použitá literatúra

  1. Bachmann, Scheidt. Parkovacie systémy. [Online] 2008. [Dátum: 15. 10 2009.] http://www.scheidt-bachmann.sk/index.php/media.
  2. Internacional, Kingparking. parkovacie systémy. [Online] 2004. [Dátum: 12. 8 2009.] http://www.kingparking.sk/aplikacie.html
  3. sk.wikipedia.org. [Online] 12. 11 2009. [Dátum: 25. 11 2009.] http://sk.wikipedia.org/wiki/S%C3%A9riov%C3%BD_port.
  4. Olmr, Vít. Hardvér. [Online] 15. 10 2005. [Dátum: 03. 07 2009.] http://hw.cz/rs-232.
  5. Matoušek, Davit. Udělejte si z PC v Delphi ... Praha : BEN - Technická literatúra, 2003. ISBN 80-7300-111-x.
  6. Matoušek, David. Práce s mikrokontroléry ATMEL AT89C2051. Praha : BEN - Technická literatúra, 2002. ISBN 80-7300-094-6.

Prílohy

Fotografie modelu

Bc.jpg

Bc1.jpg

Bc2.jpg