PDA

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



SergeyH
08.03.2013, 23:33
Пишу программу для панели оператора под 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 то приходят какие-то непонятные цифры

capzap
09.03.2013, 09:02
http://www.owen.ru/forum/showpost.php?p=104232&postcount=1681 от этого поста и ниже прочитайте. Так же не мешает знать о таких особенностях http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1% D0%B0%D0%B9%D1%82%D0%BE%D0%B2

Gans
09.03.2013, 13:00
Здравствуйте, SergeyH.

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

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

Перепишите массив задом на перёд - мне помогло. В C# стандартные функции своеобразно конвертят данные.

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

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

И саму задачу поподробнее. Типа: хочу флоат передать ввиде байт в ПЛКххх, а там небональными/рукодельными фанкциями собрать флоат.

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

SergeyH
31.03.2013, 23:46
думаю на сторое WinCE сделать Slave и посмотреть в каком формате принимаются числа float

Гарчев Евгений
04.04.2013, 18:59
ПЛК в режиме слейв читает регистры данных в обратной последовательности, необходимо поменять местами первые 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];