CRVM-redis-6/Driver/DaqDriver - 复制.csBK
2025-11-07 02:02:31 +08:00

339 lines
17 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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