PROGRAM com3
VAR
com_service_com3: ComService.COM_SERVICE; //ФБ настройки и открытия порта COM3
Settings_COM3: ComService.COM_Settings; //Структура настроек порта COM3
SettingsEX_COM3: ComService.COM_SettingsEx; //Структура расширенных настроек порта COM3
iDevice: INT; //Переменные начала цикла опроса (0-14)
DI_1: MB_RD_HOLD_REGS; // ФБ опроса датчика 1
DI_2: MB_RD_HOLD_REGS; // ФБ опроса датчика 2
abyDI_1_buffer: ARRAY[0..255] OF BYTE; //Буфер ФБ опроса датчика1
abyDI_1_data: ARRAY[0..255] OF BYTE; //Буфер данных, считанных с датчика1
abyDI_2_buffer: ARRAY[0..255] OF BYTE; //Буфер ФБ опроса датчика2
abyDI_2_data: ARRAY[0..255] OF BYTE; //Буфер данных, считанных с датчика2
rDI_1_input: REAL; //Показания датчика1
wsDI_1_input_status: WSTRING; // Статус измерения датчика1
rDI_2_input: REAL; //Показания датчика2
wsDI_2_input_status: WSTRING; // Статус измерения датчика2
_2WORD_TO_REAL: Word_Real; //Экземпляр объединения для преобразования двух WORD в REAL
END_VAR
VAR CONSTANT
abyEmptyBuffer: ARRAY [0..255] OF BYTE:=[255(0)]; // Пустой буфер
END_VAR
// [1] настраиваем COM-порт
Settings_COM3.sPort:=3;
Settings_COM3.byStopBits:=1;
Settings_COM3.byParity:=0;
Settings_COM3.ulBaudrate:=9600;
Settings_COM3.ulTimeout:=0;
Settings_COM3.ulBufferSize:=0;
SettingsEX_COM3.byByteSize:=8;
// [2] открываем COM-порт
COM_Service_COM3
(
Enable:=TRUE,
Settings:=Settings_COM3,
Sets_Ex:=SettingsEX_COM3,
Task:=OPEN_TSK,
);
// [3] iDevice определяет опрашиваемый датчик: 0 - DI1, 1 - DI2
CASE iDevice OF
0:
// запускаем ФБ опроса датчика1
DI_1
(
Enable:=COM_Service_COM3.Ready,
Mode:=MB_RTU,
DevAddr:=1,
FirstAddr:=18,
Quantity:=1,
ComHandle:=COM_Service_COM3.handle,
TimeOut:=T#500MS,
Buffer:=abyDI_1_buffer,
);
// если ФБ опроса датчика завершил работу...
IF DI_1.Complete // ФБ опроса датчика 1
THEN
// ...и ошибки отсутствуют, то забираем значения датчика
IF DI_1.Exception=0 THEN
abyDI_1_data:=abyDI_1_buffer;
rDI_1_input:=_2WORD_TO_REAL.rRealValue;
END_IF
// завершаем опрос датчика 1
DI_1(Enable:=FALSE, Buffer:=abyDI_1_buffer);
// переходим к опросу датчика 2
iDevice:=1;
// очищаем буфер датчика 2
abyDI_2_buffer:=abyEmptyBuffer;
END_IF
1:
// запускаем ФБ опроса датчика 2
DI_2
(
Enable:=COM_Service_COM3.Ready,
Mode:=MB_RTU,
DevAddr:=2,
FirstAddr:=18,
Quantity:=1,
ComHandle:=COM_Service_COM3.handle,
TimeOut:=T#500MS,
Buffer:=abyDI_2_buffer,
);
// [3.0.2] если ФБ опроса датчика завершил работу...
IF DI_2.Complete // ФБ опроса датчика 2
THEN
// ...и ошибки отсутствуют, то забираем значения датчика
IF DI_2.Exception=0 THEN
abyDI_2_data:=abyDI_2_buffer;
rDI_2_input:=_2WORD_TO_REAL.rRealValue;
END_IF
// завершаем опрос датчика 2
DI_2(Enable:=FALSE, Buffer:=abyDI_2_buffer);
// начинаем новый цикл опроса
iDevice:=0;
END_IF
END_CASE