PDA

Просмотр полной версии : Получение списка/указателей на ФБ проекта



Аркадий
29.02.2008, 15:12
Здравствуйте.
подскажите, есть ли возможность в КодеСис программно получить список всех ФБ проекта.
Нужно создать список ФБ определенных типов (собственной разработки) при инициализации программы, и потом обращаться к ним через единый интерфейс.

Филоненко Владислав
29.02.2008, 15:46
А через статические переменные ФБ никак не получится?
При первом вызове каждого экземпляра регистрируете экземпляр в некоем глобальном массиве.

Аркадий
02.03.2008, 19:38
Да, конечно и так можно. Просто не люблю глобальные переменные ))
Интересовался, может есть такая возможность встроенная.
спасибо.

Аркадий
05.03.2008, 11:35
еще вопрос похожий, чтоб тему не заводить - здесь.
есть ли какая то возможность работать с функциональным блоком по его индексу, выдаваемому indexof() ? по адресу видимо вообще никак..

скажем, надо получить доступ к фб (входы, выходы, действия) из другого фб, имея индекс. если нет, то для чего существует функция получения индекса блока?

офф. планируется ли адаптация 3-ей версии кодесиса для овенов? (ООП)

Малышев Олег
05.03.2008, 12:28
1) С индексами не получится - эта система, по неточнных данным, нужна для реализации SysLibCallBack
2) Почему ничего не получается с адресами?
Вполне возможны следующеие вызовы

typedef
myFBptr:POINTER TO myFB;
....
all_fbs:array [1..200] of myFBptr;
....
all_fb[n]^(a:=1,b:=2);


3) Третий кодесис планируется, но не для ПЛК 100-150

Аркадий
05.03.2008, 13:16
1)
Вполне возможны следующеие вызовы

typedef
myFBptr:POINTER TO myFB;
....
all_fbs:array [1..200] of myFBptr;
....
all_fb[n]^(a:=1,b:=2);



да, так конечно можно.
я по другому хотел, типа так -

MyFB : obj
obj.value := ...
dword addr := ADR(obj);
....
....
xxx := приведение к MyFB(addr).value;

НО. нельзя преобразовать к типу структура, что в общем то и понятно.. обойдусь без этого )

Малышев Олег
05.03.2008, 13:36
Так не нужно сразу преобразовывать - сделайте указатель на ФБ, присвойте ему переменную типа DWORD и вызывайте через указатель
fbptr:=adr(myfbd);
fbptr^();

Филоненко Владислав
05.03.2008, 13:38
Аркадий, это же не С!
Пожалейте тех, кто будет поддерживать систему после Вас.
Чем проще - тем лучше и надёжнее. А указатели - в самом крайнем случае, очень уж это "продвинутая" вещь. Так много нюансов.

А массив экземпляров FB не устраивает? Зачем указатель?

И добавлю - перед использованием указателя, тем более на FB, обязательно проверяйте его на NULL или, что лучше, специальной функцией на принадлежность к массиву FB. Пример такой проверки - сравнение с началом и концом массива FB и на кратность размеру FB.
Такую проверку надо делать всегда, ведь это система управления, она должна быть сверхнадёжна.

Аркадий
05.03.2008, 16:35
fbptr:=adr(myfbd);
fbptr^();
да это то понятно, это просто все )



это же не С!... А указатели - в самом крайнем случае, очень уж это "продвинутая" вещь. Так много нюансов.

я знаю )) просто привык к ним.



И добавлю - перед использованием указателя, тем более на FB, обязательно проверяйте его на NULL или, что лучше, специальной функцией на принадлежность к массиву FB. Пример такой проверки - сравнение с началом и концом массива FB и на кратность размеру FB.
Такую проверку надо делать всегда, ведь это система управления, она должна быть сверхнадёжна.

это тоже прописные истины )). так то я сам разработчик исполняющей системы для pc совместимых контроллеров, подобие фбд. на с++ писана.
просто сейчас под кодесис много чего мне не хватает, вот и интересуюсь что и как можно сделать. и еще буду спрашивать, не обессудьте ))

Филоненко Владислав
05.03.2008, 18:22
Рад помочь коллеге.