/// <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;
 }
Esempio n. 2
0
        /// <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("该简仪采集卡触发主从设置错误!");
            }
        }
Esempio n. 4
0
 /// <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("触发方式配置错误!");
            }
        }
Esempio n. 6
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();
            }
        }