По ссылке https://owen.ru/product/codesys_v2/example_program в разделе "Примеры подключения стороннего оборудования и устройств с нестандартными протоколами" в первом примере "SysLibCom - библиотека, позволяющая принимать/отсылать в порты RS-232/485 любую информацию. В архиве пример управления портом (открытие/закрытие/изменение настроек) и пример реализации протокола с помощью данной библиотеки" скачал пример программы "Инициализация порта".
В этом примере программы используются две библиотеки ComService.lib и SysLibCom.lib. В библиотеке ComService.lib есть функциональный блок COM_SERVICE.
Листинг программы и функционального блока в приложении.
В процессе разбора логики программы и функционального блока возникли следующие вопросы:
Программа
Во второй строке программы (если не считать комментарии) com_num:=0. Переменная com_num типа перечисление TYPE PORTS : (COM1:=1, COM2, COM3, COM4, COM5, COM6, COM7, COM8); END_TYPE
Почему здесь com_num присваивается значение 0, если такого значения нет в перечислении.
Функциональный блок COM_SERVICE
1) Для чего нужна переменная Delay и почему условие в IF (Delay MOD 100) = 0
2) Ready: = NOT SysComSetSettings (Settings.Port, ADR(Settings));
Получается выходная переменная Ready может получить значение 1, только в одном случае, если функция SysComSetSettings вернет FALSE, то есть установка параметров не была успешной.
3) Функция SysComOpen согласно описанию библиотеки SysLibCom.lib, возвращает дескриптор порта, который используется при вызове других функций библиотеки SysLibCom.lib. Что представляет из себя дескриптор порта, который возвращает эта функция?
Согласно описанию функции SysComOpen, входной переменной этой функции является переменная типа перечисление TYPE PORTS : (COM1:=1, COM2, COM3, COM4, COM5, COM6, COM7, COM8). И в этом функциональном блоке в строке IF SysComOpen (Settings.Port) = ...... функция SysComOpen вызывается со значением поля Port структуры Settings. Где поле Port является переменной перечисления PORTS.
Но затем в строках Ready: = NOT SysComSetSettings(Settings.Port, ADR(Settings)) и SysComClose(Settings.Port) функции SysComSetSettings и SysComClose также вызываются с Settings.Port, хотя согласно их описанию входные переменные у этих функций должны быть дескрипторы порта типа DWORD, полученные от функции SysComOpen.