实验采用带模拟量,分辨率为1-5V,量程为0--101kpa的真空表
数据采集模块采用DAM-8021, 16位模块
算法描述如下:
真空表读数范围: 0到-101kpa
模拟量输出: 1-5V
一次AD数据采集结果为(由串口助手取得): >+03.921-00.000
此时真空表读数: 74.2
则系数A=(3.921-1)/74.2=0.0393
真空表模拟量输出修正系数: 是指真空表模拟量输出的偏差.
其取得方法为, 将真空去掉,让真空表读数为零, 读一次AD采样的结果, 例如其值为+00.981-00.000, 因为这个真空表的最小模拟量值为1, 因此误差为0.019
AD采样转换结果= (当前AD采样值-1+真空表模拟量输出修正系数)/系数A
为什么要当前AD采样值减1? 这个笔者也不好理解, 经过实验证明确实如此. 也许是真空表是1-5V, 而不是0-5V的原因? 如果有朋友知道为什么, 谢谢回贴指导下笔者.
按上面的示例结果, AD数据采集结果为>+03.921-00.000
则 AD采样转换结果= (3.921-1+0.019) /0.0393= 74.8 , 因为是举的例子, 其真空表模拟量输出修正系数不是现场真实的值,因此计算结果不是74.2, 这里我只是说明计算方法而已.
下面附上代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading; namespace test1
{
//http://www.cnblogs.com/hackpig/ 猪悟能's博客 public partial class Form1 : Form
{
Thread myThread2;
private bool PlcMonitorProcEndFlag = false;
bool f1 = false; public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
} string oldstr = string.Empty;
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string data = serialPort1.ReadExisting();
bool f2=false;
try
{
if (data.Length == ) f2 = true;
string[] ary1 = data.Split('-');
string s1=string.Empty;
if (f2 || ary1.Length == )
{
f1 = true;
if (f2)
s1 = data.Substring(, data.Length - );
else
s1 = ary1[].Substring(, ary1[].Length - );
double v1 = double.Parse(s1); double xs = 0.0396f;// 0396f; /*
真空表读数范围: 0到-101kpa
模拟量输出: 1-5V 示例: 模量量结果, >+03.921-00.000
* 真空表读数, 74.2
则xs=(3.921-1)/74.2=0.0393
*
将真空去掉,让真空表读数为零, 读一次模拟输出, 其值为+00.981-00.000, 因为正常值为1, 因此误差为0.019
这个值在加到变量v1上去.
*/ v1 = v1 - + 0.019;
v1 = v1 /xs;
this.textBox1.Text = v1.ToString("0.00000"); string newstr = s1 + ": " + v1.ToString("0.00000") + Environment.NewLine;
if(!newstr.Equals(oldstr))
this.richTextBox1.AppendText(newstr); oldstr = newstr; if (this.richTextBox1.Text.Length > ) this.richTextBox1.Text = ""; }
}
catch (Exception e1)
{
f1 = false;
}
f1 = false;
} private void Form1_Load(object sender, EventArgs e)
{
try
{
serialPort1.Open();
}
catch
{
MessageBox.Show("port2 dont't open");
Environment.Exit(-);
}
myThread2 = new Thread(new ThreadStart(PlcMonitorProc));
myThread2.Start();
} private void PlcMonitorProc()
{
while (!PlcMonitorProcEndFlag)
{
if (!f1)
{
serialPort1.Write("#01" + Environment.NewLine);
Thread.Sleep();
}
}
PlcMonitorProcEndFlag = false;
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
PlcMonitorProcEndFlag = true;
myThread2.Join();
} private void stop_Click(object sender, EventArgs e)
{
PlcMonitorProcEndFlag = true;
} private void textBox1_TextChanged(object sender, EventArgs e)
{ } private void richTextBox1_TextChanged(object sender, EventArgs e)
{ } }
}
DAM8021, DAM8041这样的AD采集模块, 支持485接口, 因此可以直接用串口助手发送指令的方式取得测量结果, 相比9111卡那样的AD采集板卡, 还需要插入电脑主机槽中并且要装驱动程序, 是方便很多.
这种卡只需要IPC用串口发送字符串 "#01" 就可以取01通道的采集结果.
经用上面代码采集的数据, 跟真空表读数是完全一致的.
下面是采集的一组数据:
AD采样值 AD值计算出的真空值 真空表实际值
原创文章,出处 : http://www.cnblogs.com/hackpig/