Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Siemens S7-300 - przesuw danych w DB

pcichomski 13 Mar 2009 23:35 3769 6
  • #1
    pcichomski
    Level 16  
    Mam taki problem: W sterowniku jest DataBlock, w którym archiwizowane są pewne dane (struktura ILOSC, DATA, GODZINA). Danych tych ma być przechowywanych 500, nowa jest wpisywana na początku DB, historyczne przesuwane o 1 w dół, 500-na przepada.

    Czy jest w S7-300 jakaś funkcja biblioteczna, która załatwiła by taki przesuw automatycznie (d0>d1, d1>d2,...d499>d500, d500>"kosz") bez konieczności "rzeźbienia" stosownej pętli programowej?

    Pozdrawiam
  • #2
    gregor50+
    Level 19  
    Jest to rejestr FIFO .Wydaje mi się że jest taka funkcja ale nie jestem pewien na 100 % czy to jest w S7.
  • #3
    andy1955
    Automation specialist
    Funkcja FiFo - FC 85 w "TI-S7 Convertings Blocks" może tą sprawę załatwić
    jeżeli rzeczywiście chodzi o przesunięcie o jedno słowo (word) w dół.
    Nie wiem czy dobrze zrozumiałem ale u ciebie :
    Quote:
    archiwizowane są pewne dane (struktura ILOSC, DATA, GODZINA)

    czyli są to trzy wartości dotyczące jednego zdarzenia, które powinno się równocześnie zapisać lub zmazać.
  • #4
    pcichomski
    Level 16  
    Zdefiniowana jest struktura UDT:
    ILOSC - WORD (16 bitOw)
    DATA - Date (16 bitów)
    CZAS - TimeOfDay (32 bity)

    A więc długość rekordu wynosi 4xWORD i o tyle muszę przesunąć dane przy nowym zapisie.

    Pozdrawiam
  • #5
    suchcio
    Level 12  
    polecam funkcję block move z parametrem typu ANY.

    W helpie jest cala składnia.

    Należy pamiętać że ta funkcja działa na poziomie oesu i jeżeli podasz błędnie zakresy to CPU tego nie sprawdzi tylko nadpisze bity deformujący np inne dane. (np pierwszy bit z 32 Dworda)- co zmieni jego wartość drastycznie.
  • #6
    andy1955
    Automation specialist
    Myślę,że bez paru linijek z adresowaniem pośrednim się nie obejdzie.
  • #7
    Allmar
    Level 15  
    Najprosciej zrobic sobie samemu petle ktora bedzie Ci za kazdym razem zapisywala nowe zmienne w kolejne miejsca DB. Mozna to zrobic jak kolega powyzej wspomnialal za pomoca adresowania posredniego. Przykladowy programik:
    - w pierwszym cyklu ladujesz do DB1.DBD100 pointer 0.0 - takie jakby odwolanie do adresu
    - za kazdym zboczem narastajacym bitu M0.1 wartosc 50 ladowana jest do DB1 w co drugi Bajt i za kazdym razem adres zwiekszany jest o 2 i umieszczany znow w DB1.DBD100
    Prosta przerobka programu bedzie odpowiednia dla twojego zadania (ladowanie zmiennej zamiast liczby 50, zwiekszanie adresu o dowolna wartosc, itd...)

    OB100:
    L P#0.0
    T DB1.DBD 100

    OB1:
    A M 0.0
    FP M 0.1
    JNB _001

    OPN DB 1
    L 50
    T DBB [DBD 100]
    L DBD 100
    L P#2.0
    +D
    T DBD 100

    _001: NOP 0