ВСЕМ ПРИВЕТ! устал боротся с собственной безграмотностью, не могу победить код для отправки значиний с плавающей запятой . должно улетать старшим и младшим битом, ругается на 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.
на 0 не ругается?
Неа, на ноль не ругаетсяправда что при этом делает - не проверял
for vFor := 1 to 10 do
v := 11 - vFor;
end_for
Это то понятно, но как-то костыльно... тем более что по стандарту языка ST BY может быть отрицательным. Просто как всегда не доделано
Последний раз редактировалось Мамонов Михаил; 06.04.2026 в 15:08.
у Лоджика нет понятия отрицательного числа для целочесленных, может по этому?
А, логично, да. Ведь в BY можно и переменную подставить, не только константу. Ну значит считаем, что такая особенность в лоджике
Можно ещё дуркануть через WHILE, но он опасен: его можно легко загнать в бесконечный цикл.
Код:udiI := 10; WHILE (udiI > 0) DO *** *** udiI := udiI -1; END_WHILE
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab
Пытаясь сделать ввод в массив на 40 начальных значений, столкнулся с проблемой, вывод на экран 40 дисплеев для ввода, 1 Скрин записи массива.jpg
происходит переполнение визуализации на 136 %.
Соответственно, надо придумать автоматизацию для ввода.
Пробовал на циклах и обычную запись. Оказалось лучше и проще, обычная последовательная запись.
Получилось так.
После первого ввода, сохранения и пока идёт запись, горит синий индикатор. После ввода РТ, выбрать Запись и нажать Ок,
после записи, автоматически поменяется номер строки массива, для последующего ввода и сохранения.
Двумя ФБ, можно записать параллельно и 2 массива, используя всего 6 дисплеев и 1 экран. 1 Скрин записи массива_2.jpg
Проверил, всё работает, но пример загромождать не стал. Версия Owen Logic3.0.372,
онлайн отладка массивов в версии Owen Logic3.0.373
Последний раз редактировалось kondor3000; 27.04.2026 в 18:09.