Тема / Topic: Сохранение переменных между вызовами в ST
Гусев Александр Петрович
Active Forum Member / Активный участник форума
Участник № / Member № 2148
отправлено / posted
хотелось бы уточнить некоторые моменты относительно сохраняемости переменных в функциях, функциональных блоках, структурах и программах.
судя по тестам я вижу что во всех этих конструкциях внутренние переменные не сохраняются. каждый новый вызов они воссоздаются заново получая значения по умолчанию. это поведение кажется не совсем корректным.
дело в том что сохранение переменных для функций действительно не подразумевается самой струтурой языка ST, т. к. не существует экземпляра функции, но для функциональных блоков, структур и тем более программ сохранение внутернних переменных должно производиться (что и делается в других реализациях ST). во всяком случае мое понимание понятия функциональный блок и программа говорят именно о таком поведении. как иначе пользователь сможет написать алгоритм (или собственный блок вроде триггера или счетчика) сохраняющий свое состояние? использование для этой цели внешних переменных слишком накладно, крайне неудобно, а часто просто невозможно (когда превышено максимальное количество аргументов функции равное ~31 шт.)
ситуация выглядит еще более парадоксальной если вспомнить что в FBD-программах существуют блоки сохраняющие свое внутренее состояние (те же триггеры или счетчики). использование этих блоков в программе действительно добавляет требуемое поведение сохраняемости внутренних переменных - состояние триггера или счетчика сохраняется от вызова к вызову. учитывая что согласно документации FBD-программы транслируются в ST это означает что требуемое поведение может быть реализовано и в ST, но конструкций позволяющих сделать это я не вижу. может быть есть какой-то неизвестный мне способ или я делаю что-то не так?
служба поддержки ответила что нужно использовать для хранения состояния функциональных блоков внешние переменные. хотелось бы услышать еще мнения - кто как решает подобные вопросы. особое внимание хотелось бы обратить на тот момент что судя по существованию в FBD триггеров и счетчиков сохранение переменных между вызовами возможно.
Сообщения / Posts 84 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Для сохранения значений переменных используются аргументы и глобальные переменные программы. Как Вы определили максимальное количество аргументов для функций программы?
Сообщения / Posts 17345 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Гусев Александр Петрович
Active Forum Member / Активный участник форума
Участник № / Member № 2148
отправлено / posted
1. очень сжатый ответ. я понимаю что если по другому никак то придется либо сохранять переменные в аргументах порождая нечитабельность и проблемы с сопровождением либо выносить свои настоящие блоки в DLL где переменные будут сохранятся как поля структур собранных в статический список а блоки будут идентифицировться по их id в этом списке. именно над этим вариантом и работаю сейчас. очнь жаль что ваша реализация ST урезала понятия "функциональный блок" и "программа" до понятия "функция". но меня прежде всего интересовало как всетаки реализована сохраняемость при использовании, например, триггера? 2. определил очень просто. письмо на эту тему было отослано в службу поддержки, но ответа я не получил. суть проблемы в следующем. если функция содержит более 31 аргумента (имеется ввиду общее число input/output/inout), то TM -либо вообще отказывается выполнять программу выдавая сообщение в окно вывода "Нарушение доступа" (пологаю что это перехваченное TM "любимое" исключение всех программистов "Access violation") - это происходит если мы определили более 31 аргумента типа input -либо выполняет программу - это происходит если аргументов типа input менее 31, но общее число аргументов более 31 - НО ПРИ ВЫПОЛНЕНИИ (!!!) как только мы в программе обращаемся к какому нибудь аргументу имеющему порядковый номер в списке аргументов более 31 TM аварийно завершает работу - падает с сообщением об ошибке и предложением отправить отчет корпорации майкрософт. проверить можете сами. создайте функцию и добавте ей 31 аргумент. затем добавте либо один входной либо выходной. потом вставте эту функцию в FBD-программу в виде блока. увидете что происходит при отладке. учитывая что все функциональные блоки имеют "системный" аргумент RUN общее число аргументов функции как раз получается равным "магическому" числу 32. я полагаю что эта постоянная - размер массива в котором хранятся аргументы. т. о. осмелюсь покачать гловой и сказать "на списках надо было реализовывать работу с аргументами". извините если я не прав. жду разъяснений.
Сообщения / Posts 84 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Гусев Александр Петрович
Active Forum Member / Активный участник форума
Участник № / Member № 2148
отправлено / posted
-вы имеете ввиду ограничение на кол-во аргументов? при возможности проверю. -а как быть с сохраняемостью? как триггеры всетаки сохраняются, а мой FB так и не может иметь сохраняемых полей?
Сообщения / Posts 84 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
1. Да, речь идёт о том, что исправлена ошибка с ограничением на количество аргументов. 2. Для сохранения значений переменных используются аргументы и глобальные переменные программы.
Сообщения / Posts 17345 | Из / From: Россия
| IP / IP: IP адрес / IP address |