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

Jak wykryć i odroczyć odpytywanie wyłączonych sterowników w HMI LS eXP40-TTA/DC?

matrix0891 02 Maj 2017 13:49 741 3
  • #1 16449834
    matrix0891
    Poziom 11  
    Posty: 18
    Witam mam taki problem.

    Pod panel HMI LS eXP40-TTA/DC mam podpiętych 17 sterowników z każdego sterownika odczytuje cyklicznie co 10 sec. po ok 5 rejestrów ( temperatura i stany wyjść przekaźników w sterownikach).

    Wszystkie dane wyświetlane są na ekranie głównym HMI i wszystko działa ładnie ale w przypadku wyłączenia kilku sterowników (wyłączając im zasilanie) TIMEOUT-y przy próbach odpytywania wyłączonych sterowników koszmarnie wydłużają czas odświeżania informacji ze sterowników które są aktywne.

    Czy jest jakaś możliwość np za pomocą skryptu na HMI wykrywać który sterownik i o jakim adresie ModBUS stracił komunikację??

    Było by to bardzo pomocne gdyż mając taką informację można by odroczyć odpytywanie takich sterowników na jakiś okres celem poprawienia czasu odpytywania sterowników aktywnych w tym czasie.



    Zrobiłem coś takiego. Ale nie do końca działa jak bym chciał.

    1. Każdy z 17 sterowników ma przypisany skrypt który jest wykonywany co minutę (każdy sterownik w innej sekundzie ustawione w SCHEDULER.).

    Skrypt próbuje odczytać wartość rejestru ModBUS sterownika nr:7 W:0:#7:400117 jest to rejestr ON/OFF i ma wartość 1 lub 0.
    Gdy wartość rejestru odczyta jako 1 lub 0 znaczy że jest komunikacja ze sterownikiem. Tym samym warunek
    if (@[W:0:#7:400117]==1||@[W:0:#7:400117]==0) zostanie spełniony i skrypt wykona zadanie @[W:HW00105] = @[W:HS0008];
    czyli przepisze sekundy z zegara RTC do innego rejestru w HMI. Rejestry będą miały tą samą wartość dopóki HMI będzie mógł odczytać wartość 1 lub 0 z rejestru W:0:#7:400117 urządzenia modbus.

    if (@[W:HW00055]==0) //HW00055 – wartość opóźnienia jaka zostanie przypisana przy braku komunikacji.

    {

    if (@[W:0:#7:400117]==1||@[W:0:#7:400117]==0) //W:0:#7:400117 – adres rejestru sterownika ModBUS wartość zawsze 1 lub 0 ON/OFF

    {

    @[W:HW00105] = @[W:HS0008]; // przepisanie sekund z HS0008 do HW00105
    @[X:HW00001.5] = true; // Triger poprawnej komunikacji z urządzeniem np. do startu logowania temperatury itd.

    }
    }

    2. Następnie inny Skrypt (globalny) uruchamiany co 30 sekund, sprawdza różnice między rejestrami HS0008 i HW00105.

    Jeśli różnica wystąpiła znaczy ze nie ma komunikacji i sekundy z zegara RTC nie są przepisywane z powodu braku odczytu wartości z rejestru ModBUS.
    Następnie skrypt przypisuje do rejestru W:HW00055 ustaloną wartość która zmniejsza się o 1 za każdym uruchomieniem skryptu,
    powodując odroczenie odpytywania urządzenia ModBUS na określoną liczbę cykli.

    // Sterownik modbus nr 7

    if (@[W:HS0008]-@[W:HW00105]>1&&@[W:HW00055]==0) // sprawdzanie czy wystąpiła różnicamiędzy@[W:HW00105] a @[W:HS0008] przez brak mozliwośći odczytania rejestru @[W:0:#7:400117].
    {
    @[W:HW00055]=2; //jeśli róznica wystąpiła niepróbuj przez kolejnych 30 cykli odczytu urządzenia slave
    @[W:HW00015] = 9999;
    @[X:HW00001.5] = false; // nadpisz ostatnią poprawną wartość(odczyt temperatury) zapisaną w rejestrze wartością nie //poprawną zeby było wiadomo ze jest błąd odczytu.

    }
    else if (@[W:HW00055]>0) //odejmuj co cykl od @[W:HW00055] aż dojdzie do 0.
    {
    @[W:HW00055]–;
    }

    Program działa ale bardzo blokuje się komunikacja i odczyty po kilku minutach dopiero się aktualizują.
    Okazuje się że pomimo tego ze skrypt 1 ustawiony jest w SCHEDULER aby wykonał się co minute w np.: 12 sekundzie i generalnie tak się dzieje triger ustawiany jest zgodnie z czasem ustawionym w SCHEUDLER.
    To przy przerwaniu komunikacji HMI wyrzuca timeout mimo że skrypt nie powinien być wykonywany.
    Nawet przy niespełnieniu warunku wykonania skryptu 1 czyli if (@[W:HW00055]==0) nadal cyklicznie co ok sekundę wyrzuca timeout.

    Nie mam już pomysłów jak wybrnąć z tego problemu , będę wdzięczny za każdą pomoc.
  • #2 16455378
    szczupx
    Poziom 19  
    Posty: 555
    Pomógł: 29
    Ocena: 94
    najprostsze rozwiązanie: jeśli jest taka możliwość w sterowniku komunikacji to:
    - zmniejsz czas oczekiwania na odpowiedź (timeout na kilkadziesiąt ms)
    - zmiejsz ilość prób ponowienia odczytu (1 lub 2)
    kombinowanie z takimi skryptami to rzeźba straszna i ciężko uzyskać dobre rezultaty.
  • #3 16462598
    matrix0891
    Poziom 11  
    Posty: 18
    Timeout mam ustawiony na 1000ms i mniej się nie da ustawić.
    Co do ilości prób ponowienia odczytu to mam ustawione na 0.
    Ale i tak jest to niedoprzyjęcia.
  • #4 16462701
    szczupx
    Poziom 19  
    Posty: 555
    Pomógł: 29
    Ocena: 94
    spróbuj ugryźć temat z innej strony - nie wyłączaj sterownikom zasilania :)
    piszesz że czytasz 5 rejestrów, czytasz to jednym zapytaniem czy rozbijasz na 5?
REKLAMA