Показано с 1 по 7 из 7

Тема: Прочитать по RS-485 число типа Double

  1. #1

    По умолчанию Прочитать по RS-485 число типа Double

    Здравствуйте!

    Нужно опросить устройство по модбасу, имеющее регистр типа DOUBLE. Напрямую это, насколько мне известно, невозможно. Но может быть можно считать 4 WORD'а или 2 DWORD'а, пошаманить с битами и слепить из них как-нибудь значение типа REAL, хотя бы с потерей точности? ПЛК110.

  2. #2
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    6,971

    По умолчанию

    Считать вордамм 4 регистра, потом LReal, в 110-м вроде должен быть этот тип

  3. #3

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    Считать вордамм 4 регистра, потом LReal, в 110-м вроде должен быть этот тип
    Нету(. Или его можно библиотеками добавить?

    DT.png

  4. #4
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,403

    По умолчанию

    Если уже получены 4 регистра с данными, то просто взять и вычислить значения в формате REAL в соответствии с представлением чисел с плавающей точкой в стандарте IEEE 754
    Делается на раз-два.

    По стандарту IEEE 754
    представление числа с плавающей точкой


    Для числа двойной точности (double-precision) 64 бита


    Код:
    PROGRAM PLC_PRG
    VAR
    	D_VAL: ARRAY [0..3] OF WORD:= 16#C05E, 16#DD2F, 16#1A9F, 16#BE77; (* 4 регистра LREAL = -123.456
    							онлайн тест	http://www.binaryconvert.com/result_double.html?decimal=045049050051046052053054*)
    	Sign: BOOL; (*Знак числа*)
    	_2E: REAL;	(*Смещенная экспонента*)
    	M: DWORD;
    	fM: REAL;	(*остаток мантиссы двоичного нормализованного числа*)
    	fVAL: REAL; (*РЕЗУЛЬТАТ преобразования*)
    END_VAR
    
    (*ПРЕОБРАЗОВАНИЕ ЧИСЛА ДВОЙНОЙ ТОЧНОСТИ С ПЛАВАЮЩЕЙ ТОЧКОЙ В ЧИСЛО С ОДИНАРНОЙ ТОЧНОСТЬЮ*)
    (* ФОРМУЛА для числа сплавающей точкой в стандарте IEEE 754
    (-1)*S * 2E * 1.f
    где
    S - знак числа
    2E - смещенная экспонента
    1.f  -  мантисса – вещественное число без знака;
    1 – целая часть мантиссы (неявно присутствующая);
    f – дробная часть мантиссы;
    *)
    
    Sign:= D_VAL[0].15;
    _2E:= EXPT(2, (SHR((D_VAL[0] AND 16#7FFF),4) - 1023));
    M:= D_VAL[1] * 16#10000 + D_VAL[2];
    M:= SHR(M,4) OR (SHL(D_VAL[0],12) * 16#10000);
    M:= M /2;
    fM:=DWORD_TO_REAL(M)/16#80000000;
    
    (*Теперь по формуле*)
    fVAL:=SEL(Sign, 1, -1) * _2E * (1 + fM);
    Графическое представление "нового" формата, с потерей точности
    формула F = (-1)S * 2(E-1023) * (1 + M / 232)

    Пришлось ограничится 3 исходными регистрами, в первом - 12 бит экспонента + бит знака, а т.к. в расчетах используются переменные DWORD, то от мантиссы останется только 2 регистра.
    Проверок на выход исходного числа за диапазон REAL -3.4028E+38 - 3.4028E+38 не делал. Показал только принцип преобразования.

    Результат преобразования числа -123,456 --> 0xC05EDD2F1A9FBE77 http://www.binaryconvert.com/result_...51046052053054
    Захват-1.png
    Вложения Вложения
    Последний раз редактировалось petera; 24.11.2019 в 18:48.
    26 лет деятельности в области промышленной безопасности

  5. #5
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    6,971

    По умолчанию

    в CodeSys надо зайти в настройки конфигурации ПЛК, насколько помню по умолчанию выключено. Просто в ПЛК100 этого формата отродясь нет. а в ПЛК110 вроде должен быть. Ну и как его там использовать не в курсе.
    Хотя в руках ПЛК110 не держал, может и в нем нет.

  6. #6

    По умолчанию

    Очень круто, спасибо!

  7. #7

    По умолчанию

    Здравствуйте!

    Может подскажете еще, как из Double слепить DWORD с округлением до целого?

Похожие темы

  1. Ответов: 4
    Последнее сообщение: 17.09.2019, 11:00
  2. ПЛК110-24.30.Р-М (обновленный) и DOUBLE переменные
    от SVKEnergy в разделе ПЛК1хх [М02]
    Ответов: 6
    Последнее сообщение: 11.02.2019, 16:20
  3. 4_word modbus TO LREAL(DOUBLE FLOAT)
    от val21 в разделе СПК2хх
    Ответов: 4
    Последнее сообщение: 19.01.2018, 08:08
  4. LREAL (double float) и ПЛК100
    от vitiali в разделе ПЛК1хх
    Ответов: 24
    Последнее сообщение: 12.07.2017, 09:31
  5. СИ8 как прочитать значения
    от Anton_Minsk в разделе Помощь Разработчикам
    Ответов: 14
    Последнее сообщение: 27.02.2010, 12:06

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •