/// <summary> /// 使用AIChannelConfiguration进行简仪采集卡通道配置 /// </summary> /// <param name="jyTask">需要配置的简仪采集卡任务</param> /// <param name="channelConfiguration">通道配置</param> public static void MapAndConfigChannel(JYPXI62022AITask jyTask, AIChannelConfiguration channelConfiguration) { if (channelConfiguration.TerminalConfigType != AITerminalType.Differential) { throw new Exception("该简仪采集卡只能配置为差分输入!"); } //简仪采集卡通道用int表示,应该是一个int的集合 //var channels = ((JArray)channelConfiguration.ChannelName).ToObject<List<int>>(); 当ChannelName还是Object的时候 var channels = ChannelNameTranslator.StringToListInt(channelConfiguration.ChannelName); for (int i = 0; i < channels.Count(); i++) { jyTask.AddChannel(channels[i], channelConfiguration.MinimumValue, channelConfiguration.MaximumValue); } }
private static void MapAndConfigChannel(NIScope scopeSession, AIChannelConfiguration channelConfiguration) { //todo:检查是否真的是0,1,2…… //var channels = ((JArray)channelConfiguration.ChannelName).ToObject<List<int>>(); 当ChannelName还是Object的时候 var channels = ChannelNameTranslator.StringToListInt(channelConfiguration.ChannelName); double range = channelConfiguration.MaximumValue - channelConfiguration.MinimumValue; foreach (var c in channels) { //Todo:信号输入方式无法配置 //配置信号输入方式 switch (channelConfiguration.TerminalConfigType) { //目前只支持差分 case AITerminalType.Differential: scopeSession.Channels[c.ToString()].Configure(range, 0, ScopeVerticalCoupling.DC, 1.0, true); break; default: throw new Exception("输入方式 AITerminalType 定义无效!"); } } }
//读数据 private void readData(NIScope scopeSession) { //var channels = ((JArray)_staticConfig.ChannelConfig.ChannelName).ToObject<List<int>>(); var channels = ChannelNameTranslator.StringToListInt(_staticConfig.ChannelConfig.ChannelName); //开新线程等待读数据 //await Task.Run(() => //{ int totalReadDataLength = 0; PrecisionTimeSpan timeout = new PrecisionTimeSpan(1000000); //无timeOut AnalogWaveformCollection <double> scopeWaveform = null; double[,] readData = new double[_staticConfig.ChannelCount, _staticConfig.ClockConfig.TotalSampleLengthPerChannel]; //生成 channels string channelScope = null; //var sChannels = ((JArray)_staticConfig.ChannelConfig.ChannelName).ToObject<List<int>>(); var sChannels = ChannelNameTranslator.StringToListInt(_staticConfig.ChannelConfig.ChannelName); foreach (var s in sChannels) { channelScope += s + ","; } channelScope = channelScope.Substring(0, channelScope.Length - 1); //一次采完 //经过测试,发现在默认设置(不设置其它)情况下: // 1、如果多次 FetchDouble,则每 2 次的数据不连续(中间断一截) // 2、如果设置多个 records,则每 2 个 record 之间的数据不连续(中间断一截) //因此暂时只允许一个 record scopeWaveform = scopeSession.Channels[channelScope].Measurement.FetchDouble(timeout, _staticConfig.ClockConfig.TotalSampleLengthPerChannel, scopeWaveform); //一旦上面这里获取到数据,则表示采集开始 AIState = Status.Running; // i 是读取次数 // j 是通道计数 // k 是每一波的每个点 double[] temp; AnalogWaveform <double> waveform; for (int i = 0; i < _staticConfig.ClockConfig.TotalSampleLengthPerChannel / _staticConfig.ClockConfig.ReadSamplePerTime; i++) { //将一个通道的数据拷贝到 data[,] 的一行 for (int j = 0; j < _staticConfig.ChannelCount; j++) { waveform = scopeWaveform[i, j]; temp = waveform.GetRawData(); for (int k = 0; k < _staticConfig.ClockConfig.ReadSamplePerTime; k++) { readData[j, i *_staticConfig.ClockConfig.ReadSamplePerTime + k] = temp[k]; } } totalReadDataLength += _staticConfig.ClockConfig.ReadSamplePerTime; } GC.Collect(); Thread.Sleep(2000); //发布数据到达事件 OnDataArrival(readData); //发布停止任务事件 OnAITaskStopped(); //等待,让外部保证获取到 Running 状态 Thread.Sleep(2000); //}); }