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

S7-1200 Czyszczenie bloku danych

12 Sie 2019 20:49 168 8
  • Poziom 17  
    Mam napisaną jedną funkcję, która kasuje pętlą for zadany odcinek pamięci plc sterownika a konkretnie to zadany blok danych.

    FOR #COUNTER := 0 TO #LENGTH DO

    POKE_BOOL(area := 16#84,
    dbNumber := #DB_NUM_BLOCK,
    byteOffset := #COUNTER / 8,
    bitOffset := #COUNTER MOD 8,
    value := FALSE);
    END_FOR;

    Spróbowałem to zrobić inaczej np. poprzez funkcję
    FILL_BLK(IN:=_byte_in_,
    COUNT:=_uint_in_,
    OUT=>_byte_out_);


    ale ta funkcja jako argumentu musi mieć tablicę (BOOL lub INT) żeby się poprawnie wykonała.

    W swoim projekcie w danym bloku danych nie mogę sobie zadeklarować tablicy bo pózniej musiałbym sobie tworzyć odpowiednie komentarze dla danego indeksu co utrudniłoby mi w przyszłości analizę programu.

    Czy ma ktoś jakiś pomysł na jakąś sprytną funkcję ?
    Dla S7-300 robią to poprzez wskaźniki i odpowiednią pętlę.
    http://www.plctalk.net/qanda/showthread.php?t=25803
  • Poziom 11  
    Można zrobić to na różne sposoby, ale napisz najpierw jak ma wyglądać struktura Twojego DB?
  • Poziom 17  
    Blok danych nie jest zoptymalizowany z uwagi na to że panel hmi ma zdefiniowane zmienne w sposób DB1.DBX0.0, DB1.DBX0.1....

    Cały blok danych ma zmienne typu BOOL. Nie ma w nim żadnej struktury.
    Zmienne są poukładane w ten sposób
    ZM1:BOOL
    ZM2:BOOL
    ZM3:BOOL
    ..
    ZM99:BOOL
  • Poziom 11  
    S7-1200 Czyszczenie bloku danych

    W tym układzie widziałbym to tak jak na zdjęciu ;)
  • Poziom 17  
    Dzięki za podpowiedź ale tak jak wspomniałem ten sposób znam blok danych też czyszczę pętlą a jeśli we wspomnianym przez Ciebie przykładzie masz użytą tablicę to można to wyczyścić funkcją
    FILL_BLK(IN:=_byte_in_,
    COUNT:=_uint_in_,
    OUT=>_byte_out_);

    Jednak w moim przykładzie w bloku mam zmienne które coś oznaczają. Przykładowo
    SLG
    WPW
    PSP

    itd
    są one poadresowane jako DB1.DBX0.0, DB1.DBX0.1, DB1.DBX0.2 ....
    Funkcja FILL_BLK tego nie wyczyszczę bo musiałbym w tym bloku DB1 mieć zdefiniowaną tablicę tak jak to wygląda na Twoim zrzucie.
    Zastanawiam się czy nie da się tego zrobić jakoś sprytniej niż poprzez tą pętlę co podałem w swoim pierwszym poście.
  • Poziom 11  
    S7-1200 Czyszczenie bloku danych
    A nie można po prostu utworzyć bliźniaczego DB uzupełnionego samymi 0 i zrobić zwykły MOVE ?
  • Poziom 17  
    Może to jest myśl.
    Ja jednak chciałbym zrobić to bardziej uniwersalnie w ten sposób że podaję np. do zmiennej wejsciowej typu variant adres początkowy w postaci wskaźnika i ile danych ma wyczyścić np w ten sposób
    P#DB1.DBX0 WORD 20 lub P#DB1.DBX0.0 BOOL 160.
  • Poziom 11  
    Póki co pomysły mi się wyczerpały ;) ale jak na coś wpadnę to napiszę:)

  • Specjalista Automatyk
    Mógłbyś spróbować funkcji CREATE_DB, stworzyć ją pustą, tylko w Load memory, a później przepisać wskaźnikami przy użyciu READ_DBL, na swoją bazę, którą chcesz wyzerować. Na koniec usunąć DELETE_DB.
    Trzeba tylko pilnować cykli wykonania, bo wszystkie z tych funkcji są asynchroniczne, tzn. mogą się wykonywać przez kilka cykli PLC.