150 lines
6.1 KiB
C#
150 lines
6.1 KiB
C#
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|