Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


E-24 и Программирование под платформу .Net

Вы не вошли.

 Поиск | Регистрация | Вход 

Алексей
13.05.2014 14:45:13
#1

Гость

E-24 и Программирование под платформу .Net

Здравствуйте! Интересует можно ли сравнительно без усилий использовать старый ацп e-24 и писать программу получения данных на языке C#? Насколько я понимаю, смотреть необходимо в сторону взаимодействия с неуправлемым кодом.
У меня совсем мало опыта в этом, подскажите достаточно ли будет сделать так (хотелось бы хотя бы запусть экзампл из мануалов) :
...

using System.Runtime.InteropServices;   

using DWORD = System.UInt32;
using WORD = System.UInt16;
using BYTE = System.String;

...

[DllImport ("E24API.DLL")]
        public static extern DWORD SendCommand(DWORD hCom, BYTE cmd, WORD par, DWORD length);

        [DllImport("E24API.DLL")]
        public static extern DWORD ConfigE24Chan(DWORD hCom, WORD mode, BYTE chan);

        [DllImport("E24API.DLL")]
        public static extern DWORD SetGain(DWORD hCom, WORD gain, WORD mode, BYTE chan);

        [DllImport ("E24API.DLL")]
        public static extern DWORD RefreshParam(DWORD hCom, BYTE chan);

        [DllImport ("E24API.DLL")]
        public static extern DWORD SetActiveChan(DWORD hCom, BYTE chan);

        [DllImport ("E24API.DLL")]
        public static extern DWORD ResetCounter(DWORD hCom);

        [DllImport ("E24API.DLL")]
        public static extern DWORD ConfigE24COM(DWORD hCom, BYTE baud);

        [DllImport ("E24API.DLL")]
        public static extern DWORD SetE24Rate(DWORD hCom, WORD code, BYTE chan, ref double Freq);

        [DllImport("E24API.DLL")]
        public static extern DWORD SetEEPROMAddress(DWORD hCom, WORD Addr);

        [DllImport("E24API.DLL")]
        public static extern DWORD GetEEPROMByte(DWORD hCom, ref BYTE btret);

        [DllImport("E24API.DLL")]
        public static extern DWORD SetEEPROMByte(DWORD hCom, BYTE bt);

        [DllImport("E24API.DLL")]
        public static extern DWORD ConvertE24Block(DWORD hCom,  BYTE Buf, BYTE length, ref long ad_data,  ref BYTE p,  ref BYTE chan,  ref BYTE counter, ref BYTE err);

        [DllImport("E24API.DLL")]
        public static extern DWORD InitE24( string Com, BYTE Baud);

        [DllImport("E24API.DLL")]
        public static extern DWORD StopE24(DWORD hCom);

        [DllImport("E24API.DLL")]
        public static extern DWORD ReadComData(DWORD hCom,  BYTE data, DWORD count);
       
        [DllImport("E24API.DLL")]
        public static extern void FreeComPort(DWORD hCom);

        [DllImport("E24API.DLL")]
        public static extern DWORD Set5byteMode(DWORD hCom);

        [DllImport("E24API.DLL")]
        public static extern DWORD Set4byteMode(DWORD hCom);

        [DllImport("E24API.DLL")]
        public static extern DWORD GetParameters(DWORD hCom, ref BYTE param);

13.05.2014 15:26:42
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 676

Re: E-24 и Программирование под платформу .Net

Возможно проще всего было бы обойтись без DLL, а взаимодействовать с E-24 напрямую. Модуль работает по COM порту, формат данных и формат команд у модуля очень простой. В принципе можно просто открыть COM порт и через WINAPI принимать данные и посылать команды согласно протоколу на E24.

Алексей
13.05.2014 15:43:31
#3

Гость

Re: E-24 и Программирование под платформу .Net

Владислав, спасибо за совет, наверное Вы правы, я тоже думал уже в этом направлении. Подскажите тогда по winapi в мане есть строка:

Для успешной связи модуля E-24 с COM портом компьютера необходимо провести следующие настройки:
I.    Сконфигурировать COM порт: скорость 19200, число бит данных 8, число стоповых бит 1,контроль на чет-ность не выполняется.
II.    Установить линии DTR=0 и RTS=1 в управляющем регистре COM порта (записать число 2 по адресу BASE+4). Без этого на модуль не будет подано питание и он не будет работать.

Эквиваленто ли это вот такому решению:

System.IO.Ports.SerialPort comport = new SerialPort("COM1");
            
            comport.BaudRate = 19200;
            comport.StopBits = StopBits.One;
            comport.DataBits = 8;
            comport.Parity = Parity.None;
            comport.DtrEnable = false;
            comport.RtsEnable = true;

            comport.Open();

Потому что блока питания к АЦП у меня нет.

И меня настораживает такой большой объем кода в библиотеке:

DWORD WINAPI _export InitE24( char *Com, BYTE Baud )
{
   DCB dcb;
   BOOL fSuccess;
   DWORD ComBaud;
   HANDLE hCom;
   hCom = CreateFile( Com, GENERIC_READ | GENERIC_WRITE,
                      0,               // comm devices must be opened w/exclusive-access
                      NULL,            // no security attrs
                      OPEN_EXISTING,   // comm devices must use OPEN_EXISTING
                      0,               // not overlapped I/O
                      NULL             // hTemplate must be NULL for comm devices
                    );
   if (hCom == INVALID_HANDLE_VALUE) return 0xFFFFFFFF;

   GetCommState(hCom,&dcb);

   dcb.BaudRate =19200;
   dcb.ByteSize = 8;
   dcb.Parity = NOPARITY;
   dcb.StopBits = ONESTOPBIT;
   dcb.fDtrControl = DTR_CONTROL_DISABLE;
   dcb.fRtsControl = RTS_CONTROL_DISABLE;
   fSuccess = SetCommState( hCom, &dcb);
   if(!fSuccess) return 1;     // fail

   PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

   dcb.BaudRate = 19200;
   dcb.ByteSize = 8;
   dcb.Parity = NOPARITY;
   dcb.StopBits = ONESTOPBIT;
   dcb.fDtrControl = DTR_CONTROL_DISABLE;
   dcb.fRtsControl = RTS_CONTROL_ENABLE;
   fSuccess = SetCommState( hCom, &dcb);
   if(!fSuccess) return 1;   // fail

   unsigned char data[4]; DWORD ret=0;

   COMMTIMEOUTS TO,TOPREV;
   TO.ReadIntervalTimeout=0;
   TO.ReadTotalTimeoutMultiplier=2000;
   TO.ReadTotalTimeoutConstant=1000;
   TO.WriteTotalTimeoutMultiplier=0;
   TO.WriteTotalTimeoutConstant=0;

   GetCommTimeouts( hCom,&TOPREV);
   SetCommTimeouts( hCom,&TO);

   ReadFile( hCom,&data,4,&ret,NULL); // we wait while E24 loaded from EEPROM and start work

   SetCommTimeouts( hCom,&TOPREV);

   switch(Baud)
   {
   case 0: ComBaud=2400;break;
   case 1: ComBaud=4800;break;
   case 2: ComBaud=9600;break;
   case 3: ComBaud=19200;break;
   case 4: ComBaud=38400;break;
   case 5: ComBaud=57600;break;
   default: ComBaud=19200;
   }

   ConfigE24COM((DWORD)hCom, Baud);

   sleep(1);

   dcb.BaudRate = ComBaud;
   dcb.ByteSize = 8;
   dcb.Parity = NOPARITY;
   dcb.StopBits = ONESTOPBIT;
   dcb.fDtrControl = DTR_CONTROL_DISABLE;
   dcb.fRtsControl = RTS_CONTROL_ENABLE;
   fSuccess = SetCommState( hCom, &dcb);
   if(!fSuccess) return 1;   // fail

   StopE24((DWORD)hCom);
   PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
   SetActiveChan((DWORD)hCom,CODECALL);

   return ((ret==4) ? (DWORD)hCom:0xFFFFFFFF);  // return hCom if ok
}

Видимо, я не слишком внимательно рассматривал функцию, но просто с самого начала я почему-то решил смотреть в сторону, описанную в первом сообщении.

14.05.2014 08:04:07
#4

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 676

Re: E-24 и Программирование под платформу .Net

Алексей пишет:

Потому что блока питания к АЦП у меня нет.
И меня настораживает такой большой объем кода в библиотеке

Код на самом деле простой - по сути в этом коде делаются 4 действия:

  • снимается питание с E24 (для сброса всех настроек в состояние по умолчанию)

  • подается питание

  • на всякий случай очищается буфер COM порта

  • на модуль посылается команда STOP (по умолчанию, после подачи питания модуль сразу начнет передавать данные по всем каналам на частоте сбора 10 Гц)

Ваш код тоже правильный. Будут вопросы - пишите.

Алексей
19.05.2014 12:37:49
#5

Гость

Re: E-24 и Программирование под платформу .Net

Владислав, скажите пожалуйста, правильно ли я понимаю, что команду АЦП можно отослать в таком виде:

System.IO.Ports.SerialPort comport = new SerialPort("COM1");
            comport.BaudRate = 19200;
            comport.StopBits = StopBits.One;
            comport.DataBits = 8;
            comport.Parity = Parity.None;
            comport.DtrEnable = false;
            comport.RtsEnable = false;


            comport.BaudRate = 19200;
            comport.StopBits = StopBits.One;
            comport.DataBits = 8;
            comport.Parity = Parity.None;
            comport.DtrEnable = false;
            comport.RtsEnable = true;
           
            comport.Open();

            comport.Write("0xFF"); // ADC Halt

Или нужно конвертировать "0xFF" в байт?

Алексей
19.05.2014 12:50:25
#6

Гость

Re: E-24 и Программирование под платформу .Net

И еще вопросик. При чтении используется указатель на массив данных data, объявленный как:

unsigned char data[7];

Почему [7] ? Ведь в мануале написано, что формат вывода данных 4 или 5 байта, а не 7.

20.05.2014 08:22:35
#7

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 676

Re: E-24 и Программирование под платформу .Net

Алексей пишет:

Или нужно конвертировать "0xFF" в байт?

Обязательно нужно конвертировать в байт. В Вашем варианте будет послана текстовая строка.

Алексей пишет:

Почему [7] ? Ведь в мануале написано, что формат вывода данных 4 или 5 байта, а не 7.

Массив сделан с запасом (исторически для отдельного заказчика  выпускалась спец. версия E-24 с 7-ми байтным форматом).

Алексей
20.05.2014 16:05:04
#8

Гость

Re: E-24 и Программирование под платформу .Net

Владислав, снова прошу Вашей помощи. Просмотрев экзампл и библиотеки, прочитав мануал ,а так же проанализировав Ваши ответы на мои вопросы  я написал прораммку:

namespace ConsoleApplication4
{
    class Program
    {

        private static byte[] GetSending(string message)
        {
            byte[] mes = new byte[1];
            mes[0] = System.Convert.ToByte(message, 16);
            return mes;
        }

        static void Convert(byte[] bbb)
        {
            var bits = new System.Collections.BitArray(bbb);
           
            foreach (var b in bits)
            {

                Console.Write(System.Convert.ToInt32(b).ToString());
               
            }

            Console.WriteLine();
        }


        static void initE24(SerialPort comport)
        {
            comport.BaudRate = 19200;
            comport.StopBits = StopBits.One;
            comport.DataBits = 8;
            comport.Parity = Parity.None;
            comport.DtrEnable = false;
            comport.RtsEnable = false;


            comport.BaudRate = 19200;
            comport.StopBits = StopBits.One;
            comport.DataBits = 8;
            comport.Parity = Parity.None;
            comport.DtrEnable = false;
            comport.RtsEnable = true;
        }

        static void Main(string[] args)
        {
            System.IO.Ports.SerialPort comport = new SerialPort("COM1");
            initE24(comport);
            comport.Open();

            comport.Write(GetSending("0xFF"),0,1); // ADC Halt

            comport.Write(GetSending("0x0"),0,1);
            comport.Write(GetSending("0x0"),0,1);
            comport.Write(GetSending("0x91"),0,1); // connect ch 1 to line A


            comport.Write(GetSending("0x0"), 0,1);
            comport.Write(GetSending("0x0"),0,1);
            comport.Write(GetSending("0xA0"),0,1); // disconnect ch 2

            comport.Write(GetSending("0x0"),0,1);
            comport.Write(GetSending("0x0"),0,1);
            comport.Write(GetSending("0xB0"),0,1); // disconnect ch 3

            comport.Write(GetSending("0x0"),0,1);
            comport.Write(GetSending("0x0"),0,1);
            comport.Write(GetSending("0xC0"),0,1); // disconnect ch 4

            comport.Write(GetSending("0x00"),0,1);
            comport.Write(GetSending("0x00"),0,1);
            comport.Write(GetSending("0xB1"),0,1);
            comport.Write(GetSending("0x00"),0,1);
            comport.Write(GetSending("0x0F"),0,1);
            comport.Write(GetSending("0xA1"),0,1); // set freq 5 Hz on first ch

            comport.Write(GetSending("0x1"),0,1);
            comport.Write(GetSending("0x0"),0,1);
            comport.Write(GetSending("0xC1"),0,1); // set autocalibration on first ch

            comport.Write(GetSending("0x1D"),0,1); //reinit first ch

            comport.Write(GetSending("0xF0"),0,1); //break timer

            comport.Write(GetSending("0x81"),0,1); // swtch on 1-st ch




            byte[] b = new byte[4];

           

            while (true)
            {
                comport.Read(b, 0, 4);
                Convert(b);
           
           
            }

             
        }

       
    }
}

В результате я получаю такую картину:

01100011
00000000
00000000
00000000

11101100
00000000
00000010
11110010

10000000
00000000
00000010
11110010

00100011
00000000
00000010
11110010

00011100
00000000
00000010
11110010

00000000
00000000
00000010
11110010

00000010
00001110
00000010
11110010

10000000
00001110
00000010
11110010

Насколько я могу судить по юзергайду, я что-то делаю не так, потому что в получаемых пакетах первый бит первого из четверки байтов не всегда равен единице. К тому же единица встречается и в младших байтах посылки.
Помогите пожалуйста поправить код. Необходим простейший пример получения данных с АЦП в первого канала без усиления с частотой 5 Гц.

21.05.2014 08:24:40
#9

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 676

Re: E-24 и Программирование под платформу .Net

Я бы предложил сделать две вещи:

1. Переделать InitE24, скорее всего при вызове comport.DtrEnable = false; на линиях COM порта ничего не происходит, а происходит только при вызове comport.Open(); Поэтому лучше сделать две функции типа PowerOffE24() и PowerOnE24().

2. Не перепрограммируя E24, просто считать массив данных за один раз байт 20-30 и посмотреть на него.

Алексей
21.05.2014 11:06:23
#10

Гость

Re: E-24 и Программирование под платформу .Net

Правильно ли я понял, что нужно посмотреть поведение АЦП при вот таком коде:

 static void Convert(byte[] bbb)
        {
            var bits = new System.Collections.BitArray(bbb);
            int i = 0;
            foreach (var b in bits)
            {

                Console.Write(System.Convert.ToInt32(b).ToString());
                
            }

            Console.WriteLine();
        }


        static void StartPort(SerialPort port)
        {
            port.BaudRate = 19200;
            port.StopBits = StopBits.One;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.DtrEnable = false;
            port.RtsEnable = true;
        }

        static void StopPort(SerialPort port)
        {
            port.BaudRate = 19200;
            port.StopBits = StopBits.One;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.DtrEnable = false;
            port.RtsEnable = false;
        }

        static void Main(string[] args)
        {
            System.IO.Ports.SerialPort comport = new SerialPort("COM1");
      

            StopPort(comport);
            comport.Open();
            comport.Close();

            StartPort(comport);
            comport.Open();

            byte[] b = new byte[4];

            

            while (true)
            {
                comport.Read(b, 0, 4);
                Convert(b);
           
            
            }

             
        }

        
    }

Дамп можно скачать и посмотреть здесь: http://yadi.sk/d/Ki8H2JN_QsZjX

21.05.2014 15:50:13
#11

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 676

Re: E-24 и Программирование под платформу .Net

Почти все так, только надо еще:

            byte[] b = new byte[20];
            while (true)
            {
                comport.Read(b, 0, 20);
....
Алексей
21.05.2014 16:31:21
#12

Гость

Re: E-24 и Программирование под платформу .Net

http://yadi.sk/d/d7Q7aefyQu6rT - дамп снятый с кода выше.

22.05.2014 08:44:23
#13

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 676

Re: E-24 и Программирование под платформу .Net

Приведенный Вами dump означает, что пока что ничего не работает sad
Предлагаю следующее:

1. Возможно, модулю просто не хватает питания с линий ком порта, при этом он может запускаться, начинать работать и перезапускаться. Проверить просто - надо подать внешнее питание (12 В) к разъему внешнего питания.

2. Проверить E-24 с помощью готового ПО, например http://www.powergraph.ru/soft/demo.asp.

Алексей
22.05.2014 11:04:53
#14

Гость

Re: E-24 и Программирование под платформу .Net

Владислав, тут вот какое дело, я скачал демо поверграф, но при выборе АЦП е-24 софтина падает, оставляя вот такое сообщение:

Сигнатура проблемы:
  Имя события проблемы:    APPCRASH
  Имя приложения:    PGraphDE.exe
  Версия приложения:    3.3.0.8
  Отметка времени приложения:    533c5fd5
  Имя модуля с ошибкой:    Mscomm32.ocx
  Версия модуля с ошибкой:    6.1.98.16
  Отметка времени модуля с ошибкой:    49c91ca1
  Код исключения:    c0000005
  Смещение исключения:    0000e039
  Версия ОС:    6.1.7601.2.1.0.256.1
  Код языка:    1049
  Дополнительные сведения 1:    6327
  Дополнительные сведения 2:    632713f73bcf086b51533f7c005240a6
  Дополнительные сведения 3:    ffa4
  Дополнительные сведения 4:    ffa4345de2aa2414531ebeb44e6f0c17

При этом при использовании программы Мультихром, которую когда-то давно покупали в комплекте с АЦП - все в порядке. Данные с ацп приходят.
006d4b80648d9f7815f242a196e839fa-full.png

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

Сейчас попробую подвести 12 V. По результатам отпишусь ниже.

Алексей
22.05.2014 14:08:53
#15

Гость

Re: E-24 и Программирование под платформу .Net

@Владислав, подвел 12 В на питание. Ничего не произошло.
Меня тут терзают смутные сомнения. Само АЦП покупалось задолго до того как я стал работать на своем месте и покупалось оно вместе с Софтом Мультихром от Амперсанда. При этом на коробке значится не l-card, а Ampersand Ltd.
Не могли бы Вы узнать не было ли серии e-24, которые поставлялись этому самому амперсанду и перепрошивались ? Или прошивались Л-Кард для использования только ПО типа Мультихром?

22.05.2014 14:30:14
#16

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: E-24 и Программирование под платформу .Net

Алексей, сообщите серийный номер изделия. Я проверю, наше ли оно, и в каком году выпущено.

23.05.2014 08:33:36
#17

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 676

Re: E-24 и Программирование под платформу .Net

Хорошо бы было с этого начинать, что у Вас не E-24, а Амперсенд. Аппаратно - это E-24,  но прошивка контроллера и протокол у изделия совершенно другой - за протоколом Вам надо будет обратиться в Амперсенд.

Алексей
23.05.2014 11:32:43
#18

Гость

Re: E-24 и Программирование под платформу .Net

Большое спасибо всем за тех. поддержку.

Алексей
23.05.2014 15:54:00
#19

Гость

Re: E-24 и Программирование под платформу .Net

Я обратился в поддержку Амперсанда, там утверждают, что, судя по номеру, АЦП не их, а l-card. Я им что-то не верю, но все таки, Гарманов Александр, не могли бы Вы посмотреть у себя что за устройство я использую? Серийный номер 1C552108.

Еще раз спасибо за уделенное время.

23.05.2014 16:19:57
#20

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: E-24 и Программирование под платформу .Net

Серийный номер наш. Выпущен в мае 2005 г.
Но это, похоже, не решает Ваш вопрос, поскольку достаточно много сторонних фирм пишут своё ПО для изделий L-Card, интегрируя изделия в свои системы, продавая их как свой конечный продукт. Руководствуйтесь ответом Владислава.