Jak ustawić wartość odczytaną jeżeli jest błąd transmisjii

Główne forum techniczne dla dyskusji dotyczących problemów przy wytwarzaniu aplikacji PROMOTIC oraz sposobach ich rozwiązania.

Jak ustawić wartość odczytaną jeżeli jest błąd transmisjii

Postby zjacek » Wed 01. Jul 2015 13:54:02

Witam,
odczytuję dane z pewnego urządzenia. Odczytane wartości wyświetlam na panelu jednocześnie mam podłączony moduł Tend i wyświetlam je na wykresie. Jeżeli pojawi się błąd transmisji i nie można odczytać danych na wykresie i panelu wyświetlacza pojawiają się "stare" dane. W jaki sposób np. wyzerować wartości jeżeli były błedy w transmisji.
zjacek
 
Posts: 7
Joined: Wed 01. Jul 2015 13:40:11

Re: Jak ustawić wartość odczytaną jeżeli jest błąd transmisjii

Postby Robert Siwek » Thu 02. Jul 2015 9:06:55

Witam,
w tym celu należałoby np:
do danej zmiennej dodać rozszerzenie danych typu WriteAction. Dla zarzenia "onItemBeforWrite" ustawić "wywołaj przed KAŻDYM ZAPISEM do tej pozycji".
W obiekcie DATA, w zakładce Zdarzenia należałoby stworzyć skrypt, który będzie sprawdzać wartość właściwości Quality obiektu Var.

Następnie na podstawie tej warości można dokonać zmiany właściwości Value danego obiektu Var (wyzerowanie wartości).

http://www.promotic.eu/pl/pmdoc/Objects ... uality.htm

Pozdrawiam
Robert
Robert Siwek
 
Posts: 94
Joined: Thu 13. Dec 2012 9:29:09

Re: Jak ustawić wartość odczytaną jeżeli jest błąd transmisjii

Postby zjacek » Thu 02. Jul 2015 10:26:53

Witam,
dokładnie tak chciałem to zrobić.
Niestety nie chce działać.
Czy mogę prosić o przykład skryptu
zjacek
 
Posts: 7
Joined: Wed 01. Jul 2015 13:40:11

Re: Jak ustawić wartość odczytaną jeżeli jest błąd transmisjii

Postby Kazimierz Heczko » Mon 06. Jul 2015 9:25:34

Witam,

skrypt pownien wyglądać w nastepujący sposób:

Code: Select all
'jezeli chcemy sprawdzanie jakosci i zastepowanie wartosci wykonywac tylko dla niektorych zmiennych
'to jest konieczny nastepujacy warunek
'(moze byc uzupelniony o liste zmiennych, dla ktorych ma byc wykonywany)

If pEvent.Item.Name = "NawaZmiennej" Then
  If pEvent.Item.Quality < 192 Then

    ' 0 - wartosc zastepcza, jaka ma miec konkretna zmienna, dla kazdej zmiennej moze to byc inna wartosc
    pEvent.NewVal = 0
  End If
End If


Pozdrawiam
Kazimierz Heczko
 
Posts: 69
Joined: Thu 13. Dec 2012 9:28:56

Re: Jak ustawić wartość odczytaną jeżeli jest błąd transmisjii

Postby zjacek » Mon 06. Jul 2015 13:03:50

Witam,
dziękuję za przykład, ale niestety coś jest nie tak.
Czy jeżeli jest błąd transmisji i zmienna nie została odczyta to wykona się zadanie onItemBeforeWrite?
zjacek
 
Posts: 7
Joined: Wed 01. Jul 2015 13:40:11

Re: Jak ustawić wartość odczytaną jeżeli jest błąd transmisjii

Postby Kazimierz Heczko » Wed 22. Jul 2015 12:09:50

Witam,

po dokładnym sprawdzeniu wszystkiego stwierdziłem, iż właściwym miejscem do zamiany wartości jest zdarzenie onItemAfterWrite a nie onItemBeforeWrite.
Powodem jest fakt, iż w zdarzeniu onItemBeforeWrite niestety nie ma jeszcze do dyspozycji NOWEJ wartości właściwości Quality, jest tylko nowa wartość zmiennej (w parametrze pEvent.NewValue).
Czyli poprzednio przesłany skrypt powinien zadziałać w zdarzeniu onItemAfterWrite.
Tu jeszcze jedna uwaga, żeby skrypt zadziałał, czyli żeby zdarzenie było wywoływane to dla danej zmiennej MUSI być zdefiniowane rozszerzenie danych typu "WriteAction" i musi być ustawione, kiedy zdarzenie ma być wywoływane. Opis rozszerzenia danych:
http://www.promotic.eu/pl/pmdoc/Objects/Promotic/PmObject/Var/DExtn/ExtWriteAction/Cfg/ExtCfg.htm

Brak takiego ustawienia powoduje, że powyższe zdarzenia nie są wywoływane dla danej zmiennej.

Pozdrawiam
Kazimierz Heczko
 
Posts: 69
Joined: Thu 13. Dec 2012 9:28:56

Re: Jak ustawić wartość odczytaną jeżeli jest błąd transmisjii

Postby zjacek » Thu 23. Jul 2015 14:38:59

Witam,
niestety cięgle coś nie tak.
Ponawiam pytanie.
Czy jeżeli transmisja się nie odbyła (np przerwane połączenie) to czy wykonuje się zdarzenie onItemAfterWrite lub onItemBeforeWrite
Według mnie takie zdarzenia nie wykonują się. Zmienna zapamiętuje ostatnią poprawnie odczytaną wartość lub 0 jeżeli transmisji nigdy nie było.
Chciałbym w momencie błędu transmisji móc ustawić wartość charakterystyczną dla każdej zmiennej np 0
zjacek
 
Posts: 7
Joined: Wed 01. Jul 2015 13:40:11

Re: Jak ustawić wartość odczytaną jeżeli jest błąd transmisjii

Postby Robert Siwek » Thu 20. Aug 2015 7:31:43

Witam,
w przypadku całkowitej utraty komunikacji nie wykonują się zdarzenia onItemAfterWrite i onItemBeforeWrite.
W celu stwierdzenia poprawności odczytania zmiennych ze sterownika można zastosować zdarzenie onDataReceive - zdarzenie objektu PmCommData:
http://www.promotic.eu/pl/pmdoc/Objects ... eceive.htm
Ponieważ komunikacje różnią się od siebie - to rozwiązanie nie działa w przypadku komunikacji PmS7 oraz PmABradleyCIP.
Jaki rodzaj komunikacji zastosował Pan w swoim projekcie?

Robert
Robert Siwek
 
Posts: 94
Joined: Thu 13. Dec 2012 9:29:09

Re: Jak ustawić wartość odczytaną jeżeli jest błąd transmisjii

Postby zjacek » Fri 21. Aug 2015 11:21:17

Witam,
dotyczy to komunikacji M-BUS PmMBus (serial)
zjacek
 
Posts: 7
Joined: Wed 01. Jul 2015 13:40:11

Re: Jak ustawić wartość odczytaną jeżeli jest błąd transmisjii

Postby Robert Siwek » Fri 21. Aug 2015 11:48:29

Witam,

komunikacja M-Bus (serial) należy do grupy, w której można zastosować zdarzenie onDataReceive - zdarzenie objektu PmCommData.
Jedynym warunkiem jest wersja systemu PROMOTIC a mianowicie 8.3.0 lub nowsza.
Przykład debugu (http://www.promotic.eu/pl/pmdoc/Objects ... eceive.htm) :

Dim i,u
u = UBound(pEvent.Items)
Pm.Debug "COMM onDataReceive: Count=" & (u+1) & ", ErrorCount=" & pEvent.ErrorCount
For i=0 To u
Pm.Debug " Name=" & pEvent.Items(i).Var.Name
Pm.Debug " Value=" & pEvent.Items(i).Var.Value
Pm.Debug " Quality=" & pEvent.Items(i).Var.Quality
Pm.Debug " ItemId=" & pEvent.Items(i).ItemId
Next

Robert
Robert Siwek
 
Posts: 94
Joined: Thu 13. Dec 2012 9:29:09

Next

Return to Nie wiem jak zrobić...

Who is online

Users browsing this forum: No registered users and 3 guests

cron