Просмотр полной версии : Динамическое создание экземпляра функционального блока
Здравствуйте
Имеется ли возможность в CS3.5 во время выполнения программы создать экземпляр функционального блока?
То есть я точно не знаю сколько мне их понадобится и не хочу заранее создавать массив функциональных блоков с размером заведомо больше чем буду использовать.
Хочется создавать их программе по мере необходимости и может быть удалять если в них отпадет необходимость.
Задача видимо в выделении памяти по размеру ФБ, размещение в ней экземпляра ФБ и вызов ФБ по адресу этой памяти. Как это можно сделать я не представляю к сожалению.
Задача возникла из за необходимостью связи с неизвестным заранее количеством устройств по TCP Modbus. Для каждого устройства нужен ФБ в котором будут крутится TCP_Client и MB_TcpRequest со своим IP
Здравствуйте
Имеется ли возможность в CS3.5 во время выполнения программы создать экземпляр функционального блока?
То есть я точно не знаю сколько мне их понадобится и не хочу заранее создавать массив функциональных блоков с размером заведомо больше чем буду использовать.
Хочется создавать их программе по мере необходимости и может быть удалять если в них отпадет необходимость.
Задача видимо в выделении памяти по размеру ФБ, размещение в ней экземпляра ФБ и вызов ФБ по адресу этой памяти. Как это можно сделать я не представляю к сожалению.
Задача возникла из за необходимостью связи с неизвестным заранее количеством устройств по TCP Modbus. Для каждого устройства нужен ФБ в котором будут крутится TCP_Client и MB_TcpRequest со своим IP
Даже если такое можно сделать - кто будет использовать полученные данные от новых клиентов?
Даже если такое можно сделать - кто будет использовать полученные данные от новых клиентов?
Видимо у этого экземпляра должен быть доступ к входным и выходным переменным (по адресам например) как у нормального экземпляра описанного заранее и созданного при компиляции.
Евгений Кислов
24.04.2026, 10:57
Добрый день.
не хочу заранее создавать массив функциональных блоков с размером заведомо больше чем буду использовать
Памяти хватит в любом случае, т.е. речь только о том, что это кажется "некрасивым" и хочется "изысканного".
Хочется создавать их программе по мере необходимости и может быть удалять если в них отпадет необходимость.
https://content.helpme-codesys.com/en/LibDevSummary/fb_factory.html
Скорее всего, ссылка откроется только через VPN.
Но я предполагаю, что вы потратите существенно больше времени на изучение технологии и отладку получившегося решения, чем на "создание массива функциональных блоков с размером заведомо больше".
Спасибо посмотрел.
Вы правы тут нахрапом не получится. Интересно и полезно было бы научиться работать с кучей и можно было использовать ООП в CS
Придется пока записать в wishlist
Пойду массив создавать
интересно, насколько понимаю в ST типа Списков и Словарей нет ничего? ну еще классы? или это вот там по ссылке всё?
з.ы. нет ВПНов, чтобы посмотреть.
кстати где-то нарывался на статью, как человек писал программу для Хлебопечки (ну для выпекания хлеба), что-то похожее по идее у него там было.
Если кому будет интересно - скачанная страничка из справки.
в общем для динамики все грустно. это вам не языки программирования с классами, списками и прочим.
...
Задача видимо в выделении памяти по размеру ФБ, размещение в ней экземпляра ФБ и вызов ФБ по адресу этой памяти. Как это можно сделать я не представляю к сожалению.
В общем по этим ссылкам навели тень на плетень и все переусложнили.
видимо в выделении памяти по размеру ФБ,
да
размещение в ней экземпляра ФБ
инициализация простым запихиванием туда константного фб
и дальше конкретные поля
вызов ФБ по адресу этой памяти
ну создаете список (поле next в помощь и пара строк) и вызываете.
Какие-то массивы для обмена - ужос какой-то.
function block XXX
var
next: DWORD := 0;
...
end_if
где-то
list: pointer to XXX := 0;
где-то создание
var const
fc : XXX;
end_if
var
p: pointer to XXX;
........
p := ... sizeof(p^)); //разместил
... проверил на nil [по желанию и кратность адреса, но КДС кратное возвращает. А если нет, то и это несложно решить]
p^ := fc; //инициализация
p^. .... := какие то нужные поля
....
//в список, простейший односвязный, но хоть в какой
p^.next := list;
list := p;
где-то прогоны
var
p : pointer to XXX;
..
p := list;
while p <> 0 do
p^();
p := p^.next;
end_while
..
А с учетом функций в объявах вообще всё красиво делается. Типа
запрос : XXX := Create(.....);
где-то другой
другой : XXX := Create(.....);
еще где-то
еще : XXX := Create(.....);
И так далее.
В одном месте:
ОбработчикСписка();
И всё.
Нормально тут если повозится в начале. Потом - сапсаном летит.
Я это всё и в КДС2 делаю, а тут еще и функциями-обьявы, наследование, полиморф, свойства...
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot