Example #1
0
        private API_RETURN_CODE ConfigCiTask(string ciChannel, string ciSrc, string ciClock, ref Task ciTask, ref CounterSingleChannelReader ciMultiChannelReader)
        {
            API_RETURN_CODE code = API_RETURN_CODE.API_SUCCESS;

            try
            {
                ciTask = new Task();

                ciTask.CIChannels.CreateCountEdgesChannel(ciChannel, "", CICountEdgesActiveEdge.Rising, 0, CICountEdgesCountDirection.Up);
                ciTask.Control(TaskAction.Verify);

                ciTask.Timing.SampleClockRate = m_params.CtrSampleRate;
                ciTask.Timing.ConfigureSampleClock(ciClock,
                                                   ciTask.Timing.SampleClockRate,
                                                   SampleClockActiveEdge.Rising,
                                                   SampleQuantityMode.ContinuousSamples,
                                                   m_params.ValidScanPixelsPerFrame);

                ciTask.Stream.ConfigureInputBuffer(m_params.ValidScanPixelsPerFrame);

                // CIDataTransferMechanism x = ciTask.CIChannels.All.DataTransferMechanism;

                // 指定CI Channel使用的物理输入终端[APD的脉冲接收端]
                ciTask.CIChannels[0].CountEdgesTerminal = ciSrc;

                // 设置Ci Pause Trigger源为PFIx,PFIx与Acq Trigger[一般是Do]物理直连,接收Do的输出信号,作为触发
                // 低电平使能Pause Trigger,高电平禁能
                // ciTask.Triggers.PauseTrigger.ConfigureDigitalLevelTrigger(ciGate, DigitalLevelPauseTriggerCondition.Low);

                // 设置Arm Start Trigger,使CI与AO、DO同时启动工作
                string source = m_sysConfig.GetStartSyncSignal();
                ciTask.Triggers.ArmStartTrigger.ConfigureDigitalEdgeTrigger(source, DigitalEdgeArmStartTriggerEdge.Rising);

                ciTask.EveryNSamplesReadEventInterval = m_params.ScanPixelsPerAcquisition;
                ciTask.EveryNSamplesRead += new EveryNSamplesReadEventHandler(CiEveryNSamplesRead);

                ciMultiChannelReader = new CounterSingleChannelReader(ciTask.Stream);
                ciMultiChannelReader.SynchronizeCallbacks = false;
            }
            catch (Exception e)
            {
                Logger.Error(string.Format("config ci task[{0}] exception: [{1}].", ciChannel, e));
                code = API_RETURN_CODE.API_FAILED_NI_CONFIG_CI_TASK_EXCEPTION;
            }

            return(code);
        }
Example #2
0
        // this method configures and starts the counter.
        private void StartCounter()
        {
            // set up the counter - the fast oscillator is fed into a counter's source input
            counterTask = new Task("PhaseLock task");
            CounterChannel oscillatorChannel =
                ((CounterChannel)Environs.Hardware.CounterChannels["phaseLockOscillator"]);

            counterTask.CIChannels.CreateCountEdgesChannel(
                oscillatorChannel.PhysicalChannel,
                oscillatorChannel.Name,
                CICountEdgesActiveEdge.Rising,
                0,
                CICountEdgesCountDirection.Up
                );

            // this counter is sample-clocked by the slow reference that we are locking to.
            // the buffer is set to be "large"
            CounterChannel referenceChannel =
                ((CounterChannel)Environs.Hardware.CounterChannels["phaseLockReference"]);

            counterTask.Timing.ConfigureSampleClock(
                referenceChannel.PhysicalChannel,
                SAMPLE_CLOCK_RATE,
                SampleClockActiveEdge.Rising,
                SampleQuantityMode.ContinuousSamples,
                1000
                );

            counterReader = new CounterSingleChannelReader(counterTask.Stream);
            counterReader.SynchronizeCallbacks = true;

            if (!Environs.Debug)
            {
                counterReader.BeginReadMultiSampleInt32(
                    SAMPLE_MULTI_READ,
                    new AsyncCallback(CounterCallBack),
                    null
                    );
            }
        }