Просмотр полной версии : Язык Си в SP: FUN работает, FB нет
Добрый день,
Вопрос про SP WinNT из Codesys 2.3 напрямую не связанный с овен, надеюсь задаю в нужную ветку форума.
В интернете есть док "Creating and Linking External C Library Functions - CODESYS". Там описано как сделать внешнюю библиотеку на Си.
У меня получилось сделать, но работает только функция. Она возвращает только одно значение, правда если делать static переменные то можно возвращать сложные результаты расчета несколькими вызовами функций по типу GetProperty объекта. А вот функциональный блок возвращает только 0.
Ниже скрины создания описания библиотеки, исходников и компиляции obj, применения и отладки подключенной библиотеки. На выходе функций результат правильный. На выходе ФБ - 0.
Подскажите что не так. В настройках выравнивания данных структур в компиляторе стоит как сказано в доке - 1 байт. Еще все это работает если OBJ создан в режиме debug - так и должно быть? Release работать не будет?
29187 29188 29189
А зачем понадобилось делать внешнюю библиотеку на Си ?
4 байта. И отдельно внутри структуры 2 или 4 байта
попробовал 4 байта в настройках проекта - незаработало - так же на выходе myout2 = 0
а что значит (как это делать) отдельно внутри структуры 2 или 4 байта? добавлять ненужные переменные к битам и байтам чтобы нужные оказывались со смещением 2 или 4 байта от начала блока данных функционального блока?
А зачем .. на Си ?
Предположительно чтобы писать сложную математику (мат.модель), возможно использовать наработки. Писать будут программисты на Си. Моя задача проверить возможность писать на Си в принципе.
фб всегда выровнен под 4 байта. Внутрянка равняется по типу. Размером в 2 байта (int,word,uint..) - по 2 байт, 4 байт(real,dword,time..) - под 4 байта
Как выглядит прототип си-шной функции реализующей ST-фб ?
Как идет обращение к полям блока ?
Прототип на второй картинке из первого сообщения в теме - http://www.owen.ru/forum/attachment.php?attachmentid=29188&d=1486369345 - см. test4.h - он был сгенерирован кодесисом и потом я туда добавил static данные
Обращение на третей картинке - http://www.owen.ru/forum/attachment.php?attachmentid=29189&d=1486369361 - см. окно кода проекта
Newcomer
07.02.2017, 14:59
Предположительно чтобы писать сложную математику (мат.модель), возможно использовать наработки. Писать будут программисты на Си. Моя задача проверить возможность писать на Си в принципе.
В описании сказано, это хозяйство работает только на 32-bit платформах.
В описании сказано, это хозяйство работает только на 32-bit платформах.
Функция работает и на 64 как видим по третей картинке. ФБ сейчас проверю на 32-й виртуалке. Кодесис и так работает как 32х битное приложение в 64х битной среде.
Newcomer
07.02.2017, 15:06
Функция работает и на 64 как видим по третей картинке. ФБ сейчас проверю на 32-й виртуалке. Кодесис и так работает как 32х битное приложение в 64х битной среде.
Если работает на 32, то на 64 тем более будет работать. Надо чтобы у ПЛК была платформа не ниже 32-bit.
Проверил на 32х битной платформе. Работает как и раньше: FUN - да, FB - возвращает 0 в myout2. Наблюдается на таргетах SP PLCWinNT и SP RTE.
может дело в call convention? как должно быть? __cdecl, __stdcall, __fastcall?
адрес структуры это понятно - он собственно передается на вход функции реализующей функциональный блок. завтра на работе посмотрю. а как узнать реальный адрес экземпляра?
вижу одинаковый адрес 20093350. скрин кода и выполнения в приложении
29259 29260
а вот адрес внутри структуры оказался смещен. мне надо менять выравнивание в структуре на 2? т.е. делать меньше. сейчас видимо у меня выравнивание 4 байта, а в КДС 2 или по размеру типа.
29263
поменял выравнивание на 2. непомогло. очевидно в VS размер типа INT - 4 байта. а где это в VS задается? я инклудил wtypes.h. (http://www.owen.ru/forum/attachment.php?attachmentid=29188&d=1486369345) а какой надо было?
а где всетаки описаны типы вроде INT? какой хидер нужно подключать? т.к. мне кажется это из-за того что VS скомпилировал структуру исходя из размера INT 4 байта а не 2 байта.
Завтра попробую запись в адрес на работе.
вывел из си в КДС размер типа INT - выдал 4 - нужен правильный хидер в котором будет сказано что INT размером в 2 байта (и соотв. остальные типы как надо)
записал в Си напрямую в адрес *((byte*)inst + 4) = (byte)55; - получил в КДС на выходе LIB_TEST1.out1 == 55 т.е. в библиотеке Си другой размер типов. нужен правильный хидер. +4 потому, что в структуре перед out1 находится 2 in'а т.е. 2*2байта=4байта до начала out1 с точки зрения КДС.
поискал в INCLUDE в VS6 - там нет других описаний типа INT кроме как в wtypes.h. где же его взять? Пробовал в VS ставить платформу 386 - все равно размер INT 4 байта.
или вручную указать другие типы данных для структуры в Си чтобы они совпали с размерами КДС?
typedef short INT; и т.д. работает КДС показывает одинаковые значения указателей внутренних элементов. ФБ возвращает значение в out
в интернетах пишут про заголовочный файл CmpStd.h - он есть в платном тулките и там вроде есть описания типов. Кто нибудь может им поделиться?
Еще вопрос: Созданная таким образом библиотека работает. Но работает только с OBJ созданным в режиме Debug. Если делать Release КДС компилирует проект, загружает, но при запуске выдает ошибку Unresolved external POUs и перечисляет все функции и ФБ моей библиотеки.
В интернете пишут надо сохранить LIB файл с типом Internal Library. У меня есть только тип Internal v 2.2. Сохранил LIB internal 2.2 - проект с Release OBJ скомпилировался, загрузился, выполняется, НО ничего из функций и ФБ не возвращается, адрес КДС элемента структуры ФБ равен 0. Функции тоже возвращают нули.
Что можно сделать чтобы заработало с Release OBJ?
нули internal показывает возможно потому, что исполняет пустой код созданный в проекте библиотеки КДС а не внешний obj. Internal library v.2.3 это видимо просто internal library без версии в списке выбора типа сохранения.
Итого как запустить release OBJ пока под вопросом
да, сделал сам сопоставление типов - все работает.
про release - вроде все так же как и в debug но вот неработает. есть подозрение может КДС пользуется отладочной информацией чтобы выполнять (находить точку входа) биб-ку и по-этому неможет запустить релиз. а дебаг содержит исходный код.. а этого в том числе и хочется избежать (чтобы без детских паролей было).
на оф.форуме меня пока не авторизовали - как включат, напишу туда
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot