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

Step 7 - konwersja BCD_I nie działa, problem z przepisywaniem Licz1 (Network5)

emper 11 Sty 2009 21:24 2816 7
  • #1 5985079
    emper
    Poziom 12  
    Posty: 43
    Ocena: 1
    1. Czy ktoś mnie może oświecić czemu nie działa mi w tym programie konwersja BCD_I (Network5) ? Licz1 nie przepisuje się do odpowiedniego wejścia.

    Step 7 - konwersja BCD_I nie działa, problem z przepisywaniem Licz1 (Network5)


    2. Czy w step7 są jakieś flagi predefiniowane? W Omronie jest na przykład P_first_cycle, P_On, P_1min. Bardzo przydatne.
  • #2 5986443
    pcichomski
    Poziom 16  
    Posty: 579
    Pomógł: 32
    Ocena: 96
    Nie mam pewności czy tak jest u Ciebie, ale z twojego załączonego obrazka może wyglądać, że monitoring może nie "sięgać" do dolnych networków - tak niekiedy monitoring STEP7 się zachowuje - brak podświetlonych linii poprzedzających funkcje BCD_int. Wówczas przy we/wy pozostają jakieś ostatnie wartości jeszcze z przed utraty monitoringu. Upewnij się jaka jest wartość rejestrów z danymi przy odczycie poprzez VAT_1.

    Napisałem podobny programik, i wszystko działało.
    Pozdrawiam

    Dodano po 12 [minuty]:

    Odnośnie bitów pomocniczych:

    Timery: jeśli w konfiguracji CPU (poprzez Hardware Configuration) w zakładce "Cycle/Clock Memory" zaznaczysz opcję "Clock Memory" i podasz nr bajtu "memory byte", to w tym bajcie będą na poszczególnych bitach pojawiać się impulsy o wypełnieniu 1/2 i okresach (np. mb100):
    m100.0 - 0.1s
    m100.1 - 0.2s
    m100.2 - 0.4s
    m100.3 - 0.5s
    m100.4 - 0.8s
    m100.5 - 1s
    m100.6 - 1.6s
    m100.7 - 2s

    Inne wartości trzeba sobie wygenerować samemu na timerach :)

    Bity typu ALW_ON, ALW_OFF, frst_scn ja osobiście generuje sobie sam (bo nigdy się na nic podobnego nie natknąłem :) )

    Pozdrawiam
  • #3 5986602
    ThoronDC
    Poziom 16  
    Posty: 112
    Pomógł: 17
    Ocena: 9
    Witam

    Network 5 i 6 są zbędne.
    Zamiast pobierać wartości CVBCD, konwertować je na int i dodawać, prościej jest pobrać wartośći CV (wartość licznika jako int) i je dodawać.

    Pozdrawiam
  • #4 5986654
    pcichomski
    Poziom 16  
    Posty: 579
    Pomógł: 32
    Ocena: 96
    ThoronDC napisał:
    Witam

    Network 5 i 6 są zbędne.
    Zamiast pobierać wartości CVBCD, konwertować je na int i dodawać, prościej jest pobrać wartośći CV (wartość licznika jako int) i je dodawać.

    Pozdrawiam


    No nie bardzo: CV jest deklarowane jako WORD (patrz help do S_DU), a dodawać można INT (niby to samo a S7 nie to samo :) ) - próba dodawania rejestrów podpiętych do CV zakończy się "na czerwono" - czyli błąd niezgodności danych - przed dodaniem trzeba to i tak skonwetrować.
    Pozdrawiam
  • #5 5986967
    ThoronDC
    Poziom 16  
    Posty: 112
    Pomógł: 17
    Ocena: 9
    Witam

    Nic nie trzaba konwertować.
    Dla CPU word czy int to to samo.
    W STL nie ma różnicy.
    W LAD, FBD można odchaczyć opcję Type Check of Address
    (Options->Customize->LAD/FBD). Nieraz jest przydatna, ale bardziej utrudnia życie np. w takich przypadkach.

    Pozdrawiam
  • #6 5987265
    pcichomski
    Poziom 16  
    Posty: 579
    Pomógł: 32
    Ocena: 96
    w STL - OK - tu programista musi pilnować zgodności danych.
    Pytanie dotyczyło problemu w LAD - tu jednak warto pilnować typu danych - bo jak się wyłączy sprawdzanie i doda funkcją "add_int" liczby BCD albo s5time (wszystko to jest 16 bitów) to wyjdzie kicha.

    Osobną sprawą jest wyższość / niższość między STL a LAD :) , ale to już nie ten temat.

    Pozdrawiam
  • #7 6000713
    krzychol66
    Poziom 25  
    Posty: 724
    Pomógł: 57
    Ocena: 125
    emper napisał:
    1. Czy ktoś mnie może oświecić czemu nie działa mi w tym programie konwersja BCD_I (Network5) ? Licz1 nie przepisuje się do odpowiedniego wejścia.
    A co to jest "Licz1"?
    Czy to przypadkiem nie jest zmienna typu lokalnego?
    Jeżeli tak, to zauważ, że network 1 wykonuje się tylko co ileś-tam cykli, gdy licznik jest inkrementowany. A network 5 wykonuje się w każdym cyklu. Jeżeli w danym cyklu network 5 się wykona, a network 1 nie, to na wejściu w networku 5 dostaniesz przypadkową wartość Licz1. Najprawdopodobniej 0, ale niekoniecznie. Dlaczego? bo zmienne lokalne po zakończeniu operacji w danym bloku nie są dłużej pamiętane.
    Cytat:
    2. Czy w step7 są jakieś flagi predefiniowane? W Omronie jest na przykład P_first_cycle, P_On, P_1min. Bardzo przydatne.

    Masz bajt z pulsami, tak jak napisał kolega wyżej. Masz też cały zestaw flag specjalnych odpowiadających za diagnostykę procesora, ale w każdym procesorze nieco inny. Flagę "P_First_Cycle" z łatwością zdefiniujesz sobie sam, pamiętając, że jest specjalny blok OB, który wykonuje się 1 raz po każdym starcie procesora, a przed blokiem OB1, który odpowiada za podstawową pętlę programu.
  • #8 6001513
    pcichomski
    Poziom 16  
    Posty: 579
    Pomógł: 32
    Ocena: 96
    Z formatu wyświetlania wyglądają na globalne. Domyślnie lokalne wyświetlane są z #, w " " pokazują się mnemoniki zmiennych zdeklarowanych w Symbol Table.

Podsumowanie tematu

✨ Problem dotyczy nieprawidłowego działania konwersji BCD_I w programie STEP7, gdzie zmienna Licz1 nie jest poprawnie przepisywana w Network5. Możliwe przyczyny to brak monitoringu dolnych networków w STEP7, co powoduje, że wartości wejść/wyjść pozostają nieaktualne. Zaleca się sprawdzenie wartości rejestrów przez VAT_1. Dyskusja wskazuje, że Network 5 i 6 mogą być zbędne, a zamiast konwersji CVBCD na INT lepiej operować bezpośrednio na wartościach CV (WORD), jednak w STEP7 typy danych INT i WORD nie są tożsame i wymagana jest konwersja przed dodawaniem. W STL różnice typów są mniej istotne, natomiast w LAD/FBD warto pilnować zgodności typów lub wyłączyć opcję Type Check of Address, co ułatwia operacje na mieszanych typach danych. Zmienna Licz1 może być lokalna, co powoduje, że jej wartość nie jest zachowywana między cyklami, a Network 1 wykonuje się rzadziej niż Network 5, co skutkuje przypadkowymi wartościami w Network 5. W STEP7 istnieje możliwość definiowania własnych flag specjalnych, np. P_First_Cycle, a także wykorzystania bajtu pamięci cyklu (Clock Memory) do generowania impulsów czasowych. Zmienna Licz1 jest prawdopodobnie globalna, co można rozpoznać po formacie wyświetlania w symbolach programu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA