PDA

Просмотр полной версии : После перезагрузки в ПЛК154 перестает работать ПИД-регулятор



erfinder
13.03.2017, 13:24
Доброго времени суток! Столкнулся с проблемой, что после пропадания питания на длительный срок(когда программа загружается из flash-памяти), выходной сигнал Y ПИД-регулятора, использующегося в программе становится недействительным числом и запись выглядит как: Y=1.#QNAN.

Restart не помогает, только сброс с CoDeSys, либо перезалив проекта. Можно ли как то это исправить?

У этого http://www.owen.ru/forum/showthread.php?t=17399 джентльмена была точь в точь такая же проблема, но решение там так и не раскрывается.
Прошивка последняя, Target версии 2.10.

Забыл добавить, что если из CoDeSys рассматривать работу ПИД-регулятора (раскрыть его дерево), то видно, что 1.#QNAN появляется в интегральной части.

erfinder
15.03.2017, 14:25
Господа, я не сидел сложа руки, понял, что не всё знаю о тонкостях работы с ПЛК, и пришел к таким полезным штукам как RETAIN-переменные, объявлял по всякому, но после пропадания питания всё не уходит эта проблема. Пробовал математику считать, промежуточные переменные сами по себе не запоминаются, и после "пробуждения" они могли бы быть равны нулю даже, но нет, там -1.#QNAN...

capzap
15.03.2017, 15:16
может быть настало время выложить проект. Надеюсь регулятор запускается не в каждом цикле, а хотя бы через 100мс

erfinder
16.03.2017, 01:04
может быть настало время выложить проект. Надеюсь регулятор запускается не в каждом цикле, а хотя бы через 100мс

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

erfinder
16.03.2017, 04:48
Разобрался с проблемой. В моем проекте используется симулятор изменения уровня в баке (цикл суммирования), проблема была в нем, какой-то сбой при "пробуждении" в нем происходил, и как следствие -1.#QNAN появлялся далее по цепочке везде где используется уровень бака. Решение было таким: раз в 5 секунд записывается текущий уровень в отдельную переменную. На входе ПИД-регулятора стоит блок DECODE_FLOAT, который выдает ошибку не равную нулю, если на входе неведомая хрень по типу -1.#QNAN. Далее условие, если ошибка не равна нулю, то в текущий уровень записывается значение из переменной, где раз в 5 сек сохранялся уровень. Теперь после "пробуждения" проблем нет.