logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] Różnice między przerwaniem a wywołaniem podprogramu w sterownikach SIEMENS

elektronikq 30 Wrz 2015 21:26 1755 20
  • #1 15033478
    elektronikq
    Poziom 25  
    Posty: 3327
    Pomógł: 70
    Ocena: 614
    Jakie są istotne funkcje między tymi zdarzeniami? To i to wywołuje przerwanie OB1 i realizację czynności w tym zawartych i potem do powrotu do miejsca gdzie przerwanie / podpogram został wywołany i dalsza realizacja programu.

    Wiem, że przerwania są rezlizowane niezależnie od cyklu programu.
  • Pomocny post
    #2 15035944
    jestam
    Specjalista Automatyk
    Posty: 1794
    Pomógł: 210
    Ocena: 144
    Upraszczając: przerwanie może wystąpić w dowolnym momencie, asynchronicznie do normalnego wykonania programu. Wywołanie podprogramu występuje w chwili określonej przez programistę.

    Jeśli chcesz rozmawiać tylko o PLC Siemensa, to byłoby wskazane zaznaczyć to w temacie.
  • #3 15040153
    elektronikq
    Poziom 25  
    Posty: 3327
    Pomógł: 70
    Ocena: 614
    jestam napisał:
    Upraszczając: przerwanie może wystąpić w dowolnym momencie, asynchronicznie do normalnego wykonania programu. Wywołanie podprogramu występuje w chwili określonej przez programistę.

    Jeśli chcesz rozmawiać tylko o PLC Siemensa, to byłoby wskazane zaznaczyć to w temacie.


    Hm no ale przerwanie też musi programista ustawić? Asynchronicznie = nieregularnie?
    Właśnie zaczynam się bawić tymi przerwaniami bo chcę podłączyć silnik krokowy. I ktoś mi mówi, że silnik krokowy "to tylko z przerwaniami" ale co i dlaczego to już nie potrafił odpowiedzieć.
  • Pomocny post
    #4 15040482
    jestam
    Specjalista Automatyk
    Posty: 1794
    Pomógł: 210
    Ocena: 144
    Normalna praca sterownika PLC polega na cyklicznym wykonywaniu: odczytu wejść, sekwencji kolejnych rozkazów składających się na program oraz ustawieniu wyjść.

    Wyobraź sobie taki ciąg rozkazów umieszczony w OB1:
    1. A = 1
    2. B = 2
    3. CALL FC1
    4. B = 1
    5. A = 2
    6. CALL FC1

    Wewnątrz FC1 zawsze zmienna A <> B. Podprogram (FC1) jest wykonywany tylko w momencie określonym przez programistę, tj. w pkt. 3 i pkt. 6, tzn. "synchronicznie" z wykonaniem programu.

    Jeśli zaimplementujesz blok obsługi przerwania (wszystko jedno jakiego, time delay/cyclic/hardware) to może on być wykonany w dowolnym momencie cyklu, po wykonaniu dowolnej instrukcji programu. Wynika to z przyczyn zewnętrznych - upływu czasu lub sygnału na dedykowanym wejściu modułu I/O. Programista nie ma wpływu na moment rozpoczęcia obsługi przerwania. To jest "asynchronicznie".

    W czasie wykonywania bloku przerwania mogą dziać się "dziwne" rzeczy, np. dla programu powyżej może się zdarzyć że A = B - gdy przerwanie wystąpi pomiędzy krokiem 4 i 5. Dlatego programowanie przerwań jest trudne. Program może działać "poprawnie" podczas testów, a po kilku godzinach/dniach/tygodniach przerwanie wystąpi akurat w takiej chwili, że ujawni się błąd w programie.

    elektronikq napisał:
    Właśnie zaczynam się bawić tymi przerwaniami bo chcę podłączyć silnik krokowy. I ktoś mi mówi, że silnik krokowy "to tylko z przerwaniami" ale co i dlaczego to już nie potrafił odpowiedzieć.

    Może załóż nowy temat, opisz co i jak chcesz podłączyć i jak tym sterować. Zacznij od napisania normalnego programu w OB1 i zobacz czy jego działanie jest zadowalające.
  • #5 17550940
    elektronikq
    Poziom 25  
    Posty: 3327
    Pomógł: 70
    Ocena: 614
    Dziękuje dużo mi Pan rozjaśnił.
    Powracając do przerwania. Ale musiałbym w przerwaniu wywołać sobie taką instrukcję, że A=B. Czyli przerwanie pobiera informację z OB1? Zatrzymuje się OB1 przerwanie coś robi i zwraca do OB1 i potem OB1 leci dalej?
    A przerwanie które wykonuje się co 1ms cyclic interupt? Wywołuje się co jakiś czas, stały ustalony przez programistę. Tylko czas pętli Ob1 może to zmienić?
  • Pomocny post
    #6 17551392
    jestam
    Specjalista Automatyk
    Posty: 1794
    Pomógł: 210
    Ocena: 144
    Cytat:

    Czyli przerwanie pobiera informację z OB1?

    Nie. Instrukcje programu wykonywane podczas obsługi przerwania pobierają informacje z pamięci danych.

    Cytat:

    Zatrzymuje się OB1 przerwanie coś robi

    Tak

    Cytat:

    i zwraca do OB1 i potem OB1 leci dalej?

    Nie. Procedura obsługi przerwania nie zwraca wartości, ale zapisuje dane do pamięci danych i powraca do przerwanego miejsca w OB1, który wznawia wykonanie.

    Program w OB1 nie zauważa wystąpienia przerwania, dopóki nie odczyta komórek pamięci danych zmodyfikowanych podczas obsługi przerwania.

    Cytat:

    A przerwanie które wykonuje się co 1ms cyclic interupt? Wywołuje się co jakiś czas, stały ustalony przez programistę.

    Nie ma żadnej gwarancji jaki rozkaz z OB1 będzie wykonywany w momencie przerwania. Przerwanie nadal jest asynchroniczne.
  • #7 17551611
    elektronikq
    Poziom 25  
    Posty: 3327
    Pomógł: 70
    Ocena: 614
    Nie. Procedura obsługi przerwania nie zwraca wartości, ale zapisuje dane do pamięci danych i powraca do przerwanego miejsca w OB1, który wznawia wykonanie.

    Program w OB1 nie zauważa wystąpienia przerwania, dopóki nie odczyta komórek pamięci danych zmodyfikowanych podczas obsługi przerwania.


    Czyli np. w przerwaniu zapisuje sobie impulsy z czujnika do MB20. Przerwanie się kończy Ob1 sobie leci dalej i w miejscu ustalonym przez programistę korzysta sobie z MB20.

    Jeśli w OB1 użyję MB20 i wpiszę do niej liczbę 20. A przerwanie co 1ms zwiększa liczbę o 5. To w MB20 będę miał 25?
    Cytat:
    Nie ma żadnej gwarancji jaki rozkaz z OB1 będzie wykonywany w momencie przerwania. Przerwanie nadal jest asynchroniczne.

    Rozumiem to tak że pętla programowa nie jest stała.

    A jak użyję Ix.x : P w przerwaniu to duża różnica?
  • #8 17551861
    jestam
    Specjalista Automatyk
    Posty: 1794
    Pomógł: 210
    Ocena: 144
    Cytat:

    Jeśli w OB1 użyję MB20 i wpiszę do niej liczbę 20. A przerwanie co 1ms zwiększa liczbę o 5. To w MB20 będę miał 25?

    Tak. Po pierwszym przerwaniu.

    Chodzi o to, że odczytując MB20 dwukrotnie w kodzie OB1 możesz otrzymać dwie różne wartości. To samo w sobie nie jest nic złego, ale łatwo popełnić błąd w programie zapominając o tym fakcie.

    if MB20 < 50 then (użyj MB20) else MB20 = 0;

    Widzisz błąd?

    Pętla może być stała (PLC może poczekać po skończeniu cyklu), ale czas wykonania instrukcji programu zależy od takich rzeczy jak przerwania systemowe (np. od kontrolera Ethernet), zawartość cache w procesorze i wiele innych. Dodatkowo zegar taktujący przerwanie cykliczne zwykle jest z innego generatora niż taktowanie rdzenia procesora.

    ": P" to szczegół implementacji sterownika; w kolejnym modelu lub wersji firmware może działać inaczej.
  • #9 17557563
    elektronikq
    Poziom 25  
    Posty: 3327
    Pomógł: 70
    Ocena: 614
    Cytat:
    Tak. Po pierwszym przerwaniu.

    Chodzi o to, że odczytując MB20 dwukrotnie w kodzie OB1 możesz otrzymać dwie różne wartości. To samo w sobie nie jest nic złego, ale łatwo popełnić błąd w programie zapominając o tym fakcie.

    Teraz zrozumiałem po co używać przerwań gdy pętla programu jest długa, a brak HSC i zostaje nam zwykły licznik. Możemy troszkę przyśpieszyć liczenie impulsów.

    Tutaj użył Pan słowa dwukrotnie a może być i 6 - krotnie zależności od długości pętli?
    Cytat:
    if MB20 < 50 then (użyj MB20) else MB20 = 0;

    Przypuszczam że to SCL nie miałem do czynienia z nim ale
    jeśli MB20 jest mniejsze od 50 to z MB20 nic nie robimy jeśli nie (>50)to MB20 równa się 0.
    ?

    Dodano po 1 [godziny] 5 [minuty]:

    Przerwanie zwiększa czas trwania cyklu o czas przerwania? Czyli 0B1=10ms, OB30 1ms czyli razem 11ms?
  • #10 17558379
    Konto nie istnieje
    Poziom 1  
  • #11 17558444
    jestam
    Specjalista Automatyk
    Posty: 1794
    Pomógł: 210
    Ocena: 144
    if MB20 < 50 then (użyj MB20) else MB20 = 0;

    Intencja programisty: zliczaj od 0 do 49 i wróć do 0. Operacja używająca MB20 wymaga wartości < 50 (np. indeksowanie tablicy).

    Kod jest poprawny, gdy MB20 jest inkrementowane w normalnym cyklu PLC.

    Jeżeli MB20 jest inkrementowane w przerwaniu, może się zdarzyć, że przerwanie wystąpi pomiędzy sprawdzeniem warunku a faktycznym użyciem MB20. Operacja używająca MB20 zobaczy >=50. Konsekwencje zależą od programu.

    Takie błędy się bardzo trudno diagnozuje.

    Można się ratować używając osobnych zmiennych w pętli PLC i obsłudze przerwania, po czym kopiować dane raz na cykl. Jak zaprogramowałbyś kopiowanie kilku zmiennych, tak aby po przerwaniu "w trakcie" kopiowania dane nadal były spójne? ;-)
  • Pomocny post
    #12 17566932
    Rariusz
    Specjalista Automatyk
    Posty: 1773
    Pomógł: 267
    Ocena: 126
    Witam,

    Co do zasady w przerwaniach kod powinien być możliwie jak najmniejszy
    oraz jak najprostszy. Powoduje to szybkom obsługę przerwań. Nie ma
    co kombinować i się zbytnio zastanawiać.

    Wymianę danych między przerwaniami można wykonać jednak jest to
    ryzykowne z dwóch powodów:
    1) Priorytety przerwań
    2) Błąd w projektowaniu programu np.
    jestam napisał:
    Jeżeli MB20 jest inkrementowane w przerwaniu, może się zdarzyć, że przerwanie wystąpi pomiędzy sprawdzeniem warunku a faktycznym użyciem MB20. Operacja używająca MB20 zobaczy >=50. Konsekwencje zależą od programu.


    Pozdrawiam,
  • #13 17581890
    elektronikq
    Poziom 25  
    Posty: 3327
    Pomógł: 70
    Ocena: 614
    Ciężko mi się odnieść do tego bo nie mam aż takiego doświadczenia.

    To co napisał Rariusz to wiem z teorii. Jak przerwanie byłoby długie to wydłużyłoby działania całego programu i to o bardzo wiele ms.

    Jeżeli MB20 jest inkrementowane w przerwaniu, może się zdarzyć, że przerwanie wystąpi pomiędzy sprawdzeniem warunku a faktycznym użyciem MB20. Operacja używająca MB20 zobaczy >=50. Konsekwencje zależą od programu.
    Czyli inkrementacja MB20 jest raz na przerwanie. Czyli OB1 sprawdza MB20 mamy 49 więc leci dalej a za chwilę przerwanie i i mamy MB20=50 i wtedy dopiero w następnym OB1 zostanie sprawdzony warunek. Patrząc że np. OB1 trwa 10ms a przerwanie co 1ms to zanim dojdzie do sprawdzenia warunku to MB20 może wzrosnąć nawet do powyżej 50. To jest ten błąd?

    po czym kopiować dane raz na cykl Specjalna procedura? Np, przerwanie zapisuje liczbę w MB100 i na koniec lub raz na cyklu OB1 operacją move jest przenoszona liczba MB100 do MB20?


    Priorytet przerwań ma znaczenie jak występuje więcej jak 1 przerwanie?
    Indeksowanie tablic co to znaczy? Tablica ma 100 elementów i 100 indeksów? Każda komórka ma swój indeks i przez indeks mamy dostęp do komórki tabeli?
  • #14 17582539
    Rariusz
    Specjalista Automatyk
    Posty: 1773
    Pomógł: 267
    Ocena: 126
    Witam,

    elektronikq napisał:
    OB1 trwa 10ms a przerwanie co 1ms to zanim dojdzie do sprawdzenia warunku to MB20 może wzrosnąć nawet do powyżej 50


    MB20 będzie równy 10. Zwróć uwagę ze czas cyklu w OB1 może sie zmieniać za każdym razem.


    elektronikq napisał:
    Czyli OB1 sprawdza MB20 mamy 49 więc leci dalej a za chwilę przerwanie i i mamy MB20=50 i wtedy dopiero w następnym OB1 zostanie sprawdzony warunek.


    I tak i nie. Może się udać sprawdzić warunek lub przed sprawdzeniem MB20>50 i już nie wychwycisz tego. Sprawdzenie
    musi być w bloku przerwania i kropka.

    elektronikq napisał:
    Priorytet przerwań ma znaczenie jak występuje więcej jak 1 przerwanie?


    Tak

    elektronikq napisał:
    przez indeks mamy dostęp do komórki tabeli?


    Tak

    Pozdrawiam,
  • #15 17592572
    elektronikq
    Poziom 25  
    Posty: 3327
    Pomógł: 70
    Ocena: 614

    MB20 będzie równy 10. Zwróć uwagę ze czas cyklu w OB1 może sie zmieniać za każdym razem.

    Ok tutaj Gafa. Jak cykl 10ms to przerwań może się wykonać 10 więc tak jak Pan pisze.
    Przerwanie jest niezależne od czasu cyklu.

    I tak i nie. Może się udać sprawdzić warunek lub przed sprawdzeniem MB20>50 i już nie wychwycisz tego. Sprawdzenie
    musi być w bloku przerwania i kropka.

    To do czego pisał Pan jestam: Można się ratować używając osobnych zmiennych w pętli PLC i obsłudze przerwania, po czym kopiować dane raz na cykl. Jak zaprogramowałbyś kopiowanie kilku zmiennych, tak aby po przerwaniu "w trakcie" kopiowania dane nadal były spójne? ;-)

    Dlatego, że w przerwaniu ponieważ jak ono wystąpi deklarowana wartość np, mb20 = 49 to wtedy od razu wykona nam się jakaś czynność?

    A tak jak pisałem: W przerwaniu się zwiększa i zapisuje do MB100 impulsy. W OB1 raz na KONIEc cyklu MB100 przepisuje wartość do mB20 i porównuje?

    Tak zapytam do czego w PLC są używane tablice. W C używałem do zarządzania zmiennymi. Np. 6 zmiennych odnośnie jakiegoś sterowania.
    To to samo tylko że w jednym miejscu? 6 markerów to to samo co tablica jednowymiarowa 6 elementowa?

    A gdzie się ustala priorytet przerwań? jak ustawię co 1ms to jest możliwe aby 2 przerwania się wykonywały co 1 ms? Coś mi mówi że nie.
  • #16 17592909
    Rariusz
    Specjalista Automatyk
    Posty: 1773
    Pomógł: 267
    Ocena: 126
    Witam,

    elektronikq napisał:

    Dlatego, że w przerwaniu ponieważ jak ono wystąpi deklarowana wartość np, mb20 = 49 to wtedy od razu wykona nam się jakaś czynność?


    Załóżmy że kopiujesz w pętli for dane. W trakcie takiego kopiowania może dojść do przerwania i dane się zmienią np.

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    W kodzie powyżej, jesli i=5 i nastąpiło przerwanie to wartości w zmiennej "tablica" mogą się zmienić.
    W takim przypadku wartości w indeksach od 1 do 5 będą miały "stare wartości" a pozostałe "nowe wartości".
    Pojawił się przypadek że nie mamy zachowanej spójności danych.

    elektronikq napisał:
    Tak zapytam do czego w PLC są używane tablice.


    Np do przechowywania receptur lub do zadań komunikacji.

    Pozdrawiam,
  • #17 17596778
    elektronikq
    Poziom 25  
    Posty: 3327
    Pomógł: 70
    Ocena: 614
    Dziękuje. Na przykładzie to kopiowanie jest w OB1 to co Pan napisał post wyżej?

    A co do programu to nie znam tego języka: FOR i =1 TO N DO. W jakim to języku?
    W języku C inaczej to wygląda. Receptura to np. Skład proporcji składników do produkcji batonika?
    Ale można byłoby to zastąpić kilkoma lub więcej markerami.?
  • Pomocny post
    #18 17596942
    Rariusz
    Specjalista Automatyk
    Posty: 1773
    Pomógł: 267
    Ocena: 126
    Witam,

    elektronikq napisał:
    Dziękuje. Na przykładzie to kopiowanie jest w OB1 to co Pan napisał post wyżej?


    Tak.

    elektronikq napisał:
    A co do programu to nie znam tego języka: FOR i =1 TO N DO. W jakim to języku?


    ST na szybko ;)

    elektronikq napisał:
    Receptura to np. Skład proporcji składników do produkcji batonika?


    Tak.

    elektronikq napisał:
    Ale można byłoby to zastąpić kilkoma lub więcej markerami.?


    Rozwiń myśl.

    Pozdrawiam,
  • #19 17600261
    elektronikq
    Poziom 25  
    Posty: 3327
    Pomógł: 70
    Ocena: 614
    Np. jak mam jedną tablicę 10 elementową to każda zmienna czy to BOOL, czy WORD ma jakąś wartość - np, wł. dopływ wody, wlej 10ml syropu, 10gram czekolady.

    Natomiast jakbym zamiast tablic zastosował markery lub zmienne BYTE, WORD to też by działało tylko z tablicą jest bardziej przejrzyście lepiej się odnieść do zmienne bo nie trzeba pamiętać nazw zmiennych.
    Cytat:
    FOR i =1 TO N DO.

    Czyli wykonaj pętle for zacznij od i=1 i licz do wartości N. Przed DO stosuje się BY ale że ono domyślnie jest na 1 to nie trzeba go stosować.
    Cytat:
    tablica_nowa[i] := tablica[i];

    I pętla dopóki będzie liczyła do N to za każdym obiegiem pętli będzie kopiowała dane z tablica do tablica_nowa?
  • Pomocny post
    #20 17600270
    Rariusz
    Specjalista Automatyk
    Posty: 1773
    Pomógł: 267
    Ocena: 126
    Witam,

    elektronikq napisał:

    Przed DO stosuje się BY ale że ono domyślnie jest na 1 to nie trzeba go stosować.


    Tak.

    elektronikq napisał:
    ]I pętla dopóki będzie liczyła do N to za każdym obiegiem pętli będzie kopiowała dane z tablica do tablica_nowa?


    Tak. Element po elemencie bo zmieniamy indeks tablicy za pomocą zmiennej "i".

    Pozdrawiam,
  • #21 17607147
    elektronikq
    Poziom 25  
    Posty: 3327
    Pomógł: 70
    Ocena: 614
    Dziękuje AUTOMATYCY Rariusz i Jestam dużo się rozjaśniło.

Podsumowanie tematu

✨ W dyskusji omówiono różnice między przerwaniem a wywołaniem podprogramu w sterownikach SIEMENS. Przerwanie jest zdarzeniem asynchronicznym, które może wystąpić w dowolnym momencie cyklu programu, podczas gdy wywołanie podprogramu jest synchroniczne i następuje w określonym przez programistę momencie. Uczestnicy podkreślili, że przerwania są kluczowe w sytuacjach wymagających szybkiej reakcji, takich jak obsługa silników krokowych. Wskazano również na ryzyko związane z inkrementacją zmiennych w przerwaniach, co może prowadzić do nieprzewidywalnych wyników, jeśli nie zostaną odpowiednio zarządzane. Zasugerowano stosowanie osobnych zmiennych w pętli PLC i w obsłudze przerwania, aby uniknąć problemów z spójnością danych.
Wygenerowane przez model językowy.
REKLAMA