PDA

Просмотр полной версии : Останов работы ПЛК



SergeyNG
12.11.2007, 14:11
Помогите разобраться в особенностях ПЛК.

С периодичностью в 2-3 часа происходит самопроизвольный останов работы ПЛК. Контроллер не перегружается, а просто останавливает выполнение программы. В log.txt сообщение "2 PLC STOPED". Попытка запуска кнопочкой СТАРТ/СТОП на мордочке ПЛК происходит удачно и контроллер продолжает работать до следующего самопроизвольного останова.

Проект и лог-файл вложены.

Судя по значениям переменных, в остановленном состоянии ПЛК, останов происходит при значении переменной takt=1 инструкции CASE. Т.е. во время ожидания приема данных по интерфейсу RS232.

В чем может быть причина или как диагностировать причину останова ПЛК?

Контроллер ПЛК100 K.L
Прошивка 2.01.8
Таргет 2.04

Филоненко Владислав
12.11.2007, 14:54
1. Вы используете библиотеку SysLibMem, вы уверены, что вы работаете только с областью I/O и массивом данных в программе? Если вы где-либо ошиблись и записали не в ту область, то результаты непредсказуемы! Прямое обращение к памяти очень опасно. Поищите в этом направлении.

Gans
12.11.2007, 16:18
У меня такое тоже было :-)
Правда проблема заключалась в том что версия прошивки и версия торгет файла не совпадали. После экспорта программы и импорта в новый проект (созданный с новыми торгет-файлами) проблема больше не повторялась.
P. S. Забыл добавить первоначально проект был создан с старыми торгет-файлами :-) Удачи:)

SergeyNG
13.11.2007, 12:07
Использование библиотеки SysLibMem безусловно требует аккуратности. И все рассчеты адресов для прямого доступа к памяти I/O выполняются с предварительной проверкой на допустимый диапазон.
Даже если и есть ошибка, которую допустили в программе, хотелось бы, чтобы контроллер отдавал информацию больше чем сообщение "PLC STOPED".

Что касается соответствия таргета и прошивки. PLC Configuraton был экспортирован, создан новый проект под таргетом 2.04, далее импортирован PLC Configuration в новый проект. Но проблема не ушла.

Gans
16.11.2007, 11:43
Что касается соответствия таргета и прошивки. PLC Configuraton был экспортирован, создан новый проект под таргетом 2.04, далее импортирован PLC Configuration в новый проект. Но проблема не ушла.
а весь проект полностью со всеми POU и тд. и тп. не пробывали!?

SergeyNG
18.11.2007, 04:53
а весь проект полностью со всеми POU и тд. и тп. не пробывали!?

А смысл? Текст программы и описание переменных были перенесены в новый проект через буфер обмена.

Закоментили в тексте программы функции прямого обращения к памяти из бибилотеки SysLibMem. Таким образом исключили возможность записи значений по каким-нибудь адресам вне диапазона ввода/вывода и внутрених переменных программы. Но останов ПЛК не ушел. Не здесь зверь зарыт.

SergeyNG
03.12.2007, 15:20
Продолжу тему по поводу самопроизвольного останова ПЛК.
Появилось следующее предположение.
Для проекта используем контроллер ПЛК100 K.L (объемом памяти ввода/вывода 360 байт).

В PLC Configuration объявлен модуль Owen (Master) и к нему подцеплены 45 подэлемента Float variable Comm (Listen) и 21 подэлемент Float variable Comm (Write). Оба используемых типа включают в себя значение типа REAL и комманду на чтение/запись типа BYTE, т.е. всего 5 байт. Если вести подсчет напрямую получаем 45*5+21*5 = 330 байт области вывода этого контроллера. 330 байт < 360 байт, которыми ограничена область ввода/вывода, поэтому для проекта был выбран контроллер с ограниченной лицензией.

При детальном изучении размеров областей памяти во вкладке Target Settings замечено, что область входов занимает 16#7A (122) байта, а область выходов 16#EA (234) байта. Т.е. 330 байт, которые ложатся в области вывода, перекрывают допустимую область вывода для контроллера.

Вопросы:
1. Во время компиляции и загрузки проекта не ругается ни CoDeSys, ни контроллер на превышение допустимых размеров области вывода. Как контролировать попали мы в ограничение или нет? Только подсчитывать на листке бумаги?
2. Было замечено, что подэлементы Float variable Comm (Listen) и Float variable Comm (Write), которые внутри себя имеют типы REAL и BYTE, занимают в памяти контроллера не 5 байт, а 8 байт. А для области ввода/вывода эти подэлементы занимают 5 байт или 8 байт? Если 8, то тут даже прямой расчет на бумаге не поможет.
3. Самый главный вопрос. В своей программе мы перекрыли область памяти за ограниченные контроллером байты вывода и программа работает. Каких результатов ожидать? Может ли это быть причиной самопроизвольных остановов выполнения программы контроллера?

Филоненко Владислав
03.12.2007, 16:18
Продолжу тему по поводу самопроизвольного останова ПЛК.
Появилось следующее предположение.
Для проекта используем контроллер ПЛК100 K.L (объемом памяти ввода/вывода 360 байт).

В PLC Configuration объявлен модуль Owen (Master) и к нему подцеплены 45 подэлемента Float variable Comm (Listen) и 21 подэлемент Float variable Comm (Write). Оба используемых типа включают в себя значение типа REAL и комманду на чтение/запись типа BYTE, т.е. всего 5 байт. Если вести подсчет напрямую получаем 45*5+21*5 = 330 байт области вывода этого контроллера. 330 байт < 360 байт, которыми ограничена область ввода/вывода, поэтому для проекта был выбран контроллер с ограниченной лицензией.

При детальном изучении размеров областей памяти во вкладке Target Settings замечено, что область входов занимает 16#7A (122) байта, а область выходов 16#EA (234) байта. Т.е. 330 байт, которые ложатся в области вывода, перекрывают допустимую область вывода для контроллера.

Вопросы:
1. Во время компиляции и загрузки проекта не ругается ни CoDeSys, ни контроллер на превышение допустимых размеров области вывода. Как контролировать попали мы в ограничение или нет? Только подсчитывать на листке бумаги?
2. Было замечено, что подэлементы Float variable Comm (Listen) и Float variable Comm (Write), которые внутри себя имеют типы REAL и BYTE, занимают в памяти контроллера не 5 байт, а 8 байт. А для области ввода/вывода эти подэлементы занимают 5 байт или 8 байт? Если 8, то тут даже прямой расчет на бумаге не поможет.
3. Самый главный вопрос. В своей программе мы перекрыли область памяти за ограниченные контроллером байты вывода и программа работает. Каких результатов ожидать? Может ли это быть причиной самопроизвольных остановов выполнения программы контроллера?

По поводу ограничения памяти и его подсчета.
1. CoDeSys следит за расходованием памяти и если память исчерпалась - сообщает о ошибке. Просто надо все переменные использовать.
2. Подсчет - действительно затруднен из-за ограничений в архитектуре ARM-процессора, а именно требования к выравниванию. Но с учётом п.1. это не так важно, т.к. при переполнении вылезет ошибка.


Использование библиотеки SysLibMem безусловно требует аккуратности. И все рассчеты адресов для прямого доступа к памяти I/O выполняются с предварительной проверкой на допустимый диапазон.
Даже если и есть ошибка, которую допустили в программе, хотелось бы, чтобы контроллер отдавал информацию больше чем сообщение "PLC STOPED".

Что касается соответствия таргета и прошивки. PLC Configuraton был экспортирован, создан новый проект под таргетом 2.04, далее импортирован PLC Configuration в новый проект. Но проблема не ушла.

Т.е. Вы использовали старый проект с новым таргетом? так делать нельзя.

Для начала посоветовал бы написать простой проект, отладить его части (т.е. нормальную работу мастеров и слайвов), затем подключать по очереди программные части. Сразу написать большой проект и чтоб заработало - так не бывает.

SergeyNG
03.12.2007, 18:36
1. CoDeSys следит за расходованием памяти и если память исчерпалась - сообщает о ошибке. Просто надо все переменные использовать.

Все переменные объявленные в PLC Configuration используются. Только коственным путем через указатель адреса.
Предварительно перед написанием такого "большого" проекта были выполнены проверки, что переменные объявленные в PLC Configuration имеют определенную длину и ложатся в памяти в определенной последовательности. А если это так, то для программиста использовать в данном случае вместо 66 переменных типа REAL и 66 переменных типа BYTE всего лишь 1 указатель адреса и обьявить всего лишь одну переменную в начале массива было гораздо удобнее и быстрее.

Только что проверил. Задал последней переменной в PLC Configuration имя. Как Вы и написали, Владислав, CoDeSys выдал ошибку. И тут я все понял :D , и теперь буду писать проекты так, чтобы CoDeSys понял, что произошло переполнение памяти ввода/вывода. Но в целом считаю это не правильным, т.к. переменная МЭК %XXX.XX.XX уже объявлена в проекте, хоть и без имени, и среда разработки должна контролировать выход ее за пределы области ввода/вывода, а ПЛК эту переменную ест и даже обновляет соответствующие ей сетевые переменные. Прошу момент учесть во благо всех пользователей данного продукта!

Филоненко Владислав
04.12.2007, 13:16
т.к. вы прямо не используете эту переменную, а получаете доступ к ней по указателю, то компилятор не может проследить за её использованием. и это правильно, т.к. действует принцип "спасение указателеиспользующих - дело самих указателеиспользующих"!
да, указатель - элегантно и даже круто, но в ответственных приложениях я бы вообще не советовал их использовать, как и выделение памяти и прочие "небезопасные вещи!"

Эдуард
24.02.2012, 20:53
попробуйте присвоить кнопке какую нибудь переменную, а запускать или останавливать программу можно через кодесис. мне это помогло.

capzap
25.02.2012, 09:19
:) на дворе 12 год, я думаю те кто общалсяв седьмом уже и не помнят этого разговора