This is topic Сохранение данных в DLL-модулях in forum Языки программирования (IL/FBD) / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.
Сораняются ли значения выходов пользовательских функциональных блоков, написанных на Си, между двумя вызовами программы ? Локальные переменные для сохранения данных использовать не получается, т.к. функциональные блоки используются в нескольких 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 :
В этом случае без внутреннего разделения этих ресурсов никак нельзя. Это потребует дополнительного входа у блока.
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 :
Трудно сказать, что Вы делаете не так, ведь код блока на С++ Вы писали, а не мы...
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 :