На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: maxim84_, juice
  
> Числа в формате PIC с плавающей запятой
    Вот никогда с этим не сталкивался, и не найду инфы никак. Как преобразовывать такие данные. Данные приходят с прибора по Modbas RTU в виде старший байт мантиссы и младший байт мантиссы и порядок. Как это дело преобразовать в число не пойму. В руководстве написано что числа передаются в формате PIC с плавающей запятой, что это за формат и как с ним быть ?
    Истина где-то рядом!?!
      нашел код на Борланд С++, может кто силен и поможет перевести код на C#

      ExpandedWrap disabled
        float PICtoIARfloat(unsigned char *PICfloat)
        {
        union
        {
        float i;
        unsigned char Byte[4];
        } Number;
        //Первый байт float IAR
            Number.Byte[0] = 0x00;
        //Второй байт
            Number.Byte[1] = *(PICfloat+0);
        //Третий байт
            Number.Byte[2] = *(PICfloat+1);
            Number.Byte[2] &= 0x7F; //Сброс знака
         
            if (*(PICfloat+2) & 0x01)
            {
            //Если мл.бит установлен
            Number.Byte[2] |= 0x80;
            }
        //Четвертый байт
            Number.Byte[3] = *(PICfloat+2);
            Number.Byte[3] >>= 1;
            if (*(PICfloat+1) & 0x80)
            {
            //Если знак отрицательный
            Number.Byte[3] |= 0x80;
            }
            else
            {
            Number.Byte[3] &= 0x7F;
            }
        return Number.i;
        }


      Добавлено
      у меня получилось вот что
      ExpandedWrap disabled
        static void Main(string[] args)
                {
                     byte[] send = new byte[3] {0x65, 0x29, 0x8A};
                     Console.WriteLine(PICtoIARfloat(send));
                    Console.ReadLine();
                }
         
                static float PICtoIARfloat(byte[] PICfloat)
                {
                  
                    byte[] bt = new byte[4];
         
         
                    //Первый байт float IAR
                    bt[0] = 0x00;
                    //Второй байт
                    bt[1] = PICfloat[0];
                    //Третий байт
                    bt[2] = PICfloat[1];
                    bt[2] &= 0x7f;  //Сброс знака
         
                    if ((PICfloat[2] & 0x01) == 1)
                    {
                        //Если мл.бит установлен
                        bt[2] |= 0x80;
                    }
                    //Четвертый байт
                    bt[3] = PICfloat[2];
                    bt[3] >>= 1;
                    if ((PICfloat[1] & 0x80)==1)
                    {
                        //Если знак отрицательный
                        bt[3] |= 0x80;
                    }
                    else
                    {
                        bt[3] &= 0x7F;
                    }
                    
         
                    return ToFloat(bt);
                }
         
                static float ToFloat(byte[] input)
                {
                    byte[] newArray = new[] { input[2], input[3], input[0], input[1] };
                    return BitConverter.ToSingle(newArray, 0);
                }
            }


      но выдает не то что надо, результат должен быть 2710,313 (((

      Добавлено
      и еще, результат почему то в экспотенциальном виде выдает

      Добавлено
      Вопрос решен, кому интересно вот код )))


      ExpandedWrap disabled
        class Program
            {
                static void Main(string[] args)
                {
                     byte[] send = new byte[3] {0x65, 0x29, 0x8A};
                     Console.WriteLine(PICtoIARfloat(send));
                    Console.ReadLine();
                }
         
                static float PICtoIARfloat(byte[] PICfloat)
                {
                  
                    byte[] bt = new byte[4];
         
         
                    //Первый байт float IAR
                    bt[0] = 0x00;
                    //Второй байт
                    bt[1] = PICfloat[0];
                    //Третий байт
                    bt[2] = PICfloat[1];
                    bt[2] &= 0x7f;  //Сброс знака
         
                    if ((PICfloat[2] & 0x01) > 0)
                    {
                        //Если мл.бит установлен
                        bt[2] |= 0x80;
                    }
                    //Четвертый байт
                    bt[3] = PICfloat[2];
                    bt[3] >>= 1;
                    if ((PICfloat[1] & 0x80)>0)
                    {
                        //Если знак отрицательный
                        bt[3] |= 0x80;
                    }
                    else
                    {
                        bt[3] &= 0x7F;
                    }
                    
         
                    return ToFloat(bt);
                }
         
                static float ToFloat(byte[] input)
                {
                    return BitConverter.ToSingle(input, 0);
                }
            }
      Истина где-то рядом!?!
        ндааа, не совсем решен оказался вопрос, в боевом режиме почему то все значения идут с минусом, по величине значения похоже на правду, но вот откуда минус лезет не пойму
        Истина где-то рядом!?!
          Тип byte по определению не может быть отрицательным. Переполнение?
            тип byte не может, но в массиве храниться знак, который сбрасывается в 20й строчке, но почему опять вылазит не понятно
            Истина где-то рядом!?!
              проблема крылась не в алгоритме преобразования а в том что пакет модбаза почему то у татар задом наперед идет )))
              Истина где-то рядом!?!
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script Execution time: 0,0887 ]   [ 15 queries used ]   [ Generated: 21.10.18, 14:53 GMT ]