CRVM-redis-6/Driver/DaqDriver - 复制.cs.bak

150 lines
6.1 KiB
C#
Raw Permalink Normal View History

2025-11-07 02:02:31 +08:00
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;
}
}
}