|
|
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);
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 676
|
Re: E-24 и Программирование под платформу .Net
Возможно проще всего было бы обойтись без DLL, а взаимодействовать с E-24 напрямую. Модуль работает по COM порту, формат данных и формат команд у модуля очень простой. В принципе можно просто открыть COM порт и через WINAPI принимать данные и посылать команды согласно протоколу на E24.
|
|
|
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
}
Видимо, я не слишком внимательно рассматривал функцию, но просто с самого начала я почему-то решил смотреть в сторону, описанную в первом сообщении.
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 676
|
Re: E-24 и Программирование под платформу .Net
Алексей пишет:Потому что блока питания к АЦП у меня нет. И меня настораживает такой большой объем кода в библиотеке
Код на самом деле простой - по сути в этом коде делаются 4 действия: снимается питание с E24 (для сброса всех настроек в состояние по умолчанию) подается питание на всякий случай очищается буфер COM порта на модуль посылается команда STOP (по умолчанию, после подачи питания модуль сразу начнет передавать данные по всем каналам на частоте сбора 10 Гц)
Ваш код тоже правильный. Будут вопросы - пишите.
|
|
|
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" в байт?
|
|
|
Re: E-24 и Программирование под платформу .Net
И еще вопросик. При чтении используется указатель на массив данных data, объявленный как: Почему [7] ? Ведь в мануале написано, что формат вывода данных 4 или 5 байта, а не 7.
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 676
|
Re: E-24 и Программирование под платформу .Net
Алексей пишет:Или нужно конвертировать "0xFF" в байт?
Обязательно нужно конвертировать в байт. В Вашем варианте будет послана текстовая строка. Алексей пишет:Почему [7] ? Ведь в мануале написано, что формат вывода данных 4 или 5 байта, а не 7.
Массив сделан с запасом (исторически для отдельного заказчика выпускалась спец. версия E-24 с 7-ми байтным форматом).
|
|
|
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 Гц.
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 676
|
Re: E-24 и Программирование под платформу .Net
Я бы предложил сделать две вещи: 1. Переделать InitE24, скорее всего при вызове comport.DtrEnable = false; на линиях COM порта ничего не происходит, а происходит только при вызове comport.Open(); Поэтому лучше сделать две функции типа PowerOffE24() и PowerOnE24(). 2. Не перепрограммируя E24, просто считать массив данных за один раз байт 20-30 и посмотреть на него.
|
|
|
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
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 676
|
Re: E-24 и Программирование под платформу .Net
Почти все так, только надо еще: byte[] b = new byte[20];
while (true)
{
comport.Read(b, 0, 20);
....
|
|
|
Re: E-24 и Программирование под платформу .Net
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 676
|
Re: E-24 и Программирование под платформу .Net
Приведенный Вами dump означает, что пока что ничего не работает  Предлагаю следующее: 1. Возможно, модулю просто не хватает питания с линий ком порта, при этом он может запускаться, начинать работать и перезапускаться. Проверить просто - надо подать внешнее питание (12 В) к разъему внешнего питания. 2. Проверить E-24 с помощью готового ПО, например http://www.powergraph.ru/soft/demo.asp.
|
|
|
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
При этом при использовании программы Мультихром, которую когда-то давно покупали в комплекте с АЦП - все в порядке. Данные с ацп приходят.
 Правда в случае мультихрома задействуется всего один канал... возможно, это требует меньших затрат энергии и питания хватает. Сейчас попробую подвести 12 V. По результатам отпишусь ниже.
|
|
|
Re: E-24 и Программирование под платформу .Net
@Владислав, подвел 12 В на питание. Ничего не произошло. Меня тут терзают смутные сомнения. Само АЦП покупалось задолго до того как я стал работать на своем месте и покупалось оно вместе с Софтом Мультихром от Амперсанда. При этом на коробке значится не l-card, а Ampersand Ltd. Не могли бы Вы узнать не было ли серии e-24, которые поставлялись этому самому амперсанду и перепрошивались ? Или прошивались Л-Кард для использования только ПО типа Мультихром?
|
|
- Инженер-электронщик
- Откуда: "Л Кард"
- Здесь с 21.04.2014
- Сообщений: 4,597
|
Re: E-24 и Программирование под платформу .Net
Алексей, сообщите серийный номер изделия. Я проверю, наше ли оно, и в каком году выпущено.
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 676
|
Re: E-24 и Программирование под платформу .Net
Хорошо бы было с этого начинать, что у Вас не E-24, а Амперсенд. Аппаратно - это E-24, но прошивка контроллера и протокол у изделия совершенно другой - за протоколом Вам надо будет обратиться в Амперсенд.
|
|
|
Re: E-24 и Программирование под платформу .Net
Большое спасибо всем за тех. поддержку.
|
|
|
Re: E-24 и Программирование под платформу .Net
Я обратился в поддержку Амперсанда, там утверждают, что, судя по номеру, АЦП не их, а l-card. Я им что-то не верю, но все таки, Гарманов Александр, не могли бы Вы посмотреть у себя что за устройство я использую? Серийный номер 1C552108. Еще раз спасибо за уделенное время.
|
|
- Инженер-электронщик
- Откуда: "Л Кард"
- Здесь с 21.04.2014
- Сообщений: 4,597
|
Re: E-24 и Программирование под платформу .Net
Серийный номер наш. Выпущен в мае 2005 г. Но это, похоже, не решает Ваш вопрос, поскольку достаточно много сторонних фирм пишут своё ПО для изделий L-Card, интегрируя изделия в свои системы, продавая их как свой конечный продукт. Руководствуйтесь ответом Владислава.
|