This is topic Управление состоянием канала in forum Редактор Базы Каналов (Математика) / Channel Base Editor at Форум TRACE MODE: техническая поддержка.
Такой вопрос: есть несколько каналов типа INPUT подтипа КОНТР_1, причем часть каналов при старте выключена. Необходимо включить выкюченные каналы(для начала один из них) по какому-либо событию(например, по нажатию кнопки). Согласно документации, был создан канал типа OUTPUT подтипа КАНАЛ с дополнением Установить и были заданы след. параметры: CH= имя включаемого канала, ATTR=Состояние, Time=до выкл. По нажатию кнопки (в редакторе представления данных) в этот канал посылалась 1 (хотя сразу возникает вопрос, какой атрибут должен иметь канал, связанный с кнопкой), но канал не включился. Точно таким же способом попрбовал изменить значение уже включенного канала - никаких изменений, однако изменялось значение канала подтипа ДИАГНОСТИКА с дополнением КОНТР_1 как раз на посылаемую величину. Объясните, в чем я был неправ и как же все-таки управлять состоянием канала в реальном времени. Заранее благодарен за ответ.
Posted by preo_alm (Участник № / Member № 33) on :
Еще вопрос. Ситуация, аналогичная предыдущей, только для каналов типа OUTPUT подтипа КОНТР_1. Посылка команды в устройство осуществляется только при установленной галочке Отработать для данного канала и то, только до первого останова монитора реального времени. После повторного запуска (без выхода из монитора реального времени)каналы типа OUTPUT отключаются. Как осуществить управление каналом типа OUTPUT в реальном времени?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1) Обращаю Ваше внимание, что отличное от нуля значение атрибута Состояние означает отключение канала от пересчета. Групповое управление Включением/Выключением пересчета каналов можно осуществлять через канал с подтипом ОБЪЕКТ и дополнением к подтипу Состояние. Для управляемого таким образом объекта, необходимо установить флаг "Загружаемый". 2) Остановка монитора реального времени без перезапуска проекта аналогична функции "Пауза", поэтому при повторном запуске проекта он продолжает работать с того момента, когда его остановили. Если Вы хотите реализовать принудительную выдачу данных по каналам типа OUTPUT, то необходимо собрать их в отдельный объект, сделать его загружаемым и осуществлять управление через канал подтипа ОБЪЕКТ и дополнением к подтипу Выдача.
Posted by preo_alm (Участник № / Member № 33) on :
Все это хорошо, все работает, но хотелось бы управлять не запуском цикла, а единичной операцией: по нажатию кнопки канал типа INPUT опрашивался один раз, а канал типа OUTPUT выдавал даннные тоже один раз и эти каналы отключались до следующего нажатия кнопки. Подскажите, как это осуществить?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
При переходе значения канала ОБЪЕКТ Выдача из нулевого в ненулевое будет осуществлена отработка управляемых каналов на один цикл. Для того, чтобы выполнить повторную отработку этот канал необходимо снова "обнулить" и вновь послать отличное от нуля значение. Как раз то, что Вам нужно. Кнопку посылки лучше делать с восстановлением.
Posted by preo_alm (Участник № / Member № 33) on :
Ничего подобного не поисходит: при переходе значения канала ОБЪЕКТ Выдача Вход из нулевого в ненулевое запускается отработка управляемых каналов, но не на один цикл, а до тех пор ,пока не будет обнулено значение канала ОБЪЕКТ Выдача Вход. Возможно это связано с драйвером, но в драйвере для каналов типа OUTPUT (p[0].F.fmt[3] = 1) в ф-ции Set_xxx устанавлиается значение max_rec=0, т.е. остальные ф-ции не вызываются. Посоветуйте пожалуйста как решить данную проблему. Заранее благодарю за ответ и поздравляю всех с НОВЫМ ГОДОМ!
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Не совсем понятно, причем здесь p[0].F.fmt[3] = 1 ? Дело в том, что канал ОБЪЕКТ Выдача при переходе из нулевого значения в ненулевое выставляет для всех каналов управляемого им объекта флаг "Отработать". По этому флагу сервер мат. обработки осуществляет пересчет канала и обнуление его флага. Пересчет происходит за один цикл пересчета узла. В связи с этим причину следует искать в особенности реализации драйвера.
Posted by preo_alm (Участник № / Member № 33) on :
Особенность реализации драйвера состоит в том, что в процедуре Set_xxx проверяется тип канала (p[0].F.fmt[3] = 1 - канал типа OUTPUT) и для канала OUTPUT устанавливается число принимаемых байт max_rec=0, т.е. данные только передаются. В этом случае функции Check_xxx, Get_xxx, zCompare_xxx не вызываются, что на самом деле и происходит, т.е. ошибки, вызывающие повторную посылку данных могут возникнуть только в процессе передачи данных, а, т.к. устройство правильно реагирует на посланные данные, я сделал вывод, что драйвер работает нормально и причина в чем-то другом, а имеенно не происходит автоматическое обнуление флага "Отработать" после выполнения одного цикла или даже если и происходит, то система на это не реагирует. Так что остановить цикл выдачи даннных пока-что можно только обнулением значения канала ОБЪЕКТ Выдача Вход. Возможно, эта информация поможет Вам ответить на поставленный ранее вопрос. И еще прошу Вас, если можно, давать более подробные описания рекомендуемых настроек: начиная от типа канала до атрибута и значения, посылаемого в канал.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Указанная Вами ошибка локализована и будет исправлена в ближайшем релизе. Пока придется использовать найденный Вами обходной путь.