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

Тема: ПЛК110 - Перестановка байт в REAL

  1. #1

    По умолчанию ПЛК110 - Перестановка байт в REAL

    Не совсем понимаю как переставить байты в переменной с типом REAL. Я забираю данные с плотномера модулем REAL input module(FLOAT), забираю байты в порядке 0 1 2 3, для получения читаемого значения мне необходимо их переставить в порядке 3 2 1 0, не совсем понимаю как правильно это сделать? Нужно использовать REAL_TO_DWORD, делать перестановку и потом использовать DWORD_TO_REAL или это так не работает? Буду благодарен любым подсказкам

  2. #2
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,861

    По умолчанию

    Код:
    function swap : real
    var_input
      in : real;
      order : int; //(2143,3412,4321);
    var
      x at %MW0 : real;
      d at %MW0 : dword;
      w0 at %MW0 : word;
      w1 at %MW1 : word;
    ---
    x := in; 
    case order of 3412,4321:
      d := rol(d, 16);
    end_case
    case order of 2143,4321:
      w0 := rol(w0, 8);
      w1 := rol(w1, 8);
    end_case
    swap := x;
    
    
    или
    
    function swap : real
    var_input
      x at %MW0 : real;
      order : int; //(2143,3412,4321);
    var
    {flag noinit on}
      d at %MW0 : dword;
      w0 at %MW0 : word;
      w1 at %MW1 : word;
    {flag off}
    ---
    case order of 3412,4321:
      d := rol(d, 16);
    end_case
    case order of 2143,4321:
      w0 := rol(w0, 8);
      w1 := rol(w1, 8);
    end_case
    swap := x;
    
    ----
    читаемого значения := swap(данные с плотномера модулем REAL, 4321);
    Последний раз редактировалось Валенок; 12.03.2025 в 10:33.

  3. #3

    По умолчанию

    Можете добавить комментарии не совсем понимаю что такое %MW0 и %MW1

  4. #4
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,861

    По умолчанию

    Адрес. Абсолютный.

    Ваш ник без "e" подразумевает что такое - знакомо.

  5. #5

    По умолчанию

    Если я правильно понял это адрес модуля, допустим %QD6.4.3.0.0 , а где мне взять адреса для WORDов, или я не правильно понимаю работу функции?

  6. #6

    По умолчанию

    Цитата Сообщение от Move Посмотреть сообщение
    Если я правильно понял это адрес модуля, допустим %QD6.4.3.0.0 , а где мне взять адреса для WORDов, или я не правильно понимаю работу функции?
    Вот вариант проще
    Код:
    FUNCTION_BLOCK Swap_BYTE
    VAR_INPUT
    	rIn:REAL;        (*входная переменная типа REAL*)
    END_VAR
    VAR_OUTPUT
    	rOut:REAL;     (*переменная rOut с переставленными местами БАЙТами*)
    END_VAR
    VAR
    	pInput	   : POINTER TO ARRAY[0..3] OF BYTE;     (*  указатели на массивы *)
    	pOutput	: POINTER TO ARRAY[0..3] OF BYTE;
    END_VAR
    ___________________________________________
    pInput :=ADR(rIn);
    pOutput := ADR(rOut);                           (* Обязательно объявить блок в разделе переменных и в теле программы PLC_PRG  *)
    
    pOutput^[ 0 ] := pInput^[ 3 ];                    (* Перестановка байт *)
    pOutput^[ 1 ] := pInput^[ 2 ];
    pOutput^[ 2 ] := pInput^[ 1 ];                    (* Перестановка байт *)
    pOutput^[ 3 ] := pInput^[ 0 ];

  7. #7
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,861

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Вот вариант проще
    А чем проще? Что только 1 вариант перестановки?

    Тогда вот 4321
    Код:
    var
    читаемого значения %MW0 : real;
    d at %MW0 : dword;
    w0 at %MW0 : word;
    w1 at %MW1 : word;
    end_var
    -----
    читаемого значения := данные с плотномера модулем REAL;
    d := rol(d, 16);
    w0 := rol(w0, 8);
    w1 := rol(w1, 8);


    Цитата Сообщение от Move Посмотреть сообщение
    а где мне взять адреса для WORDов,..
    %M* не надо брать. Они просто есть
    Последний раз редактировалось Валенок; 12.03.2025 в 12:58.

  8. #8

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    А чем проще? Что только 1 вариант перестановки?
    Проще для новичков, в понимании как это работает)

  9. #9

    По умолчанию

    Все работает, спасибо!

  10. #10
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,861

    По умолчанию

    Работает - хорошо.

    ))
    А насчет проще для новичков - так не надо перескакивать через основы и сразу колбасить указатели.
    Все что привёл - база базовая:
    -Всё есть набор битов
    -Имя переменной - неявный адрес
    -Формат хранения и формат представления real
    -Преобразование (что-то_TO _ что-то) vs интерпретация набора битов
    -Базовые операции с битовыми (сдвиг и ролинг)

Похожие темы

  1. Ответов: 10
    Последнее сообщение: 29.07.2022, 14:42
  2. Ограничение в 360 байт
    от Спорягин Кирилл в разделе ПЛК1хх [М02]
    Ответов: 18
    Последнее сообщение: 03.12.2020, 18:14
  3. Байт статуса МЭ110-224.1М
    от Nomad в разделе Мх110
    Ответов: 4
    Последнее сообщение: 14.08.2019, 13:57
  4. modbus RTU, real, swap (перестановка слов)
    от vitiali в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 18.07.2011, 16:52
  5. чтение массива байт
    от Febricio в разделе Сетевые технологии
    Ответов: 1
    Последнее сообщение: 29.07.2010, 11:06

Ваши права

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