Пример #1
0
        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();
            }
        }
Пример #2
0
 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;
         }
     }
 }
Пример #3
0
 void LFATAL(string _msg, lpcie.Errs _err)
 {
     if (_err != 0)
     {
         throw (new Exception(_msg + " " + L502.GetErrorString(_err)));
     }
 }
Пример #4
0
        /* установка частот сбора данных из элементов управления и обновление их реально
         * установленными значениями */
        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);
        }
Пример #5
0
        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;
        }
Пример #6
0
 bool CheckError(lpcie.Errs _err)
 {
     if (_err == 0)
     {
         return(false);
     }
     LastError = L502.GetErrorString(_err);
     return(true);
 }
Пример #7
0
        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);
        }
Пример #8
0
        /* Функция синхронного сбора данных. Выполняется в отдельном потоке */
        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);
        }
Пример #9
0
        /* настройка параметров модуля значениями из элементов управления */
        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);
        }
Пример #10
0
 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);
         }
     }
 }
Пример #11
0
        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 = "";
                        }
                    }
                }
            }
        }
Пример #12
0
 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);
         }
     }
 }
Пример #13
0
        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);
                }
            }
        }
Пример #14
0
 /* Функция, вызываемая по завершению потока сбора данных.
  * Так как она работает с интерфейсом, то при вызове из другого потока,
  * она планируется на выполнения в основном потоке, как и 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();
     }
 }
Пример #15
0
 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");
         }
     }
 }
Пример #16
0
        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;
        }
Пример #17
0
 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();
 }
Пример #18
0
        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");
                }
            }
        }