PDA

Просмотр полной версии : ПЛК160 v1.2.42 reset by watchdog! каждых 50 дней



Samel
16.06.2022, 09:53
Добрый день. Столкнулся с проблемой периодического сброса плк по watchdog с равными интервалами времени. Смущает что интервал близок к макс. значению переменной типа TIME - 4194967295ms(49d17h2m47s295ms)

Samel
16.06.2022, 10:13
Если посмотреть debug.txt из этой темы https://owen.ru/forum/showthread.php?t=36247 - интервал сброса по watchdog в этих же пределах!

IVM
16.06.2022, 10:27
Добрый день. Столкнулся с проблемой периодического сброса плк по watchdog с равными интервалами времени. Смущает что интервал близок к макс. значению переменной типа TIME - 4194967295ms(49d17h2m47s295ms)

Ищи где у тебя в программе таймер переполняется.

Samel
16.06.2022, 12:13
Ищи где у тебя в программе таймер переполняется.

Переполнение таймера может приводит к ресету по watchdog?

Samel
16.06.2022, 12:25
Таймеры 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 дней++ получается отрицательное значение и тут то и ошибка вылазит.

Samel
16.06.2022, 13:41
Приведите пример когда время может стать отрицательным?

Samel
16.06.2022, 13:48
t3(T#71582m47s291ms):= t1(T#0ms) - t2(T#5ms);
Только что закинул пример на ПЛК110

Филоненко Владислав
16.06.2022, 13:52
Поэтому время переводим в DWORD, вычитаем и сравниваем

Samel
16.06.2022, 13:58
Поэтому время переводим в DWORD, вычитаем и сравниваем

Так а где сброс плк

Samel
16.06.2022, 14:12
Я уверен что в плк все операции с переменными типа time идут через dword

Спорягин Кирилл
16.06.2022, 14:39
Так а где сброс плк

Так если у Вас цикл по этому огромному dword, то вот и будет собака.

Samel
16.06.2022, 14:44
Я уверен что в плк все операции с переменными типа time идут через dword


Так если у Вас цикл по этому огромному dword, то вот и будет собака. Проблема в том что у меня нет циклов с привязкой к огромному dword)

petera
16.06.2022, 14:46
Проблема в том что у меня нет циклов с привязкой к огромному dword)

https://owen.ru/forum/attachment.php?attachmentid=32403&d=1501764156

Филоненко Владислав
17.06.2022, 08:31
Так а где сброс плк

А сброс в цикле где получилось отрицательное время (как раз в районе 49-го дня) и как результат цикл не заверчился через условные 1000мс, а завершится через 49 дней. А Вачдог бдит!

Филоненко Владислав
17.06.2022, 08:32
Вообще эти гадания на отсутствующей программе - неэфективны

Samel
17.06.2022, 08:34
Подытожим:
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 у меня нет.

Под отрицательным временем, подразумевается огромное время, полученное при неправильном расчёте. Вам показали направление поиска на примерах.
Дальнейшее гадание не имеет смысла, пока не будет выложена программа.

Samel
17.06.2022, 09:16
А сброс в цикле где получилось отрицательное время (как раз в районе 49-го дня) и как результат цикл не заверчился через условные 1000мс, а завершится через 49 дней. А Вачдог бдит!

Что Вы понимаете под циклом?

Samel
17.06.2022, 09:24
Два места использования переменной типа 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 откуда берётся?

И лучше бы Вы всю программу выложили

Samel
17.06.2022, 10:09
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

Валенок
17.06.2022, 18:56
Счетчик и мгновенный расход. Вообще никакого криминала.

Samel
19.06.2022, 11:38
Счетчик и мгновенный расход. Вообще никакого криминала.

Криминала нет - а ресет раз в 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 такой стабильностью не отличаются.

Samel
19.06.2022, 11:53
В вот проблема другая https://owen.ru/forum/showthread.php?t=35900&page=4&highlight=watchdog но есть debug.txt и там я тоже вижу ресет в 50 дней.

Samel
30.06.2022, 12:40
Что в debug.txt значит запись
3 M local data #3 =186a1

Валенок
01.07.2022, 10:45
Что в 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 месяца и бесперебойник.

Samel
01.07.2022, 12:05
Без описания - гадать бесполезно.
Меня там больше напрягают отрицитательные 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;

(* ============================== *)

Валенок
01.07.2022, 22:13
в модбасе.либ есть потенции для резета
что где и как с RESET - неясно.

Проект лучше приводить как есть.

Samel
27.09.2022, 11:57
Продолжим тему!
Нужно было срочно запустить в работу 2 станции на ПЛК160[М2]. Один был по наличию, второй - 2 мес ожидания. У заказчика горели сроки! Нашел у себя старой модификации 18г ПЛК160, поставили пока не придет новый. И что мы наблюдаем - старый работает, а новый стабильный ресет в 50 дней!
И мы будем дальше утверждать что проблема в проекте?

Samel
27.09.2022, 12:02
есди быть точным, то наверное 49 дней и несколько часов, как раз диапазон 32-битного целого в миллисекундах

4194967295ms(49d17h2m47s295ms), но сути это не меняет!

Валенок
27.09.2022, 12:13
Samel Я душой до сих пор на Вашей стороне т.к. не исключал проблем внизу (см. ранее)
Но объективности ради - проекта как небыло так и нет.

Samel
27.09.2022, 12:15
Я Вам проект сбрасывал).

Валенок
27.09.2022, 15:18
)) Склероз - 2 мес. таки.
Если бы увидел что-то серъезное - написал бы. Вроде не писал ?
Если не увидел в проект радикальных проблем - или плохо вижу или я тупой или их не было.
Остальные варианты - проблемы с прошивкой.