PDA

Просмотр полной версии : странная логика в ФБ COM_SERVICE



Ian
23.06.2021, 22:55
По ссылке 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.

Евгений Кислов
24.06.2021, 06:38
1. Поскольку Delay там инкрементируется - это позволяет создать задержку в 100 циклов ПЛК между запуском блока и открытием порта.
А вот зачем нужна эта задержка - мне всегда самому было интересно.
Возможно, на каких-то первых ПЛК были проблемы при попытке открыть порт сразу после запуска проекта, и поэтому добавили эту искусственную задержу - но это лишь гипотеза.

2. В реализации библиотеки SysLibCom для ПЛК ОВЕН - при успешной установке настроек функция возвращает FALSE.

3. В реализации библиотеки SysLibCom для ПЛК ОВЕН - дескриптор открытого порта равен номеру этого порта.


реализация отличается, т.к. мы руководствовались английской документацией с ошибкой. а когда документацию исправили - уже менять все было поздно.

https://owen.ru/forum/showthread.php?t=6217&p=29094&viewfull=1#post29094