Для тех потомков, кто будет пользовать этот самый 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





Ответить с цитированием