Страница 168 из 168 ПерваяПервая ... 68118158166167168
Показано с 1,671 по 1,674 из 1674

Тема: CODESYS V3.5. Настройка обмена с другими устройствами (Modbus, ОВЕН, OPC и др.)

  1. #1671

    По умолчанию

    Всем Доброго времени суток.
    Столкнулся с такой бедой как "Числа в формате PIC с плавающей запятой" при опросе по RS485 счетчика газа Ирвис К-300.
    ИрвисК300.png
    Прошу вашей помощи, может кто то сталкивался с такой проблемой ранее, как эти значения привести к понятным REAL?
    В сети нашел только пример на языке С, но я в нем вообще не понимаю, что в нем происходит, может у кого есть пример на ST?
    Код:
    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);
            }
        }
    Вложения Вложения

  2. #1672
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    13,164

    По умолчанию

    Им блин что, регистров было жалко?

  3. #1673

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    Им блин что, регистров было жалко?
    Видимо, хотя на других приборах этой марки с регистрами все было нормально, мне кажется тут дело в микроконтроллере, на котором собран прибор.

  4. #1674

    По умолчанию

    Цитата Сообщение от Ctakah133 Посмотреть сообщение
    Всем Доброго времени суток.
    Столкнулся с такой бедой как "Числа в формате PIC с плавающей запятой" при опросе по RS485 счетчика газа Ирвис К-300.
    ИрвисК300.png
    Прошу вашей помощи, может кто то сталкивался с такой проблемой ранее, как эти значения привести к понятным REAL?

    Вот функция на ST, можете проверить её с примером из документа. У меня результаты совпали.
    Можно упростить, если использовать объединение (UNION).


    Код:
    FUNCTION PIC_TO_REAL : REAL
    VAR_INPUT
        picData : ARRAY[0..2] OF BYTE;  // Три байта в формате PIC: [мл.байт мантиссы, ст.байт мантиссы, порядок]
    END_VAR
    VAR
        abyTemp : ARRAY[0..3] OF BYTE;  // 4 байта
        dwTemp : DWORD;
        result : REAL;
    END_VAR
    Код:
    abyTemp[0] := 0; //Нулевой байт REAL = 0
    abyTemp[1] := picData[0]; // Первый байт REAL = нулевой байт PIC (мл. байт мантиссы)
    abyTemp[2] := picData[1] AND 16#7F; // Второй байт REAL = первый байт PIC (ст. байт мантиссы) со сброшенным знаком
    
    // Проверка младшего бита порядка (из второго байта PIC)
    IF (picData[2] AND 16#01) <> 0 THEN
        // Если младший бит установлен, устанавливаем старший бит второго байта REAL
        abyTemp[2] := abyTemp[2] OR 16#80;
    END_IF
    
    // Третий байт REAL = второй байт PIC, сдвинутый вправо на 1 бит
    abyTemp[3] := SHR(picData[2], 1);
    
    // Установка знакового бита в третьем байте REAL
    IF (picData[1] AND 16#80) <> 0 THEN
        // Если знак отрицательный (старший бит первого байта PIC установлен)
        abyTemp[3] := abyTemp[3] OR 16#80;
    ELSE
        abyTemp[3] := abyTemp[3] AND 16#7F;
    END_IF
    
    // Копируем байты в DWORD
    dwTemp := 	SHL(TO_DWORD(abyTemp[1]), 8) OR 
    			SHL(TO_DWORD(abyTemp[2]), 16) OR
            	SHL(TO_DWORD(abyTemp[3]), 24);
    
    // Копируем DWORD в REAL через указатель
    MEM.MemMove(ADR(dwTemp), ADR(result), SIZEOF(result));
    
    PIC_TO_REAL := result;
    Инженер по продукту ПЛК

    e-mail: a.pineko-skvortsov@owen.ru

Страница 168 из 168 ПерваяПервая ... 68118158166167168

Похожие темы

  1. Настройка ПР200, управление 3-мя устройствами через RS-485
    от Orbes в разделе Среда программирования OWEN Logic
    Ответов: 20
    Последнее сообщение: 15.05.2017, 16:45
  2. СП3ХХ Пример настройка обмена с ПЛК на CODESYS 2.3
    от Denis_Kay в разделе Панели оператора (HMI)
    Ответов: 6
    Последнее сообщение: 02.03.2017, 15:12
  3. Ответов: 43
    Последнее сообщение: 13.04.2015, 14:05
  4. Универсальная функция для обмена с устройствами OwenIO и всеми любимый LabView.
    от Алексей Крагель в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 30.05.2014, 13:38

Ваши права

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