Вход

Просмотр полной версии : Изменить значение выхода в момент присвоения переменной. ПЛК 160.



Kamerton
28.09.2015, 17:30
Доброго дня.

Подскажите, пожалуйста, можно ли изменить значение аналогового входа во время выполнения/отладки?

Сейчас поясню...
Есть клапан, подключённый к аналоговому входу ПЛК 160. При изменении значения переменной в программе, значение на выходе (напряжение на клапане) изменяется только по завершению цикла POU.

Можно ли как-то изменять значение выхода в момент изменения переменной?

Я хочу вынести логику открытия клапана в отдельную функцию, а в своём ФБлоке ждать изменения давления после открытия клапана. Но в результате, клапан открывается только по завершению блока, когда программа "перестаёт ждать".

capzap
28.09.2015, 17:37
стесняюсь спросить какое время цикла у Вас , что позволяет Вам увидеть завершение работы блока?

жекон
28.09.2015, 21:01
Надеюсь что понял cуть вопроса, скорее всего Вы пытайтесь поменять из конфигуратора с привязанной переменной, меняйте в программе

Kamerton
29.09.2015, 09:07
стесняюсь спросить какое время цикла у Вас , что позволяет Вам увидеть завершение работы блока?

Не сочтите за ехидство, но... Стесняюсь спросить, какого цикла? :) POU? Просто не уверен, что правильно понял. Если вы про него, то время не большое. Смотрю переменную под отладкой и при пошаговом проходе (выполнение на контроллере) её значение меняется, но клапан не открывается, пока не "прошагаешь" весь POU...


Надеюсь что понял cуть вопроса, скорее всего Вы пытайтесь поменять из конфигуратора с привязанной переменной, меняйте в программе

Плохо я понимаю разницу между конфигуратором и программой... Другими словами, я слежу за изменениями переменной при отладке. Значение переменной меняется, но открытия клапана не происходит.

petera
29.09.2015, 10:08
Смотрю переменную под отладкой и при пошаговом проходе (выполнение на контроллере) её значение меняется, но клапан не открывается, пока не "прошагаешь" весь POU...
И это правильно, так и должно быть. Такова особенность работы ПЛК: Сканирование входов--Запоминание состояния физических входов-->Выполнение всей программы-->Получение значений состояния выходов-->Запись этих состояний на физические выходы. Далее все повторяется.

Kamerton
29.09.2015, 13:26
И это правильно, так и должно быть. Такова особенность работы ПЛК: Сканирование входов--Запоминание состояния физических входов-->Выполнение всей программы-->Получение значений состояния выходов-->Запись этих состояний на физические выходы. Далее все повторяется.

Спасибо огромное! Теперь яснее стало, как эта штука работает.

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

spectrum48k
29.09.2015, 20:42
Спасибо огромное! Теперь яснее стало, как эта штука работает.

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

читать срочно: И.В. Петров "Язык ST для C программиста - CoDeSys"

Yegor
30.09.2015, 09:54
читать срочно: И.В. Петров "Язык ST для C программиста - CoDeSys"Интереса ради глянул. Там местами глупости всякие говорятся вроде этой:
Неявное преобразование типов запрещено. Любое преобразование нужно делать явно спомощью специальных операторов. Запомнить их легко. Пишем исходный тип, далее _TO_ инужный тип. Например: iX := REAL_TO_INT(rX);Булшит. Оно не запрещено. Оно даже реализовано для числовых типов — их можно преобразовывать к бОльшим типам: INT -> DINT, например. Для указателей неявное преобразование тоже реализовано: POINTER TO X <-> DWORD. Другое дело, что нет возможности объявить своё неявное преобразование.

И вообще «традиционному программисту» я бы сказал вот чего... Программа на языках 61131-3 пишется как функция моментального вычисления зависимости выходов от внешних сигналов и внутренних переменных. Контроллер постоянно как можно быстрее пересчитывает эту функцию вновь и вновь. По сути это традиционный опрос, только в режиме опроса работает целиком вся программа.

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

Чего нет ещё в стандартной комплектации: рекурсии, указателей на функции, операции взятия указателя (указатели инициализируются только через неявное преобразование из DWORD), в принципе указателей вообще нет (но раз уж кодесис, то ладно), препроцессора, блокирующих функций, управляемой многопоточности. Да много чего нет. Главное — понять и полюбить программирование в бесконечном опросе.

Kamerton
30.09.2015, 12:02
читать срочно: И.В. Петров "Язык ST для C программиста - CoDeSys"

Спасибо. Да, с этого следовало бы начать :)


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

Спасибо, буду обращать внимание, хотя, не замечал, чтобы использовал что-то подобное. Но, скорее всего, придётся столкнуться с проблемой, ибо после C# опыта в управлении памятью нету :)

spectrum48k
30.09.2015, 17:36
Приведенный пример неявного преобразования больше исключение, чем правило, и лучше сразу привыкать к тому, что разные типы необходимо преоборазовывать.

Вот еще ссылка - шах и мат: http://prolog-plc.ru/pb1