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

Siemens S7-300 - automatyczne przesuwanie danych w DataBlocku, funkcja?

pcichomski 13 Mar 2009 23:35 4018 6
  • #1 6278691
    pcichomski
    Poziom 16  
    Posty: 579
    Pomógł: 32
    Ocena: 96
    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 6281990
    gregor50+
    Poziom 19  
    Posty: 301
    Pomógł: 13
    Ocena: 33
    Jest to rejestr FIFO .Wydaje mi się że jest taka funkcja ale nie jestem pewien na 100 % czy to jest w S7.
  • #3 6283389
    andy1955
    Specjalista Automatyk
    Posty: 700
    Pomógł: 136
    Ocena: 50
    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 :
    Cytat:
    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 6285672
    pcichomski
    Poziom 16  
    Posty: 579
    Pomógł: 32
    Ocena: 96
    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 7289710
    suchcio
    Poziom 12  
    Posty: 15
    Pomógł: 3
    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 7290156
    andy1955
    Specjalista Automatyk
    Posty: 700
    Pomógł: 136
    Ocena: 50
    Myślę,że bez paru linijek z adresowaniem pośrednim się nie obejdzie.
  • #7 7307065
    Allmar
    Poziom 15  
    Posty: 85
    Pomógł: 16
    Ocena: 3
    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

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem automatycznego przesuwania danych w DataBlocku sterownika Siemens S7-300, gdzie archiwizowane są rekordy o strukturze UDT (ILOSC - WORD, DATA - Date, CZAS - TimeOfDay) w liczbie 500. Nowe dane mają być wpisywane na początek, a starsze przesuwane o jedno miejsce w dół, przy czym najstarszy rekord jest usuwany. Zapytano o istnienie w S7-300 funkcji bibliotecznej realizującej takie przesuwanie bez konieczności pisania własnej pętli. W odpowiedziach wskazano na funkcję FIFO (FC 85) z pakietu "TI-S7 Convertings Blocks", która może przesuwać dane o jedno słowo, jednak wymaga dopasowania do struktury rekordu. Alternatywnie polecono użycie funkcji Block Move z parametrem typu ANY, umożliwiającej przesunięcie bloków danych, choć wymaga ostrożności przy adresowaniu, aby nie uszkodzić innych danych. Wskazano również, że najczęściej konieczne jest napisanie własnej pętli z adresowaniem pośrednim, co pozwala na precyzyjne zarządzanie przesuwaniem i zapisem danych w DB. Przykładowy kod pokazano, jak za pomocą adresowania pośredniego i zmiennego wskaźnika można realizować przesuwanie i zapisywanie kolejnych rekordów w DataBlocku.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA