Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
2.0 kB
2
Indexable
Never
FUNCTION_BLOCK Read_Temperature_Sensors
TITLE = 'Чтение датчиков температуры'

VAR_INPUT
    Device_Address : INT; // Адрес устройства Modbus
    Start_Address : INT; // Начальный адрес регистра
    Number_Of_Registers : INT; // Количество регистров для чтения
END_VAR

VAR_OUTPUT
    Temperature_1 : REAL; // Значение температуры с датчика 1
    Temperature_2 : REAL; // Значение температуры с датчика 2
    Temperature_3 : REAL; // Значение температуры с датчика 3
    Temperature_4 : REAL; // Значение температуры с датчика 4
    Error : BOOL; // Флаг ошибки
END_VAR

VAR
    Modbus_Client : MODBUS_CLIENT; // Клиент Modbus
    Data_Buffer : ARRAY[0..255] OF BYTE; // Буфер для данных
    Temperature_Buffer : ARRAY[1..8] OF WORD; // Буфер для температурных значений
END_VAR

// Инициализация клиента Modbus
Modbus_Client := MODBUS_CLIENT(Device_Address, MODBUS_TCP);

// Чтение данных с устройства
Error := NOT Modbus_Client.ReadHoldingRegisters(Start_Address, Number_Of_Registers, Data_Buffer);

// Если произошла ошибка, выход из функции
IF Error THEN
    RETURN;
END_IF

// Конвертация байтов в температуры
FOR i := 1 TO 4 DO
    Temperature_Buffer[i] := WORD_TO_UINT(Data_Buffer[2 * (i - 1)] + Data_Buffer[2 * (i - 1) + 1] * 256);
END_FOR

// Преобразование температурных значений в градусы Цельсия
Temperature_1 := INT_TO_REAL(Temperature_Buffer[1]) / 10;
Temperature_2 := INT_TO_REAL(Temperature_Buffer[2]) / 10;
Temperature_3 := INT_TO_REAL(Temperature_Buffer[3]) / 10;
Temperature_4 := INT_TO_REAL(Temperature_Buffer[4]) / 10;