private void btnStart_Click(object sender, EventArgs e) { /* настраиваем все параметры в соответствии с элементами управления */ lpcie.Errs err = setupParams(); /* разрешаем синхронный ввод АЦП */ if (err == lpcie.Errs.OK) { err = hnd.StreamsEnable(X502.Streams.ADC); } /* разрешаем синхронный ввод с цифровых линий в зависимости от переключателя */ if (err == lpcie.Errs.OK) { err = setSyncDinStream(); } if (err != lpcie.Errs.OK) { MessageBox.Show(X502.GetErrorString(err), "Ошибка настройки параметров модуля", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { /* создаем новый поток для сбора в нем данных */ thread = new Thread(this.threadFunc); threadRunning = true; thread.Start(); updateControls(); } }
private void button10_Click(object sender, EventArgs e) { if (hnd != null) { if (out16 == false) { state_outputs = state_outputs + 32768; lpcie.Errs err = hnd.AsyncOutDig(state_outputs, 0); if (err != lpcie.Errs.OK) { MessageBox.Show(X502.GetErrorString(err), "Ошибка асинхронного вывода на цифровой выход №16", MessageBoxButtons.OK, MessageBoxIcon.Error); } out16 = true; button10.BackColor = Color.Lime; } else { state_outputs = state_outputs - 32768; lpcie.Errs err = hnd.AsyncOutDig(state_outputs, 0); if (err != lpcie.Errs.OK) { MessageBox.Show(X502.GetErrorString(err), "Ошибка асинхронного вывода на цифровой выход №16", MessageBoxButtons.OK, MessageBoxIcon.Error); } out16 = false; button10.BackColor = Color.Silver; } } }
void LFATAL(string _msg, lpcie.Errs _err) { if (_err != 0) { throw (new Exception(_msg + " " + L502.GetErrorString(_err))); } }
/* установка частот сбора данных из элементов управления и обновление их реально * установленными значениями */ lpcie.Errs setAdcFreq() { lpcie.Errs err = lpcie.Errs.OK; double f_acq, f_lch, f_din; f_acq = Convert.ToDouble(edtAdcFreq.Text); f_lch = Convert.ToDouble(edtAdcFreqLch.Text); f_din = Convert.ToDouble(edtDinFreq.Text); // устанавливаем требуемую частоту сбора. err = hnd.SetAdcFreq(ref f_acq, ref f_lch); if (err == lpcie.Errs.OK) { // обновляем значение индикатора, для отображения // реально установившейся частоты edtAdcFreq.Text = f_acq.ToString(); edtAdcFreqLch.Text = f_lch.ToString(); // Устанавливаем частоту синхронного сбора err = hnd.SetDinFreq(ref f_din); if (err == lpcie.Errs.OK) { edtDinFreq.Text = f_din.ToString(); } } return(err); }
public LCard502(LCard502Pars _pars, DOnPr _OnPr = null) { if (_OnPr != null) { OnPr += _OnPr; } LastError = null; /* создаем описатель модуля */ hnd = new L502(); string serial = FindSerial(_pars.DevNum); if (serial == null) { throw (new Exception("LCard502.LCard502: Ошибка: Устройство не найдено: " + _pars.DevNum.ToString())); } pr("LCard502 create"); // lpcie.Errs res; /* устанавливаем связь по выбранному серийному номеру */ lpcie.Errs res = hnd.Open(serial); if (res != 0) { throw (new Exception(L502.GetErrorString(res) + " Ошибка открытия модуля")); } /* получаем информацию о модуле */ L502.Info devinfo = hnd.DevInfo; }
bool CheckError(lpcie.Errs _err) { if (_err == 0) { return(false); } LastError = L502.GetErrorString(_err); return(true); }
IPAddress FirstIp() { E502.EthSvcBrowser sb = new E502.EthSvcBrowser(); lpcie.Errs err = sb.Start(); if (err != lpcie.Errs.OK) { throw (new Exception(string.Format("Ошибка запуска поиска устройств в сети {0}: {1}", err, X502.GetErrorString(err)))); } IPAddress addr = null; for (int i = 0; i < 10; i++) { //while (err == lpcie.Errs.OK) //{ E502.EthSvcEvent svc_evt; /* Метод EthSvcRecord предоставляет доступ ко функциям для работы с описателем сервиса. * В отличие от С не нужно освобождать память вручную, т.к. освобождение выполняется * в деструкторе */ E502.EthSvcRecord svc_rec; err = sb.GetEvent(out svc_rec, out svc_evt, 300); if (err != lpcie.Errs.OK) { throw (new Exception(string.Format("Ошибка получения записи о найденном устройстве {0}: {1}", err, X502.GetErrorString(err)))); } if (svc_evt == E502.EthSvcEvent.NONE) { continue; } if (svc_evt == E502.EthSvcEvent.REMOVE) { pr(string.Format("Устройство отключено: {0}, S/N: {1}", svc_rec.InstanceName, svc_rec.DevSerial)); continue; } /* Адрес мы можем получить только для присутствующего устройства */ if ((svc_evt == E502.EthSvcEvent.ADD) || (svc_evt == E502.EthSvcEvent.CHANGED)) { lpcie.Errs cur_err = svc_rec.ResolveIPv4Addr(out addr, 2000); if (cur_err != lpcie.Errs.OK) { throw (new Exception(string.Format("Ошибка получения IP-адреса устройтсва {0}: {1}", err, X502.GetErrorString(err)))); } pr(string.Format("{0}: {1}, S/N: {2}, Адрес = {3}", svc_evt == E502.EthSvcEvent.ADD ? "Плата" : "Изм. параметров", svc_rec.InstanceName, svc_rec.DevSerial, addr.ToString())); break; } } lpcie.Errs stop_err = sb.Stop(); if (stop_err != lpcie.Errs.OK) { throw (new Exception(string.Format("Ошибка останова поиска сервисов {0}: {1}", stop_err, X502.GetErrorString(stop_err)))); } return(addr); }
/* Функция синхронного сбора данных. Выполняется в отдельном потоке */ private void threadFunc() { reqStop = false; /* запускаем синхронные потоки ввода-вывода*/ lpcie.Errs err = hnd.StreamsStart(); if (err == lpcie.Errs.OK) { /* выполняем прием пока не произойдет ошибка или * не будет запроса на останов от основного приложения */ while (!reqStop && (err == lpcie.Errs.OK)) { /* принимаем данные синхронного ввода */ Int32 rcv_size = hnd.Recv(rcv_buf, RECV_BUF_SIZE, RECV_TOUT); /* значение меньше нуля означает ошибку... */ if (rcv_size < 0) { err = (lpcie.Errs)rcv_size; } else if (rcv_size > 0) { /* если больше нуля - значит приняли новые данные */ dinSize = RECV_BUF_SIZE; adcSize = RECV_BUF_SIZE; /* получаем номер лог. какнала, соответствующий первому * отсчету АЦП, так как до этого могли обработать * некратное количество кадров */ firstLch = hnd.NextExpectedLchNum; /* разбираем данные на синхронный ввод и отсчеты АЦП и * переводим АЦП в Вольты */ err = hnd.ProcessData(rcv_buf, (uint)rcv_size, X502.ProcFlags.VOLT, adcData, ref adcSize, dinData, ref dinSize); if (err == lpcie.Errs.OK) { /* обновляем значения элементов управления */ UpdateData(); } } } /* по выходу из цикла отсанавливаем поток. * Чтобы не сбросить код ошибки (если вышли по ошибке) * результат останова сохраняем в отдельную переменную */ lpcie.Errs stop_err = hnd.StreamsStop(); if (err == lpcie.Errs.OK) { err = stop_err; } } /* завершаем поток */ finishThread(err); }
/* настройка параметров модуля значениями из элементов управления */ lpcie.Errs setupParams() { lpcie.Errs err = lpcie.Errs.OK; /* таблица соответствия индексов в ComboBox и кодов режима измерения */ X502.LchMode[] f_mode_tbl = { X502.LchMode.COMM, X502.LchMode.DIFF, X502.LchMode.ZERO }; /* таблица соответствия индексов в ComboBox и кодов диапазонов АЦП */ X502.AdcRange[] f_range_tbl = { X502.AdcRange.RANGE_10, X502.AdcRange.RANGE_5, X502.AdcRange.RANGE_2, X502.AdcRange.RANGE_1, X502.AdcRange.RANGE_05, X502.AdcRange.RANGE_02 }; /* таблица соответствия индексов в ComboBox и кодов источника синхронизации */ X502.Sync[] f_sync_tbl = { X502.Sync.INTERNAL, X502.Sync.EXTERNAL_MASTER, X502.Sync.DI_SYN1_RISE, X502.Sync.DI_SYN2_RISE, X502.Sync.DI_SYN1_FALL, X502.Sync.DI_SYN2_FALL }; UInt32 lch_cnt = Convert.ToUInt32(cbbLChCnt.Text); /* Устанавливаем кол-во логических каналов */ hnd.LChannelCount = lch_cnt; /* Настраниваем таблицу логических каналов */ err = hnd.SetLChannel(0, Convert.ToUInt32(cbbLCh1_Channel.Text) - 1, f_mode_tbl[cbbLCh1_Mode.SelectedIndex], f_range_tbl[cbbLCh1_Range.SelectedIndex], 0); if ((err == lpcie.Errs.OK) && (lch_cnt >= 2)) { err = hnd.SetLChannel(1, Convert.ToUInt32(cbbLCh2_Channel.Text) - 1, f_mode_tbl[cbbLCh2_Mode.SelectedIndex], f_range_tbl[cbbLCh2_Range.SelectedIndex], 0); } if ((err == lpcie.Errs.OK) && (lch_cnt >= 3)) { err = hnd.SetLChannel(2, Convert.ToUInt32(cbbLCh3_Channel.Text) - 1, f_mode_tbl[cbbLCh3_Mode.SelectedIndex], f_range_tbl[cbbLCh3_Range.SelectedIndex], 0); } /* Настраиваем источник частоты синхронизации и запуска сбора */ if (err == lpcie.Errs.OK) { hnd.SyncMode = f_sync_tbl[cbbSyncMode.SelectedIndex]; hnd.SyncStartMode = f_sync_tbl[cbbSyncStartMode.SelectedIndex]; } /* настраиваем частоту сбора с АЦП */ if (err == lpcie.Errs.OK) { err = setAdcFreq(); } /* Записываем настройки в модуль */ if (err == lpcie.Errs.OK) { err = hnd.Configure(0); } return(err); }
private void btnAsyncDigOut_Click(object sender, EventArgs e) { if (hnd != null) { UInt32 val = Convert.ToUInt32(edtAsyncDigOut.Text, 16); lpcie.Errs err = hnd.AsyncOutDig(val, 0); if (err != lpcie.Errs.OK) { MessageBox.Show(X502.GetErrorString(err), "Ошибка асинхронного вывода на цифровые линии", MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
private void btnAsyncAdcFrame_Click(object sender, EventArgs e) { if (hnd != null) { /* устанавливаем параметры модуля */ lpcie.Errs err = setupParams(); if (err != lpcie.Errs.OK) { MessageBox.Show(X502.GetErrorString(err), "Ошибка настройки параметров АЦП", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (err == lpcie.Errs.OK) { UInt32 lch_cnt = hnd.LChannelCount; /* Создаем массив для приема количества отсчетов, равному количеству * логических каналов */ double[] adc_data = new double[lch_cnt]; err = hnd.AsyncGetAdcFrame(X502.ProcFlags.VOLT, 1000, adc_data); if (err != lpcie.Errs.OK) { MessageBox.Show(X502.GetErrorString(err), "Ошибка приема кадра АЦП", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { /* выводим результат */ edtLCh1_Result.Text = adc_data[0].ToString("F7"); if (lch_cnt >= 2) { edtLCh2_Result.Text = adc_data[1].ToString("F7"); } else { edtLCh2_Result.Text = ""; } if (lch_cnt >= 3) { edtLCh3_Result.Text = adc_data[2].ToString("F7"); } else { edtLCh3_Result.Text = ""; } } } } }
private void btnAsyncDac2_Click(object sender, EventArgs e) { if (hnd != null) { double val = Convert.ToDouble(edtAsyncDac2.Text);; lpcie.Errs err = hnd.AsyncOutDac(X502.DacCh.CH2, val, X502.DacOutFlags.CALIBR | X502.DacOutFlags.VOLT); if (err != lpcie.Errs.OK) { MessageBox.Show(X502.GetErrorString(err), "Ошибка вывода на ЦАП", MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
private void btnSetAdcFreq_Click(object sender, EventArgs e) { if (hnd != null) { hnd.LChannelCount = Convert.ToUInt32(cbbLChCnt.Text); lpcie.Errs err = setAdcFreq(); if (err != lpcie.Errs.OK) { MessageBox.Show(X502.GetErrorString(err), "Ошибка установки частоты сбора", MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
/* Функция, вызываемая по завершению потока сбора данных. * Так как она работает с интерфейсом, то при вызове из другого потока, * она планируется на выполнения в основном потоке, как и UpdateData */ private void finishThread(lpcie.Errs err) { if (this.InvokeRequired) { this.Invoke(new finishThreadDelegate(this.finishThread), err); } else { if (err != lpcie.Errs.OK) { MessageBox.Show(X502.GetErrorString(err), "Сбор данных завершен с ошибкой", MessageBoxButtons.OK, MessageBoxIcon.Error); } threadRunning = false; updateControls(); } }
private void btnAsyncDigIn_Click(object sender, EventArgs e) { if (hnd != null) { UInt32 din; lpcie.Errs err = hnd.AsyncInDig(out din); if (err != lpcie.Errs.OK) { MessageBox.Show(X502.GetErrorString(err), "Ошибка асинхронного ввода с цифровых линий", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { edtAsyncDigIn.Text = din.ToString("X5"); } } }
public LCard502E(LCard502Pars _pars, DOnPr _OnPr = null) { if (_OnPr != null) { OnPr += _OnPr; } LastError = null; IPAddress addr = FirstIp(); if (addr == null) { throw (new Exception("LCard502E.LCard502E: Ошибка: Устройство не найдено")); } /* создаем запись, соответствующую заданному адресу */ X502.DevRec rec = E502.MakeDevRecordByIpAddr(addr, 0, 5000); /* создание объекта */ hnd = X502.Create(rec.DevName); /* станавливаем связь устанавливаем связь по созданной записи */ lpcie.Errs res = hnd.Open(rec); if (res != lpcie.Errs.OK) { throw (new Exception(string.Format("Ошибка открытия модуля: {0}", X502.GetErrorString(res)))); } //return; ///* создаем описатель модуля */ //hnd = new L502(); //string serial = FindSerial(_pars.DevNum); //if (serial == null) // throw (new Exception("LCard502.LCard502: Ошибка: Устройство не найдено: " + _pars.DevNum.ToString())); //pr("LCard502 create"); //// lpcie.Errs res; ///* устанавливаем связь по выбранному серийному номеру */ //lpcie.Errs res = hnd.Open(serial); //if (res != 0) // throw (new Exception(L502.GetErrorString(res) + " Ошибка открытия модуля")); ///* получаем информацию о модуле */ //L502.Info devinfo = hnd.DevInfo; }
private void btnOpenByIP_Click(object sender, EventArgs e) { /* создаем запись, соответствующую заданному адресу */ X502.DevRec rec = E502.MakeDevRecordByIpAddr(IPAddress.Parse(edtIpAddr.Text), 0, 5000); if (rec != null) { /* создание объекта */ hnd = X502.Create(rec.DevName); /* станавливаем связь устанавливаем связь по созданной записи */ lpcie.Errs res = hnd.Open(rec); if (res == lpcie.Errs.OK) { showDevInfo(); } else { MessageBox.Show(X502.GetErrorString(res), "Ошибка открытия модуля", MessageBoxButtons.OK, MessageBoxIcon.Error); hnd = null; } } updateControls(); }
static void Main(string[] args) { /* функции для поиска представлены в виде методов отдельного класса EthSvcBrowser */ E502.EthSvcBrowser sb = new E502.EthSvcBrowser(); /* запуск поиска сервисов */ lpcie.Errs err = sb.Start(); if (err != lpcie.Errs.OK) { Console.WriteLine("Ошибка запуска поиска устройств в сети {0}: {1}", err, X502.GetErrorString(err)); } else { bool end = false; Console.WriteLine("Запущен поиск устройств в локальной сети. Для останова нажмите любую клавишу"); while (!end && (err == lpcie.Errs.OK)) { E502.EthSvcEvent svc_evt; /* Метод EthSvcRecord предоставляет доступ ко функциям для работы с описателем сервиса. * В отличие от С не нужно освобождать память вручную, т.к. освобождение выполняется * в деструкторе */ E502.EthSvcRecord svc_rec; err = sb.GetEvent(out svc_rec, out svc_evt, 300); if (err != lpcie.Errs.OK) { Console.WriteLine("Ошибка получения записи о найденном устройстве {0}: {1}", err, X502.GetErrorString(err)); } else if (svc_evt != E502.EthSvcEvent.NONE) { /* Адрес мы можем получить только для присутствующего устройства */ if ((svc_evt == E502.EthSvcEvent.ADD) || (svc_evt == E502.EthSvcEvent.CHANGED)) { IPAddress addr; lpcie.Errs cur_err = svc_rec.ResolveIPv4Addr(out addr, 2000); if (cur_err != lpcie.Errs.OK) { Console.WriteLine("Ошибка получения IP-адреса устройтсва {0}: {1}", cur_err, X502.GetErrorString(cur_err)); } else { Console.WriteLine("{0}: {1}, S/N: {2}, Адрес = {3}", svc_evt == E502.EthSvcEvent.ADD ? "Новое устройтсво" : "Изм. параметров", svc_rec.InstanceName, svc_rec.DevSerial, addr.ToString()); } } else if (svc_evt == E502.EthSvcEvent.REMOVE) { Console.WriteLine("Устройство отключено: {0}, S/N: {1}", svc_rec.InstanceName, svc_rec.DevSerial); } } /* вход по нажатию клавиши */ if (Console.KeyAvailable) { end = true; } } lpcie.Errs stop_err = sb.Stop(); if (stop_err != lpcie.Errs.OK) { Console.WriteLine("Ошибка останова поиска сервисов {0}: {1}", stop_err, X502.GetErrorString(stop_err)); } else { Console.WriteLine("Останов поиска сервисов выполнен успешно!\n"); } } }