/// <summary> /// 使用默认参数初始化配置文件属性 /// 部署到全新系统时使用该方法产生默认配置文件,并可在此基础上手动修改 /// 其余情况务必使用有参构造函数通过配置文件构造该类实例 /// </summary> public NIAIStaticConfig() { //没有配置文件路径时,初始化生成的模板 TriggerConfig = new AITriggerConfiguration() { TriggerType = AITriggerType.DigitalTrigger, TriggerSource = "/PXI1Slot3/ai/StartTrigger", TriggerEdge = Edge.Rising, MasterOrSlave = AITriggerMasterOrSlave.Slave }; ClockConfig = new AIClockConfiguration() { ClkSource = "", SampleQuantityMode = AISamplesMode.FiniteSamples, SampleRate = 1000, ClkActiveEdge = Edge.Rising, TotalSampleLengthPerChannel = 1000, ReadSamplePerTime = 500 }; ChannelConfig = new AIChannelConfiguration() { ChannelName = "PXI1Slot4/ai0:3", TerminalConfigType = AITerminalType.Differential, MinimumValue = 0, MaximumValue = 10 }; StartTime = 0.5; AutoWriteDataToFile = true; ChannelCount = 4; RemainShotsMax = 30; RemainShotsMin = 20; }
/// <summary> /// 使用默认参数初始化配置文件属性 /// 部署到全新系统时使用该方法产生默认配置文件,并可在此基础上手动修改 /// 其余情况务必使用有参构造函数通过配置文件构造该类实例 /// </summary> public JYAIStaticConfig() { ////没有配置文件路径时,初始化生成的模板 //BoardNum = 0; //TriggerConfig = new AITriggerConfiguration() //{ // TriggerType = BasicAIModel.AITriggerType.Immediate, // TriggerSource = AIDigitalTriggerSource.SSI, // TriggerEdge = Edge.Rising, // MasterOrSlave = AITriggerMasterOrSlave.NonSync //}; //ClockConfig = new AIClockConfiguration() //{ // ClkSource = AIClockSource.Internal, // SampleQuantityMode = AISamplesMode.FiniteSamples, // ClkActiveEdge = Edge.Rising, // SampleRate = 1000, // TotalSampleLengthPerChannel = 1000, // ReadSamplePerTime = 500 //}; //ChannelConfig = new AIChannelConfiguration() //{ // ChannelName = new int[] { 0, 1, 2, 3 }, // TerminalConfigType = AITerminalType.Differential, // MinimumValue = 0, // MaximumValue = 10 //}; //StartTime = 0.5; //AutoWriteDataToFile = true; //ChannelCount = 4; //RemainShotsMax = 30; //RemainShotsMin = 20; TriggerConfig = new AITriggerConfiguration(); ClockConfig = new AIClockConfiguration(); ChannelConfig = new AIChannelConfiguration(); }
/// <summary> /// 使用AITriggerConfiguration进行简仪采集卡触发及多卡同步配置 /// </summary> /// <param name="jyTask">需要配置的简仪采集卡任务</param> /// <param name="triggerConfiguration">触发配置</param> public static void MapAndConfigTrigger(JYPXI62022AITask jyTask, AITriggerConfiguration triggerConfiguration) { //加了主卡带从卡的时候,如果从卡采样率设满,从卡有时触发不了 //jyTask.Trigger.Mode = AITriggerMode.Start; //jyTask.Trigger.ReTriggerCount = 0; //jyTask.Trigger.PreTriggerSamples = 0; //jyTask.Trigger.Delay = 0; switch (triggerConfiguration.TriggerType) { case BasicAIModel.AITriggerType.Immediate: //无触发 jyTask.Trigger.Type = JYPXI62022.AITriggerType.Immediate; break; case BasicAIModel.AITriggerType.DigitalTrigger: //外部数字触发 jyTask.Trigger.Type = JYPXI62022.AITriggerType.Digital; //触发边沿 switch (triggerConfiguration.TriggerEdge) { case Edge.Falling: jyTask.Trigger.Digital.Edge = AIDigitalTriggerEdge.Falling; break; case Edge.Rising: jyTask.Trigger.Digital.Edge = AIDigitalTriggerEdge.Rising; break; default: throw new Exception("触发边沿配置错误!"); } //触发源 jyTask.Trigger.Digital.Source = (AIDigitalTriggerSource)Enum.ToObject(typeof(AIDigitalTriggerSource), int.Parse((string)triggerConfiguration.TriggerSource)); jyTask.Trigger.Delay = triggerConfiguration.Delay * 1000000; break; case BasicAIModel.AITriggerType.AnalogTrigger: throw new Exception("该简仪采集卡无法使用模拟触发!"); default: throw new Exception("触发方式配置错误!"); } //主从卡不同,配置不同 switch (triggerConfiguration.MasterOrSlave) { case AITriggerMasterOrSlave.NonSync: //不需要设置主从 jyTask.Sync.Topology = SyncTopology.Independent; break; case AITriggerMasterOrSlave.Master: jyTask.Sync.Topology = SyncTopology.Master; //主卡需要触发路由 jyTask.Trigger.Digital.Source = AIDigitalTriggerSource.Trig_IO; //SSI的意思就是背板某条触发总线,驱动底层自动map jyTask.Sync.TriggerRouting = SyncTriggerRouting.SSI; jyTask.Sync.TimeBaseRouting = SyncTimeBaseRouting.SSI; break; case AITriggerMasterOrSlave.Slave: jyTask.Sync.Topology = SyncTopology.Slave; //从卡不需要配置触发路由 jyTask.Sync.TriggerRouting = SyncTriggerRouting.SSI; jyTask.Sync.TimeBaseRouting = SyncTimeBaseRouting.SSI; //覆盖之前设置的触发属性,应为digitial触发,触发源SSI jyTask.Trigger.Type = JYPXI62022.AITriggerType.Digital; jyTask.Trigger.Digital.Edge = AIDigitalTriggerEdge.Rising; jyTask.Trigger.Digital.Source = AIDigitalTriggerSource.SSI; break; default: throw new Exception("该简仪采集卡触发主从设置错误!"); } }
/// <summary> /// 使用默认参数初始化配置文件属性 /// </summary> public NIScopeAIStaticConfig() { TriggerConfig = new AITriggerConfiguration(); ClockConfig = new AIClockConfiguration(); ChannelConfig = new AIChannelConfiguration(); }
/// <summary> /// 使用AITriggerConfiguration进行NI采集卡触发及多卡同步配置 /// </summary> /// <param name="niTask"></param> /// <param name="triggerConfiguration"></param> public static void MapAndConfigTrigger(NationalInstruments.DAQmx.Task niTask, AITriggerConfiguration triggerConfiguration) { switch (triggerConfiguration.TriggerType) { case AITriggerType.Immediate: //没触发,无需配置 break; case AITriggerType.DigitalTrigger: DigitalEdgeStartTriggerEdge digitalTriggerEdge; switch (triggerConfiguration.TriggerEdge) { case Edge.Falling: digitalTriggerEdge = DigitalEdgeStartTriggerEdge.Falling; break; case Edge.Rising: digitalTriggerEdge = DigitalEdgeStartTriggerEdge.Rising; break; default: throw new Exception("触发边沿配置错误!"); } niTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger((string)triggerConfiguration.TriggerSource, digitalTriggerEdge); //设置为0 NI报错 if (triggerConfiguration.Delay != 0) { niTask.Triggers.StartTrigger.DelayUnits = StartTriggerDelayUnits.Seconds; niTask.Triggers.StartTrigger.Delay = triggerConfiguration.Delay; } break; case AITriggerType.AnalogTrigger: AnalogEdgeStartTriggerSlope analogTriggerEdge; switch (triggerConfiguration.TriggerEdge) { case Edge.Falling: analogTriggerEdge = AnalogEdgeStartTriggerSlope.Falling; break; case Edge.Rising: analogTriggerEdge = AnalogEdgeStartTriggerSlope.Rising; break; default: throw new Exception("触发边沿配置错误!"); } //默认触发电平2.5v niTask.Triggers.StartTrigger.ConfigureAnalogEdgeTrigger((string)triggerConfiguration.TriggerSource, analogTriggerEdge, 2.5); if (triggerConfiguration.Delay != 0) { niTask.Triggers.StartTrigger.DelayUnits = StartTriggerDelayUnits.Seconds; niTask.Triggers.StartTrigger.Delay = triggerConfiguration.Delay; } break; default: throw new Exception("触发方式配置错误!"); } }
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(); } }