Показано с 1 по 7 из 7

Тема: WinCE + ПЛК160 Проблема с отправкой чисел с плавающей точкой

  1. #1

    По умолчанию WinCE + ПЛК160 Проблема с отправкой чисел с плавающей точкой

    Пишу программу для панели оператора под WindowsCE 6.0 .NET 3.5 C# + программу для ПЛК160. Использую библиотеку NModbus. Может кто сталкивался с этим. Вот код С#:
    Код:
                
                float f1 = -10;
                int f2 = -10;
                byte[] bytes = BitConverter.GetBytes(f1);
                ushort[] us = new ushort[2];
                us[0] = BitConverter.ToUInt16(bytes, 0);
                us[1] = BitConverter.ToUInt16(bytes, 2);
               
    
                        mb.WriteMultipleRegisters(1, 2, us);
    Вот код CoDeSys:
    Код:
    Par3:= DWORD_TO_INT(%QD7.2.0);
    Par4:=DWORD_TO_DINT(%QD7.2.0);
    Par5:=DWORD_TO_REAL(%QD7.2.0);
    Так вот когда я отправляю f2 тоесть INT то все ок, Par3 и Par4 и Par5 = -10. Если же я использую f1 тоесть Float то приходят какие-то непонятные цифры

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

    По умолчанию

    http://www.owen.ru/forum/showpost.ph...postcount=1681 от этого поста и ниже прочитайте. Так же не мешает знать о таких особенностях http://ru.wikipedia.org/wiki/%D0%9F%...82%D0%BE%D0%B2

  3. #3

    По умолчанию

    Здравствуйте, SergeyH.

    После получения массива байт:

    byte[] bytes = BitConverter.GetBytes(f1);

    Перепишите массив задом на перёд - мне помогло. В C# стандартные функции своеобразно конвертят данные.
    Автоматизация Диспетчеризация Сервис
    e-mail: ads-kaluga@mail.ru

  4. #4

    По умолчанию

    Не доглядел :-)
    Может не:
    byte[] bytes = BitConverter.GetBytes(f1);

    а вот так:
    byte[] bytes = ByteConverter.GetBytes(f1);

    И саму задачу поподробнее. Типа: хочу флоат передать ввиде байт в ПЛКххх, а там небональными/рукодельными фанкциями собрать флоат.
    Автоматизация Диспетчеризация Сервис
    e-mail: ads-kaluga@mail.ru

  5. #5

    По умолчанию

    в С# нет класа ByteConverter. Собрать не катит нужно чтоб любое устройство могло по modbus записать значения.
    Инверсия массива не помогла.

  6. #6

    По умолчанию

    думаю на сторое WinCE сделать Slave и посмотреть в каком формате принимаются числа float

  7. #7

    По умолчанию

    ПЛК в режиме слейв читает регистры данных в обратной последовательности, необходимо поменять местами первые 2 байта данных и последние. Можно сделать такое преобразование в ПЛК через указатель на массив из 2 элементов типа word.

    var_input
    f1:REAL; (* значение с панели*)
    f1_res: REAL; (*преобразованное значение*)
    pIn: POINTER TO ARRAY[0..1] OF WORD;
    pInRes: POINTER TO ARRAY[0..1] OF WORD;
    end_var

    pIn:=ADR(f1);
    pInRes:=ADR(f1_res);
    pInRes^[0]:=pIn^[1];
    pInRes^[1]:=pIn^[0];

Похожие темы

  1. Ввод чисел в ИП320
    от Frayl в разделе Панели оператора (HMI)
    Ответов: 3
    Последнее сообщение: 12.08.2012, 10:54
  2. проблема с ПЛК160
    от Сергеев Василий в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 01.06.2012, 16:25
  3. ПЛК160
    от CEkip в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 07.02.2011, 11:34
  4. Ответов: 1
    Последнее сообщение: 22.10.2010, 10:24

Ваши права

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