MODUL 4 · UPOZNAVANJE I OSNOVE RADA U ROBOTSKOM SIMULACIJSKOM OKRUŽENJU
Nastavna jedinica 4.4
Korištenje baza podataka u simulacijskom okruženju
Kada podaci o pozicijama, masama i kutovima stoje upisani među naredbama, svaka izmjena proizvoda znači ulazak u kod. Odvajanjem podataka u zasebnu datoteku program prestaje ovisiti o tome što se toga dana izrađuje: kod ostaje isti, a mijenja se samo sadržaj datoteke koju robot čita na početku ciklusa.
- obrazložiti zašto se podaci zadatka odvajaju od programskog koda
- opisati ustroj jednostavne baze u tekstualnoj datoteci sa stupcima i graničnikom
- napisati slijed otvaranja, čitanja redak po redak i zatvaranja datoteke
- razdvojiti redak po graničniku i pretvoriti polja u odgovarajuće tipove
- provjeriti ispravnost pročitanog retka i odrediti ponašanje pri neispravnom zapisu
Zašto podatke odvajamo od koda
Program koji u naredbama nosi konkretne brojeve radi točno jedan posao. Promjena visine kutije traži otvaranje programa, pronalaženje svih mjesta na kojima se ta visina pojavljuje i ispravak svakoga od njih. Svaki takav zahvat nosi rizik: dovoljno je propustiti jedno mjesto pa da robot na posljednjem sloju udari u složaj.
Odvajanje podataka od koda rješava to na razini ustroja. Program zna kako se slaže, a datoteka zna što se slaže i gdje. Prednosti su tri. Izmjenu smije napraviti tehnolog koji ne poznaje robotski jezik. Isti program poslužuje više proizvoda. Povijest izmjena vidljiva je u datoteci, a ne skrivena u kodu.
| Podaci u kodu | Podaci u datoteci | |
|---|---|---|
| Promjena proizvoda | izmjena programa | izmjena datoteke |
| Tko smije mijenjati | programer robota | tehnolog ili pripremljač |
| Rizik pri izmjeni | velik, podaci su na više mjesta | manji, podatak postoji jednom |
| Više izvedbi istodobno | više inačica programa | jedan program, više datoteka |
| Dodatna obveza | nema je | provjera ispravnosti pročitanog |
Oblik jednostavne baze
Za potrebe robotske ćelije baza podataka ne mora biti poslužiteljski sustav. Dovoljna je tekstualna datoteka u kojoj je svaki redak jedan zapis, a polja su odvojena graničnikom — točkom sa zarezom, zarezom ili znakom tabulatora. Prvi redak obično nosi nazive stupaca, a redci koji počinju posebnim znakom smatraju se komentarom.
| Stupac | Tip | Značenje | Primjer |
|---|---|---|---|
| oznaka | znakovni niz | oznaka pozicije ili obratka | POZ_A12 |
| x | realni broj | koordinata u korisničkom sustavu, mm | 412.5 |
| y | realni broj | koordinata u korisničkom sustavu, mm | -238.0 |
| z | realni broj | visina hvatanja, mm | 96.0 |
| kut | realni broj | zakret oko okomite osi, stupnjevi | 90.0 |
| masa | realni broj | masa obratka, kg | 2.4 |
# oznaka;x;y;z;kut;masa
POZ_A01;412.5;-238.0;96.0;0.0;2.4
POZ_A02;632.5;-238.0;96.0;0.0;2.4
POZ_A03;852.5;-238.0;96.0;90.0;2.4
POZ_B01;412.5;-78.0;96.0;0.0;3.1Takav zapis ima dvije velike prednosti. Čitljiv je bez posebnog programa, pa se otvara i provjerava u bilo kojem uređivaču teksta, i lako nastaje iz proračunske tablice, čime priprema podataka ostaje na mjestu na kojem se ionako radi.
Otvaranje, čitanje i zatvaranje
Rad s datotekom uvijek ima isti slijed: otvoriti, čitati dok ima redaka, zatvoriti. Otvaranje vraća oznaku kojom se datoteci kasnije pristupa. Čitanje vraća jedan redak i pomiče se na sljedeći. Kada redaka više nema, čitanje javlja kraj datoteke. Zatvaranje oslobađa datoteku, i ono se nikada ne izostavlja.
VAR iodev baza;
VAR string redak;
VAR num ukupno := 0;
Open "HOME:/podaci/pozicije.csv", baza \Read;
redak := ReadStr(baza);
WHILE redak <> EOF DO
IF StrPart(redak, 1, 1) <> "#" THEN
obradiRedak redak;
ukupno := ukupno + 1;
ENDIF
redak := ReadStr(baza);
ENDWHILE
Close baza;
TPWrite "Učitano zapisa: " \Num := ukupno;Pažnja
Datoteku zatvorite i kada obrada završi pogreškom. Otvorena datoteka zauzima resurs kontrolera, a pri ponovnom pokretanju programa drugo otvaranje iste datoteke može biti odbijeno. U jezicima koji podržavaju obradu pogreške, zatvaranje ide u dio koji se izvodi u svakom slučaju.
Razdvajanje i pretvorba tipova
Pročitani redak je niz znakova. Da bi se iz njega dobile brojčane vrijednosti, redak se najprije razdvoji po graničniku na polja, a zatim se svako polje pretvori u traženi tip. Pretvorba je korak na kojem se najčešće otkrije da podatak nije ono što se očekivalo: umjesto broja stoji prazno polje, decimalni zarez umjesto točke ili tekst zaostao iz proračunske tablice.
PROC obradiRedak(string redak)
VAR string polje{6};
VAR num brojPolja;
VAR bool ok;
VAR num x;
VAR num y;
VAR num z;
brojPolja := Razdvoji(redak, ";", polje);
IF brojPolja <> 6 THEN
TPWrite "Neispravan broj polja: " + redak;
RETURN;
ENDIF
ok := StrToVal(polje{2}, x) AND StrToVal(polje{3}, y)
AND StrToVal(polje{4}, z);
IF NOT ok THEN
TPWrite "Polje nije broj: " + redak;
RETURN;
ENDIF
spremiPoziciju polje{1}, x, y, z;
ENDPROCPretvorba se nikada ne radi bez provjere uspjeha. Naredba koja niz pretvara u broj vraća i podatak o tome je li pretvorba uspjela; taj se podatak mora ispitati. Kod koji pretpostavlja da je pretvorba uspjela nastavlja rad s neodređenom vrijednošću, a robot tada odlazi na točku koja nije nigdje zapisana.
Provjera ispravnosti i neispravan redak
Ispravnost se provjerava u tri koraka. Prvi je oblik: ima li redak očekivani broj polja i jesu li brojčana polja doista brojevi. Drugi je raspon: nalaze li se koordinate unutar radnog prostora i je li masa manja od nosivosti. Treći je smisao u odnosu na ostale zapise: ne ponavlja li se ista oznaka, ne preklapaju li se dvije pozicije.
| Vrsta pogreške | Kako se prepoznaje | Razuman postupak |
|---|---|---|
| prazan redak | duljina retka je nula | preskočiti bez poruke |
| komentar | prvi znak je oznaka komentara | preskočiti bez poruke |
| krivi broj polja | razdvajanje vraća drugi broj | zapisati u dnevnik i preskočiti |
| polje nije broj | pretvorba javlja neuspjeh | zapisati u dnevnik i preskočiti |
| izvan radnog prostora | koordinata izvan granica | preskočiti i upozoriti operatera |
| masa iznad nosivosti | usporedba s dopuštenom masom | zaustaviti ciklus |
Odluka o ponašanju pri neispravnom retku dio je zadatka, a ne stvar ukusa. Za paletizaciju je razumno preskočiti neispravan zapis, nastaviti s ostalima i na kraju javiti koliko ih je preskočeno. Za zavarivanje je razumno zaustaviti ciklus, jer preskočeni šav znači neispravan proizvod koji se ne vidi. U oba se slučaja u dnevnik zapisuje redni broj retka i njegov sadržaj.
Primjer
Datoteka ima 48 redaka. Prvi je zaglavlje, dva su prazna, jedan ima pet polja umjesto šest, a u jednom je masa 12 kg uz nosivost od 10 kg. Program učita 43 ispravna zapisa, dva preskoči uz zapis u dnevnik i zaustavi se na retku s prekoračenom masom.
Prikaz razvrstava retke datoteke i računa koliko zapisa ostaje za izvođenje. Zaglavlje, prazni redci i komentari ne broje se u pogreške; ostali neispravni zapisi preskaču se uz zapis u dnevnik.
Ključni pojmovi
| Pojam | Značenje |
|---|---|
| Graničnik | Znak koji u retku razdvaja polja, najčešće točka sa zarezom, zarez ili tabulator. |
| Zapis | Jedan redak datoteke koji opisuje jednu poziciju ili jedan obradak. |
| Zaglavlje | Prvi redak s nazivima stupaca; ne obrađuje se kao podatak. |
| Pretvorba tipa | Postupak kojim se znakovni niz pretvara u broj ili logičku vrijednost. |
| Kraj datoteke | Oznaka koju čitanje vraća kada više nema redaka. |
| Dnevnik | Zapis o preskočenim i neispravnim redcima, s rednim brojem i sadržajem. |
Provjeri se
Kratka provjera prije prelaska na sljedeću jedinicu. Odgovor se potvrđuje klikom, a obrazloženje se prikazuje odmah.
Pitanje 1 od 3
Glavna prednost odvajanja podataka od programskog koda jest:
Program ostaje nepromijenjen, a mijenja se sadržaj datoteke koju robot čita.
Pitanje 2 od 3
Nakon razdvajanja retka po graničniku polja su:
Redak je niz znakova, pa su i polja znakovni nizovi; pretvorba u broj je zaseban korak.
Pitanje 3 od 3
Redak s masom većom od nosivosti robota razumno je:
Prekoračenje nosivosti ugrožava robot i teret, pa se ciklus zaustavlja, a ne nastavlja.
Odgovoreno 0 od 3.