Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 11 по 20 из 37

Тема: Переворачивание регистров

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

    По умолчанию

    Цитата Сообщение от lara197a Посмотреть сообщение
    Открываем проект- вызываем справку, операторы и функции МЭК- операторы сдвига.
    VAR
    A,A1: DWORD;
    B,D1: REAL;
    END_VAR

    A:=REAL_TO_DWORD(B);
    A1:=ROR(A,16);
    D1:=DWORD_TO_REAL(A1);
    REAL_TO_DWORD преобразовывает в другой формат - что не катит. Нужен просто перенос.

    Для кдс2 - указатель или %. Для кдс3 + к этому есть union
    Последний раз редактировалось Валенок; 14.08.2014 в 20:45.

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

    По умолчанию

    обоснуй?
    преобразование ничего не меняет.
    Последний раз редактировалось lara197a; 14.08.2014 в 20:59.

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

    По умолчанию

    Чесно говоря думал что это очевидно. Приведу пример.

    x : real := 2000; последовательность байт здесь - 00,00,FA,44
    эту последовательность надо сделать FA,44,00,00. Это и есть перестановка регистров.
    А если сделать d : (dword) := real_to_dword(x), то мы получим d = 16#000007D0, а из этого, как не переставляй байты, никак не получится FA,44,00,00.

    Допускаю что есть редкие комбинации где срастется, но это фичи на которые лучше не рассчитывать.


    Код:
    преобразование ничего не меняет
    любое целое <-> real всегда меняет внутреннее представление.
    real_to_dword(dword_to_real(dw)) не всегда = dw

    ^, %, union
    Последний раз редактировалось Валенок; 14.08.2014 в 21:31.

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

    По умолчанию

    Вообще-то контроллер работает с бинарным форматом, а в нем все исполняется правильно.
    К примеру эта же функция с пресловутыми двумя тысячами:
    DWORD_TO_REAL.jpgЯ года 3 назад решал задачу получения данных с преобразователя,
    где данные хранились в формате:
    Мантиса в одном регистре
    Экспонента в одном байте другого регистра.
    Все работает, много лет.
    Из данных пишется график, архив и пр...
    А выглядит это так:
    A1_p:=Mantisa; (*присваеваем значение регистра 108 промежуточной переменной*)

    A9:=A1.15; (*Выделяем знак*)

    A1_p.15:=FALSE; (*Убиваем 15 бит в промежуточной переменной*)

    A3:=WORD_TO_DWORD(A1_p); (*превращаем 2 байта в 4*)

    A4:=SHL(A3,8); (*Сдвигаем влево на 8 бит*)

    A2_p:=WORD_TO_BYTE(Exponenta); (*выделяем младший байт с экспонентой*)

    A2_2p:=BYTE_TO_DWORD(A2_p); (*превращаем 2 байта в 4*)

    A2_1p:=SHL(A2_2p,23); (*Сдвигаем влево на 23 бита*)

    A5:=A4+A2_1p; (*Соединяем экспоненту с мантисой*)

    A5.31:=A9; (*Добавляем знак*)

    pt :=ADR(A5); (*Копируем в префикс*)

    A6:=pt^; (*Превращение в реал(флоат)*)

    RAMP_REAL1( IN:=A6 , (*усредняем(фильтруем)*)
    ASCEND:= 100,
    DESCEND:=300,
    TIMEBASE:=T#1s ,
    RESET:= ,
    OUT=>A6_1 );

    A8:=REAL_TO_DWORD(A6_1); (*выделяем целую часть*)

    A7:=A8/6; (*получаем расход в мин*10*)

    VAR_OUT:=DWORD_TO_WORD(A7); (*Упаковываем значение в 1 регистр*)

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

    По умолчанию

    К примеру эта же функция с пресловутыми двумя тысячами
    ))) Картинка ни о чем.
    Вы путаете ЗНАЧЕНИЕ и ПРЕДСТАВЛЕНИЕ. Для dword - они совпадают (исторически сложилось)
    Но для ТС при получении данных с ai нужно переставить слова не ЗНАЧЕНИЯ (как на картинке), а в ПРЕДСТАВЛЕНИИ real. А оно на картинке - отсутствует.

    Все работает, много лет.
    Из данных пишется график, архив и пр...
    А выглядит это так:
    A1_p:=Mantisa; (*присваеваем значение регистра 108 промежуточной переменной*)
    ..
    VAR_OUT:=DWORD_TO_WORD(A7); (*Упаковываем значение в 1 регистр*)
    Не сомневаюсь что это работает, но задачу ТС по перестановке регистров (слов) в ПРЕДСТАВЛЕНИИ можно решить не зная формата ПРЕДСТАВЛЕНИЯ. Достаточно знать что это 4 байта. Например:

    ai:real;
    p: pointer to dword; //Вы, кстати, без указателей не обошлись ))

    p:=adr(ai);
    p^:=rol(p^,16); //всё
    Последний раз редактировалось Валенок; 15.08.2014 в 00:07.

  6. #16

    По умолчанию

    Значит вариант предложенный lara197a извиняюсь не катит?

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

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    ))) Картинка ни о чем.
    //Вы, кстати, без указателей не обошлись ))
    1. Это не картинка, а контроллер в режиме исполнения.
    2. Указатель там не нужен -100%. Используйте косвенную адресацию и будет Вам счастье.
    Много лет назад я имел по поводу указателей разговор с уважаемым И.Петровым,
    ведущим специалистом КДС в России. Использовать их он крайне не рекомендовал....
    3. С таким же успехом можно сделать без указателя. А:=ror(B,16)
    4. Вообще перевод применен реал-дворд для наглядности,
    первоначально в примере сдвинул влево и в право с заполнением нулями и сложил переменные.
    Но потом решил, что и так все видно, что и Вам показал.
    5. Спор ни о чем.

  8. #18
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    ai:real;
    p: pointer to dword; //Вы, кстати, без указателей не обошлись ))

    p:=adr(ai);
    p^:=rol(p^,16); //всё
    Пользуясь случаем, хочу передать привет компилятору кодесиса, который в ответ на rol(ai, 16) говорит удивительные вещи:
    Type mismatch in parameter 1 of 'ROL': Cannot convert 'REAL' to 'ANY_NUM".
    REAL входит в группу ANY_NUM согласно стандарта, если что. В доках же пишут, что допускаются только BYTE, WORD и DWORD. При этом компилятор молча съедает и INT, и DINT, и UDINT. Непоследовательно как-то.

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

    По умолчанию

    жаль не могу поучаствовать в придумывании кода без машины, а как в Ваших вариантах преобразуется число 0.00000000375, вроде тоже реал

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

    По умолчанию

    В заключении хотелось бы отметить, что для избежания ошибок перевод из REAL в DWORD крайне желателен.
    при этом полностью сохраняя порядок бит и размер, мы просто избавляемся от условностей типа переменной.

    DWORD- ЭТО ВСЕ ЧТО УГОДНО - 4 БАЙТА.
    REAL- ЭТО 32-Х БИТНАЯ ПЕРЕМЕННАЯ. В КОТОРОЙ 31,30-24, 23-0 БИТЫ ИМЕЮТ СТРОГО ОПРЕДЕЛЕННОЕ ЗНАЧЕНИЕ.

    При этом гарантированно не будет ошибок компилятора и пр.

Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Похожие темы

  1. использование регистров 3х и 4х
    от feniks13 в разделе Панели оператора (HMI)
    Ответов: 3
    Последнее сообщение: 17.09.2014, 23:35
  2. Описание регистров ИП320
    от ribamuka в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 12.05.2014, 20:46
  3. СП200 и сравнение регистров
    от Malyshevsergey в разделе Сервисное ПО
    Ответов: 2
    Последнее сообщение: 14.09.2011, 17:10
  4. ип320, номера регистров
    от drvlas в разделе Панели оператора (HMI)
    Ответов: 42
    Последнее сообщение: 21.04.2011, 05:19

Ваши права

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