PDA

Просмотр полной версии : Динамическое создание экземпляра функционального блока



razv
24.04.2026, 10:18
Здравствуйте
Имеется ли возможность в CS3.5 во время выполнения программы создать экземпляр функционального блока?
То есть я точно не знаю сколько мне их понадобится и не хочу заранее создавать массив функциональных блоков с размером заведомо больше чем буду использовать.
Хочется создавать их программе по мере необходимости и может быть удалять если в них отпадет необходимость.
Задача видимо в выделении памяти по размеру ФБ, размещение в ней экземпляра ФБ и вызов ФБ по адресу этой памяти. Как это можно сделать я не представляю к сожалению.

Задача возникла из за необходимостью связи с неизвестным заранее количеством устройств по TCP Modbus. Для каждого устройства нужен ФБ в котором будут крутится TCP_Client и MB_TcpRequest со своим IP

1exan
24.04.2026, 10:39
Здравствуйте
Имеется ли возможность в CS3.5 во время выполнения программы создать экземпляр функционального блока?
То есть я точно не знаю сколько мне их понадобится и не хочу заранее создавать массив функциональных блоков с размером заведомо больше чем буду использовать.
Хочется создавать их программе по мере необходимости и может быть удалять если в них отпадет необходимость.
Задача видимо в выделении памяти по размеру ФБ, размещение в ней экземпляра ФБ и вызов ФБ по адресу этой памяти. Как это можно сделать я не представляю к сожалению.

Задача возникла из за необходимостью связи с неизвестным заранее количеством устройств по TCP Modbus. Для каждого устройства нужен ФБ в котором будут крутится TCP_Client и MB_TcpRequest со своим IP

Даже если такое можно сделать - кто будет использовать полученные данные от новых клиентов?

razv
24.04.2026, 10:51
Даже если такое можно сделать - кто будет использовать полученные данные от новых клиентов?

Видимо у этого экземпляра должен быть доступ к входным и выходным переменным (по адресам например) как у нормального экземпляра описанного заранее и созданного при компиляции.

Евгений Кислов
24.04.2026, 10:57
Добрый день.


не хочу заранее создавать массив функциональных блоков с размером заведомо больше чем буду использовать

Памяти хватит в любом случае, т.е. речь только о том, что это кажется "некрасивым" и хочется "изысканного".


Хочется создавать их программе по мере необходимости и может быть удалять если в них отпадет необходимость.

https://content.helpme-codesys.com/en/LibDevSummary/fb_factory.html

Скорее всего, ссылка откроется только через VPN.

Но я предполагаю, что вы потратите существенно больше времени на изучение технологии и отладку получившегося решения, чем на "создание массива функциональных блоков с размером заведомо больше".

razv
24.04.2026, 11:42
Спасибо посмотрел.
Вы правы тут нахрапом не получится. Интересно и полезно было бы научиться работать с кучей и можно было использовать ООП в CS
Придется пока записать в wishlist
Пойду массив создавать

melky
24.04.2026, 14:12
интересно, насколько понимаю в ST типа Списков и Словарей нет ничего? ну еще классы? или это вот там по ссылке всё?
з.ы. нет ВПНов, чтобы посмотреть.

кстати где-то нарывался на статью, как человек писал программу для Хлебопечки (ну для выпекания хлеба), что-то похожее по идее у него там было.

SlavikP
26.04.2026, 04:35
Если кому будет интересно - скачанная страничка из справки.

melky
26.04.2026, 10:22
в общем для динамики все грустно. это вам не языки программирования с классами, списками и прочим.

Валенок
01.05.2026, 23:28
...
Задача видимо в выделении памяти по размеру ФБ, размещение в ней экземпляра ФБ и вызов ФБ по адресу этой памяти. Как это можно сделать я не представляю к сожалению.
В общем по этим ссылкам навели тень на плетень и все переусложнили.


видимо в выделении памяти по размеру ФБ,
да

размещение в ней экземпляра ФБ
инициализация простым запихиванием туда константного фб
и дальше конкретные поля

вызов ФБ по адресу этой памяти
ну создаете список (поле 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 делаю, а тут еще и функциями-обьявы, наследование, полиморф, свойства...