СТА 3/2018

Для того чтобы использовать функции в неблокирующем режиме, необходимо после создания сокета SysSockCreate() вызвать функцию SysSockIoctl() с входным аргументом SOCKET_FIONBIO (листинг 20), которая является командой перевода сокета в неблокирующий режим. При неблокирую- щем (асинхронном) режиме функция возвращает управление программе вне зависимости от того, закончена операция приёма/передачи или нет (рис. 10). Также дополнительные настройки работы сокета можно сделать с помощью функции SysSockSetOptions() , например, включить возможность повторного использования порта (ли- стинг 21). Подключение нескольких клиентов Серверный TCP-сокет, работающий согласно схеме на рис. 5, подходит для обмена данными в режиме точка–точка, когда существует одно входящее клиентское соединение. В случае если к серверу будет подключаться несколько кли- ентов, может возникнуть путаница с принимаемыми и от- правляемыми сообщениями, а также может появиться оче- редь на ожидание подключения. Для того чтобы эффективно работать с несколькими кли- ентами, используется SysSockSelect() (листинг 22). Данный ме- тод проверяет состояние нескольких идентификаторов соке- тов одновременно. Сокеты можно проверять на готовность к чтению, записи или на наличие исключительных ситуаций, то есть ошибок. Если хотя бы один сокет клиента готов, например, к от- правке данных, SysSockSelect() сообщит об этом программе и соединение с данным клиентом будет установлено. Схема ра- боты серверного сокета с использованием SysSockSelect() по- казана на рис. 10. Функция SysSockSelect() является блокирующей, она возвра- щает управление, если хотя бы один из проверяемых сокетов готов к выполнению соответствующей операции. Но в каче- стве настройки в функции можно указать интервал времени, по истечении которого она вернёт управление в любом случае. О СОБЕННОСТИ ИСПОЛЬЗОВАНИЯ ВНЕШНИХ РЕСУРСОВ КОНТРОЛЛЕРА При создании сокетов для CPM723-01 необходимо иметь в виду, что система исполнения приложений версии CODESYS V3 не имеет в своём составе подсистемы автоматического учё- та и освобождения внешних ресурсов, запрошенных прило- жением [1]. К таким внешним ресурсам относятся файлы, со- кеты и другие системные ресурсы. Для того чтобы был обес- печен повторный доступ к ним, необходимо самостоятельно освобождать полученные системные идентификаторы (в на- шем случае hServerSocket и hClientSocket ) в обработчике си- стемного события PrepareExit , в котором вызывать действия по освобождению ресурсов, требуемых в программах (рис. 11). Таким образом, каждый раз перед завершением работы приложения будет закрываться доступ к портам, и при сле- дующем запуске приложения данные порты будут открыты для использования. З АКЛЮЧЕНИЕ TCP- и UDP-сокеты отвечают за обмен данными между различными устройствами и процессами. На базе обмена дан- ными по сокетам можно создавать протоколы стека TCP/IP более высокого уровня. Обмен по TCP и UDP в контроллере CPM723-01 может по- требоваться там, где устройство, с которым необходимо орга- В ЗАПИСНУЮ КНИЖК У ИНЖЕ Н Е РА СТА 3/2018 88 www.cta.ru Листинг 20. Включение неблокирующего режима result := SysSockIoctl(hSocket, SOCKET_FIONBIO, ADR(mode)); // hSocket – системный идентификатор сокета клиента или сервера; // ADR(mode) – указатель на переменную, включающую опцию (значение переменной равно 16#1). Листинг 21. Дополнительные настройки работы сокета result := SysSockSetOption(hSocket, SOCKET_SOL, SOCKET_SO_REUSEADDR, ADR(mode), SIZEOF(mode)); // hSocket – системный идентификатор сокета клиента или сервера; // SOCKET_SOL – уровень протокола, соответствующий уровню сокетов; // SOCKET_SO_REUSEADDR – опция, позволяющая связать сокет с локальным адресом, // который уже используется на другом открытом сокете; // ADR(mode) – указатель на переменную, включающую опцию (значение переменной 16#1). Листинг 22. Работа с несколькими клиентами result := SysSockSelect(maxConnections+1, ADR(readSet), ADR(writeSet), ADR(exceptSet), ADR(timeSelect), ADR(socketReady)); // maxConnections+1 – количество проверяемых дескрипторов. В качестве аргумента // устанавливается максимальное количество соединений + 1; // ADR(readSet), ADR(writeSet), ADR(exceptSet) – указатель на набор дескрипторов // (SOCKET_FD_SET), которые следует проверять на готовность к чтению, записи и // наличию исключительных ситуаций; // SysSockSelect() является блокирующей функцией, она возвращает управление, если // хотя бы один из проверяемых сокетов готов к выполнению соответствующей операции; // ADR(timeSelect) – указатель на интервал времени timeSelect, по прошествии которого // функция вернёт управление в любом случае; // timeSelect имеет структуру SOCKET_TIMEVAL и задаёт максимальное время, которое // функция SysSockSelect будет ожидать для получения ответа; // ADR(socketReady) – указатель на количество сокетов, готовых к работе, которое // возвращает функция SysSockSelect.

RkJQdWJsaXNoZXIy MTQ4NjUy