using System; using NationalInstruments.DAQmx; using CRVM.Entity; using CRVM.Utility; namespace CRVM.Driver { public class DaqDriver { private double[,] vibdata; private double[,] speeddata; private double[] cutdata; private double[] lendata; private Task myTask_Analog, myTask_Speed, myTask_Cut, myTask_Len; private AnalogMultiChannelReader analogInReader, analogSpeedReader; private AnalogSingleChannelReader analogCutReader, analogLenReader; private Task runningTask; private AsyncCallback analogCallback; public DaqDriver() { //修改为线程池任务 new System.Threading.Tasks.Task(() => DaqStart()).Start(); } public void DaqStart() { try { myTask_Analog = new Task(); myTask_Cut = new Task(); myTask_Len = new Task(); myTask_Speed = new Task(); //振动信号 加速度信号 1~8通道 1~5通道对应1~5机架的振动信号 6~8通道预留 for (int i = 0; i < 4; i++) { myTask_Analog.AIChannels.CreateAccelerometerChannel("Vib1/ai" + i.ToString(), "", AITerminalConfiguration.Pseudodifferential, -5.0, 5.0, SysParam.Instance.channel[i].vibSens, AIAccelerometerSensitivityUnits.MillivoltsPerG, AIExcitationSource.Internal, Convert.ToSingle(0.004), AIAccelerationUnits.G); } for (int i = 0; i < 4; i++) { myTask_Analog.AIChannels.CreateAccelerometerChannel("Vib2/ai" + i.ToString(), "", AITerminalConfiguration.Pseudodifferential, -5.0, 5.0, SysParam.Instance.channel[4 + i].vibSens, AIAccelerometerSensitivityUnits.MillivoltsPerG, AIExcitationSource.Internal, Convert.ToSingle(0.004), AIAccelerationUnits.G); } //轧制速度 模拟电流信号4-20mA 1~2机架0-1000mpm 3~5机架0-1600mpm 单位(m/min) for (int i = 0; i < 5; i++) { myTask_Speed.AIChannels.CreateCurrentChannel("L1signal/ai" + i.ToString(), "", (AITerminalConfiguration)(-1), -0.02, 0.02, AICurrentUnits.Amps); } //轧制距离 模拟电流信号4-20mA 0-200m锯齿波 单位m myTask_Len.AIChannels.CreateCurrentChannel("L1signal/ai5", "", (AITerminalConfiguration)(-1), -0.02, 0.02, AICurrentUnits.Amps); //剪切信号 模拟电流信号4-20mA <12 无剪切 >12剪切 myTask_Cut.AIChannels.CreateCurrentChannel("L1signal/ai6", "", (AITerminalConfiguration)(-1), -0.02, 0.02, AICurrentUnits.Amps); //采样速率 myTask_Analog.Timing.ConfigureSampleClock("", Convert.ToDouble(SysParam.Instance.sampleFre), SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, 1000); ////声明采集任务 myTask_Analog.Control(TaskAction.Verify); //数据采集 runningTask = myTask_Analog; analogInReader = new AnalogMultiChannelReader(myTask_Analog.Stream); analogCutReader = new AnalogSingleChannelReader(myTask_Cut.Stream); analogLenReader = new AnalogSingleChannelReader(myTask_Len.Stream); analogSpeedReader = new AnalogMultiChannelReader(myTask_Speed.Stream); analogCallback = new AsyncCallback(AnalogInCallback); //启动采集 //模拟通道采集同步 analogInReader.SynchronizeCallbacks = true; analogInReader.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback, myTask_Analog); SysParam.Instance.isDatahandlered = true; } catch (DaqException ex) { throw new Exception("没连接上仪器,请重新连接仪器并重新启动重新" + ex.Message); } } public void DaqStop() { runningTask = null; if (myTask_Analog != null) { myTask_Analog.Stop(); } if (myTask_Cut != null) { myTask_Cut.Stop(); } if (myTask_Len != null) { myTask_Len.Stop(); } if (myTask_Speed != null) { myTask_Speed.Stop(); } } private void AnalogInCallback(IAsyncResult ar) { if (runningTask == ar.AsyncState) { analogInReader.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback, myTask_Analog); vibdata = analogInReader.EndReadMultiSample(ar); speeddata = analogSpeedReader.ReadMultiSample(SysParam.Instance.samplePoint); cutdata = analogCutReader.ReadMultiSample(SysParam.Instance.samplePoint); lendata = analogLenReader.ReadMultiSample(SysParam.Instance.samplePoint); if (SysParam.Instance.isDatahandlered)//数据处理未能及时完成时,该帧数据不触发回调 { SysParam.Instance.isDatahandlered = false; if (DaqDataChangEvent != null) { DaqDataChangEvent.Invoke(new Daqdata(vibdata, speeddata, lendata, cutdata)); } } } } public delegate void DriverCollectDataHandle(Daqdata data); public event DriverCollectDataHandle DaqDataChangEvent; } public class Daqdata : EventArgs { public double[,] vibData; public double[,] speedData; public double[] lenData; public double[] cutData; public Daqdata(double[,] indata, double[,] speeddata, double[] lendata, double[] cutdata) { this.vibData = indata; this.cutData = cutdata; this.lenData = lendata; this.speedData = speeddata; } } }