Elektroda.pl
Elektroda.pl
X

Search our partners

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

Step7, adresowanie bitu, zmiennej wyjściowej bajtowej funkcji FC.

PROAT 31 Jul 2011 21:35 5610 9
SterControl
  • #1
    PROAT
    Level 13  
    Witam

    Mam mały problem. Mianowicie w funkcji FC, używam kilku bitów wyjściowych, ale wolałbym je włożyć do bajtu i nie wiem jak zaadresować prawidłowo zmienną.

    Przykładowo MB 100, składa się z M100.0 do M100.7, ale jak wpisać pierwszy bit zmiennej #PM która jest typu byte? #PM0.0 do #PM0.7

    Drugie pytanie z tego samego typu.

    Jak stworzyć funkcję FC ze zmiennymi wejściowymi i wyjściowymi, których to nie trzeba wszystkich wykorzystywać, tzn. jak wywołuje wcześniej zrobiona przeze mnie funkcje, to musze podpiąć wszystkie wejścia i wyjścia, nie mogę zostawić niektórych pustych, a funkcje z biblioteki stepa można wywoływać bez podpinania koniecznie wszystkich zmiennych.

    pozdrawiam
  • SterControl
  • Helpful post
    #2
    Rkarcz
    Automation specialist
    Pytanie 1:

    Możesz w Symbol Table dodać

    Bit0 M0.0 BOOL

    oraz

    Byte0 MB0 BYTE

    i spokojnie adresować po symbolice

    A ZMIENNA
    = bit0

    L B#16#0
    T Byte0

    i w obu przypadkach odwołujesz się do tej samej przestrzeni adresowej.

    Pytanie 2:

    Zrób FB. W FB będziesz miał DB_Instance i możesz podglądać co się dzieje w bloku, ale i nie musisz podpinać wszystkich zmiennych.

    Pzdr
  • SterControl
  • Helpful post
    #3
    User removed account
    User removed account  
  • #4
    PROAT
    Level 13  
    Dzięki za odzew.

    Jeszcze raz przedstawię problem.

    Funkcja FC daje mi 8 wyjść typu BOOL od P0 do P7, a ja chce to złożyć w jeden bajt PM.

    Co musze zrobić?

    1. Zamiast wyjść zrobic TEMP, to jasne .

    2. Zrobić sobie zmienną PM_tmp typu byte, jasne

    3. Network1:
    MOVE PM do PM_tmp OK, rozumiem.

    4. Network2:
    |---|L0.0|---(L0.1) i tu nie rozumiem. Jeżeli L(0.0)=1 to L(0.1)=1?
    Rozumiem chyba że L0.0 to wskaźnik i ja mam go przesuwać od L0.0 do L0.7 i wtedy przykładowo, jak ustawie wskaźnik na L0.0 to, moge zrobic move P0 do PM? Nie da się zrobic move pomiędzy bool a byte.

    Pozdrawiam
  • #5
    Rkarcz
    Automation specialist
    Wejścia zostaw jako wejścia, stwórz zmienną OUT typu WORD

    TAR2
    L P##QWord
    +I
    LAR1

    A IN0
    = DIX [AR1,P#1.0] // bit 00
    :
    :
    A IN7
    = DIX [AR1,P#1.7] // bit 07

    A IN8
    = DIX [AR1,P#0.0] // bit 08
    :
    :
    A IN15
    = DIX [AR1,P#0.7] // bit 15
  • #6
    User removed account
    User removed account  
  • #7
    Rkarcz
    Automation specialist
    Niestety LAD w tym wypadku ma jedną podstawową wadę... :-) Ano niestety adresuje po L0.0 - czyli konkretnym adresie. I jakiekolwiek przetasowanie zmiennych powoduje zmiany w logice FB... :-)

    A w STL używając AR2 przy otwartym FB, DB jednynie należy pamiętać o jego zerowaniu:

    L 0
    T AR2

    po operacjach na pointerach - inaczej PLC nie wie w jakim DB, DBInstance się znajduje... :-)
  • #8
    bhtom
    Level 38  
    PROAT wrote:

    Jak stworzyć funkcję FC ze zmiennymi wejściowymi i wyjściowymi, których to nie trzeba wszystkich wykorzystywać, tzn. jak wywołuje wcześniej zrobiona przeze mnie funkcje, to musze podpiąć wszystkie wejścia i wyjścia, nie mogę zostawić niektórych pustych, a funkcje z biblioteki stepa można wywoływać bez podpinania koniecznie wszystkich zmiennych.

    Jeśli nie chcesz "podpinać" wszystkich wejść w zmiennych wejściowych funkcji, to jeśli są to zmienne BOOL to możesz w to miejsce podpiąć znacznik "zawsze zero", powinieneś mieć taki stworzony w programie. Co do niewykorzystanych wyjść, stwórz zmienne tymczasowe. W zależności jakie masz te zmienne (BOOL,INT, itp.) Stwórz po jednej zmiennej z danego rodzaju i powstawiaj. Nie zależy Ci przecież na wartości tej zmiennej, możesz więc wstawić jedną w kilka miejsc. Oczywiście musi się zgadzać typ zmiennej.
    Pozdrawiam.
  • #9
    PROAT
    Level 13  
    Dzięki wielkie Panowie.

    Oba sposoby działają, zarówno na znacznikach (czego wcześniej jeszcze na S7 nie robiłem, a jest to jak widzę proste), jak i przez zmienne lokalne (że też na to nie wpadłem :) ).

    Co do drugiego pytania, to mi chodziło czy można zrobić FC ze zmiennymi IN, OUT których możemy nie podpinać, bo to że trzeba podpiąć jakiś marker, nawet kilka razy ten sam, to wiem. Rozumiem że w FC trzeba podpinać wszystkie wejścia wyjścia które się zadeklarowało, dalej nie drążę. Jak będę chciał zrobić bardziej uniwersalny bloczek to użyję zamiast FC, FB co załatwi sprawę.

    Jeszcze raz dzięki. Problem rozwiązany, temat do zamknięcia.
  • #10
    Rkarcz
    Automation specialist
    W przypadku FC zawsze masz żądanie podania zmiennej bo system jej fizycznie nie ma - FC jest logiką zgrupowaną pod jednym wywołaniem ze stosem zmiennym lokalnych - TEMP. Pamiętaj też, że zmienne TEMP muszą być "czytane" po ich wpisaniu, nigdy przed - dotyczy to także FB.

    W przypadku FB masz zmienne IN/OUT/IN_OUT w DB_Instance, które możesz nadpisywać coś na te wejścia podając, ale nie musisz. FB ma tą przewagę, że zmienne masz poukładane w DB, a nie masz śmietnika w Symbol Table - przynajmniej z mojego punktu widzenia. No i wielokrotne wywołanie tego samego FB nie zabiera Ci czasu na "tworzenie" zmiennych ręcznie, czy to jako Markery, czy DB. A czas to pieniądz... :-) Nawet jak nie Twój to pracodawcy, czy klienta.