Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11

Тема: Преобразование массива байт в формате Motorola в REAL

  1. #1

    По умолчанию Преобразование массива байт в формате Motorola в REAL

    Читаю данные из расходомера в массив байт ARRAY [0..3] OF BYTE
    Судя по инструкции, они хранятся "в формате Motorola (MSB->LSB)". Никак не могу преобразовать их в REAL. Пробовал использовать функции DWORD_OF_BYTE и DW_TO_REAL из oscat. Переставлял байты во всех возможных порядках, но все равно получается неверное число. Может кто-нибудь сталкивался.

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

    По умолчанию

    Код:
    FUNCTION Swap : REAL
    VAR_INPUT
    	B	: ARRAY[0..3] OF BYTE;  //сюда пихаете свое ...
    	Order	: WORD; (*2143,3412,4321, все остальное as is - 1234*)  //... и определяете как свапить 
    END_VAR
    VAR
    {flag noinit on}
    	_ AT %MB0 : ARRAY[0..3] OF BYTE;
    	W1 AT %MB0 : WORD;
    	W2 AT %MB2 : WORD;
    	D AT %MB0 : DWORD;
    	X AT %MB0 : REAL;
    {flag off}
    END_VAR
    ---------------------------
    _ := B;
    
    CASE Order OF 3412,4321:
    	D := ROL(D, 16);
    END_CASE
    
    CASE Order OF 2143,4321:
    	W1 := ROL(W1, 8);
    	W2 := ROL(W2, 8);
    END_CASE
    
    Swap := X;
    ps
    такие примитивы быстрее написать чем шарится по каким-то оскатам.
    скоро таблицу умножения там искать будут

  3. #3

    По умолчанию

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

  4. #4

    По умолчанию

    CASE Order OF 3412,4321:
    D := ROL(D, 16);
    END_CASE

    Что за странная конструкция оператора CASE ? Что там делается ?

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

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    CASE Order OF 3412,4321:
    D := ROL(D, 16);
    END_CASE

    Что за странная конструкция оператора CASE ? Что там делается ?
    очевидно же, что меняются слова местами
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  6. #6

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    CASE Order OF 3412,4321:
    D := ROL(D, 16);
    END_CASE

    Что за странная конструкция оператора CASE ? Что там делается ?
    См. скрин 1 Перестановка регистров.jpg

  7. #7

    По умолчанию

    А можно ещё вопрос по синтаксису?
    Код:
    {flag noinit on}
    	_ AT %MB0 : ARRAY[0..3] OF BYTE;
    ..............
    {flag off}
    Где выделяется память под %MB0?
    Для чего использовать директивы компилятора? Почему без них не обойтись?

  8. #8

    По умолчанию

    Цитата Сообщение от FPavel Посмотреть сообщение
    А можно ещё вопрос по синтаксису?
    Код:
    {flag noinit on}
    	_ AT %MB0 : ARRAY[0..3] OF BYTE;
    ..............
    {flag off}
    Где выделяется память под %MB0?
    Для чего использовать директивы компилятора? Почему без них не обойтись?
    Посмотрите мой скрин, начальные адреса массива, DWORD, REAL и первого WORD одинаковые AT %QB12.1.0, только второй WORD отличается адресом. Выделил память в слейве в виде 2 регистров. Это можно сделать двумя 2BYTE (так думаю лучше) или четырьмя 8 BIT ( 1 байт).
    Перевёрнутые регистры (байты) получаем по Модбас в виде массива B и кладём их по адресу массива W. Переставляя слова в DWORD или байты в словах, получаем правильное значение ( всего 3 варианта).
    В эмуляции я сначала выделил 4 байта, представил их в виде массива, переставил местами слова и подал их на вход функции.
    (блоки разложения на байты и перестановки байтов у меня давно в личной биб-ке есть)
    Пример склейки REAL из двух WORD, есть в моём примере, в последнем сообщении в конце страницы тут https://owen.ru/forum/showthread.php?t=35094#10
    Байты переставлять и раскладывать можно так же, как в примере перестановки слов.

    {flag noinit on} и {flag off} в 2.3 это комментарии и их можно просто выкинуть
    Массив у меня W, а не _
    W3, W4, D2 просто для наглядности, видно как меняются местами байты и регистры, r10 значение полученного REAL.
    Последний раз редактировалось kondor3000; 29.07.2022 в 22:38.

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

    По умолчанию

    Где выделяется память под %MB0?
    В области которую не видел кто использует )) Чего добру пропадать ?

    Для чего использовать директивы компилятора? Почему без них не обойтись?
    Потому что это - функция. На входе стековые переменные засираются неявно в 0 по стандарту КДС.
    И КДС с какого-то считает что как бы локальные нестековые тоже нужно засрать.
    От этой диареи есть директива запрета инициализации. Не нашел бы директивы (или б где-то нужна была бы %M...) - заюзал бы указатель.
    Код:
    ....  тоже самое
    VAR
    	pd : pointer to dword;
    	pw : pointer to word;
    	px : pointer to real;
    END_VAR
    ---------------------------
    pd := pw := px := adr(B);
    
    CASE Order OF 3412,4321:
    	pd^ := ROL(pd^, 16);
    END_CASE
    
    CASE Order OF 2143,4321:
    	pw^ := ROL(pw^, 8);
    	pw := pw + 2;
    	pw^ := ROL(pw^, 8);
    END_CASE
    
    Swap := px^;
    Но и тут поставил бы "flag noinit on" (была б) - ну накой бестолковое обнуление 12-ти байт если они в первой же строке устанавливаются.
    В КДС3 - прошел бы union. Можно использовать SysMemSwap. Можно юзать не функцию а PROGRAM
    Главное - понимать чего хочешь.

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    {flag noinit on} и {flag off} в 2.3 это комментарии и их можно просто выкинуть..
    )) И КДС чудит (см. выше)
    Последний раз редактировалось Валенок; 28.07.2022 в 22:47.

  10. #10

    По умолчанию

    kondor3000, Валенок, спасибо.
    Успешно решал подобную задачу на другом ПЛК, и при изучении в качестве тренировки пробовал в CoDeSys, но до указателей не додумался, а штатных средств приведения типов (typecast) не нашёл.
    Спасибо.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Язык ST преобразование string в real
    от LoneJke в разделе Трёп (Курилка)
    Ответов: 1
    Последнее сообщение: 27.12.2019, 17:06
  2. Преобразование ARRAY OF BYTE в REAL
    от Дениска в разделе ПЛК1хх [М02]
    Ответов: 7
    Последнее сообщение: 31.07.2019, 10:07
  3. преобразование Real>string кракозябры
    от K580BB55A в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 09.11.2010, 17:07
  4. чтение массива байт
    от Febricio в разделе Сетевые технологии
    Ответов: 1
    Последнее сообщение: 29.07.2010, 12:06
  5. Передача массива байт по Rs485
    от IgorG в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 19.01.2010, 13:43

Ваши права

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