Преобразование Uint16 в Eint и наоборот

Просмотр 4 сообщений - с 1 по 4 (из 4 всего)
  • Автор
    Сообщения
  • #9918
    epikhin
    Участник

    Добрый всем день.
    Имеется ЧРП фирмы Emotron считываю по ModBus параметры, но у этого чуда имеется формат Eint (это формат с плавающей запятой, только основан на одном слове).

    В документации нашел код и инструкцию, помогите прикрутить к скаде.

    Пример программирования.
    
    typedef struct
    {
    int m:11; // mantissa, -1024..1023
    int e: 4; // exponent -8..7
    unsigned int f: 1; // format, 1->special emoint format
    } \} eint16;
    //---------------------------------------------------------------------------
    unsigned short int float_to_eint16(float value)
    {
    eint16 etmp;
    int dec=0;
    while (floor(value) != value && dec<16)
    {
    dec++; value x=10;
    }
    if (value>=0 && value<=32767 && dec==0)
    *(short int *)&etmp=(short int)value;
    else if (value>=-1000 && value<0 && dec==0)
    {
    etmp.e=0;
    etmp.f=1;
    etmp.m=(short int)value;
    }
    else
    {
    etmp.m=0;
    etmp.f=1;
    etmp.e=-dec;
    if (value>=0)
    etmp.m=1; // Set sign
    else
    etmp.m=-1; // Set sign
    value=fabs(value);
    while (value>1000)
    {
    etmp.e++; // increase exponent
    value=value/10;
    }
    value+=0.5; // round
    etmp.m=etmp.m*value; // make signed
    }
    Rreturn (*(unsigned short int *)&etmp);
    }
    //---------------------------------------------------------------------------
    float eint16_to_float(unsigned short int value)
    {
    float f;
    eint16 evalue;
    evalue=*(eint16 *)&value;
    if (evalue.f)
    {
    if (evalue.e>=0)
    f=(int)evalue.m*pow10(evalue.e);
    else
    f=(int)evalue.m/pow10(abs(evalue.e));
    }
    else
    f=value;
    return f;
    }
    //---------------------------------------------------------------------------
    #9919
    Mikhail
    Модератор

    Добрый день!
    Нужно в Visual Studio создать новый проект типа Console Application для тестирования формулы и в прямолинейно изменить синтаксис C на C#. В бесплатную поддержку это не входит, но возможно, кто-то из пользователей попробует помочь.

    #9920
    Mikhail
    Модератор

    Вам вероятно нужно только eint16_to_float ?

    #9935
    epikhin
    Участник

    Нужно как чтение так и запись. Т.к. некоторыми параметрами хотелось бы управлять со скады.

Просмотр 4 сообщений - с 1 по 4 (из 4 всего)
  • Вы должны авторизироваться для ответа в этой теме.