PDA

Просмотр полной версии : Зависание ПЛК63 при выполнении программы



Oleg77
08.10.2018, 09:12
Здравствуйте, помогите решить проблему.
ПЛК63м соединен по RS485 по Modbus RTU с амперметром. Программа начинает выполняться, при считывании данных из амперметра ПЛК63м виснет и перезагружается. Происходит это в разный момент выполнения программы, никакой системности нет, может происходить через 3сек., может через 10сек.

Филоненко Владислав
08.10.2018, 10:18
Здравствуйте, помогите решить проблему.
ПЛК63м соединен по RS485 по Modbus RTU с амперметром. Программа начинает выполняться, при считывании данных из амперметра ПЛК63м виснет и перезагружается. Происходит это в разный момент выполнения программы, никакой системности нет, может происходить через 3сек., может через 10сек.

Угадай болезнь по описанию.

Проект где?

Oleg77
08.10.2018, 17:46
Угадай болезнь по описанию.

Проект где?

Проект здесь.




PROGRAM InitComPort
VAR
COM_SERVICE1: COM_SERVICE;
END_VAR


IF ComPortState = 0 THEN
Settings.Port:= 0; (*RS-485*)
Settings.dwBaudRate:=9600; (*speed*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=2;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(ComPortState=0) , Settings:=Settings , Task:=OPEN_TSK );

IF COM_SERVICE1.ready THEN
ComPortState:= 2;
END_IF


----------------------------------------------------------------------------------------


PROGRAM GetMDVV
VAR
GetModbus: MB_RD_HOLD_REGS;
TimeOut: TIME:= T#50ms;
Buffer: ARRAY[0..255] OF BYTE;
EndGetStored: BOOL;
ErrorStored: BYTE;
DataSize: WORD;
GetReq: BOOL:= TRUE;
HavePause:TON;
END_VAR


F ComPortState = 2 THEN

GetModbus(
Enable:= GetReq,
Mode:= MB_RTU,
DevAddr:= 8, (*Адрес*)
FirstAddr:= 15,(*Регистр*)
Quantity:= 1,(*Количество регистров*)
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
GetReq:= FALSE;
IF GetModbus.Complete THEN
EndGetStored:= TRUE;
(* EndSendStored:= TRUE; *)
ErrorStored:= GetModbus.Exception;
END_IF(*END_IF*)
HavePause(IN:= EndGetStored,PT:=T#50ms);
(* HavePause(IN:= EndSendStored,PT:=T#50ms);*)
IF HavePause.Q THEN
(* IF HavePause.Q THEN *)
GetReq:= TRUE;
EndGetStored:= FALSE;
(* EndSendStored:= FALSE;*)
END_IF
END_IF









Проект состоит из двух блоков. Один для открытия и настройки порта RS-485. Другой для запроса данных из регистра 15 амперметра с адресом 8. Пример рабочий, но у нас никак не хочет работать. Пробовали разные варианты. Даже объединяли в один блок. Результат один : зависание и перезагрузка. Запросы и ответы все идут как бы нормально. Мониторинг пакетов проводили программой MODSIM32 в режиме Show traffic.

[008][003][000][015][000][001][180][144] - это запрос

[008] - адрес амперметра
[003] - код функции чтения регистра
[000][015] - первый регистр для чтения (0FH)
[000][001] - количество регистров
[180][144] - контрольная сумма

[008][003][002][000][000][100][069] - это ответ

[008] - адрес амперметра
[003] - код функции чтения регистра
[002] - количество байт
[000][000] - данные
[100][069] - контрольная сумма

Опять писк и перезагрузка. Последний пакет [008][003][002][000][000][100][069].

Пишет код ошибки в ПЛК - 3,
Произошла перезагрузка сторожевым таймером, обусловленная зависанием.
Проверить программу CoDeSys на наличие ошибок.

В чём тут проблема ?

A.Simonov
11.10.2018, 14:55
Проект здесь.




PROGRAM InitComPort
VAR
COM_SERVICE1: COM_SERVICE;
END_VAR


IF ComPortState = 0 THEN
Settings.Port:= 0; (*RS-485*)
Settings.dwBaudRate:=9600; (*speed*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=2;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(ComPortState=0) , Settings:=Settings , Task:=OPEN_TSK );

IF COM_SERVICE1.ready THEN
ComPortState:= 2;
END_IF


----------------------------------------------------------------------------------------


PROGRAM GetMDVV
VAR
GetModbus: MB_RD_HOLD_REGS;
TimeOut: TIME:= T#50ms;
Buffer: ARRAY[0..255] OF BYTE;
EndGetStored: BOOL;
ErrorStored: BYTE;
DataSize: WORD;
GetReq: BOOL:= TRUE;
HavePause:TON;
END_VAR


F ComPortState = 2 THEN

GetModbus(
Enable:= GetReq,
Mode:= MB_RTU,
DevAddr:= 8, (*Адрес*)
FirstAddr:= 15,(*Регистр*)
Quantity:= 1,(*Количество регистров*)
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
GetReq:= FALSE;
IF GetModbus.Complete THEN
EndGetStored:= TRUE;
(* EndSendStored:= TRUE; *)
ErrorStored:= GetModbus.Exception;
END_IF(*END_IF*)
HavePause(IN:= EndGetStored,PT:=T#50ms);
(* HavePause(IN:= EndSendStored,PT:=T#50ms);*)
IF HavePause.Q THEN
(* IF HavePause.Q THEN *)
GetReq:= TRUE;
EndGetStored:= FALSE;
(* EndSendStored:= FALSE;*)
END_IF
END_IF









Проект состоит из двух блоков. Один для открытия и настройки порта RS-485. Другой для запроса данных из регистра 15 амперметра с адресом 8. Пример рабочий, но у нас никак не хочет работать. Пробовали разные варианты. Даже объединяли в один блок. Результат один : зависание и перезагрузка. Запросы и ответы все идут как бы нормально. Мониторинг пакетов проводили программой MODSIM32 в режиме Show traffic.

[008][003][000][015][000][001][180][144] - это запрос

[008] - адрес амперметра
[003] - код функции чтения регистра
[000][015] - первый регистр для чтения (0FH)
[000][001] - количество регистров
[180][144] - контрольная сумма

[008][003][002][000][000][100][069] - это ответ

[008] - адрес амперметра
[003] - код функции чтения регистра
[002] - количество байт
[000][000] - данные
[100][069] - контрольная сумма

Опять писк и перезагрузка. Последний пакет [008][003][002][000][000][100][069].

Пишет код ошибки в ПЛК - 3,
Произошла перезагрузка сторожевым таймером, обусловленная зависанием.
Проверить программу CoDeSys на наличие ошибок.

В чём тут проблема ?

Какая прошивка?
Если залить максимально простой проект, почти пустой.
Будет ли зависать ПЛК?

Желательно целиком выложить файл проекта .pro

Oleg77
13.10.2018, 08:14
Какая прошивка?
Если залить максимально простой проект, почти пустой.
Будет ли зависать ПЛК?

Желательно целиком выложить файл проекта .pro

Какая прошивка была в ПЛК при покупке прибора не смотрели, а в процессе выявления причин зависания и перезагрузки, поменяли прошивку на Ver 2.12. Особых изменений в работе контролёра не увидели.

ПЛК перестаёт виснуть когда отключаешь амперметр от питания 220 V. Запросы через порт RS-485 по протоколу ModBus RTU летят без задержек. Зависания начинаются когда вступает в работу амперметр, т. е. когда приходят ответы от амперметра. Судя по ответам, пакеты приходят корректные. Мониторинг пакетов проводили программой MODSIM32 в режиме Show traffic.

Мы уже обращались на этот форум с этой же проблемой, но с примером взятым с пластинки, пришедшей с ПЛК. В процессе общения прошла информация, что в данном примере пользователями была выявлена ошибка, которая приводила к сбою работы ПЛК. Было принято решение в дальнейшей работе данный пример не использовать.
Собственно весь проект выложен в листинге выше. Больше там ничего нет. Это рабочий пример, которым любезно поделился один из пользователей этого форума, пытаясь помочь нам в решении поставленной задачи. В нём только поменяли на свои значения настройки порта и функцию запроса с номером регистра.

Но если нужен сам файлик, куда кинуть ?

Может лучше описать всю историю наших действий, начиная с поставленной задачи ? Тогда наверное будет более понятно из чего исходить и как решить эту проблему с зависанием.

A.Simonov
15.10.2018, 16:29
Какая прошивка была в ПЛК при покупке прибора не смотрели, а в процессе выявления причин зависания и перезагрузки, поменяли прошивку на Ver 2.12. Особых изменений в работе контролёра не увидели.

ПЛК перестаёт виснуть когда отключаешь амперметр от питания 220 V. Запросы через порт RS-485 по протоколу ModBus RTU летят без задержек. Зависания начинаются когда вступает в работу амперметр, т. е. когда приходят ответы от амперметра. Судя по ответам, пакеты приходят корректные. Мониторинг пакетов проводили программой MODSIM32 в режиме Show traffic.

Мы уже обращались на этот форум с этой же проблемой, но с примером взятым с пластинки, пришедшей с ПЛК. В процессе общения прошла информация, что в данном примере пользователями была выявлена ошибка, которая приводила к сбою работы ПЛК. Было принято решение в дальнейшей работе данный пример не использовать.
Собственно весь проект выложен в листинге выше. Больше там ничего нет. Это рабочий пример, которым любезно поделился один из пользователей этого форума, пытаясь помочь нам в решении поставленной задачи. В нём только поменяли на свои значения настройки порта и функцию запроса с номером регистра.

Но если нужен сам файлик, куда кинуть ?

Может лучше описать всю историю наших действий, начиная с поставленной задачи ? Тогда наверное будет более понятно из чего исходить и как решить эту проблему с зависанием.

Отправьте целиком проект (.pro) на support@owen.ru
С указанием ссылки на эту тему.

P.S.
Я, визуально, не вижу ошибок. Хочу залить исходник проекта на наш ПЛК и протестировать.
Есть только одна опечатка, вместо "IF" у Вас "F", но думаю она возникла при копировании кода.

Oleg77
15.10.2018, 19:05
Отправьте целиком проект (.pro) на support@owen.ru
С указанием ссылки на эту тему.

P.S.
Я, визуально, не вижу ошибок. Хочу залить исходник проекта на наш ПЛК и протестировать.
Есть только одна опечатка, вместо "IF" у Вас "F", но думаю она возникла при копировании кода.

Хорошо отправим.

P.S.
Да. Вы правы. Эта опечатка. Вместо "IF" в листинге "F". Она возникла при копировании кода.

A.Simonov
24.10.2018, 14:33
Хорошо отправим.

P.S.
Да. Вы правы. Эта опечатка. Вместо "IF" в листинге "F". Она возникла при копировании кода.

Получил от вас очень много писем подозрительного содержания.
Прошу собрать все в один архив, выложить на любой облачный сервис:
https://disk.yandex.ru/
https://files.mail.ru/

И отправить ссылку на архив.
А так же прошу сформировать файл README.txt, в котором будет пояснено назначение файлов.

Oleg77
25.10.2018, 09:07
Получил от вас очень много писем подозрительного содержания.
Прошу собрать все в один архив, выложить на любой облачный сервис:
https://disk.yandex.ru/
https://files.mail.ru/

И отправить ссылку на архив.
А так же прошу сформировать файл README.txt, в котором будет пояснено назначение файлов.

Хорошо. Сделаем.