Просмотр полной версии : Изменить значение выхода в момент присвоения переменной. ПЛК 160.
Kamerton
28.09.2015, 17:30
Доброго дня.
Подскажите, пожалуйста, можно ли изменить значение аналогового входа во время выполнения/отладки?
Сейчас поясню...
Есть клапан, подключённый к аналоговому входу ПЛК 160. При изменении значения переменной в программе, значение на выходе (напряжение на клапане) изменяется только по завершению цикла POU.
Можно ли как-то изменять значение выхода в момент изменения переменной?
Я хочу вынести логику открытия клапана в отдельную функцию, а в своём ФБлоке ждать изменения давления после открытия клапана. Но в результате, клапан открывается только по завершению блока, когда программа "перестаёт ждать".
стесняюсь спросить какое время цикла у Вас , что позволяет Вам увидеть завершение работы блока?
Надеюсь что понял cуть вопроса, скорее всего Вы пытайтесь поменять из конфигуратора с привязанной переменной, меняйте в программе
Kamerton
29.09.2015, 09:07
стесняюсь спросить какое время цикла у Вас , что позволяет Вам увидеть завершение работы блока?
Не сочтите за ехидство, но... Стесняюсь спросить, какого цикла? :) POU? Просто не уверен, что правильно понял. Если вы про него, то время не большое. Смотрю переменную под отладкой и при пошаговом проходе (выполнение на контроллере) её значение меняется, но клапан не открывается, пока не "прошагаешь" весь POU...
Надеюсь что понял cуть вопроса, скорее всего Вы пытайтесь поменять из конфигуратора с привязанной переменной, меняйте в программе
Плохо я понимаю разницу между конфигуратором и программой... Другими словами, я слежу за изменениями переменной при отладке. Значение переменной меняется, но открытия клапана не происходит.
Смотрю переменную под отладкой и при пошаговом проходе (выполнение на контроллере) её значение меняется, но клапан не открывается, пока не "прошагаешь" весь POU...
И это правильно, так и должно быть. Такова особенность работы ПЛК: Сканирование входов--Запоминание состояния физических входов-->Выполнение всей программы-->Получение значений состояния выходов-->Запись этих состояний на физические выходы. Далее все повторяется.
Kamerton
29.09.2015, 13:26
И это правильно, так и должно быть. Такова особенность работы ПЛК: Сканирование входов--Запоминание состояния физических входов-->Выполнение всей программы-->Получение значений состояния выходов-->Запись этих состояний на физические выходы. Далее все повторяется.
Спасибо огромное! Теперь яснее стало, как эта штука работает.
После "программирования для ПК", подобное поведение вгоняет в ступор. Кажется, что есть какой-то другой способ, чтобы "оно заработало" :)
spectrum48k
29.09.2015, 20:42
Спасибо огромное! Теперь яснее стало, как эта штука работает.
После "программирования для ПК", подобное поведение вгоняет в ступор. Кажется, что есть какой-то другой способ, чтобы "оно заработало" :)
читать срочно: И.В. Петров "Язык ST для C программиста - CoDeSys"
читать срочно: И.В. Петров "Язык 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
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot