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

Тема: LREAL (double float) и ПЛК100

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #17

    По умолчанию

    Законченый и провереный вариант кода для преобразования байт содержащих LREAL и полученых через порт от расходомера в REAL. Исходя из особенностей ПЛК100, 8-мь байт собираются в строку при приеме через порт. Разработчикам которые работают с расходомерами или теплосчетчиками, с большими расходами советовал бы оценить достаточно ли им разрешающей способности REAL и если нет взять другой контроллер работающий с LREAL. Сapzap спасибо за подсказки.
    Код:
    FUNCTION StDR_to_R : REAL (*преобразование дабл флоат в флоат на  ПЛК100 принятых через порт *)
    VAR_INPUT
    	str_d:STRING;
    	swap:BOOL;
    END_VAR
    VAR
    	str:POINTER TO BYTE;
    	b: ARRAY[1..8]OF BYTE;
    	mant:DWORD;  (*Мантиса числа REAL *)
    	help1:DWORD;(*Вспомогательная переменнаяч*)
    	i:BYTE;(*счет для цикла*)
    	expon:DWORD;
    	FL:POINTER TO REAL; (*для копирования DWORD  в REAL *)
    END_VAR
    str:=ADR(str_d);
    (*swap устанавливается в 1 или снимается в зависимости от порядка передачи другого контроллера*)
    IF swap=1 THEN (*Формируем масив с определенной последовательностью байт*)
    i:=8;
    WHILE i<>0 DO       (*если требуется начинать с большего и по убыванию *)
    b[i]:=str^;
    str:=str+1;
    i:=i-1;
    END_WHILE
    ELSE                                     (*если требуется только перестановка местами слов*)
    FOR i:=2 TO 8  BY 2 DO
    b[i]:=str^;
    str:=str+1;
    b[i-1]:=str^;
    str:=str+1;
    END_FOR
    END_IF
    mant:=0;
    expon:=0;
    help1:=0;
    help1:=(b[7] AND 16#0F) ;    (*Определили мантису*)
    help1:=SHL(help1,19);
    mant:= mant OR help1;
    help1:=b[6];
    help1:=SHL(help1,11);
    mant:= mant OR help1;
    help1:=b[5];
    help1:=SHL(help1,3);
    mant:= mant OR help1;
    help1:=(b[4] AND 16#F0);
    help1:=SHR(help1,5);
    mant:= mant OR help1; (*Определили мантису*)
    
    help1:=(b[7] AND 16#F0); (*определяем экспоненту*)
    help1:=SHR(help1,4);
    expon:=expon OR help1;
    help1:=(b[8] AND 16#7F);
    help1:=SHL(help1,4);
    expon:=expon OR help1;
    IF mant>0 THEN            (*чтобы при нулевой мантисе не вылизло какое-нибудь число*)
    expon:=expon-1023;
    expon:=expon+127;  (*если мантиса больше 0 экспон. приймет значения *)
    END_IF
    expon:=SHL(expon,23);   (*определяем экспоненту*)
    
    help1:=(b[8] AND 16#80); (*определяем  знак*)
    help1:=SHL(help1,24);  (*определяем  знак*)
    
    help1:= help1 OR expon OR mant  ; (*Собрали все вместе. здесь находится 32 битное число. Если его побитно запихнуть в REAL то получем преобразование LREAL TO REAL*)
    
    FL:=ADR(help1);
    StDR_to_R :=FL^;          (*здесь копирую побитно в  REAL *)
    Последний раз редактировалось vitiali; 14.04.2011 в 20:36.

Ваши права

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