2 программы запивывают в INPUT одного канала. Одна программа-счетчик работает с циклом пересчета CALC, а вторая (устанавливает начальное значение) запускается нажатием кнопки. При нажатии кнопки реальное значение не всегда правильно устанавливается, обычно надо нажать кнопку 2-3 раза. Подумал про переписывание значения другой программой. На время установки отключаю программу-счетчик, но этот финт не помогает. При включении канала его значение опять переписывается программой счетчиком. Подскажите как правильно реализовать установку значения.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Нельзя от двух независимых источников передавать значение в один канал. Конфликты неминуемы. Это не особенности Trace Mode 6, это алгоритмический нонсенс для любой прикладной программы. Должен быть программный арбитр, который отдает приоритет, например, экранной посылке перед программным счетчиком. Алгоритм функционирования арбитра определяется постановкой прикладной задачи.
Posted by Petrix (Участник № / Member № 3662) on :
1. Источники не независимы. Программа-счетчик берет реальное значение канала, увеличивает его допустим на 1 и записывает во входное значение. Другая программа должна установить начальное значение.
2. Мной полагалось, что отключение пересчета канала избавит от конфликта. Но этого не произошло. Канал программы-счетчика отключается, потом устанавливаем новое значение. То, что значение установилось видно на ГЭ привязанном к реальному значению канала. Но после пуска счетчик не получает нового значения, а продолжает увеличивать значение до установки. Я понимаю, что вы можете кэшировать значения, но при отключении канала кэш должен сбрасываться.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Пришлите, пожалуйста, тестовый пример проекта, реализующий этот конфликт.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Согласно стандарта IEC 61131-3 в языке FBD есть следующие соглашения: - выход любого функционального блока является статической переменной и сохраняет свое значение между вызовами программы, - вход RUN функционального блока управляет только собственной функцией блока. Если RUN<>0, то блок не пересчитывается и значение его выхода остается тем же, которое было по завершении предыдущего вызова программы, - значение выхода функционального блока, привязанного к аргументу программы, всегда передается в аргумент по завершении программы.
Этим объясняется полученный Вами эффект.
Посылаю Вам пример с двумя программами - на языках FBD и ST, каждая из которых позволяет решить Вашу задачу.
Posted by Petrix (Участник № / Member № 3662) on :