PDA

Просмотр полной версии : Язык Си в SP: FUN работает, FB нет



sas7
06.02.2017, 11:23
Добрый день,

Вопрос про 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

Вольд
06.02.2017, 16:02
А зачем понадобилось делать внешнюю библиотеку на Си ?

sas7
07.02.2017, 13:32
4 байта. И отдельно внутри структуры 2 или 4 байта

попробовал 4 байта в настройках проекта - незаработало - так же на выходе myout2 = 0

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

sas7
07.02.2017, 13:35
А зачем .. на Си ?
Предположительно чтобы писать сложную математику (мат.модель), возможно использовать наработки. Писать будут программисты на Си. Моя задача проверить возможность писать на Си в принципе.

sas7
07.02.2017, 14:58
фб всегда выровнен под 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 платформах.

sas7
07.02.2017, 15:04
В описании сказано, это хозяйство работает только на 32-bit платформах.
Функция работает и на 64 как видим по третей картинке. ФБ сейчас проверю на 32-й виртуалке. Кодесис и так работает как 32х битное приложение в 64х битной среде.

Newcomer
07.02.2017, 15:06
Функция работает и на 64 как видим по третей картинке. ФБ сейчас проверю на 32-й виртуалке. Кодесис и так работает как 32х битное приложение в 64х битной среде.

Если работает на 32, то на 64 тем более будет работать. Надо чтобы у ПЛК была платформа не ниже 32-bit.

sas7
07.02.2017, 15:27
Проверил на 32х битной платформе. Работает как и раньше: FUN - да, FB - возвращает 0 в myout2. Наблюдается на таргетах SP PLCWinNT и SP RTE.

sas7
07.02.2017, 15:48
может дело в call convention? как должно быть? __cdecl, __stdcall, __fastcall?

sas7
07.02.2017, 21:16
адрес структуры это понятно - он собственно передается на вход функции реализующей функциональный блок. завтра на работе посмотрю. а как узнать реальный адрес экземпляра?

sas7
08.02.2017, 10:31
вижу одинаковый адрес 20093350. скрин кода и выполнения в приложении
29259 29260

sas7
08.02.2017, 10:42
а вот адрес внутри структуры оказался смещен. мне надо менять выравнивание в структуре на 2? т.е. делать меньше. сейчас видимо у меня выравнивание 4 байта, а в КДС 2 или по размеру типа.
29263

sas7
08.02.2017, 10:52
поменял выравнивание на 2. непомогло. очевидно в VS размер типа INT - 4 байта. а где это в VS задается? я инклудил wtypes.h. (http://www.owen.ru/forum/attachment.php?attachmentid=29188&d=1486369345) а какой надо было?

sas7
08.02.2017, 20:50
а где всетаки описаны типы вроде INT? какой хидер нужно подключать? т.к. мне кажется это из-за того что VS скомпилировал структуру исходя из размера INT 4 байта а не 2 байта.
Завтра попробую запись в адрес на работе.

sas7
09.02.2017, 10:08
вывел из си в КДС размер типа 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 байта.

или вручную указать другие типы данных для структуры в Си чтобы они совпали с размерами КДС?

sas7
14.02.2017, 11:27
typedef short INT; и т.д. работает КДС показывает одинаковые значения указателей внутренних элементов. ФБ возвращает значение в out

в интернетах пишут про заголовочный файл CmpStd.h - он есть в платном тулките и там вроде есть описания типов. Кто нибудь может им поделиться?

sas7
14.02.2017, 11:46
Еще вопрос: Созданная таким образом библиотека работает. Но работает только с OBJ созданным в режиме Debug. Если делать Release КДС компилирует проект, загружает, но при запуске выдает ошибку Unresolved external POUs и перечисляет все функции и ФБ моей библиотеки.

В интернете пишут надо сохранить LIB файл с типом Internal Library. У меня есть только тип Internal v 2.2. Сохранил LIB internal 2.2 - проект с Release OBJ скомпилировался, загрузился, выполняется, НО ничего из функций и ФБ не возвращается, адрес КДС элемента структуры ФБ равен 0. Функции тоже возвращают нули.

Что можно сделать чтобы заработало с Release OBJ?

sas7
14.02.2017, 12:24
нули internal показывает возможно потому, что исполняет пустой код созданный в проекте библиотеки КДС а не внешний obj. Internal library v.2.3 это видимо просто internal library без версии в списке выбора типа сохранения.

Итого как запустить release OBJ пока под вопросом

sas7
15.02.2017, 09:40
да, сделал сам сопоставление типов - все работает.

про release - вроде все так же как и в debug но вот неработает. есть подозрение может КДС пользуется отладочной информацией чтобы выполнять (находить точку входа) биб-ку и по-этому неможет запустить релиз. а дебаг содержит исходный код.. а этого в том числе и хочется избежать (чтобы без детских паролей было).

на оф.форуме меня пока не авторизовали - как включат, напишу туда