예제 #1
0
파일: SGWork.cs 프로젝트: andreyV512/rag
 public void Init(SignalListDef _SL, DOnInsert _OnInsert)
 {
     SL         = _SL;
     OnInsert   = _OnInsert;
     sgWorkPars = new SGWorkPars();
     propertyGrid1.SelectedObject = sgWorkPars;
     timer1.Interval = Convert.ToInt32(ParAll.ST.Defect.Some.Period);
     SGSet.SaveParsToDB();
 }
예제 #2
0
 public JWorkSGSOP(SGWorkPars _tsDefSG, Bank _bank, SignalListDef _SL, DOnStatus _OnStatus = null)
 {
     tsDefSG             = _tsDefSG;
     bank                = _bank;
     SL                  = _SL;
     OnStatus            = _OnStatus;
     IsComplete          = false;
     J.Add(jAlarm        = new JAlarmList());
     sgSet               = new SGSet(_SL, pr);
     J.Add(jDemagnetizer = new JDemagnetizer(ParAll.ST.Defect.Demagnetizer, ParAll.CTS.DemagnetizerTS, false));
 }
예제 #3
0
 public string StartGSPF(SGWorkPars _tsDefSG = null)
 {
     if (gspf == null)
     {
         return(null);
     }
     if (_tsDefSG == null)
     {
         _tsDefSG = new SGWorkPars();
     }
     return(gspf.Start(_tsDefSG));
 }
예제 #4
0
파일: GSPF.cs 프로젝트: andreyV512/rag
        public string Start(SGWorkPars _tsDefSG)
        {
            if (device != null)
            {
                return("Устройство уже запущено");
            }
            // Служебное имя устройства, с которым будет работать программа.
            const string BOARD_NAME = "GSPF052PCI";

            //частота генерируемого синуса в Герцах
            double signalFrequency = _tsDefSG.Frequency * 1000;

            if (signalFrequency <= 0)
            {
                return("signalFrequency <=0");
            }
            //амплитуда генерируемого синуса в вольтах
            double signalVoltage = _tsDefSG.Voltage;

            if (signalVoltage <= 0)
            {
                return("signalVoltage <=0");
            }
            // Код выполнения операции.
            RSH_API st;

            //Создание экземпляра класса и подключение к библиотеке абстракции устройства
            device = new Device(BOARD_NAME);

            pr("--> Sinus Generator <--");

            //=================== ИНФОРМАЦИЯ О ЗАГРУЖЕННОЙ БИБЛИОТЕКЕ ======================
            string libVersion, libname, libCoreVersion, libCoreName;

            st = device.Get(RSH_GET.LIBRARY_VERSION_STR, out libVersion);
            if (st != RSH_API.SUCCESS)
            {
                return(SayGoodBye(st));
            }

            st = device.Get(RSH_GET.CORELIB_VERSION_STR, out libCoreVersion);
            st = device.Get(RSH_GET.CORELIB_FILENAME, out libCoreName);
            st = device.Get(RSH_GET.LIBRARY_FILENAME, out libname);

            pr("Library Name: " + libname);
            pr("Library Version: " + libVersion);
            pr("Core Library Name: " + libCoreName);
            pr("Core Library Version: " + libCoreVersion);

            //===================== ПРОВЕРКА СОВМЕСТИМОСТИ =================================

            uint caps = (uint)RSH_CAPS.SOFT_GENERATION_IS_AVAILABLE;

            //Проверим, поддерживает ли устройство функцию генерации сигнала.
            st = device.Get(RSH_GET.DEVICE_IS_CAPABLE, ref caps);
            if (st != RSH_API.SUCCESS)
            {
                return(SayGoodBye(st));
            }

            //========================== ИНИЦИАЛИЗАЦИЯ =====================================

            // Подключаемся к устройству. Нумерация устройств начинается с 1.
            st = device.Connect(Convert.ToUInt32(ParAll.SG.GSPF.DevNum));
            if (st != RSH_API.SUCCESS)
            {
                return(SayGoodBye(st));
            }

            /*
             *      Для подключения к устройству по заводскому номеру.
             *      uint serialNumber = 11111;
             *      st = device.Connect(serialNumber, RSH_CONNECT_MODE.SERIAL_NUMBER);
             *      if (st != RSH_API.SUCCESS)
             *                  return SayGoodBye(st);
             */

            //структура инициализации
            RshInitGSPF initStr = new RshInitGSPF();

            //запуск генерации - программный
            initStr.startType = ParAll.SG.GSPF.GetEGSPFStart();
            //циклическое проигрывание сигнала
            initStr.control = ParAll.SG.GSPF.GetEGSPFSPlay();

            //Определим частоту ЦАП, которую будем использовать для генерации
            initStr.frequency = signalFrequency < 1000 ? 12500000 : 100000000;

            //определим максимальный размер буфера
            uint bufferSize = 0;

            device.Get(RSH_GET.DEVICE_MEMORY_SIZE, ref bufferSize);

            //Подгоняем частоту дискретизации устройства, чтобы буфер поместился в память устройства
            while (initStr.frequency / signalFrequency > bufferSize)
            {
                initStr.frequency /= 2;
            }

            //вычисляем размер  буфера (сколько отсчетов займет один период синуса)
            int bufSize = Convert.ToInt32(initStr.frequency / signalFrequency);

            //Число слов в буфере должно быть чётным (аппаратные особенности устройств серии ГСПФ)
            if (bufSize % 2 != 0)
            {
                bufSize++;
            }

            //Определяем подходящий коэффициент ослабления
            if (signalVoltage > 5.1)
            {
                initStr.attenuator = RshInitGSPF.AttenuatorBit.AttenuationOff;
            }
            else if (signalVoltage > 2.6)
            {
                initStr.attenuator = RshInitGSPF.AttenuatorBit.Attenuation6dB;
            }
            else if (signalVoltage > 1.26)
            {
                initStr.attenuator = RshInitGSPF.AttenuatorBit.Attenuation12db;
            }
            else if (signalVoltage > 0.626)
            {
                initStr.attenuator = RshInitGSPF.AttenuatorBit.Attenuation18dB;
            }
            else if (signalVoltage > 0.313)
            {
                initStr.attenuator = RshInitGSPF.AttenuatorBit.Attenuation24dB;
            }
            else if (signalVoltage > 0.157)
            {
                initStr.attenuator = RshInitGSPF.AttenuatorBit.Attenuation30dB;
            }
            else if (signalVoltage > 0.078)
            {
                initStr.attenuator = RshInitGSPF.AttenuatorBit.Attenuation36dB;
            }
            else
            {
                initStr.attenuator = RshInitGSPF.AttenuatorBit.Attenuation42dB;
            }

            //Вычисляем амплитуду
            double range = 0;

            //Максимальная амплитуда в вольтах
            device.Get(RSH_GET.DEVICE_OUTPUT_RANGE_VOLTS, ref range);

            //Можно пересчитать на установленную нагрузку
            double OutR = 1000000.0f;

            range = OutR * (range / (OutR + 50.0));
            double amplitude = (signalVoltage / range) * (double)Math.Pow(2, (double)initStr.attenuator);;

            short[] dataBuffer = new short[bufSize];
            // формируем синус
            for (int i = 0; i < bufSize; i++)
            {
                dataBuffer[i] = (short)(Convert.ToInt16(amplitude * 8190 * Math.Sin(i * (2 * Math.PI * signalFrequency) / initStr.frequency)) << 2);
            }

            st = device.Init(initStr);
            if (st != RSH_API.SUCCESS)
            {
                return(SayGoodBye(st));
            }

            pr("=============================================================");
            pr(string.Format("Signal Frequency: {0} Hz Signal Range: {1} V",
                             signalFrequency.ToString(), signalVoltage.ToString()));
            pr("=============================================================");
            pr("Loading buffer into device . . .");
            st = device.SetData(dataBuffer);
            if (st != RSH_API.SUCCESS)
            {
                return(SayGoodBye(st));
            }

            st = device.Start();
            if (st != RSH_API.SUCCESS)
            {
                return(SayGoodBye(st));
            }

            // Ожидаем окончания проигрывания буфера. (для GSPF052PCI)
            st = device.Get(RSH_GET.WAIT_BUFFER_READY_EVENT);
            if (st != RSH_API.SUCCESS)
            {
                SayGoodBye(st);
            }
            else
            {
                pr("Interrupt has taken place!");
                pr("Which means that GSPF had generated loaded buffer completely.");
            }
            return(null);
        }