using System; using NationalInstruments.DAQmx; using CRVM.Entity; using CRVM.Utility; namespace CRVM.Driver { public class DaqDriver { private double[,] vibdata1 = new double[4, SysParam.Instance.samplePoint]; private double[,] vibdata2 = new double[4, SysParam.Instance.samplePoint]; private double[,] speeddata = new double[8, SysParam.Instance.samplePoint]; private double[] cutdata; private double[] lendata; private Task myTask_Analog1, myTask_Analog2, myTask_Speed, myTask_Cut, myTask_Len; private AnalogMultiChannelReader analogInReader1, analogInReader2, analogSpeedReader; //private AnalogSingleChannelReader analogCutReader, analogLenReader; private Task runningTask1, runningTask2, runningTask3; private AsyncCallback analogCallback1, analogCallback2, analogCallback3; int count = 0; public DaqDriver() { //修改为线程池任务 new System.Threading.Tasks.Task(() => DaqStart()).Start(); } public void DaqStart() { DevelopLog.DeBug.WriteLogFile("DaqStart", "DaqStart"); try { myTask_Analog1 = new Task(); myTask_Analog2 = new Task(); myTask_Speed = new Task(); //振动信号 加速度信号 1~3通道对应1~3机架的振动信号 4通道预留 for (int i = 0; i < 4; i++) { myTask_Analog1.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); } //振动信号 加速度信号 1~2通道对应4~5机架的振动信号 3,4通道预留 for (int i = 0; i < 4; i++) { myTask_Analog2.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); } /*//轧制速度 ai0-ai4通道为模拟电流信号4-20mA 1机架0-550mpm 2机架0-1000mpm 3~5机架0-1700mpm 单位(m/min) ai5:轧制距离 模拟电流信号4-20mA 0-200m锯齿波 单位m ai6:剪切信号 模拟电流信号4-20mA <12 无剪切 >12剪切 for (int i = 0; i < 7; i++) { myTask_Speed.AIChannels.CreateCurrentChannel("L1signal/ai" + i.ToString(), "", (AITerminalConfiguration)(-1), -0.02, 0.02, AICurrentUnits.Amps); }*/ //1#SPD myTask_Speed.AIChannels.CreateCurrentChannel("L1signal/ai0", "", (AITerminalConfiguration)(-1), -0.02, 0.02, AICurrentUnits.Amps); //2#SPD myTask_Speed.AIChannels.CreateCurrentChannel("L1signal/ai2", "", (AITerminalConfiguration)(-1), -0.02, 0.02, AICurrentUnits.Amps); //3#SPD myTask_Speed.AIChannels.CreateCurrentChannel("L1signal/ai4", "", (AITerminalConfiguration)(-1), -0.02, 0.02, AICurrentUnits.Amps); //4#SPD myTask_Speed.AIChannels.CreateCurrentChannel("L1signal/ai6", "", (AITerminalConfiguration)(-1), -0.02, 0.02, AICurrentUnits.Amps); //5#SPD myTask_Speed.AIChannels.CreateCurrentChannel("L1signal/ai1", "", (AITerminalConfiguration)(-1), -0.02, 0.02, AICurrentUnits.Amps); //LENGTH myTask_Speed.AIChannels.CreateCurrentChannel("L1signal/ai5", "", (AITerminalConfiguration)(-1), -0.02, 0.02, AICurrentUnits.Amps); //CUT myTask_Speed.AIChannels.CreateCurrentChannel("L1signal/ai3", "", (AITerminalConfiguration)(-1), -0.02, 0.02, AICurrentUnits.Amps); //SPARE myTask_Speed.AIChannels.CreateCurrentChannel("L1signal/ai7", "", (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_Analog1.Timing.ConfigureSampleClock("", Convert.ToDouble(SysParam.Instance.sampleFre), SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, 1024); myTask_Analog2.Timing.ConfigureSampleClock("", Convert.ToDouble(SysParam.Instance.sampleFre), SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, 1024); myTask_Speed.Timing.ConfigureSampleClock("", Convert.ToDouble(SysParam.Instance.sampleFre), SampleClockActiveEdge.Rising, SampleQuantityMode.ContinuousSamples, 1024); ////声明采集任务 string time1 = DateTime.Now.Second.ToString() + ":" + DateTime.Now.Millisecond.ToString(); myTask_Analog2.Control(TaskAction.Verify); string time2 = DateTime.Now.Second.ToString() + ":" + DateTime.Now.Millisecond.ToString(); myTask_Analog1.Control(TaskAction.Verify); string time3 = DateTime.Now.Second.ToString() + ":" + DateTime.Now.Millisecond.ToString(); myTask_Speed.Control(TaskAction.Verify); ////声明采集任务 /*string time4 = DateTime.Now.Second.ToString() + ":" + DateTime.Now.Millisecond.ToString(); myTask_Analog2.Control(TaskAction.Verify); string time5 = DateTime.Now.Second.ToString() + ":" + DateTime.Now.Millisecond.ToString(); myTask_Analog1.Control(TaskAction.Verify); string time6 = DateTime.Now.Second.ToString() + ":" + DateTime.Now.Millisecond.ToString(); myTask_Speed.Control(TaskAction.Verify);*/ //数据采集 runningTask1 = myTask_Analog1; runningTask2 = myTask_Analog2; runningTask3 = myTask_Speed; analogInReader1 = new AnalogMultiChannelReader(myTask_Analog1.Stream); analogInReader2 = new AnalogMultiChannelReader(myTask_Analog2.Stream); analogSpeedReader = new AnalogMultiChannelReader(myTask_Speed.Stream); analogCallback1 = new AsyncCallback(AnalogInCallback1); analogCallback2 = new AsyncCallback(AnalogInCallback2); analogCallback3 = new AsyncCallback(AnalogInCallback3); myTask_Analog2.Start(); myTask_Speed.Start(); //启动采集 //模拟通道采集同步 analogInReader1.SynchronizeCallbacks = true; analogInReader2.SynchronizeCallbacks = true; analogSpeedReader.SynchronizeCallbacks = true; analogInReader1.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback1, myTask_Analog1); analogInReader2.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback2, myTask_Analog2); analogSpeedReader.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback3, myTask_Speed); SysParam.Instance.isDatahandlered = true; } catch (DaqException ex) { DevelopLog.DeBug.WriteLogFile("ex", ex.ToString()); throw new Exception("没连接上仪器,请重新连接仪器并重新启动重新" + ex.Message); } } public void DaqStop() { runningTask1 = null; runningTask2 = null; runningTask3 = null; if (myTask_Analog1 != null) { myTask_Analog1.Stop(); } if (myTask_Analog2 != null) { myTask_Analog2.Stop(); } //if (myTask_Cut != null) //{ // myTask_Cut.Stop(); //} //if (myTask_Len != null) //{ // myTask_Len.Stop(); //} if (myTask_Speed != null) { myTask_Speed.Stop(); } } /*private void AnalogInCallback1(IAsyncResult ar) { if (runningTask1 != null && runningTask1 == ar.AsyncState) { try { //DevelopLog.DeBug.WriteLogFile("analogInReader1", ""); vibdata1 = analogInReader1.EndReadMultiSample(ar); ////cutdata = analogCutReader.ReadMultiSample(SysParam.Instance.samplePoint); ////lendata = analogLenReader.ReadMultiSample(SysParam.Instance.samplePoint); //DevelopLog.DeBug.WriteLogFile("analogSpeedReader", ""); //if (SysParam.Instance.isDatahandlered && count >= 3)//数据处理未能及时完成时,该帧数据不触发回调 //DevelopLog.DeBug.WriteLogFile("speedInReader2", ""); speeddata = analogSpeedReader.ReadMultiSample(SysParam.Instance.samplePoint); //DevelopLog.DeBug.WriteLogFile("analogInReader2", ""); vibdata2 = analogInReader2.ReadMultiSample(SysParam.Instance.samplePoint); if (SysParam.Instance.isDatahandlered)//数据处理未能及时完成时,该帧数据不触发回调 { count = 0; SysParam.Instance.isDatahandlered = false; if (DaqDataChangEvent != null) { DaqDataChangEvent.Invoke(new Daqdata(vibdata1, vibdata2, speeddata, lendata, cutdata)); } } analogInReader1.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback1, myTask_Analog1); } catch (Exception ex) { DevelopLog.DeBug.WriteLogFile("AnalogInCallback1", ex.ToString()); } } } private void AnalogInCallback2(IAsyncResult ar) { if (runningTask2 == ar.AsyncState) { //DevelopLog.DeBug.WriteLogFile("AnalogInCallback2", ""); analogInReader2.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback2, myTask_Analog2); vibdata2 = analogInReader2.EndReadMultiSample(ar); //DevelopLog.DeBug.WriteLogFile("analogInReader2", ""); count++; //vibdata2 = analogInReader2.ReadMultiSample(SysParam.Instance.samplePoint); //DevelopLog.DeBug.WriteLogFile("analogInReader2", ""); //speeddata = analogSpeedReader.ReadMultiSample(SysParam.Instance.samplePoint); ////cutdata = analogCutReader.ReadMultiSample(SysParam.Instance.samplePoint); ////lendata = analogLenReader.ReadMultiSample(SysParam.Instance.samplePoint); //DevelopLog.DeBug.WriteLogFile("analogSpeedReader", ""); if (SysParam.Instance.isDatahandlered && count >= 2)//数据处理未能及时完成时,该帧数据不触发回调 { count = 0; SysParam.Instance.isDatahandlered = false; if (DaqDataChangEvent != null) { DaqDataChangEvent.Invoke(new Daqdata(vibdata1, vibdata2, speeddata, lendata, cutdata)); } } } } private void AnalogInCallback3(IAsyncResult ar) { if (runningTask3 == ar.AsyncState) { //DevelopLog.DeBug.WriteLogFile("AnalogInCallback3", ""); analogSpeedReader.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback3, myTask_Speed); speeddata = analogSpeedReader.EndReadMultiSample(ar); //DevelopLog.DeBug.WriteLogFile("analogSpeedReader", ""); count++; //vibdata2 = analogInReader2.ReadMultiSample(SysParam.Instance.samplePoint); //DevelopLog.DeBug.WriteLogFile("analogInReader2", ""); //speeddata = analogSpeedReader.ReadMultiSample(SysParam.Instance.samplePoint); ////cutdata = analogCutReader.ReadMultiSample(SysParam.Instance.samplePoint); ////lendata = analogLenReader.ReadMultiSample(SysParam.Instance.samplePoint); //DevelopLog.DeBug.WriteLogFile("analogSpeedReader", ""); if (SysParam.Instance.isDatahandlered && count >= 3)//数据处理未能及时完成时,该帧数据不触发回调 { count = 0; SysParam.Instance.isDatahandlered = false; if (DaqDataChangEvent != null) { DaqDataChangEvent.Invoke(new Daqdata(vibdata1, vibdata2, speeddata, lendata, cutdata)); } } } }*/ int countTest = 0; private void AnalogInCallback1(IAsyncResult ar) { if (runningTask1 != null && runningTask1 == ar.AsyncState) { try { //DevelopLog.DeBug.WriteLogFile("AnalogInCallback1", ""); analogInReader1.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback1, myTask_Analog1); //DevelopLog.DeBug.WriteLogFile("analogInReader1", ""); vibdata1 = analogInReader1.EndReadMultiSample(ar); //DevelopLog.DeBug.WriteLogFile("speedInReader2", ""); if (countTest == 0) { speeddata = analogSpeedReader.ReadMultiSample(SysParam.Instance.samplePoint); //DevelopLog.DeBug.WriteLogFile("analogInReader2", ""); vibdata2 = analogInReader2.ReadMultiSample(SysParam.Instance.samplePoint); countTest++; } if (SysParam.Instance.isDatahandlered)//数据处理未能及时完成时,该帧数据不触发回调 { SysParam.Instance.isDatahandlered = false; if (DaqDataChangEvent != null) { DaqDataChangEvent.Invoke(new Daqdata(vibdata1, vibdata2, speeddata, lendata, cutdata)); } } } catch (Exception ex) { DevelopLog.DeBug.WriteLogFile("AnalogInCallback1", ex.ToString()); //analogInReader1.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback1, myTask_Analog1); } } } private void AnalogInCallback2(IAsyncResult ar) { if (runningTask2 == ar.AsyncState) { //DevelopLog.DeBug.WriteLogFile("AnalogInCallback2", ""); analogInReader2.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback2, myTask_Analog2); vibdata2 = analogInReader2.EndReadMultiSample(ar); } } private void AnalogInCallback3(IAsyncResult ar) { if (runningTask3 == ar.AsyncState) { //DevelopLog.DeBug.WriteLogFile("AnalogInCallback3", ""); analogSpeedReader.BeginReadMultiSample(SysParam.Instance.samplePoint, analogCallback3, myTask_Speed); speeddata = analogSpeedReader.EndReadMultiSample(ar); } } public delegate void DriverCollectDataHandle(Daqdata data); public event DriverCollectDataHandle DaqDataChangEvent; } public class Daqdata : EventArgs { public double[,] vibData1; public double[,] vibData2; public double[,] speedData; public double[] lenData; public double[] cutData; public Daqdata(double[,] indata1, double[,] indata2, double[,] speeddata, double[] lendata, double[] cutdata) { this.vibData1 = indata1; this.vibData2 = indata2; this.cutData = cutdata; this.lenData = lendata; this.speedData = speeddata; } } }