PDA

Просмотр полной версии : C#, ТРМ202, Протокол OWEN, owen_io.dll : помогите считать float параметры



Avol
30.09.2015, 12:52
Имеется ТРМ202 старой модификации (без modbus, только OWEN). Никак не могу считать float параметры. Целочисленные читаются.
Порт открывается


ConnectionError res = (ConnectionError)NativeMethods.OpenPort(
(int)numericUpDown1.Value, (int)BaudRate.Baud115200, (int)Parity.None, (int)DataBits.Eight, (int)StopBits.One, (int)ConverterType.Auto);

if (res != ConnectionError.Ok)
{
label8.Text = "Ошибка открытия порта: " + res.ToString();
}
else
{
label8.Text = "Com port открыт";
}

Методы из библиотеки owen_io.dll

partial class NativeMethods
{
[DllImportAttribute("owen_io.dll", EntryPoint = "OpenPort", CallingConvention = CallingConvention.StdCall)]
public static extern int OpenPort(int n, int speed, int part, int bits, int stop, int vid);

[DllImportAttribute("owen_io.dll", EntryPoint = "ClosePort", CallingConvention = CallingConvention.StdCall)]
public static extern int ClosePort();


[DllImportAttribute("owen_io.dll", EntryPoint = "ReadIEEE32", CallingConvention = CallingConvention.StdCall)]
public static extern int ReadIEEE32(int adr, int adr_type, System.IntPtr command, ref float value, ref int time, int index);


[DllImportAttribute("owen_io.dll", EntryPoint = "ReadUInt", CallingConvention = CallingConvention.StdCall)]
public static extern int ReadUInt(int adr, int adr_type, System.IntPtr command, ref int value, int index);

[DllImportAttribute("owen_io.dll", EntryPoint = "ReadSInt", CallingConvention = CallingConvention.StdCall)]
public static extern int ReadSInt(int adr, int adr_type, System.IntPtr command, ref int value, int index);


[DllImportAttribute("owen_io.dll", EntryPoint = "ReadFloat24", CallingConvention = CallingConvention.StdCall)]
public static extern int ReadFloat24(int adr, int adr_type, System.IntPtr command, ref float value, int index);


[DllImportAttribute("owen_io.dll", EntryPoint = "ReadStoredDotS", CallingConvention = CallingConvention.StdCall)]
public static extern int ReadStoredDotS(int adr, int adr_type, System.IntPtr command, ref float value, int index);
}
Целочисленные параметры читаются


int bitMask = 0;

ConnectionError res;

IntPtr name = Marshal.StringToCoTaskMemAnsi(textBox1.Text);

res = (ConnectionError)NativeMethods.ReadUInt(
(int)numericUpDown2.Value, 0, name, ref bitMask, -1);

if (res == ConnectionError.Ok)
{
textBox2.Text = bitMask.ToString();
}

А вот float вообще никак не хочет читаться


IntPtr name = Marshal.StringToCoTaskMemAnsi(textBox1.Text);

float value = 0;

ConnectionError res = (ConnectionError)NativeMethods.ReadStoredDotS((int )numericUpDown2.Value, 1, name, ref value, -1);

Посоветуйте как float вычитать. Или примерами поделитесь рабочими. Заранее благодарен.

liga_blunt
30.09.2015, 13:12
Я поехал и Сервис-центр и перепрошил 202 новой прошивкой и появился модбас

Avol
30.09.2015, 13:18
Я поехал и Сервис-центр и перепрошил 202 новой прошивкой и появился модбас

202, которые у меня, старой модификации. Прошивка невозможна (Это ответ поддержки).

liga_blunt
30.09.2015, 13:23
У меня были 2009г. как то так

Avol
30.09.2015, 13:40
У меня были 2009г. как то так

от 2006го в наличии

bender_slava_robotam
30.09.2015, 20:49
Имеется ТРМ202 старой модификации (без modbus, только OWEN). Никак не могу считать float параметры. Целочисленные читаются.
Порт открывается

Методы из библиотеки owen_io.dll

Посоветуйте как float вычитать. Или примерами поделитесь рабочими. Заранее благодарен.



[DllImport("owen_io.dll", EntryPoint = "ReadFloat24")]
public static extern int ReadFloat24(uint adr, uint adr_type, string command, ref float value, int index);


Параметры
adr Адрес устройства.
adr_type Длина адреса.(0 - 8 бит ;1- 11 бит)
command Команда.
value Значение считанного параметра.
index Индекс.
Возвращаемое значение При успехе ERR_OK, при неудаче <0.




float val=0;
if(ReadFloat24((int)numericUpDown2.Value, 1, textBox1.Text, ref value, -1)==ERR_OK)
{куда то там вывести val;}


adr и index зависит от того какой у вас параметр, некоторые читаются с истинными адресами прибора, некоторые со сдвигом адресанекоторые по линейному индексу-курите на прибор доки и зрите в конфигуратор

Avol
09.10.2015, 05:06
Напишу как читается, может пригодиться кому-нибудь:

Целочисленные:
ConnectionError res = (ConnectionError)NativeMethods.ReadUInt(AdresDevic e, 0, NameParam, ref value, Index);
Index = -1 для параметров не требующих индексации. Например: Addr, rSdL...

Float24:
ConnectionError res = (ConnectionError)NativeMethods.ReadFloat24(DeviceA ddress + (Chanel - 1), 0, name, ref value, Index);
Для считывания оперативных параметров PV, LuPV... смещать нужно DeviceAddress, Index = -1. Т.е. для первого канала DeviceAddress, для второго DeviceAddress + 1.