Последний раз редактировалось uni; 16.03.2017 в 10:11. Причина: ссылка на форум
Да не, с версиями всё норм. Это глюк runtime'а как по мне. Вот видео демонстрация проблемы. CoDeSys 3.5.10.0 (10, 20). Остальное свежее с сайта RaspberryPi. runtime в устройство загружает сам CoDeSys (уж какой загрузит, ему виднее).
Для тех потомков, кто будет пользовать этот самый codesys и столкнётся с глюком потери соединения при работе с event'ами, знайте, что CDRead() с принудительно установленным флагом O_NONBLOCK спасёт отца русской демократии. Такого флага конечно нет, но вы его можете объявить сами (O_NONBLOCK = 4000 - в десятичной (!) системе). Флаг нужно пользовать как в Си-программах.
Ну и если вы хотите большего, к примеру, часами (/dev/rtc) поуправлять (ioctl) или чем другим, то запросы можно оформить так (я не нашёл эквиваленты макросов _IOR и _IOW):
П.С. Оказывается CmpCharDevice.library после чистой установки CoDeSys почему-то недоступна. Видимо эта библиотека появляется при добавлении пакета с RaspberryPi, но на просторах сети её найти и скачать можно. Также можно добавить в проект библиотеки недостающий флаг и дополнительную функциональность по сборке запросов. Может быть где-то кто-то до меня это уже сделал, кто знает...Код:var constant RTC_RD_TIME: udint := 16#09; RTC_SET_TIME: udint := 16#0a; group: dword := 16#70; IOC_OUT: dword := 16#80000000; IOC_IN: dword := 16#40000000; IOCPARM_MASK: dword := 16#1fff; end_var method private ReadRequest : dword var_input num: udint; len: udint; end_var ReadRequest := IOC_OUT or ( shl( len and IOCPARM_MASK, 16 ) or ( shl( group, 8 ) or num ) ); method private WriteRequest : dword var_input num: udint; len: udint; end_var WriteRequest := IOC_IN or ( shl( len and IOCPARM_MASK, 16 ) or ( shl( group, 8 ) or num ) ); // ... hRtc := CDOpen( '/dev/rtc', CmpCharDevice.ACCESS_MODE.O_RDONLY, adr( Result ) ); if hRtc <> RTS_INVALID_HANDLE then Request := dword_to_dint( ReadRequest( RTC_RD_TIME, sizeof( TRtcTime ) ) ); CDIoctl( hRtc, Request, dword_to_dint( adr( Read ) ), adr( Result ) ); CDClose( hRtc, adr( Result ) ); end_if // ... hRtc := CDOpen( '/dev/rtc', CmpCharDevice.ACCESS_MODE.O_WRONLY, adr( Result ) ); if hRtc <> RTS_INVALID_HANDLE then Request := dword_to_dint( WriteRequest( RTC_SET_TIME, sizeof( TRtcTime ) ) ); CDIoctl( hRtc, Request, dword_to_dint( adr( rtctime ) ), adr( Result ) ); CDClose( hRtc, adr( Result ) ); end_if
Последний раз редактировалось uni; 25.03.2017 в 12:16. Причина: доп. информация
Используя shared memory можно передавать данные из runtime codesys во внешние программы. Таким образом можно делать визуализацию на Mono, используя преимущества c#. Отлаживать оба проекта можно в Windows системе, правда с небольшим отличием в доступе к разделяемому объекту.
Код для codesys взят из примера SharedMemory и обрезан (см. в store). На raspberri pi 3 нужно лишь открыть и прочитать файл /dev/shm/{имя_объекта_в_codesys}. На картинке ниже codesys формирует одно число типа lreal и записывает его в разделяемую память. Проект на c# открывает файл, читает это число (текущее измерение) и отображает его на графике (компонент NPlot).
Писать визуализацию в Codesys то ещё занятие, не для слабонервных. Всё равно она нестандартная (велосипедная). Ни чем не хуже делать её на mono, тем более, что возможностей здесь на порядок больше.
2017-10-21_23-04-29.png
Мужики, не в дружбу а в службу, если есть здесь кто покупал CODESYS Control for Raspberry Pi SL - интересует содержимое папки /var/opt/codesys/backup. Скиньте в личку в любом виде, 'на_коньяк' строго гарантирую.
Добрый день. Обновлю тему.
в логе codesyscontrol.log такие сообщения
1547254171, 0x00000002, 4, 16, 40, Retain restore from file failed: [<app>Application</app>]
1547254171, 0x00000002, 2, 1288, 49, Retain data are initialized now of [<app>Application</app>]
1547254177, 0x00000002, 1, 0, 2, Application [<app>Application</app>] loaded via [Bootproject]
поля такие
;<entries>
;Timestamp, CmpId, ClassId, ErrorId, InfoId, InfoText
;</entries>
Можно ли отловить это событие (event)? куда смотреть? CmpApp EventIDs смотрел, что то не нашел.... И что такое CmpId, ClassId, ErrorId, InfoId?
c CmpId разобрался, там же в логе
1547264340, 0x00000001, 1, 0, 10, <cmp>CmpApp</cmp>, <id>0x00000002</id> <ver>3.5.14.0</ver>
т.е. это CmpApp...
описание ClassId тоже найдено:
#define LOG_INFO 0x00000001
For general information
#define LOG_WARNING 0x00000002
For warnings
#define LOG_ERROR 0x00000004
For errors
#define LOG_EXCEPTION 0x00000008
For exceptions
#define LOG_DEBUG 0x00000010
Only for debug log entries
#define LOG_COM 0x00000040
For communication entries
#define LOG_INFO_TIMESTAMP_RELATIVE
0x00000080
Там же описания ErrorId, InfoId, InfoText
"Error Id" The error Id, if an operation failed
"Info Id" An unique Id per component, that can be used to specify a longer
test for the log entry in the target description of CODESYS. This is
used to save resources in the runtime system to store the log entries
'Info string" - Info string with optional and variable information, e.g. application
names or task names