This is topic Сохранение данных в DLL-модулях in forum Языки программирования (IL/FBD) / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.


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

Posted by Сафронов (Участник № / Member № 408) on :
 
Сораняются ли значения выходов пользовательских функциональных блоков, написанных на Си, между двумя вызовами программы ? Локальные переменные для сохранения данных использовать не получается, т.к. функциональные блоки используются в нескольких FBD, а входы все заняты. Или подскажите другой способ сохранения данных от вызова к вызову.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
А что мешает использовать static переменные в самом коде FBD-блока? Здесь на форуме совсем недавно даже исходный код на Си++ приводился ( здесь), который реализовывал очень большую задержку значения. Так вот в нем его внутренний массив значений как раз как static обозначался, чтобы не потерять данные от вызова к вызову блока.
 
Posted by Сафронов (Участник № / Member № 408) on :
 
Мещает то, что функциональные блоки используются в нескольких FBD, и переменные static будут общими для всех FBD, что в данном случае недопустимо (данные должны сохраняться для каждой FBD отдельно).
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
В этом случае без внутреннего разделения этих ресурсов никак нельзя. [duno / незнайка]
Это потребует дополнительного входа у блока.
 
Posted by Сафронов (Участник № / Member № 408) on :
 
Подскажите, пожалуйста, как инициализировать static переменные нулями при первом включении функционального блока.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Есть три варианта по мере усложнения:
1) Обнулить его при объявлении, например так: static int MyArray[800]={0};
2) Обнулить его в функции DllMain - вызывается при первом вызове DLL.
3) Создать простенький класс и обнулять массив через конструктор класса при его инициализации.
 
Posted by Сафронов (Участник № / Member № 408) on :
 
При обнулении при объявлении данных МикроМРВ прекращает работу на первом цикле с выводом на терминал сообщения:
run-time error M6101:MATH
-floating-point error:invalid.
Объявление static переменных делалось в двух вариантах:
1)в теле процедуры ФБ;
2)вне его.
Инициализация внутри main результата не дала. При первом подключении ФБ данные не равны 0.
Что мы делаем не так ?
Запускался МикроМРВ релизов 5.11 и 5.12.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Трудно сказать, что Вы делаете не так, ведь код блока на С++ Вы писали, а не мы... [duno / незнайка]
 
Posted by Сафронов (Участник № / Member № 408) on :
 
Если в текст ФБ, помещенный в справке, вставить инициализацию при объявлении данных static float, то МикроМРВ прекращает работу на первом цикле так же, как и в случае применения ФБ, написанного нами.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Я привел Вам пример на 800 элементов просто как пример, наверняка у Вас не хватает стэка, чтобы разместить в нем данные Вашего массива - вот система ДОС и "вылетает"... На сколько элементов у Вас массив и какая его размерность?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
И еще - обязательно в настройках компилятора должно стоять, что "SS!=DS, DS loaded on function entry"!
 
Posted by Сафронов (Участник № / Member № 408) on :
 
Массив данных состоит из 5 элементов типа float. Требования приведенные в справке к написанию ФБ мы соблоюдаем.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Пришлите, пожалуйста, на адрес hotline@adastra.ru Ваш вариант модификации нашего примера FBD-блока для анализа.
 
Posted by Сафронов (Участник № / Member № 408) on :
 
Текст ФБ отправили.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Текст получили.
Комментарии отправлены почтой.
 


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2