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; }
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); } }
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(); } }