Интерфейс -- это https://help.codesys.com/webapp/_cds...rsion=3.5.17.0 в терминах среды кодсиса.
Я хотел сделать что-то вроде аналога оператора __QUERYINTERFACE, или, может быть, точнее будет назвать это фабрикой интерфейсов.
Интерфейс -- это https://help.codesys.com/webapp/_cds...rsion=3.5.17.0 в терминах среды кодсиса.
Я хотел сделать что-то вроде аналога оператора __QUERYINTERFACE, или, может быть, точнее будет назвать это фабрикой интерфейсов.
Интерфейс - это тип данных. Его нельзя вернуть в вызове POU. Можно вернуть экземпляр конкретного интерфейса.
Экземпляр интерфейса - это ссылка на экземпляр ФБ, реализующего данный конкретный интерфейс.
Экземпляр какого интерфейса вы хотите возвращать в вызове своей "фабрики"?
Судя по предыдущим постам (поправьте меня, пожалуйста, если я неверно вас понял) - произвольного.
Но что значит "экземпляр произвольного интерфейса" в контексте языка со статической типизацией?
Можно сказать (и мы уже это обсуждали), что экземпляры интерфейсов, передаваемые оператору __QUERYINTERFACE, должны наследовать системный интерфейс __SYSTEM.IQueryInterface.
И действительно - можно реализовать POU, который будет возвращать экземпляр такого типа. Т.е. на выходе вы получите ссылку на экземпляр ФБ, который реализует __SYSTEM.IQueryInterface.
Какому объекту вы передадите значение этого выхода? Опять же, типизация статическая - т.е. только другому объекту данного типа.
Соответственно, вы получите ссылку на экземпляр ФБ, реализующего __SYSTEM.IQueryInterface.
Что предполагается делать с ним дальше? У __SYSTEM.IQueryInterface нет публичных методов.
__QUERYINTERFACE - это системный оператор, реализованный крайне специфичным образом и функционирующий именно так, как было задумано его создателями.
Если вам интересно мое мнение - то я бы рекомендовал использовать его, а не пытаться разработать "аналог".
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
> Можно вернуть экземпляр конкретного интерфейса
Да, предполагалось, что будет объявлен экземпляр определённого интерфейса (занулённый), затем передан фабрике вместе с индексом "устройства", предположительно реализующего подобный интерфейс. Если "устройство" действительно реализует интерфейс такого типа, то переданный экземпляр интерфейса инициализируется этим "устройством", если нет -- остаётся равным нулю. Набор интерфейсов, которые может создавать фабрика, конечно, фиксированный.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Идея была в том, чтобы каждое "устройство" не знало про остальных ничего, кроме уникального индекса, и, предположительно, интерфейса, который может быть реализован по этому индексу.
Т.е. из "устройства" выполняется запрос к фабрике интерфейсов, отдаётся ей уникальный индекс, и экземпляр интерфейса, предположительно реализуемый "устройством" с таким индексом. А фабрика, если по индексу реализован запрашиваемый интерфейс, инициализирует его.
В моем понимании "инициализация экземпляра интерфейса" - это присвоение ему экземпляра ФБ, реализующего это интерфейс.А фабрика, если по индексу реализован запрашиваемый интерфейс, инициализирует его.
Где (в каком POU вашего проекта) на ваш взгляд должен быть объявлен этот экземпляр ФБ?
Последний раз редактировалось Евгений Кислов; 12.11.2022 в 11:20.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
у Сименса есть нечто подобное owen.png может на него лучше перейти с такими запросами
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Добрый день. Да, после перезапуска все собралось. Прошу прощения за панику. Как то даже неудобно теперь)
Все "устройства" объявлены статически, в отдельном GVL.
С "занулённым" интерфейсом ничего нельзя сделать. Ну т.е. он реально представляет собой 32-битное беззнаковое целое со значением 0, и на этом всё.Да, предполагалось, что будет объявлен экземпляр определённого интерфейса (занулённый), затем передан фабрике вместе с индексом "устройства", предположительно реализующего подобный интерфейса. Если "устройство" действительно реализует интерфейс такого типа, то переданный экземпляр интерфейса инициализируется этим "устройством", если нет -- остаётся равным нулю. Набор интерфейсов, которые может создавать фабрика, конечно, фиксированный.
Чтобы убедиться, что "устройство действительно реализует интерфейс такого типа" - нужно сначала инициализировать экземпляр интерфейса экземпляром ФБ устройства - тогда можно будет использовать __QUERYINTERFACE. Т.е. результат, который вы хотите получить в результате успешной проверки, является необходимым условием этой проверки.
Если позволите высказать мне свое мнение - я бы вам рекомендовал сосредоточиться на реальной задаче из реальной предметной области и проанализировать различные возможные варианты ее решения, а не зацикливаться на одном конкретном (см. XY Problem в подписи). Понятно, что "когда у вас в руке молоток, всё становится похожим на гвозди" - но иногда рубить деревья молотком оказывается не очень удобным. Надеюсь, вы автоматизируете не абстрактную фабрику. =)
Последний раз редактировалось Евгений Кислов; 12.11.2022 в 14:17.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk