Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 20 из 20

Тема: owen_io.dll + .NET 4.0 + C#

  1. #11

    По умолчанию

    Цитата Сообщение от firefox0013 Посмотреть сообщение
    Тогда дело в дллимпорте. Я точно не помню как он пишется 1 раз делал потом на c# свою либу писал для общения по овену. укажите явно [In],[Out] параметры. float value точно было ин аут.

    Код:
                [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", CharSet = CharSet.Unicode, EntryPoint = "ReadFloat24", CallingConvention = CallingConvention.StdCall)]
                public static extern float ReadFloat24(int adr, int adr_type, [MarshalAs(UnmanagedType.BStr)] string command,[In] [Out] ref float value, int index);
    Точно не помню но делал такое а код уже удалил. Попробуйте вместо Unicode поставить ASCII и тип возвращаемого значения float.
    Переписал код дллимпорта как вы сказали. Пришлось чуть-чуть и подредактировать код основной функции так:

    Код:
                double result;
                float value = 0;
    
                result = NativeMethods.OpenPort(2, 8, 0, 1, 0, 1);
                Console.WriteLine(result);
    
                result = NativeMethods.ReadFloat24(32, 0, "PV", ref value, 0);
                Console.WriteLine(result);
                Console.WriteLine(value);
    
                result = NativeMethods.ClosePort();
                Console.WriteLine(result);
    
                Console.ReadLine();
    Но всё равно не работает, код ошибки - NaN, т.е. я даже не знаю, что за ошибка. Есть идеи?

  2. #12

    По умолчанию

    Цитата Сообщение от iKarma Посмотреть сообщение
    Переписал код дллимпорта как вы сказали. Пришлось чуть-чуть и подредактировать код основной функции так:

    Код:
                double result;
                float value = 0;
    
                result = NativeMethods.OpenPort(2, 8, 0, 1, 0, 1);
                Console.WriteLine(result);
    
                result = NativeMethods.ReadFloat24(32, 0, "PV", ref value, 0);
                Console.WriteLine(result);
                Console.WriteLine(value);
    
                result = NativeMethods.ClosePort();
                Console.WriteLine(result);
    
                Console.ReadLine();
    Но всё равно не работает, код ошибки - NaN, т.е. я даже не знаю, что за ошибка. Есть идеи?
    У вас одно устройство подключено к ком порту или несколько? Мне кажется у вас не верные параметры при вызове фунцций.
    OpenPort(int n, int speed, int part, int bits, int stop, int vid);
    n - номер ком порта COM1 - 0 COM2 -1 и так далие
    speed - скорость порта. обычно 115200
    part - четность. если не ошибаюсь 0
    bits - 8
    stop - 1
    vid - не помню

    ReadFloat24(int adr, int adr_type, [MarshalAs(UnmanagedType.BStr)] string command,[In] [Out] ref float value, int index);

    adr - адрес устройства в сети обычно 0
    index = -1

    Вы уверены в используемых параметрах? для устройств овен есть програмулина для настройки скачайте и попробуйте ей подключится что проверить что связь есть.

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

    По умолчанию

    Цитата Сообщение от iKarma Посмотреть сообщение
    Но всё равно не работает, код ошибки - NaN, т.е. я даже не знаю, что за ошибка. Есть идеи?
    Вы же вроде год назад озадачивались этой темой, тут читали: http://www.owen.ru/forum/showthread....ht=owen_io.dll

  4. #14

    По умолчанию

    Всё, наконец-то разобрался

    Причина была в некорректном дллимпорте и вызове.

    Вот корректный код (вдруг кому ещё поможет):

    Код:
    //...
    
    [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);
    
    //...

  5. #15

    По умолчанию

    Добрый день! Срочно нужна помощь! Пишу программку на c# что то вроде диспетчеризации. С чтением данных разобрался полностью, а вот запустить машину, или перевести в дежурный режим никак! контроллер ТРМ133м02

    пытался записать параметр "STAT"
    int 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("ошибка чтения данных");
    }
    возвращает ошибку 104

    импорт выполнен так:
    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);
    }
    Пожалуйста, подскажите, как мне запустить или остановить этот контроллер! Уже мозг кипеть начинает!

  6. #16

    По умолчанию

    ну подскажите пожалуйста, где же ошибка? в длл импорте?
    [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? Блин все перепробовал, ни фига не получается. Люди же сталкивались с такой задачей.....

  7. #17

    По умолчанию

    Короче, подключил сниффер COM порта (виртуального) и посмотрел пакеты.
    RS485.WriteWord(adr, 0, command, value, -1);
    эта хрень отправляет пакеты
    в которых размер блока данных почему то равен двум (0010), вместо ожидаемого одного (0001). как я понял, за величину блока данных отвечает параметр index. Но могу и ошибаться. Методом научного тыка определил, что при изменении index меняется размер блока данных. Однако, единицы добиться так и не смог. Решил записать правильные пакеты, и отправлять их напрямую в порт через класс SerialPort. посмотрим, что выйдет.

  8. #18

    По умолчанию

    Позвольте поинтересоваться, по вашему мнению, какой должен быть размер поля данных при вызове функции WriteByte()?

  9. #19

    По умолчанию

    Я думал, 1. проснифил конфигуратор, он отправляет два пакета. Первый с размером два байта, не зависимо от записываемой величины, и с неизвестным мне хэш кодом 2728 или 2827 не помню уже. А второй пакет содержит записываемую величину, размер 1 байт и хэш код 9C5B, что , собственно, я и ожидал увидеть. Сегодня отправлял пакеты напрямую с ком порта, получается. Так, собственно, и думаю решить проблему. Ибо для меня все равно остается загадкой этот нюанс, а сроки поджимают.

  10. #20

    По умолчанию

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

Страница 2 из 2 ПерваяПервая 12

Похожие темы

  1. ТРМ101 + АС4 + owen_io + VB.NET 2008
    от tralivali в разделе Помощь Разработчикам
    Ответов: 1
    Последнее сообщение: 22.03.2011, 13:24
  2. owen_io.dll + C# = проблема???
    от Diman в разделе Помощь Разработчикам
    Ответов: 6
    Последнее сообщение: 19.04.2010, 14:03
  3. owen_io.dll
    от Arkady в разделе Помощь Разработчикам
    Ответов: 8
    Последнее сообщение: 27.07.2007, 07:36
  4. owen_io.dll
    от Vladimir в разделе Помощь Разработчикам
    Ответов: 4
    Последнее сообщение: 27.04.2007, 15:13
  5. owen_io.dll - ТРМ138
    от Соловьев Владимир в разделе Сервисное ПО
    Ответов: 20
    Последнее сообщение: 26.03.2007, 12:47

Ваши права

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