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.
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.