PDA

Просмотр полной версии : Обработка исключений



const3
25.06.2012, 13:54
Здраствуйте.
Хорошим тоном для программиста является то, что в своей программе он должен предусмотреть все ситуации работы алгоритма, плохие данные и т.д. Когда в работу вступают еще и реальные приборы, то тут нужен особый подход. Программа для ПЛК должна быть простой и как можно более без ошибочной. Если ПЛК является мозгом системы, такой как котельная, то тут вообще нужен глаз да глаз.
Вот разработал я проект для котельной все все одобрили и начали писать, выбрали для управления шкафов ПЛК 63 - как достаточный и недорогой, но наткнулся на проблему. Как таковой обработки исключений я не нашел в CodeSys, попробовал использовать овновскую библиотеку. Зарегистрировал прерывание, описал callback функцию, но шото нифига не выходит. Подскажите пожалуйста как мне организовать обработку исключений на ПЛК 63, и возможно ли это вообще?

IVM
25.06.2012, 14:46
Здраствуйте.
Хорошим тоном для программиста является то, что в своей программе он должен предусмотреть все ситуации работы алгоритма, плохие данные и т.д. Когда в работу вступают еще и реальные приборы, то тут нужен особый подход. Программа для ПЛК должна быть простой и как можно более без ошибочной. Если ПЛК является мозгом системы, такой как котельная, то тут вообще нужен глаз да глаз.
Вот разработал я проект для котельной все все одобрили и начали писать, выбрали для управления шкафов ПЛК 63 - как достаточный и недорогой, но наткнулся на проблему. Как таковой обработки исключений я не нашел в CodeSys, попробовал использовать овновскую библиотеку. Зарегистрировал прерывание, описал callback функцию, но шото нифига не выходит. Подскажите пожалуйста как мне организовать обработку исключений на ПЛК 63, и возможно ли это вообще?

А какие конкретно исключительные ситуации Вы собираетесь обрабатывать ?

Gans
25.06.2012, 15:03
Здравствуйте const3,
Есть олимпиады/соревнования по программированию и в задании где необходимо было обработать ошибочные данные и тд. У победителя соревнований не было ни одного «try-catch-finally» и тд. все проверялось на предварительном этапе:
1. Если корень квадратный из числа – с начало сравнивалось «число < нуля».
2. Если надо было что-то перемножить сложить - проверялось «действительно ли число».
и тд.

Мораль сей басни такова: перепроверяйте все данные + исправность оборудования!!!
Например:
1. включили пускатель и через какое-то время должен замкнутся дополнительный контакт заведенный на ПЛК1хх, если не успел замкнутся неисправность! Выключение аналогично и тд.
2. при преобразовании из DWORD (0-4294967295, 32 Bit) в WORD (0-65535, 16 Bit)
Проверьте что бы Вам остались не только младшие биты, если DWORD>65535. Аналогично для REAL->WORD и тд.
3. При включении программы или подачи питания на ПЛКххх подождите некоторое время прежде чем принимать решения, что давление/температура низкое и тд. Может просто данные не успели оцифровать или считать по RS485.
4. Проверяйте данные на целостность если коэффициент пропорциональности для ПИД-регулятора = 0 значит что-то здесь не так. В этом случае заменить его своим значением подобранным после пусконаладки и дт.
5. Если температура проветривания теплицы ниже задания значит надо либо задание температуры теплицы сделать ниже либо порог проветривания выше.
6. Если неисправен датчик температуры наружного воздуха значит в автоматическом режиме прекратить управляющее воздействие на исполнительный механизм контура регулирования температуры подачи отопления. и тд.

P. S. Функций обработки исключений в CoDeSys я тоже не встречал, но программы с таким подходом работают и ведут себя адекватно даже при неисправности датчиков и не верных уставок и тд :-)

capzap
25.06.2012, 15:22
Здраствуйте.
Хорошим тоном для программиста является то, что в своей программе он должен предусмотреть все ситуации работы алгоритма, плохие данные и т.д. ... ...Как таковой обработки исключений я не нашел в CodeSys


P. S. Функций обработки исключений в CoDeSys я тоже не встречал, но программы с таким подходом работают и ведут себя адекватно даже при неисправности датчиков и не верных уставок и тд :-)

Если брать языки высокого уровня для ПК, то в основном исключения касаются работы с файлами, с обменом по сети и т.п.. Подобные вещи в ПЛК работают посредством библиотек, К примеру берем документацию на бибку SysLibFile_RU и читаем что касается открытия файла
SysFileOpen
Функция типа DWORD, используется для открытия существующего или создания нового файла.Возвращает дескриптор файла, либо '0' в случае ошибки.Получая ноль это как раз и есть работа бибки обработавшей исключение
SysLibMem_RU

SysMemAlloc
Функция типа DWORD, служит для динамического выделения памяти.
Возвращаемое функцией значение есть указатель на выделенную память либо 0, если нет возможности выделить запрошенный объем памяти ну и так далее, кроме того к исключениям можно отнести и "злую собаку"

const3
25.06.2012, 15:50
Я тут не хочу ни с кем спорить, ваши ответы очень мне помогают и думаю другим людям также. Но олимпиада по программированию и реальные ситуации это как вы понимаете разные вещи, даже если у вас есть хорошие данные, но в какое-то время плохо запаяная ножка оптрона отошла и сигнал пропал, а этот оптрон управлял исполнительным механизмом, которые должен был работать всегда, но кто ж знал, что где-то на заводе брак и т.д. Как говорят доверяй, но проверяй. А если например программу пишет много разработчиков, и каждый пишет только свой блок, который просто является черным ящиком, имеющий входы и выходы. И ты написал блок и уверен, что при определенных входных данных он стабильно работает, но тут по сети данные исказились и к тебе вместо 3х байт пришли 2.5.

Это был отступ. Но ближе к делу. Исключительные ситуации датчиков и т.д. - это не-то, я имел ввиду исключительные ситуации программы. capzap попал в точку. Обработка исключительных ситуаций при передаче по сети. У меня нет ПЛК 110, там я так понял протоколы все реализованы уже, в 63 еще нужно писать самому, используя библиотеку Modbus, тут то и возникают иногда баги, например при передаче нескольких байтов.
Еще меня беспокоит WatchDog timer. Одно дело когда программа зависла , но в то же время не поменяла своего состояния, а другое - это когда ПЛК сам перегружается когда ему вздумается. Невозможно предугадать какой код сколько времени выполняется, особенно, когда это проверяется дебаггером.
Я понимаю что с помощью retain переменных и хитрых алгоритмов можно вернуть систему в работоспособное состояние, но извините меня и скажите , что я не прав...
Да виноват разработчик, но все же, если что плохое может случится оно обязательно случится, все что может сломатся и не может все равно сломается (з-н Мерфи). Так что нужно подстраховываться.

capzap
25.06.2012, 16:02
это когда ПЛК сам перегружается когда ему вздумается. Невозможно предугадать какой код сколько времени выполняется, особенно, когда это проверяется дебаггером.

У Вас не верное представление о работе ПЛК, это не компьютер. ПЛК перегружается когда цикл по времени превысил задаваемый параметр максимальное время цикла, а не как Вы выразились когда вздумается. Так же ни кто особо несчитает сколько код будет выполняться во время цикла, одни и те же вычисления каждый цикл будут иметь одно и тоже время, поэтому подобрав оптимальное минимальное и максимальное время цикла, можно забыть о беспокойствах перегрузки контроллера.
Что же касается обмена данных, перед началом отправки запускаете таймер, по его истечении прекращаете ожидание ответа и переходите к повтору посылки запроса, это и будет обработка исключения

ЗЫ по возможности избавтесь от таких операций как WHILE, FOR и т. п. это сосвсем не то что в компьютерном программировании из-за них в основном и происходят перегрузки

const3
25.06.2012, 16:19
"одни и те же вычисления каждый цикл будут иметь одно и тоже время"
Это кто вам такое сказал? Откуда такие сведения. Даже если будут одни и те же начальные условия на универсальном процессоре не могут операции выполнятся динаково. Конвееры разные, разная последовательность выборки данных, разный стек сопроцессора и процессора, стек памяти + прерывания + watchdog, даже разная температура крисалла все таки - представьте что кристалл перегрелся. Даже на ПЛИС и то не будет одинаковое время выполнения кода, хоть там все выполняется параллельно. Но не будем спорить . Я вас понял. Спасибо за советы. А когда вздумается: я имел ввиду то, что не возможно предугадать когда сработает watchdog, и какой код это вызовет. Я не говорю о предсказуемом коде, а говорю о том который трудно проверить в лабораторных условиях.

capzap
25.06.2012, 16:27
выкладывайте код и я возможно скажу где у Вас "собака" затаилась :)

const3
25.06.2012, 16:33
Так в том то и дело, что код только начал писать. Я просто хочу добавить обработку исключений от "собаки". Я признаю что у вас больше опыта в программировании ПЛК. Подскажите пожалуйста тогда так. Может лучше взять ПЛК 110 вместо 63 и не парится. Заказ на 200 тыс. гривен и больше. Не хочется чтобы в каком-то месте что-то пошло не так.

capzap
25.06.2012, 16:43
http://www.owen.ru/forum/showthread.php?t=11237 начните с этого, а потом когда создадите свою прогу и покажете пилотный экземпляр, то найдутся форумчане которые помогут избавиться от лишнего и дабавят надежности в Ваш проект, уже по конкретным направлениям

Валенок
26.06.2012, 00:38
Послушал. Жесть.
Зачем чего-то вычислять каждый цикл ?
Зачем прерывания при цикле 1-2мс ?
Остальное - про преположить самое худшее - правильно. Я даже советовал бы до использования пощупать сами биб-ки на предел. Пример

SysMemAlloc
Функция типа DWORD, служит для...
VAR
DW : DWORD;
..
DW:=DW+SEL(SysMemAlloc(512)=0,512,0);
Последний раз меня очень удивил результат :confused: (на ПЛК154)


Я просто хочу добавить обработку исключений от "собаки".
Не тратьте время зря

capzap
26.06.2012, 06:43
:) я же говорил, найдутся те, кто может подсказать практически на любой вопрос, главное их задавать и наглядно показывать свою проблему.
Кстати по поводу примеров, вот еще масса полезного http://www.owen.ru/forum/showthread.php?t=11341