Elektroda.pl
Elektroda.pl
X

Search our partners

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

S7-1200 i blok danych DB - pomoc w pisaniu programu

toke12 11 Apr 2012 20:31 8089 16
SterControl
  • #1
    toke12
    Level 10  
    Witam,

    proszę o podpowiedź lub jakąś wskazówkę...kawałek programu to byłoby niebo.

    Program (w skrócie) powinien mierzyć czas trwania sygnału zera i jedynki na dowolnym wejściu.
    Czas badania sygnału pojawiającego się na wejściu ma trwać np. 3 minuty.
    Chciałbym zapamiętać pięć wyników (czasów) dla np. zera. Czyli po każdym badaniu sygnału chcę zapisać ten czas.
    Do tego należy użyć bloku DB.
    Tworzę taki blok np. DB4 typ danych określam jako czasowe (time) i dla step7 basic są one 32bitowe.
    I teraz tak pierwsza zdeklarowana zmienna time w bloku DB ma adres:
    DB4.DBD0 "pomiar_1"
    DB4.DBD4 "pomiar_2"
    DB4.DBD8 "pomiar_3"
    .
    ostatnia piąta
    DB4.DBD16 "pomiar_4"

    mój problem polega na tym, że nie wiem jak zapisać w tym bloku DB te czasy.
    Należy użyć funkcji move? aby to zrealizować? No i jak zmieniać adresy co kolejne badanie poprzez instrukcje inkrementacji?

    Z góry dziękuję za pomoc
  • SterControl
  • #2
    ElMapet
    Level 20  
    sygnał detekcja zbocza narastającego albo opadającego

    i dalej 1 impuls

    -(p) - (m0.0)
    - M0.0 - move
    DBD12 do DBD16
    - M0.0 - Move
    DBD8 do DBD12

    na DBD0 Move czas z tamiera


    każdy zapalany krótkim impulsem z detekcji

    to najprościej

    jest też chyba funkcja datalog
    ale nie jej jeszcze nie używałem wiec tylko mrugnęła mi wiedza o tym
  • #3
    krzysiekj18
    Level 19  
    Proponuję użyć podwójnej tablicy (x,y) gdzie x to nr. wiersza a y to nr. kolumny.
    Następnie w języku SCL (wymagany TIA v11 sp2) odwołujesz się w bardzo prosty sposób do danej komórki tablicy np.:

    Tablica -> Array [0 .. 25, 0..1] of Time

    pomiar_low := Tablica (NrPomiaru, 0);
    pomiar_hig := Tablica (NrPomiau, 1);
    NrPomiaru := NrPomiaru + 1;
  • SterControl
  • #4
    toke12
    Level 10  
    No niestety nie mam tej wersji programu, moja wersja to TIA v10.5 SP2..
    a opcja użycia za każdym razem funkcji move no dobrze...tu potrzebuję zapisać pięć wyników...a co w przypadku gdy będę potrzebował pięciuset...trzeba dać ekstra pięćset linii w programie na realizację?
    Myślę, że jest jakiś myk na to i da się to zrealizować łatwiej w LAD...
    wspólny mianownik tego problemu w LAD i SCL to zapis do tablic?
  • #5
    Miglans_87
    Level 13  
    Możesz użyć tablicy.

    DB4.[pointer] = pomiar;
    pointer++;

    Tylko zmieniasz zmienną pointer.
  • #6
    toke12
    Level 10  
    Ostatnia propozycja nie wchodzi w grę, wersja programu nie pozwala na to no chyba, że się mylę.
  • #7
    Klakier74
    Level 15  
    Użyć bloczka FieldRead i FieldWrite. Elegancko tworzy i adresuje tablicę w 10.5
  • #8
    ElMapet
    Level 20  
    no cóż, moj pomysł był łopatologiczny

    ale chętnie zobaczę jak robi się coś takiego dla S7-300 w LD albo FBD
  • #9
    Miglans_87
    Level 13  
    Miglans_87 wrote:
    Możesz użyć tablicy.

    DB4.[pointer] = pomiar;
    pointer++;

    Tylko zmieniasz zmienną pointer.


    Używałem ten sposób na step 7 przy sterowniki S7-300. Miałem nadzieje że w S7-1200 też będzie działało.
  • #10
    ElMapet
    Level 20  
    można prosić o całą instrukcję,
    najlepiej program ze stepa
  • #11
    Klakier74
    Level 15  
    W 10.5 można tylko pisać bodajże w LAD i FDB. Nie ma obsługi tablicy jako takiej.
    Tylko powyższe bloczki zapewniają adresowanie pośrednie. Bloczki zresztą są w kompilatorze przez pomyłkę i nie ma ich w helpie.
  • #12
    ElMapet
    Level 20  
    S7-1200 i blok danych DB - pomoc w pisaniu programu

    1.
    OPN DB 4
    L DBD 2
    SLD 3
    LAR1
    L #pomiar
    T DBD [AR1,P#0.0]
    2.
    L DBD 2
    L L#4
    +D
    T DBD 2
    3.
    L DBW 6
    L 4
    *I
    L 8
    +I
    ITD
    L DBD 2
    >D
    BEC
    4.
    L L#8
    T DBD 2


    Funkcja wpisuje wartości do tablicy
    przy przepełnieniu wpisuje od nowa, najstarsze kasując.

    jak to zmodyfikować aby
    na 6.0 był zawsze najmłodszy pomiar
    im dalej na 8.0 wchodziły starsze
  • Helpful post
    #13
    Klakier74
    Level 15  
    Ładny program tylko, po co? do tego służą bloczki FC85 FIFO i FC87 LIFO, do tego FC 84 ATT ( i oczywiście FC 86 jak ktoś potrzebuje ).
    Zresztą program jest napisany na 300 i jest nieprzydatny bo kolega ma program na 1200 ze starą wersją poniżej V2.0 ( do tego pracuje na 10.5 gdzie jest tylko LAD i FDB a sterownik nie przewiduje adresowania pośredniego ).

    Jak pisałem można użyć 2 bloczki adresowania pośredniego.
    Nie jest to oficjalnie wspierane bo sterownik nie maił adresować pośrednio, ale jakiemuś programiście się omsknęło i bloczki zostały.

    FieldRead - służy do odczytu z tabeli danej zmiennej od zadanego indexu
    FieldWrite - to samo tylko zapis

    FieldRead
    Bloczek ma 3 parametry
    INDEX - index z tablicy
    MEMBER - początkowy adres tablicy
    VALUE - wartość zwracana
    dla bloczka wybiera się też z jakiego typu zmienne jest zbudowana tablica
    ( oczywiście lepiej tablicę założyć wcześniej np. Zadana Array [0..299] of real )

    FieldWrite - podobnie tylko odwrotnie.

    Do bloczku dostajemy się specyficznie. Wstawimy pusty ( taki z 2 znakami zapytania ), rozwijamy listę instrukcji i szukamy na samym dole. Nie ma do niego helpa i instrukcji bo to pomyłka i bloki "nie istnieją". Natknąłem się na nie przez przypadek ale pracują bez zarzutu na kilkunastu instalacjach.
  • #14
    tysky
    Level 12  
    Czołem,

    Opis FieldRead i FieldWrite, a także wszystkich nowych funkcji znajduje się w manualu (s7-1200 System Manual) do s7-1200.

    Pozdrawiam
  • #15
    toke12
    Level 10  
    Witam po przerwie.Niestety nie mogłem wcześniej napisać.
    Klakier zgadza się Twoje rozwiązanie jest idealne jak chodzi o zapis danych.
    W bloczku FiledWrite należy:
    Index (zmienna DInt) inkrementować zmienną zaczynając od pierwszego indexu
    i jeśli zdeklarowana tablica jest od array[2..30] of Real to pierwszy index jest 2

    Value w skrócie wartość którą chcemy zapisać

    Member pierwsze miejsce w DB gdzie chcemy zapisać zmienną Value.

    Dzięki i pozdrawiam.

    p.s.
    aktualizacja TIA 10.5 do wersji V11 umożliwia programowanie w SCL?
  • #16
    krzysiekj18
    Level 19  
    TIA v11 umożliwia pisanie programów w SCL.
    Jedynie musisz mieć zainstalowane wszystkie poprawki (zwłaszcza SP2).