PDA

Просмотр полной версии : Работа функционального блока



Алексей11
20.04.2007, 12:37
Добрый день!
Прошу разъяснить следующую ситуацию.
В тестовом проекте написал функциональный блок, в котором используется локальная переменная для хранения некоторого значения, полученного в предыдущем цикле. В проекте 8 цепей, экземпляр моего FB используется в 5-й цепи. Загружаю проект в ПЛК150, перевожу в состояние Run. Через некоторое время отключаю питание ПЛК минут на 15, затем снова включаю питание. Программа загружается из флэшки в ОЗУ, переходит в состояние Run и начинает исполняться. Но исполняются цепи до моего FB, а цепь с моим FB и следующие за ней не выполняются(пробовал записывать и фиксировать различные значения на входе блоков других цепей).Программа начинает полностью работать после команды Reset (cold).

Вопросы:
1. Какую ошибку я допустил при создании блока (файл проекта прикрепляю)? Переменную для хранения значения вычисленного в предыдущем цикле объявлял локальной, глобальной, Retain - никаких изменений.
2. Где можно найти описание кодов ошибок которые возникают при исполнении программы и видны в редакторе CoDeSys? (при работе у переменной было значение -1.#QNAN)
3. Когда в моем FB возникает ошибка после подачи питания на ПЛК, почему не останавливается вся программа (ее состояние - Run) , а ее часть до данного блока работает, а после него нет (почему не работают следующие за блоком цепи)?

Малышев Олег
22.04.2007, 16:21
Есть предположение, что происходит арифметическое переполнение и выброс исключительной ситуации.

К сожалению не понял из проекта какой нужен таргет.

Настоятельно рекомендую до использования значений с аналоговых входов плк прогнать их через блок DECODE_FLOAT библиотеки pid_regulators.lib. Это связано с тем что при нештатных ситуациях значение с измерителя может быть некорректным.

Алексей11
23.04.2007, 10:21
Версия прошивки 2.00.4, таргет 2.0.
Спасибо за подсказку, версия с арифметическим переполнением мне тоже представляется наиболее вероятной. Удивляет, что при появлении исключительной ситуации часть кода (начальная) продолжает выполняться и не происходит останов всей программы. Почему именно Reset(cold) позволяет начать выполняться всему коду программы?