Leo29 у вас сравнение двух аналоговых сигналов. А таймер имеет на выходе bool. Так понимаю вы хотите сравнивать по таймеру сигналы а не на каждом цикле?.
Тогда вам в код ST надо к своему блоку сравнения добавить bool вход EN и написать таким образом, чтобы сравнение происходило по его работе. И уже тогда с таймера на EN заводить выход. Нужно будет постоянное сравнение в цикле программы, просто на EN заведете константу 1 To_Bool
Ответ получил, вопрос снимаеться с повестки.Спасибо kondor3000.
Доброго времени суток. Подскажите плз - как сделать, чтобы функции и блоки а язык ST в OL можно было разложить по каталогам. А то все сейчас в куче лежат. Не очень удобно
ВСЕМ ПРИВЕТ! устал боротся с собственной безграмотностью, не могу победить код для отправки значиний с плавающей запятой . должно улетать старшим и младшим битом, ругается на intValue AND 65535- не поддерживает UDINT
FUNCTION_BLOCK fbScalePosition
VAR_INPUT
PRO_POS_H : REAL; // Входная позиция (вещественное число)
END_VAR
VAR_OUTPUT
inp_PR0_position_H : UDINT; // Старшие 16 бит результата
inp_PR0_position_L : UDINT; // Младшие 16 бит результата
END_VAR
VAR
scaledValue : REAL; // Промежуточное масштабированное значение
intValue : UDINT; // 32-битное беззнаковое целое для результата
scaledMin : REAL := -10000000.0; // Минимальное значение входного диапазона
scaledMax : REAL := 10000000.0; // Максимальное значение входного диапазона
outputMax : REAL := 4294967295.0; // Максимальное значение выходного диапазона (2^32 - 1)
scaleFactor : REAL; // Коэффициент масштабирования
END_VAR
// Тело функционального блока
scaledValue := PRO_POS_H;
// Ограничение входного значения диапазоном
IF scaledValue < scaledMin THEN
scaledValue := scaledMin;
ELSIF scaledValue > scaledMax THEN
scaledValue := scaledMax;
END_IF;
// Масштабирование входного значения к диапазону 0...4294967295
scaleFactor := outputMax / (scaledMax - scaledMin);
scaledValue := (scaledValue - scaledMin) * scaleFactor;
// Преобразование в целое число
intValue := REAL_TO_UDINT(scaledValue);
// Разделение 32-битного значения на два 16-битных
inp_PR0_position_H := SHR(intValue, 16); // Старшие 16 бит
inp_PR0_position_L := intValue AND 65535; // Младшие 16 бит
END_FUNCTION_BLOCK
У вас не целое 32 битное, а Float, с ним так не работает.
Здесь выложены ФБ для сборки и разборки Float на DWORD или 2 WORD.
Real_TO_UDINT (DWORD)_ 2 WORD https://owen.ru/forum/showthread.php...l=1#post450146
А вообще перестановка регистров обычно делается в Мастере, в ПР например, это галка Старшим регистром вперёд.
В панели СП3хх тоже галка есть. В ПЛК1хх это настройка в UMD (Универсал Модбас девайс), настройка Native.
Есть и более простой способ, например для передачи 1 знака после запятой одним регистром, Float умножают на 10 и конвертируют в целое, передают по сети. После приёма целое сначала конвертируют в Float, а потом делят на 10.
То есть передаём 12,3 после умножения и конвертации 123, принимаем, конвертируем и делим 123/10 = 12,3
Для передачи 2 знаков умножаем и делим на 100.
Последний раз редактировалось kondor3000; 16.11.2025 в 18:27.