Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 14 из 14

Тема: Получение данных с уровнемера

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

    По умолчанию

    Перестановка байт
    Код:
    PROGRAM PLC_PRG
    VAR
        ptFl: POINTER TO REAL;
        ptDw: POINTER TO DWORD;
        height: REAL;
        height_2: REAL;
        SWAP_BYTE_C: DWORD;
    END_VAR
    
    ptDw:=ADR(height_tmp);
    (*В зависимости от параметра Byte Sequence в UMD нужно использовать
    или этот вариант*)
    SWAP_BYTE_C:=(ROL(ptDw^,8) AND 16#FF00FF00) OR (ROR(ptDw^,8) AND 16#00FF00FF);
    ptFl:=ADR(SWAP_BYTE_C);
    height:=ptFl^;
    
    (*Или этот вариант*)
    SWAP_BYTE_C:=(ROR(ptDw^,8) AND 16#FF00FF00) OR (ROL(ptDw^,8) AND 16#00FF00FF);
    ptFl:=ADR(SWAP_BYTE_C);
    height_2:=ptFl^;
    Тут два варианта для разных значений Byte Sequence в UMD - height и height_2
    height_tmp - это именованная переменная в слейве ПЛК
    Захват-2.png

    Результат с Вашим значением
    Захват-1.png

    Можно код оформить в виде функции
    Последний раз редактировалось petera; 06.09.2018 в 12:41.
    26 лет деятельности в области промышленной безопасности

  2. #12

    По умолчанию

    Господа, спасибо всем, кто откликнулся на призыв о помощи.
    Отдельное ОГРОМНОЕ СПАСИБО камраду petera!!!
    Когда на первой странице прочитал, что нужно байты поменять местами, то малость завис. Надо искать что то подобное, может сам чего сочиню. А когда на второй странице увидел код, однозначно сам бы не осилил.

  3. #13
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,249

    По умолчанию

    извиняюсь, не часто захожу.
    Тип данных реал записывается как в 1 байте мантисса со знаком, в остальных экспонента.
    В модбасе не определен порядок следования байт.
    Для этого иногда это требуется сделать в ручную.
    Обычно сначала нужно представить число в бинарном виде и будет видно, какой байт содержит мантиссу.
    Подробно все уже рассказал.
    Для общего ознакомления можно почитать здесь:
    https://studfiles.net/preview/3368734/

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

    По умолчанию

    В общем случае возможно четыре варианта расположения байт

    4321 - "нормальный порядок" соответствующий представлению REAL в ПЛК
    3421 - переставлены байты в словах
    2143 - переставлены слова
    1234 - переставлены слова и байты в словах

    Код вынес в три функции
    Код:
    FUNCTION REAL_3412 : REAL
    VAR_INPUT
    	in: REAL;
    END_VAR
    VAR
    	ptFl: POINTER TO REAL;
    	ptDw: POINTER TO DWORD;
    	SWAP_BYTE: DWORD;
    END_VAR
    (*это вариант, когда порядок байт 3412*)
    ptDw:=ADR(height_tmp);
    SWAP_BYTE:=(ROL(ptDw^,8) AND 16#FF00FF00) OR (ROR(ptDw^,8) AND 16#00FF00FF);
    ptFl:=ADR(SWAP_BYTE);
    REAL_3412:=ptFl^;
    Код:
    FUNCTION REAL_2143 : REAL
    VAR_INPUT
    	in: REAL;
    END_VAR
    VAR
    	ptFl: POINTER TO REAL;
    	ptDw: POINTER TO DWORD;
    	SWAP_BYTE: DWORD;
    END_VAR
    (*это вариант, когда порядок байт 2143*)
    ptDw:=ADR(height_tmp);
    SWAP_BYTE:=ROR(ptDw^,16);
    ptFl:=ADR(SWAP_BYTE);
    REAL_2143:=ptFl^;
    Код:
    FUNCTION REAL_1234 : REAL
    VAR_INPUT
    	in: REAL;
    END_VAR
    VAR
    	ptFl: POINTER TO REAL;
    	ptDw: POINTER TO DWORD;
    	SWAP_BYTE: DWORD;
    END_VAR
    (*это вариант, когда порядок байт 1234*)
    ptDw:=ADR(height_tmp);
    SWAP_BYTE:=(ROR(ptDw^,8) AND 16#FF00FF00) OR (ROL(ptDw^,8) AND 16#00FF00FF);
    ptFl:=ADR(SWAP_BYTE);
    REAL_1234:=ptFl^;
    Пример использования в PLC_PRG
    Код:
    PROGRAM PLC_PRG
    VAR
    	height_1: REAL;		(*когда порядок 3412*)
    	height_2: REAL;		(*когда порядок 1234*)
    	height_3: REAL;		(*когда порядок 2134*)
    END_VAR
    (*height_tmp - это именованная переменная в слейве ПЛК
    если нормальный порядок байт для внутреннего представления REAL 
    принять как 4321, то*)
    
    (*этот вариант, когда порядок байт в height_tmp 3412*)
    height_1:= REAL_3412(height_tmp);
    
    (*этот вариант, когда порядок байт в height_tmp 1234*)
    height_2:= REAL_1234(height_tmp);
    
    (*этот вариант, когда порядок байт в height_tmp 2143*)
    height_3:= REAL_2143(height_tmp);
    Захват-1.png
    26 лет деятельности в области промышленной безопасности

Страница 2 из 2 ПерваяПервая 12

Похожие темы

  1. Получение данных по ОРС с ПЛК63
    от stesl в разделе ПЛК63/73
    Ответов: 22
    Последнее сообщение: 23.05.2015, 02:45
  2. Получение данных из ПЛК на ПК
    от bladerunner в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 06.01.2015, 08:51
  3. Получение данных с ПЛК110
    от MerlinLegacy в разделе Master SCADA 3
    Ответов: 8
    Последнее сообщение: 05.02.2014, 21:52
  4. Получение данных с датчиков
    от qawaq в разделе Помощь Разработчикам
    Ответов: 8
    Последнее сообщение: 13.05.2013, 18:54
  5. Получение данных из MS SQL в MasterSCADA
    от energy_aleks в разделе Master SCADA 3
    Ответов: 32
    Последнее сообщение: 30.04.2011, 18:49

Ваши права

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