Elektroda.pl
Elektroda.pl
X
SterControlSterControl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

analiza kodu w programie Step7

10 Cze 2005 16:56 2322 8
  • Poziom 11  
    Witam szanownych grupowiczów!
    Mam problem z analizą kodu STEP7:

    A I 15.1
    = #GZ
    A I 5.5
    = #KORR_WEG
    A I 15.2
    = #GVZ
    L 0
    T #BCD
    L PIB 5
    T #SCHNELL_EINLESEN
    A L 12.4
    = I 5.4

    Chodzi mi dokładnie o 2 dwie ostatnie linijki. Co oznacza komenda A L 12.4 (nie mogłem znaleźć w dokumentacji) oraz jaki cel ma forsowanie wejścia 5.4 (jest to sygnał z enkodera)
    Pzodr
    Krzysmci
  • SterControlSterControl
  • Poziom 17  
    Witam,

    to nie jest czasem jakiś lokalny merker w funkcji? Nie pamiętam już, bo dawno nie grzebałem w kodach stl-owych step7 ale w funkcjach można odnosić się do lokalnych merkerów - i kurde nie pamiętam jak się je określało - może L ? Co do forsowania wejścia to nie mam pojęcia co to za myk. Ale to o czym mówiłem to sprawdź może w helpie jak się definiuje lokalne merekery w funkcjach.

    Pozdrawiam,

    Michał.
  • Poziom 14  
    W s& możesz tworzyć fynkcje
    i tym funkcjom przypisujesz wejścia i wyjścia
    wszystko co zaczyna się od # jest właśnie wejsciem albo wyjściem
    i po kolei:
    A I 15.1
    = #GZ
    jeśli A 15.1=1 to #GZ ustaw na jeden

    A I 5.5
    = #KORR_WEG
    jesli I5.5=1 to #KORR_WEG ustaw na jeden

    A I 15.2
    = #GVZ
    to samo co wyżej

    L 0
    T #BCD
    ładuj do akumolatora 0
    zapisz zawartość akumulatora do #BCD

    L PIB 5
    T #SCHNELL_EINLESEN
    laduj do akumulatora wejście bajt prawdopodobnie analogowe 5
    zapisz zawartość akumulatora #SCH......

    A L 12.4
    = I 5.4
    a L tutaj to jest zmienna lokalna występująca wylko w tej funkcji
    najprawdopodobniej jest ona gdziejsz wyżej uzyta.
    Trochę nie po polsku ale mam nadzieję że zrozumiale
    pozdrawiam
    Jarek
  • SterControlSterControl
  • Poziom 14  
    Dodany plik to screen żebyś wiedział gdzie są zdefiniowane te zmienne
  • Pomocny post
    Poziom 24  
    Pomyslowy_Dobromir napisał:
    W s& możesz tworzyć fynkcje
    i tym funkcjom przypisujesz wejścia i wyjścia
    wszystko co zaczyna się od # jest właśnie wejsciem albo wyjściem
    Niekoniecznie. Może być także zmienną lokalną.
    Cytat:

    i po kolei:
    L PIB 5
    T #SCHNELL_EINLESEN
    laduj do akumulatora wejście bajt prawdopodobnie analogowe 5
    Dokładniej: wymuś sprzętowe odczytanie wartości bajtu wejść 5 i zapisz odczytaną wartość do akumulatora
    Cytat:

    zapisz zawartość akumulatora #SCH......

    A L 12.4
    = I 5.4
    a L tutaj to jest zmienna lokalna występująca wylko w tej funkcji
    najprawdopodobniej jest ona gdziejsz wyżej uzyta.
    To jest stary trick programistyczny. Do zmiennych lokalnych możesz się dostać albo "po nazwie" (tzn. #nazwa) albo "po adresie". L 12.4 jest właśnie takim przykładem odwołania się "po adresie" i oznacza dokładnie bit 4 w bajcie 12 obszaru zmiennych lokalnych przypisanych do tego konkretnego bloku FB czy FC.
    Dlaczego potem następuje forsowanie wejścia, trudno powiedzieć nie znając układu. Dość prawdopodobne jest, że 4 ostatnie linie Twojego programu mają na celu odczytanie aktualnej wartości I 5.4 bez zmiany pozostałych bitów w IB5. Przez aktualną wartość rozumiem wartość z chwili wykonywania instrukcji, a nie z chwili początku pętli programowej.
  • Poziom 11  
    Dzięki za odpowiedzi. Sprawa nieco się rozjaśniła :)

    krzychol66 napisał:

    Do zmiennych lokalnych możesz się dostać albo "po nazwie" (tzn. #nazwa) albo "po adresie". L 12.4 jest właśnie takim przykładem odwołania się "po adresie" i oznacza dokładnie bit 4 w bajcie 12 obszaru zmiennych lokalnych przypisanych do tego konkretnego bloku FB czy FC.

    To miałoby sens, gdyż w danym FB deklaracja zmiennych:
    TEMP
    0.0 GZ BOOL
    0.1 KORR_WEG BOOL
    0.2 GVZ BOOL
    0.3 IMPULS_WEGERFASSUNG BOOL
    2.0 STRECKE_DOPPELT INT
    4.0 Z10 INT
    6.0 Z13 INT
    8.0 BCD WORD
    10.0 DUMMY INT
    12.0 SCHNELL_EINLESEN BYTE

    ale już w drugim FB dla drugiego, symetrycznego toru transportowego jest:

    TEMP
    0.0 GZ BOOL
    0.1 KORR_WEG BOOL
    0.2 GVZ BOOL
    0.3 IMPULS_WEGERFASSUNG BOOL
    2.0 STRECKE_DOPPELT INT
    4.0 Z30 INT
    6.0 Z33 INT
    8.0 BCD WORD
    10.0 SCHNELL_EINLESEN BYTE

    a fragment kodu:
    L PIB 5
    T #SCHNELL_EINLESEN
    A L 12.6
    = I 5.6

    a więc w deklaracji zmiennych lokalnych nie ma zmiennej o adresie 12. Jak to wytłumaczyć? Dodam, że odwołanie do L 12.4 jak i L12.6 występuje tylko raz w danym FB i jest to w pierwszym segmencie.
  • Poziom 17  
    Witam,

    to chyba jest tak: PLC ładuje bajt z wejścia analogowego PIB 5 w bajt lokalny 12.0 (SCHNELL_EINLESEN). Kwestia co dalej ? Czy dwa ostatnie wiersze nie oznaczają czasem operacji przepisania bitu I5.6 w bit L12.6 - który jest częścią bajtu 12 - czyli SCHNELL_EINLESEN ?

    Pozdrawiam,

    Michał.
  • Poziom 11  
    michasp napisał:
    Witam,

    to chyba jest tak: PLC ładuje bajt z wejścia analogowego PIB 5 w bajt lokalny 12.0 (SCHNELL_EINLESEN).


    Raczej chodzi o pobranie aktualnej wartości i5.6 bezpośrednio z wejścia by uaktualnić wartość i5.6 w obrazie wejść, tak jak pisał Krzychol66. To ma sens, gdyż dany FB jest wywoływany z OB 35 sterowanym czasowo.
  • Poziom 24  
    krzysmci napisał:

    a więc w deklaracji zmiennych lokalnych nie ma zmiennej o adresie 12. Jak to wytłumaczyć? Dodam, że odwołanie do L 12.4 jak i L12.6 występuje tylko raz w danym FB i jest to w pierwszym segmencie.

    1. L 12.4 i L 12.6 nie muszą być zadeklarowane, żeby być... miejsca na stosie jest zazwyczaj dosyć...
    2. Masz do czynienia z typowym błędem programowym: najpierw ktoś dostawał się do tego samego obszaru na 2 sposoby, a potem zmienił deklarację zmiennych lokalnych, więc mu sie położenie schnell_einlesen przesunęło, ale już nie przesunął odwołań bezpośrednich z LB12 do LB10.
    3. najprawdopodobniej zbiegiem okoliczności (tzn. wywołanie kolejno po sobie, takie same deklaracje I/O) oba FB czytają LB12 z tego samego obszaru pamięci fizycznej, więc drugi FB dostaje tam poprawne dane zapisane przez pierwszy FB.
    Niektórzy programiści celowo robią takie błędy, żeby potem nikt oprócz nich nie mógł poprawnie zanalizować programu i dokonać przeróbek...