Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 25 из 25

Тема: ТРМ-148 и OWEN_IO.dll

  1. #21

    По умолчанию

    потому что это указатель.

  2. #22

    По умолчанию

    Цитата Сообщение от Дмитрий Егоренков Посмотреть сообщение
    потому что это указатель.
    мой код на С#
    Код:
    //Универсальная функция чтения записи
            [DllImportAttribute("owen_io.dll", EntryPoint = "OwenIO", CallingConvention = CallingConvention.StdCall)]
            unsafe public static extern int OwenIO(int adr, int adr_type, int is_read, string command, char * dev, ref int params_sz);
    Код:
    unsafe public static int read_owen_io(int adr, int adr_type,  string command)//, ref string value)
            {
                try
                {
                    int  sz =0;
                    string value = "";
                    char[] param = new char[8];   
                    fixed (char* p = &param[0])
                    {
                        //string param = "";
                        int res = OwenIO(adr, adr_type, 1, command, p, ref sz);
                        for (int i = 0; i < param.Length; i++)
                            value += param[i];
                       // System.Windows.Forms.MessageBox.Show(sz + "\n" + value);
                        return res;
                    }
                }
                catch { return -1000; }
            }
    при чтении "dev" возвращает значения "11576","49856","204","\0" как это расшифровать ?

  3. #23

    По умолчанию

    для начала надо понять разницу между строками в C и в C#, а потом почитать что-нибудь про взаимодействие с неуправляемым кодом. и тогда все само расшифруется.

    Код:
            [DllImportAttribute("owen_io.dll", EntryPoint = "OwenIO", CallingConvention = CallingConvention.StdCall)]
            public static extern int OwenIO(int adr, int adr_type, int is_read, string command, IntPtr dev, ref int params_sz);
    
            public static int read_owen_io(int adr, int adr_type, string command)
            {
                int sz = 0;
                IntPtr param = Marshal.AllocCoTaskMem(15);
    
                int res = OwenIO(adr, adr_type, 1, command, param, ref sz);
    
                if (res == 0)
                {
                    string value = Marshal.PtrToStringAnsi(param, sz);
                }
                Marshal.FreeCoTaskMem(param);
    
                return res;
            }

  4. #24

    По умолчанию

    Цитата Сообщение от Дмитрий Егоренков Посмотреть сообщение
    для начала надо понять разницу между строками в C и в C#, а потом почитать что-нибудь про взаимодействие с неуправляемым кодом. и тогда все само расшифруется.

    Код:
            [DllImportAttribute("owen_io.dll", EntryPoint = "OwenIO", CallingConvention = CallingConvention.StdCall)]
            public static extern int OwenIO(int adr, int adr_type, int is_read, string command, IntPtr dev, ref int params_sz);
    
            public static int read_owen_io(int adr, int adr_type, string command)
            {
                int sz = 0;
                IntPtr param = Marshal.AllocCoTaskMem(15);
    
                int res = OwenIO(adr, adr_type, 1, command, param, ref sz);
    
                if (res == 0)
                {
                    string value = Marshal.PtrToStringAnsi(param, sz);
                }
                Marshal.FreeCoTaskMem(param);
    
                return res;
            }
    Спасибо !!!Работает!!!

  5. #25

    По умолчанию

    Цитата Сообщение от Дмитрий Егоренков Посмотреть сообщение
    для оперативных параметров номер канала прибавляется к адресу, для конфигурационных -- передается как индекс. соответственно выглядит это так: error = Owen_io.WriteStoredDotS(16, ADRTYPE_8BIT, "SP.LU", (float)t, (channel - 1));

    библиотека будет загружена один раз. два прибора можно опрашивать поочередно.
    не получается. возвращает ошибку 47.
    каким образом модно записать уставку? не могли бы вы привести рабочий код? то, что вы написали не работает.


    Разобрался.
    индекс должен быть кратен 3 (состояние работы).
    error = Owen_io.WriteStoredDotS(16, ADRTYPE_8BIT, "SP.LU", (float)t, 3 * (channel - 1));
    Последний раз редактировалось ToniPizecato; 19.07.2010 в 20:20.

Страница 3 из 3 ПерваяПервая 123

Ваши права

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