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