Просмотр полной версии : ПЛК160 v1.2.42 reset by watchdog! каждых 50 дней
Добрый день. Столкнулся с проблемой периодического сброса плк по watchdog с равными интервалами времени. Смущает что интервал близок к макс. значению переменной типа TIME - 4194967295ms(49d17h2m47s295ms)
Если посмотреть debug.txt из этой темы https://owen.ru/forum/showthread.php?t=36247 - интервал сброса по watchdog в этих же пределах!
Добрый день. Столкнулся с проблемой периодического сброса плк по watchdog с равными интервалами времени. Смущает что интервал близок к макс. значению переменной типа TIME - 4194967295ms(49d17h2m47s295ms)
Ищи где у тебя в программе таймер переполняется.
Ищи где у тебя в программе таймер переполняется.
Переполнение таймера может приводит к ресету по watchdog?
Таймеры TON, TOF, TP ограничены PT, я думаю их тяжело переполнить. Функция TIME() возвращает время в миллисекундах от начала работы системы в формате TIME должна наверное с нуля начать или нет?
kondor3000
16.06.2022, 13:25
Таймеры TON, TOF, TP ограничены PT, я думаю их тяжело переполнить. Функция TIME() возвращает время в миллисекундах от начала работы системы в формате TIME должна наверное с нуля начать или нет?
Время то начнётся с нуля, но в программе может например считаться наработка, как разница текущего времени и времени включения.
При обнулении функции TIME(); время наработки может стать отрицательным и вачдог обеспечен. К переполнению времени надо очень внимательно относиться. 49 дней и аут)))
С таймерами тоже может случиться казус, зависит от программы.
Филоненко Владислав
16.06.2022, 13:27
Обычно такое бывает если у Вас есть какой-либо цикл, в котором неправильно вычисляется разница времени между текущим и временем начала. Т.к. начало обычно бывает при T чуть выше 0, то через 49 дней++ получается отрицательное значение и тут то и ошибка вылазит.
Приведите пример когда время может стать отрицательным?
t3(T#71582m47s291ms):= t1(T#0ms) - t2(T#5ms);
Только что закинул пример на ПЛК110
Филоненко Владислав
16.06.2022, 13:52
Поэтому время переводим в DWORD, вычитаем и сравниваем
Поэтому время переводим в DWORD, вычитаем и сравниваем
Так а где сброс плк
Я уверен что в плк все операции с переменными типа time идут через dword
Спорягин Кирилл
16.06.2022, 14:39
Так а где сброс плк
Так если у Вас цикл по этому огромному dword, то вот и будет собака.
Я уверен что в плк все операции с переменными типа time идут через dword
Так если у Вас цикл по этому огромному dword, то вот и будет собака. Проблема в том что у меня нет циклов с привязкой к огромному dword)
Проблема в том что у меня нет циклов с привязкой к огромному dword)
https://owen.ru/forum/attachment.php?attachmentid=32403&d=1501764156
Филоненко Владислав
17.06.2022, 08:31
Так а где сброс плк
А сброс в цикле где получилось отрицательное время (как раз в районе 49-го дня) и как результат цикл не заверчился через условные 1000мс, а завершится через 49 дней. А Вачдог бдит!
Филоненко Владислав
17.06.2022, 08:32
Вообще эти гадания на отсутствующей программе - неэфективны
Подытожим:
1. Таймеры TON, TOF, TP ограничены PT.
2. Переменная типа TIME отрицательной быть не может.
61262
3. Циклов с привязкой к огромному dword у меня нет.
61263
kondor3000
17.06.2022, 09:06
Подытожим:
1. Таймеры TON, TOF, TP ограничены PT.
2. Переменная типа TIME отрицательной быть не может.
3. Циклов с привязкой к огромному dword у меня нет.
Под отрицательным временем, подразумевается огромное время, полученное при неправильном расчёте. Вам показали направление поиска на примерах.
Дальнейшее гадание не имеет смысла, пока не будет выложена программа.
А сброс в цикле где получилось отрицательное время (как раз в районе 49-го дня) и как результат цикл не заверчился через условные 1000мс, а завершится через 49 дней. А Вачдог бдит!
Что Вы понимаете под циклом?
Два места использования переменной типа TIME в расчетах:
1 . timeSec(clk := TIME_TO_DWORD(TIME()) MOD 1000 > 500);
2. peri := TIME() - t;
c := SEL(peri > tImpMax, c, 0);
IF c = 2 THEN
IF (peri >= period) AND (TIME_TO_DWORD(peri) <> 0) THEN
value := coef * 3600 * 1000 / TIME_TO_DWORD(peri);
END_IF
ELSE
value := 0;
END_IF
Филоненко Владислав
17.06.2022, 09:49
TIME() - t -- t откуда берётся?
И лучше бы Вы всю программу выложили
TIME() - t -- t откуда берётся?
И лучше бы Вы всю программу выложили
По фронту имульса сохраняется t := TIME();
Да и это значение не имеет, переменная perI при любых раскладах > 0, если она > tImpMax(T#3m) все что ниже не выполняется
peri := TIME() - t;
c := SEL(peri > tImpMax, c, 0);
fix(clk := IN);
IF fix.Q THEN
period := peri;
t := TIME();
c := MIN(2,c + 1);
dwACC := dwACC + 1;
ACC := dwACC * coef;
oldAcc := ACC;
END_IF
IF c = 2 THEN
IF (peri >= period) AND (TIME_TO_DWORD(peri) <> 0) THEN
value := coef * 3600 * 1000 / TIME_TO_DWORD(peri);
END_IF
ELSE
value := 0;
END_IF
Счетчик и мгновенный расход. Вообще никакого криминала.
Счетчик и мгновенный расход. Вообще никакого криминала.
Криминала нет - а ресет раз в 50 дней есть)
Вот тема - https://owen.ru/forum/showthread.php?t=31276. Овен правил в прошивке.
Вот тема - https://owen.ru/forum/showthread.php?t=32236&page=2. Опять что правилось прошивкой.
Техподдержка говорит - обновляйтесь до последней и все будет ОК. Но у меня уже последняя!
Скачал debug.txt со станций за последний год, где мог доступ получить - работают 4, 6, 8, 14 мес. Сбросы только по питанию. Но там ПЛК110. А вот три станции па ПЛК160 такой стабильностью не отличаются.
В вот проблема другая https://owen.ru/forum/showthread.php?t=35900&page=4&highlight=watchdog но есть debug.txt и там я тоже вижу ресет в 50 дней.
Что в debug.txt значит запись
3 M local data #3 =186a1
Что в debug.txt значит запись
Без описания - гадать бесполезно.
Меня там больше напрягают отрицитательные ide. Вы видели отрицательные номера квартир/домов ?
Судя по
Поэтому время переводим в DWORD, вычитаем и сравниваем
+ несколько раз высказанным предположениям что ТС в каких-то циклах использует время для выхода (как обыденность), хотя ТС и сказал что у него таких циклов - нет, там (внизу) могли, например, напереводить и забыть про unsigned. Они ж внизу не на СТ и не в квадратиках пишутъ.
Проекта нет. Вачдог в цикле может быть не только при юзании времени как условия выхода :
-внутри цикла доступен для изменения сам счетчик
for i := 1 to 2 do //2 раза - и домой.
i := 1;
end_for
-машинный ноль
x : real;
--
x := 20_000_000;
while x < 20_000_010 do //10 раз - это такая ведь фигня
x := x + 1;
end_while
...
Так же перезагруз это не только зависание, а и обращения к левой памяти (косяки с индексами, указателями ..)
В общем много разной хрени
(К квадратофилам: пожалуйста, не надо сообщать про то, что тут ST, а было б Си так даже кофе бы на клаву опрокинулось бы, в вот в квадратиках такого нету и всё работает)
Имхо проект в виде
;
(с текущей конфигурацией обмена - если она есть и ) чётче бы локализовал проблему по ветке система/пользователь. Но нужно всего-то свободный ПЛК [+ ?], 2 месяца и бесперебойник.
Без описания - гадать бесполезно.
Меня там больше напрягают отрицитательные ide. Вы видели отрицательные номера квартир/домов ?
Судя по
+ несколько раз высказанным предположениям что ТС в каких-то циклах использует время для выхода (как обыденность), хотя ТС и сказал что у него таких циклов - нет, там (внизу) могли, например, напереводить и забыть про unsigned. Они ж внизу не на СТ и не в квадратиках пишутъ.
Проекта нет. Вачдог в цикле может быть не только при юзании времени как условия выхода :
-внутри цикла доступен для изменения сам счетчик
for i := 1 to 2 do //2 раза - и домой.
i := 1;
end_for
-машинный ноль
x : real;
--
x := 20_000_000;
while x < 20_000_010 do //10 раз - это такая ведь фигня
x := x + 1;
end_while
...
Так же перезагруз это не только зависание, а и обращения к левой памяти (косяки с индексами, указателями ..)
В общем много разной хрени
(К квадратофилам: пожалуйста, не надо сообщать про то, что тут ST, а было б Си так даже кофе бы на клаву опрокинулось бы, в вот в квадратиках такого нету и всё работает)
Имхо проект в виде
;
(с текущей конфигурацией обмена - если она есть и ) чётче бы локализовал проблему по ветке система/пользователь. Но нужно всего-то свободный ПЛК [+ ?], 2 месяца и бесперебойник.
Циклы я сразу отмел, использую только for c фиксированным циклом. Условий выхода по времени нет. Да и цикл, ошибки индекса и указатели проявляли бы себя раньше, а не раз в 50 дней!
Набор библиотек стандартный61489
Во всех проектах используется +/- одинаковый набор Fb, Но проблема наблюдается только на 160плк.
Проводил всевозможные эксперименты с переменой TIME, DWORD, REAL( на столько только 110плк)
VAR
checkStartTP: TON;
t1, t2, t3,t4,t5,t6:TIME;
testTON2: TON;
onTON2: BOOL;
ptTON2: TIME;
BLOCK_TON2 : BOOL;
sysTIME : TIME;
div1 : INT := 10;
div2 : INT := 10;
div3 : INT := 10;
tempDWORD:DWORD;
dWord1: DWORD;
dWord2: DWORD;
dWord3: DWORD;
dWord4: DWORD;
dWord5: DWORD;
f1: REAL;
f2: REAL;
f3: REAL;
f4: REAL;
RESET: BOOL;
sysTimeDW: DWORD;
testFLTR: DIG_FLTR;
ON_OFF_TEST_FLTR: BOOL;
END_VAR
VAR RETAIN
testTON: TON;
onTON: BOOL;
ptTON: TIME;
END_VAR
sysTime := TIME();
t3 := t1 - t2;
t4:= T#1m - T#5m;
t5 := sysTime - T#49d15h2m47s295ms;
testTON(IN := onTON, PT := ptTON);
IF BLOCK_TON2 = FALSE THEN
testTON2(IN := onTON2, PT := ptTON2);
END_IF;
(* ============================== *)
tempDWORD := tempDWORD + 1;
dWord5 := dWord5 * dWord5;
dWord3 := dWord1 + dWord2;
dWord4 := dWord1 - dWord2;
(* ============================== *)
div1 := 100;
f1 := 100;
div3 := div1/div2;
f3 := F1/F2;
div2 := div2 +1;
IF div2 > 10 THEN div2 := 0;
END_IF
f2 := f2 +1;
IF f2 > 10 THEN f2 := 0;
END_IF
(* ============================== *)
IF ON_OFF_TEST_FLTR THEN
sysTimeDW := TIME_TO_DWORD(TIME());
testFLTR(
IN_VAL:= div1,
PB := 2,
TI := 2500
);
END_IF
(* ============================== *)
WHILE RESET DO
;
END_WHILE;
(* ============================== *)
в модбасе.либ есть потенции для резета
что где и как с RESET - неясно.
Проект лучше приводить как есть.
Продолжим тему!
Нужно было срочно запустить в работу 2 станции на ПЛК160[М2]. Один был по наличию, второй - 2 мес ожидания. У заказчика горели сроки! Нашел у себя старой модификации 18г ПЛК160, поставили пока не придет новый. И что мы наблюдаем - старый работает, а новый стабильный ресет в 50 дней!
И мы будем дальше утверждать что проблема в проекте?
есди быть точным, то наверное 49 дней и несколько часов, как раз диапазон 32-битного целого в миллисекундах
4194967295ms(49d17h2m47s295ms), но сути это не меняет!
Samel Я душой до сих пор на Вашей стороне т.к. не исключал проблем внизу (см. ранее)
Но объективности ради - проекта как небыло так и нет.
)) Склероз - 2 мес. таки.
Если бы увидел что-то серъезное - написал бы. Вроде не писал ?
Если не увидел в проект радикальных проблем - или плохо вижу или я тупой или их не было.
Остальные варианты - проблемы с прошивкой.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot