Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

program 'parking' saia GRAFTEC

wujooo 20 Jan 2011 00:39 2708 9
Optex
  • #1
    wujooo
    Level 9  
    Mam do napisania program w graftecu (SAIA PG5), który będzie symulował parking.
    Program ma opierać się na 2 sterownikach (wjazd i wyjazd).

    Mam kilka pytań i byłbym wdzięczny jeśli ktoś mógłby mi pomóc, gdyż nie jestem z kierunku Automatyki i mam spory problem w tej kwestii.

    Chcę w tablicy przechowywać czasy wjazdu aut na parking (indeks w tablicy to tzw kod, który by kierowca dostawał przy wjeździe i pod ten indeks zapisywałby się czas wjazdu) później przy wyjeździe drugi sterownik pobierałby z pierwszego sterownika z tablicy tylko ten element o danym indeksie co chce opuścić parking , liczył różnicę i pokazywał czas pobytu. Jak zaimplementować tą tablicę w graftecu, jak przeszukuje się tablice tam, żeby np wyłowić pierwszy wolny indeks w niej, albo jak przy wyjeździe pobierać z niej dany element o konkretnym indeksie?

    Drugie pytanie mam co do czasu.
    Wiadomo, że czas musiałbym jakoś skoordynować na obu sterownikach dlatego myślę pobrać go na pierwszym i przesłać jakoś do drugiego, da się tak zrobić? Może jakaś pomoc w tej kwestii albo pomysł ?

    Będę bardzo wdzięczny za pomoc w jakiejkolwiek formie każdemu kto zechce mi cokolwiek napisać. Pozdrawiam i dziękuję
  • Optex
  • #2
    jestam
    Automation specialist
    Graftec to język do organizacji wykonania programu: składa się z kroków i tranzycji. W każdym kroku możesz umieścić fragment programu w IL lub Fupli, w każdej tranzycji tak samo. Wszelkie operacje na tablicach będziesz robił w IL lub Fupli, jak wolisz. Obejrzyj przykładowy projekt w PG5 (Chapter 6 - Graftec).

    Przekazywanie danych między sterownikami jest możliwe. Trzeba je połączyć siecią i ją skonfigurować. Nie piszesz nic o sprzęcie jaki masz do dyspozycji.

    Opisz dokładnie jak chcesz aby to działało i koniecznie umieść swoje rozwiązanie. Na tym forum nie odrabia się prac zaliczeniowych za kogoś.
  • #3
    wujooo
    Level 9  
    Wiem co to jest Graftec i że kod piszę w IL. Chodzi mi o odpowiedzi na powyższe pytania.

    Sterowniki których będę używał:
    "WJAZD"
    Sterownik: PCD2M170
    IP: 10.0.4.28
    S-Bus: 3
    IP Node: 3

    "WYJAZD"
    Sterownik: PCD2M170
    IP: 10.0.4.29
    S-Bus: 5
    IP Node: 5

    Zaplanowane przeze mnie zmienne:

    WJAZD:

    PARKING_ON – zgłoszenie chęci wjazdu na parking
    WJAZD_UP – szlaban wjazdowy w górę (rozkaz)
    WJAZD_UP_READY – szlaban wjazdowy otwarty (czujnik)
    WJAZD_DOWN – szlaban wjazdowy w dół (rozkaz)
    WJAZD_DOWN_READY – szlaban wjazdowy zamknięty (czujnik)
    T_BSY – flaga zajętości
    R1 – ilość aut na parkingu
    R2 – pojemność parkingu
    BILETY – tablica 50 elementowa (50 = ilość miejsc parkingowych) pojazdów przebywających na parkingu z ich czasem wjazdu
    R10 – czas wjazdu


    WYJAZD:

    PARKING_OFF – zgłoszenie chęci wyjazdu z parkingu
    WYJAZD_UP – szlaban wyjazdowy w górę (rozkaz)
    WYJAZD_UP_READY – szlaban wyjazdowy otwarty (czujnik)
    WYJAZD_DOWN – szlaban wyjazdowy w dół (rozkaz)
    WYJAZD_DOWN_READY – szlaban wyjazdowy zamknięty (czujnik)
    T_BSY – flaga zajętości
    R12 – czas wyjazdu
    R14 = (R12 – R10) czas parkowania
    ZAPŁACONO – informacja o dokonaniu zapłaty (czujnik)


    Cały opis zdarzenia podczas pracy programu:

    1 sterownik (WJAZD)
    - klient naciska przycisk „WJAZD” przy bramie wjazdowej
    - program sprawdza czy są wolne miejsca
    - jeżeli są to drukuje bilet z kodem (indeks w tablicy)
    - zapisuje w tablicy na pozycji z danym indeksem czas przybycia
    - otwiera szlaban
    - inkrementuje liczbę samochodów na parkingu
    2 sterownik (WYJAZD)
    - klient wkłada bilet do czytnika „WYJAZD”
    - program pobiera z drugiego sterownika czas przybycia z danym indeksem biletu
    - program oblicza różnicę sekund (czas pobytu na parkingu)
    - pobiera opłatę za parking (wyświetla liczbę sekund pobytu na parkingu)
    - dekrementuje liczbę samochodów na parkingu
    - zeruje element z indeksem z biletu i wysyła z powrotem go do tablicy (ster.1)
    - otwiera szlaban
    Komunikacja:
    - Cała tablica będzie znajdowała się na sterowniku pierwszym
    - Sterownik drugi będzie pobierał ze sterownika 1 tylko jeden element z konkretnym indeksem (ten, który zgłosi chęć wyjazdu)
    - Sterownik ‘WJAZD’ będzie pobierał czas funkcją RTIME i przesyłał go do sterownika ‘WYJAZD’ aby zainicjować czasy na obu sterownikach

    Wszystko tak jak pisałem wiem mniej więcej jak zrobić, problem mam z tą tablicą, jak znaleźć w niej pierwszy wolny rekord żeby tam dodać czas wjazdu auta które przyjechało i jak na drugim sterowniku pobrać dany element o danym indeksie z 1 sterownika.
    Jak zaplanować te telegramy w przesyłaniu danych.

    Będę wdzięczny za pomoc.
  • Optex
  • Helpful post
    #4
    jestam
    Automation specialist
    wujooo wrote:

    Komunikacja:
    - Cała tablica będzie znajdowała się na sterowniku pierwszym
    - Sterownik drugi będzie pobierał ze sterownika 1 tylko jeden element z konkretnym indeksem (ten, który zgłosi chęć wyjazdu)
    - Sterownik ‘WJAZD’ będzie pobierał czas funkcją RTIME i przesyłał go do sterownika ‘WYJAZD’ aby zainicjować czasy na obu sterownikach


    Masz w sterownikach Ethernet, więc oba mogą być masterami, ale możesz uprościć komunikację przez wysłanie czasu ze sterownika WYJAZD do WJAZD. Jest bloczek Fupli 'Broadcast Clock'.

    wujooo wrote:

    problem mam z tą tablicą, jak znaleźć w niej pierwszy wolny rekord żeby tam dodać czas wjazdu auta które przyjechało


    W fupla: bloczki z grupy Indirect. W IL: rozkaz GETX + zmiana zawartości rejestru indeksowego IX (rozkazy SEI, INI itp.),
    Algorytm np. taki:
    1. załadowanie IX ostatnio sprawdzanym elementem,
    2. w pętli
    - inkrementacja IX modulo długość tablicy,
    - sprawdzenie czy element tablicy jest wolny,
    - nie: goto 2
    - tak: zapisanie czasu wjazu w tablicy, zapisanie indeksu ostatnio sprawdzanego elementu na następny raz.

    wujooo wrote:

    jak na drugim sterowniku pobrać dany element o danym indeksie z 1 sterownika.
    Jak zaplanować te telegramy w przesyłaniu danych.

    Odczyt rejestru o zadanym adresie jest możliwy tylko z IL, rozkazem SRXMI, zapis zera po wyjeździe z parkingu rozkazem STXMI. Rozkazy działają jak zwykłe SRXM/STXM, ale pozwalają na adresowanie pośrednie - podajesz adresy rejestrów, w którym przechowujesz adresy parametrów rozkazu. Np. F 101 oznacza: flaga o numerze przechowywanym w R 101. Przykład w pomocy.

    Obejrzyj projekt przykładowy "Chapter 13 - IL + Ether-S-Bus", jest tam użyty IL + Grafcet. Trzeba pozmieniać SRXM/STXM na SRXMI/STXMI.

    Ponieważ zdalnie tylko zwalniasz miejsce, nie musisz robić żadnej synchronizacji dostępu do tablicy przez dwa sterowniki.
  • #5
    wujooo
    Level 9  
    Quote:
    Masz w sterownikach Ethernet, więc oba mogą być masterami, ale możesz uprościć komunikację przez wysłanie czasu ze sterownika WYJAZD do WJAZD. Jest bloczek Fupli 'Broadcast Clock'.


    A czy mogę te czasy zainicjować jakoś za pomocą IL ? Wolałbym nie wchodzić w Fuplę bo tam jeszcze nic nie robiłem więc jestem kompletnie zielony.

    Wiem, że jest taka funkcja jak RTIME która pobiera do rejestru aktualny czas, ale jak go zainicjować wtedy na drugim sterowniku?

    Myślałem, że zrobię to tak:
    RTIME R 10
    i w R 10 będę miał czas z 1 sterownika, następnie wyślę go do sterownika 2, a następnie użyję funkcji WTIME R 10 aby zainicjować ten czas na 2 sterowniku.

    Czy dobrze robię?

    Quote:
    RTIME CZAS


    LDL R_ADR_WJAZD1
    S.PRJ.WYJAZD2.SbusStation
    LDH R_ADR_WJAZD1
    S.PRJ.WYJAZD2.IPNode
    STXM 8
    1
    CZAS
    CZAS_DEST
    LD OPOZ
    30


    W symbolach : CZAS R 10


    Później na drugim odbiorę to w CZAS_DEST i zrobię
    WTIME do tego?

    Z tymi danymi w tablicach mi kompletnie nie idzie mógłbyś jakoś rozpisać mi na prostym przykładzie np tablicy 3 elementowej jak zapisać czas do danego indeksu i jak później go pobrać?

    Pierw chcę przeszukać tą tablicę w celu znalezienia pustego mca, to może łatwiej przeszukiwać całą tablicę rekord po rekordzie i porównywać element z tablicy do 0 ? Jak to zrobić ?
    CMP R 400
    R 60

    gdzie R 400 to nieuzywany rejestr przeze mnie wiec zawsze tam bedzie zero ?
    a R60 to tablica i jakoś inkrementować indeksy w pętli?

    Później wstawianie czasu wjazdu do tej tablicy w to puste mce też nie za bardzo mam pomysł znalazłem przykład użycia GETX w pętli i inkrementuje się tam indeks nie wiem ile razy bym musiał to inkrementować. Ogólnie rzecz biorąc nie mogę do końca zrozumieć działania tych rejestrów i tablic w IL, jak byś mógł na prostym krótkim przykładzie objaśnić co i jak to byłbym wdzięczny.
  • Helpful post
    #6
    jestam
    Automation specialist
    Na szybko: przykład dla tablicy, wszystko pisane z palca, nie testowane, mogą być błędy.

    Code:

    LiczbaMiejsc EQU 50
    CzasWjazdu EQU R[LiczbaMiejsc] ; każdy element tablicy zawiera czas w sekundach od północy 1/1/1970 r.
    NumerMiejsca EQU R
    temp EQU R

    ; Znalezienie wolnego miejsca

    SEI 0 ; rejestr indeksowy IX := 0
    szukaj:
    CMPX CzasWjazdu ; czy CzasWjazdu[IX] == 0?
         0
    JR Z znalezione
    INI LiczbaMiejsc - 1
    JR H szukaj
    ; błąd: brak miejsc na parkingu
    .....
    JR koniec

    znalezione:
    STI NumerMiejsca ; zapamiętaj numer miejsca w zmiennej
    SYSRD 7090 ; czas w sekundach od pólnocy 1/1/1970
          temp
    PUTX temp
         CzasWjazdu ; CzasWjazdu[IX] := bieżący czas

    ; wydrukuj bilet z numerem miejsca

    koniec:
  • #7
    wujooo
    Level 9  
    Dzięki, super. Czaję.
    To 1 sterownik 'WJAZD' ukończony, teraz dłubię przy drugim i stoję już długo w mcu gdzie chcę pobrać z 1 sterownika z tej tablicy czasów konkretny rekord,a później po pobraniu go wyzerować. Próbuję to zrobić wg tego co pisałeś + help + chapter13 i ciągle errory :/


    Quote:
    SRXMI 8
    R 50
    R[NumerMiejsca]
    R CZAS_PRZYJAZDU

    STXMI 8
    R 50
    R 103 ; pusty rejestr czyli zero
    R[NumerMiejsca]


    Error 34: brama_wyjazdowa.sfc: Line 79: Missing operand
    Error 34: brama_wyjazdowa.sfc: Line 85: Missing operand

    podkreśla R[NumerMiejsca]
  • Helpful post
    #8
    jestam
    Automation specialist
    Załóżmy, że adres bazowy tablicy w 1 sterowniku to 1000:
    CzasWjazduPlc1 EQU R[LiczbaMiejsc] 1000

    Code:

    NumerMiejsca EQU R
    ; ładuj numer biletu NumerMiejsca = xxx

    temp EQU R
    ; odczyt czasu z Plc1

    LD     R 100     ;load the Count
           1        ;1 items
    ADD NumerMiejsca
        1000 ; R 1000 [NumerMiejsca]
        R 101 ;load the source base address
    LD     R 102     ;load the destination address
           K temp     ;numer rejestru temp

    SRXMI  8         ;
           R 100     ;count is in R 100
           R 101     ;source type R, base address in R 101
           R 102     ;destination type R, base address in R 102

    ; w temp jest element tablicy z Plc1 o offsecie NumerMiejsca


    Drugi sposób z użyciem SRXMX:

    Code:

    NumerMiejsca EQU R
    ; ładuj numer biletu NumerMiejsca = xxx

    CzasWjazduPlc2 EQU R[LiczbaMiejsc] ; pomocnicza tablica w Plc2
    temp EQU R

    SEI NumerMiejsca ; IX = NumerMiejsca
    SRXMX  8         ;
           1     ;count
           R 1000    ;source R 1000 [NumerMiejsca]
           CzasWjazduPlc2   ;destination CzasWjazduPlc2[NumerMiejsca]
    GETX CzasWjazduPlc2
        temp

    ; w temp jest element tablicy z Plc1 o offsecie NumerMiejsca


    samo obliczenie czasu robisz tak:
    Code:

    biezacyCzas EQU R
    ileSekund EQU R
    SYSRD 7090
          biezacyCzas
    SUB biezacyCzas
        temp
        ileSekund
  • Helpful post
    #10
    jestam
    Automation specialist
    Pominąłeś plik projektu *.5pj

    1. Nie zerujesz komórki tablicy w sterowniku wjazd, zamiast tego przesyłasz zmniejszoną o 1 liczbę aut.

    Użyj STXMI do zerowania miejsca w tablicy. Sterownik wjazd sam zauważy, że nie mam miejsca.
    Wysyłanie liczby aut może spowodować wyścig i błąd w działaniu.

    2. Synchronizację czasu warto robić częściej. Np. przez cały czas gdy sterownik wyjazd czeka na bilet.

    3. Pilnuj adresów: R_DIAG_WYJAZD2 ma u ciebie adres R 1000, u mnie R 1000 to początek tablicy w sterowniku wjazd. To nie jest problem, ale lepiej, jak adresy się nie nakładają.