コード例 #1
0
        public static void ConfigureMeasurement(NIScope scope, MeasurementConfiguration measurementConfig, string channelNames = "0")
        {
            switch (measurementConfig.ScopeTriggerType)
            {
            case ScopeTriggerType.DigitalEdge:
                scope.Trigger.ConfigureTriggerDigital(ScopeTriggerSource.FromString(measurementConfig.ScopeTriggerSource),
                                                      measurementConfig.TriggerEdge, PrecisionTimeSpan.Zero, PrecisionTimeSpan.Zero);
                break;

            case ScopeTriggerType.Immediate:
                scope.Trigger.ConfigureTriggerImmediate();
                break;

            case ScopeTriggerType.Software:
                scope.Trigger.ConfigureTriggerSoftware(PrecisionTimeSpan.Zero, PrecisionTimeSpan.Zero);
                break;

            default:
                throw new System.NotImplementedException("The functionality for the requested NI-SCOPE trigger type has not been implemented.");
            }

            scope.Acquisition.SampleRateMin     = measurementConfig.SampleRate_Hz;
            scope.Acquisition.NumberOfPointsMin = (long)Math.Round(scope.Acquisition.SampleRate * measurementConfig.MeasurementTime_s);

            scope.Timing.NumberOfRecordsToAcquire = 1;
        }
コード例 #2
0
        public void StartAcquisition(string channelName, double sampleRate, double referencePosition,
                                     double range, int numberOfPoints, int numberOfRecords)
        {
            try
            {
                scopeDevices = new ModularInstrumentsSystem("NI-Scope");
                scopeName    = scopeDevices.DeviceCollection[0].Name;
                scopeSession = new NIScope(scopeName, false, true);
                scopeSession.DriverOperation.Warning += new EventHandler <ScopeWarningEventArgs>(DriverOperation_Warning);

                scopeSession.Channels[channelName].InputImpedance = 50;

                double offset = 0.0;
                ScopeVerticalCoupling coupling = ScopeVerticalCoupling.DC;
                double probeAttenuation        = 1.0;
                scopeSession.Channels[channelName].Configure(range, offset, coupling, probeAttenuation, true);

//                scopeSession.Channels[channelName]

                bool enforceRealtime = true;

                scopeSession.Timing.ConfigureTiming
                    (sampleRate, numberOfPoints, referencePosition, numberOfRecords, enforceRealtime);

                double               triggerLevel    = 1.6;
                ScopeTriggerSlope    triggerSlope    = ScopeTriggerSlope.Positive;
                ScopeTriggerCoupling triggerCoupling = ScopeTriggerCoupling.DC;
                PrecisionTimeSpan    triggerHoldoff  = PrecisionTimeSpan.Zero;
                PrecisionTimeSpan    triggerDelay    = PrecisionTimeSpan.Zero;
                ScopeTriggerSource   triggerSource   = ScopeTriggerSource.External;

                scopeSession.Trigger.EdgeTrigger.Configure
                    (triggerSource, triggerLevel, triggerSlope, triggerCoupling, triggerHoldoff, triggerDelay);

                recordLength     = scopeSession.Acquisition.RecordLength;
                sampleRate       = scopeSession.Acquisition.SampleRate;
                this.channelName = channelName;

                scopeSession.Measurement.Initiate();


                timeout = new PrecisionTimeSpan(5.0);
            }
            catch (Exception ex)
            {
                ShowError(ex);
            }
        }
コード例 #3
0
        private static void MapAndConfigTrigger(NIScope scopeSession, AITriggerConfiguration triggerConfiguration, ref TClock tClockSession)
        {
            //配置触发沿
            ScopeTriggerSlope triggerSlope;

            switch (triggerConfiguration.TriggerEdge)
            {
            case Edge.Rising:
                triggerSlope = ScopeTriggerSlope.Positive;
                break;

            case Edge.Falling:
                triggerSlope = ScopeTriggerSlope.Negative;
                break;

            default:
                throw new Exception("触发沿 TriggerEdge 设置错误!");
            }

            //设置触发源
            ScopeTriggerSource triggerSource = triggerConfiguration.TriggerSource.ToString();

            //设置触发模式
            switch (triggerConfiguration.TriggerType)
            {
            case AITriggerType.Immediate:
                scopeSession.Trigger.Type = ScopeTriggerType.Immediate;
                scopeSession.Trigger.ConfigureTriggerImmediate();
                break;

            case AITriggerType.DigitalTrigger:
                scopeSession.Trigger.Type = ScopeTriggerType.DigitalEdge;
                scopeSession.Trigger.ConfigureTriggerDigital(triggerSource, triggerSlope, PrecisionTimeSpan.Zero, new PrecisionTimeSpan(triggerConfiguration.Delay));
                break;

            case AITriggerType.AnalogTrigger:
                scopeSession.Trigger.Type = ScopeTriggerType.Edge;
                scopeSession.Trigger.EdgeTrigger.Configure(triggerSource, 2.5, triggerSlope, ScopeTriggerCoupling.DC, PrecisionTimeSpan.Zero, new PrecisionTimeSpan(triggerConfiguration.Delay));
                break;

            default:
                throw new Exception("触发模式 TriggerType 设置错误!");
            }

            //如果不是非同步
            //加入到TClock中
            if (triggerConfiguration.MasterOrSlave != AITriggerMasterOrSlave.NonSync)
            {
                lock (TClockDevice.Lock)
                {
                    if (TClockDevice.SyncDevices == null)
                    {
                        TClockDevice.SyncDevices = new List <NIScope>();
                    }
                    TClockDevice.SyncDevices.Add(scopeSession);
                }
            }

            //如果是主卡,则将所有的 SynchronizableDevices 实例化出来,这样写也就决定了只能有一个 Master( NI 机箱可级联支持双 Master)
            //这一行必须是在所有需要同步的卡 scopeSession 设置完毕之后
            if (triggerConfiguration.MasterOrSlave == AITriggerMasterOrSlave.Master)
            {
                TClockDevice.IsMasterReady            = false;
                TClockDevice.IsSlaveCanAddIntoTDevice = true;

                //因为主卡可能会和从卡同时被 Arm,因此先等待所有从卡设备加入 TClockDevice
                Thread.Sleep(1000);

                TClockDevice.IsSlaveCanAddIntoTDevice = false;

                ITClockSynchronizableDevice[] scopeSynchronizableDevices = new ITClockSynchronizableDevice[TClockDevice.SyncDevices.Count];
                for (int i = 0; i < TClockDevice.SyncDevices.Count; i++)
                {
                    scopeSynchronizableDevices[i] = TClockDevice.SyncDevices[i];
                }
                tClockSession = new TClock(scopeSynchronizableDevices);
                tClockSession.ConfigureForHomogeneousTriggers();
                tClockSession.Synchronize();
            }
        }