This is topic Сохранение переменных между вызовами в ST in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/31/t/000238.html

Posted by Гусев Александр Петрович (Участник № / Member № 2148) on :
 
хотелось бы уточнить некоторые моменты относительно сохраняемости переменных в функциях, функциональных блоках, структурах и программах.

судя по тестам я вижу что во всех этих конструкциях внутренние переменные не сохраняются. каждый новый вызов они воссоздаются заново получая значения по умолчанию. это поведение кажется не совсем корректным.

дело в том что сохранение переменных для функций действительно не подразумевается самой струтурой языка ST, т. к. не существует экземпляра функции, но для функциональных блоков, структур и тем более программ сохранение внутернних переменных должно производиться (что и делается в других реализациях ST). во всяком случае мое понимание понятия функциональный блок и программа говорят именно о таком поведении. как иначе пользователь сможет написать алгоритм (или собственный блок вроде триггера или счетчика) сохраняющий свое состояние? использование для этой цели внешних переменных слишком накладно, крайне неудобно, а часто просто невозможно (когда превышено максимальное количество аргументов функции равное ~31 шт.)

ситуация выглядит еще более парадоксальной если вспомнить что в FBD-программах существуют блоки сохраняющие свое внутренее состояние (те же триггеры или счетчики). использование этих блоков в программе действительно добавляет требуемое поведение сохраняемости внутренних переменных - состояние триггера или счетчика сохраняется от вызова к вызову. учитывая что согласно документации FBD-программы транслируются в ST это означает что требуемое поведение может быть реализовано и в ST, но конструкций позволяющих сделать это я не вижу. может быть есть какой-то неизвестный мне способ или я делаю что-то не так?

служба поддержки ответила что нужно использовать для хранения состояния функциональных блоков внешние переменные. хотелось бы услышать еще мнения - кто как решает подобные вопросы. особое внимание хотелось бы обратить на тот момент что судя по существованию в FBD триггеров и счетчиков сохранение переменных между вызовами возможно.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Для сохранения значений переменных используются аргументы и глобальные переменные программы.
Как Вы определили максимальное количество аргументов для функций программы?
 
Posted by Гусев Александр Петрович (Участник № / Member № 2148) on :
 
1. очень сжатый ответ. я понимаю что если по другому никак то придется либо сохранять переменные в аргументах порождая нечитабельность и проблемы с сопровождением либо выносить свои настоящие блоки в DLL где переменные будут сохранятся как поля структур собранных в статический список а блоки будут идентифицировться по их id в этом списке. именно над этим вариантом и работаю сейчас. очнь жаль что ваша реализация ST урезала понятия "функциональный блок" и "программа" до понятия "функция". но меня прежде всего интересовало как всетаки реализована сохраняемость при использовании, например, триггера?
2. определил очень просто. письмо на эту тему было отослано в службу поддержки, но ответа я не получил. суть проблемы в следующем. если функция содержит более 31 аргумента (имеется ввиду общее число input/output/inout), то TM
-либо вообще отказывается выполнять программу выдавая сообщение в окно вывода "Нарушение доступа" (пологаю что это перехваченное TM "любимое" исключение всех программистов "Access violation") - это происходит если мы определили более 31 аргумента типа input
-либо выполняет программу - это происходит если аргументов типа input менее 31, но общее число аргументов более 31 - НО ПРИ ВЫПОЛНЕНИИ (!!!) как только мы в программе обращаемся к какому нибудь аргументу имеющему порядковый номер в списке аргументов более 31 TM аварийно завершает работу - падает с сообщением об ошибке и предложением отправить отчет корпорации майкрософт.
проверить можете сами. создайте функцию и добавте ей 31 аргумент. затем добавте либо один входной либо выходной. потом вставте эту функцию в FBD-программу в виде блока. увидете что происходит при отладке. учитывая что все функциональные блоки имеют "системный" аргумент RUN общее число аргументов функции как раз получается равным "магическому" числу 32. я полагаю что эта постоянная - размер массива в котором хранятся аргументы. т. о. осмелюсь покачать гловой и сказать "на списках надо было реализовывать работу с аргументами". извините если я не прав. жду разъяснений.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Вышел новый релиз ТМ 6.05. Данная ошибка исправлена.
 
Posted by Гусев Александр Петрович (Участник № / Member № 2148) on :
 
-вы имеете ввиду ограничение на кол-во аргументов? при возможности проверю.
-а как быть с сохраняемостью? как триггеры всетаки сохраняются, а мой FB так и не может иметь сохраняемых полей?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
1. Да, речь идёт о том, что исправлена ошибка с ограничением на количество аргументов.
2. Для сохранения значений переменных используются аргументы и глобальные переменные программы.
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2