Вы же вроде год назад озадачивались этой темой, тут читали: http://www.owen.ru/forum/showthread....ht=owen_io.dll
Вы же вроде год назад озадачивались этой темой, тут читали: http://www.owen.ru/forum/showthread....ht=owen_io.dll
А вообще если вам ReadFloat24 надо используйте http://www.owen.ru/forum/showthread.php?t=16224 а ком порт как нибудь сами откроете.
Удалось победить проблему?
Всё, наконец-то разобрался
Причина была в некорректном дллимпорте и вызове.
Вот корректный код (вдруг кому ещё поможет):
Код://... [DllImportAttribute("owen_io.dll", CharSet = CharSet.Unicode, EntryPoint = "ReadFloat24", CallingConvention = CallingConvention.StdCall)] public static extern int ReadFloat24(int adr, int adr_type, System.IntPtr command, ref float value, int index); //... IntPtr name = Marshal.StringToCoTaskMemAnsi("PV"); result = NativeMethods.ReadFloat24(32, 0, name, ref value, -1); //...
Добрый день! Срочно нужна помощь! Пишу программку на c# что то вроде диспетчеризации. С чтением данных разобрался полностью, а вот запустить машину, или перевести в дежурный режим никак! контроллер ТРМ133м02
пытался записать параметр "STAT"
возвращает ошибку 104int adr = Convert.ToInt32(textBox1.Text); // адрес прибора
IntPtr command = Marshal.StringToCoTaskMemAnsi("STAT");
int value = Convert.ToInt32(textBox3.Text); // величина, которую будем записывать
try
{
int result = RS485.WriteWord(adr, 0, command, value, -1);
MessageBox.Show("процесс " + result.ToString() + "\n" + "значение " + value.ToString());
}
catch
{
MessageBox.Show("ошибка чтения данных");
}
импорт выполнен так:
Пожалуйста, подскажите, как мне запустить или остановить этот контроллер! Уже мозг кипеть начинает!class RS485
{
[DllImportAttribute("owen_io.dll", EntryPoint = "OpenPort", CallingConvention = CallingConvention.StdCall)]
public static extern int OpenPort(int n, int sped, 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 = "SetMaxRetriesGlobal", CallingConvention = CallingConvention.StdCall)]
public static extern void SetMaxRetriesGlobal(int n);
[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 = "ReadSInt", CallingConvention = CallingConvention.StdCall)]
public static extern int ReadSInt(int adr, int adr_type, IntPtr command, ref int param, int index);
[DllImportAttribute("owen_io.dll", EntryPoint = "WriteWord", CallingConvention = CallingConvention.StdCall)]
public static extern int WriteWord(int adr, int adr_type, IntPtr command, int value, int index);
}
ну подскажите пожалуйста, где же ошибка? в длл импорте?может надо добавить ключевое слово ref или out? Блин все перепробовал, ни фига не получается. Люди же сталкивались с такой задачей.....[DllImportAttribute("owen_io.dll", EntryPoint = "WriteWord", CallingConvention = CallingConvention.StdCall)]
public static extern int WriteWord(int adr, int adr_type, IntPtr command, int value, int index);
Короче, подключил сниффер COM порта (виртуального) и посмотрел пакеты.эта хрень отправляет пакетыRS485.WriteWord(adr, 0, command, value, -1);
в которых размер блока данных почему то равен двум (0010), вместо ожидаемого одного (0001). как я понял, за величину блока данных отвечает параметр index. Но могу и ошибаться. Методом научного тыка определил, что при изменении index меняется размер блока данных. Однако, единицы добиться так и не смог. Решил записать правильные пакеты, и отправлять их напрямую в порт через класс SerialPort. посмотрим, что выйдет.
Позвольте поинтересоваться, по вашему мнению, какой должен быть размер поля данных при вызове функции WriteByte()?
Может просветите меня, неуча, как оно должно выглядеть? Ладно, два байта. Почему конфигуратор отправляет два пакета, а данная функция один пакет? почему хэш коды разные?
Я думал, 1. проснифил конфигуратор, он отправляет два пакета. Первый с размером два байта, не зависимо от записываемой величины, и с неизвестным мне хэш кодом 2728 или 2827 не помню уже. А второй пакет содержит записываемую величину, размер 1 байт и хэш код 9C5B, что , собственно, я и ожидал увидеть. Сегодня отправлял пакеты напрямую с ком порта, получается. Так, собственно, и думаю решить проблему. Ибо для меня все равно остается загадкой этот нюанс, а сроки поджимают.