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 tworzenie (logowanie) danych - w plikach csv

vulpes_vulpes 26 Aug 2015 09:13 5571 9
  • #1
    vulpes_vulpes
    Level 10  
    Witam,

    potrzebował bym pomocy z s7-1200 i funkcjami DataLog...
    Przeczytałem to, co jest na supporcie Siemensa, ale przykład przez nich uzyty wydaje mi się za bardzo skomplikowany. Do celów edukacyjnych chciałbym zrobić na początku prostszą formę zapisu danych.

    Stworzyłem sobie projekt, w którym mam licznik. Zegar generowany w PLC symuluje go.
    Następnie w projekcie stworzyłem DB w którym umieszczam wartości liczników. Zakładam, że będą to liczniki czegoś tam na zmianach, dlatego mam w DB "wartosc_akt" aktualizowana co 10s, i "licznik_zm_n-1", "licznik_zm_n-2" i "licznik_zm_n-3". Funkcją MOVE przesuwam o wybranych godzinach liczniki tak, że w pamięci zostają wartości ostatnich 3 zmian + aktualny. Wartości liczników to DWord ze względu na spodziewaną wysoką wartość licznika.

    DataLog służyć miałby zapisowi wartości liczników z większego okresu, powiedzmy na razie 100 zapisów. Ew później wartości te miały by być prezentowane jako trend na www generowanej z PLC.
    Format, na obecną chwilę w celu zrozumienia działania, miałby być:



    >>czas, wartość licznika,<<

    w późniejszej wersji

    >>czas, wartość licznika1, wartość licznika2, wartość licznika3,<<

    (będzie zliczanie z kilku stanowisk)

    Miałem pisać jak to zrobiłem ale w trakcie pisania doszło do mnie, że jet to kompletnie źle, choć nie wiem jak ma być dobrze. Czy ktoś może łopatologicznie wyjaśnić mi jak praktycznie używać bloki DataLogCreate_DB i DataLogWrite_DB?
    Czy w każdym cyklu muszę wykonywać Create, potem Open, potem Write i Close?
    Niby tylko Create ma możliwość podpięcia DATA ale czy nie jest tak, że wywołanie Create wyzeruje blok danych?
  • Helpful post
    #2
    Yasounet
    Level 11  
    Hej,

    Z tego co pamiętam ponowne wykonanie DataLogCreate zwróci po prostu 8093 - data log already exists.

    Najprościej się chyba do tego zabrać jednorazowo tworząc log (jest on automatycznie otwierany, można to zrobić np w OB100), zaś jeśli DataLogCreate zwróci 8093, to wykorzystać funkcję DataLogOpen. Na wejście "DATA" wykorzystać jakaś strukturę w której umieszczać będziesz potem swoje pomiary. Dalej zostaje już tylko generowanie co jakiś czas impulsu, który wrzuca pomiary (aktualne i poprzednie) do struktury przypisanej do "DATA", wywołuje DataLogWrite i voila, będzie smigać.

    Jakiś przykładowy kod który to obrazuje -
    OB100
    Code: scl
    Log in, to see the code

    no i sam blok
    Code: scl
    Log in, to see the code


    Na koniec przyznam, że nie korzystałem z datalogów bardzo dużo i możliwe, że istnieje znacznie łatwiejsze rozwiązanie takiego problemu - mi wystarcza że powyższe działa :)
  • #3
    vulpes_vulpes
    Level 10  
    OK dzięki.
    Ja zrobiłem to trochę inaczej, na blokach. Napiszę, może komuś się przyda.

    Wstawiłem 3 bloki do programu FC1.
    OB100 darowałem sobie, nie wiem czemu ale po wykonaniu w OB100 utworzenia bloku kolejne funkcje nie widziały utworzonej struktury.
    Na pewno można to zrobic bardziej kompaktowo, na FB nie FC jednak mi tak było jakoś jaśniej na początek.

    Na początek tworzymy strukturę. 100 wpisów, o nazwie i id którą pobierze sobie z DB TAGI. Dane również będą w tym DB ale będą aktualizowane co pewien okres. Id i nazwa będą stałe.

    Do nazwy wpisujemy string 'nazwa', Wywołanie bloku DB4 robimy raz, co kontrolujemy zmienną dataLog_created.

    S7-1200 tworzenie (logowanie) danych - w plikach csv

    Być może u mnie OB100 nie sprawdziło się, bo DB4 wymaga do stworzenia struktury więcej niż 1 cyklu?

    Dalej otwieramy w 2 kroku strukturę 'nazwa', tag DataLog_Open zameiniamy po wykonanej operacji na 2:

    S7-1200 tworzenie (logowanie) danych - w plikach csv

    Nie jestem do końca pewien czy potrzebuję tu otwierać tą strukturę, teoretycznie nie, ponieważ po utworzeniu jest domyślnie otwarta. Jest to chyba dobra praktyka, jeśli struktur było by więcej.


    Na koniec Write:

    S7-1200 tworzenie (logowanie) danych - w plikach csv

    wykonywane po utworzeniu i po otwarciu, co minutę, o 11 sekundzie każdej minuty (mam zaprogramowany zegar czasu rzeczywistego).

    Struktura wygląda następująco:

    S7-1200 tworzenie (logowanie) danych - w plikach csv

    wartości są te same, ponieważ mam symulowany impuls timerem, który daje na 1 minutę (okres odczytu) tyle samo impulsów +/- 1 za każdym razem.

    Dla większej ilości logów należało by jeszcze zastosować instrukcję close.



    A teraz jeszcze jedno moje pytanie:
    mam strukturę jednowymiarową, zapis z jednego źródła.
    Czy da się stworzyć strukturę z zapisem większej ilości zmiennych?
    Czyli:

    z obecnej:
    2803, 8/28/2015,13:50:11, 1493
    na np taką:
    2803, 8/28/2015,13:50:11, 1493, 2313, 913, 14113
  • Helpful post
    #4
    Yasounet
    Level 11  
    Jasne, zmień tylko typ zmiennej "dane" w db "TAGI" na 'struct', np tak:

    S7-1200 tworzenie (logowanie) danych - w plikach csv
  • #5
    vulpes_vulpes
    Level 10  
    OK, spróbuję. Dzięki.
  • #6
    grabek_radek
    Level 21  
    A jak zrobić zapis do osobnych kolumn dla CSV?
    w chwili obecnej mam jedną kolumnę w której dane oddzielone są przecinkami
    S7-1200 tworzenie (logowanie) danych - w plikach csv
    a potrzebuje coś takiego
    S7-1200 tworzenie (logowanie) danych - w plikach csv
    bloczek do tworzenia
    S7-1200 tworzenie (logowanie) danych - w plikach csv
  • #7
    Yasounet
    Level 11  
    Format CSV z definicji zapisuje dane po przecinku (CSV - comma-separated values, wartości rozdzielone przecinkiem). Dane można odpowiednio formatować podczas importu np. do programu excel (typ pliku : rozdzielany, ograniczniki : przecinek).
  • #8
    grabek_radek
    Level 21  
    dziwne bo na filmiku

    czas 17:13 nic nie robi tylko otwiera
  • #9
    Yasounet
    Level 11  
    Z bardzo prostego powodu, Excel automatycznie formatuje pliki CSV na podstawie opcji regionalnych systemu operacyjnego. Dla osoby na filmiku (najprawdopodobniej z językiem systemu ustawionym na angielski) separatorem listy jest właśnie przecinek, w języku polskim standardowym znakiem jest średnik. Jeśli chcesz aby Excel automatycznie otwierał pliki csv już podzielone na kolumny, zmień ustawienia regionalne systemu (symbol dziesiętny z przecinka na kropkę, separator listy z średnika na przecinek).
  • #10
    grabek_radek
    Level 21  
    Yasounet czy bawiłeś się kiedyś w stworzenie trendu na webserver aby wyświetlał zmiennną w czasie ?
    ogólnie chciałem cos takiego zrobić ale nie znam javascript i poszukuje jakiegoś gotowego rozwiazania
    Link