实验采用带模拟量,分辨率为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/

最新文章

  1. JS刷新父窗口的几种方式<转>
  2. 云主机不能外网ssh连接,只能内网ssh连接的问题处理
  3. 解决 SVN cleanup 任务中断导致无法 update
  4. jq实现某个标签内,达到一定字数后,剩下的用 ... 显示
  5. iOS添加自定义字体方法
  6. indexOf()不区分大小写用法
  7. 【HDOJ】5155 Harry And Magic Box
  8. Postman 安装及使用入门教程(转)
  9. JavaWeb总结(十)—文件上传和下载
  10. iOS钉钉远程打卡助手(支持越狱和非越狱)
  11. windows汇编环境配置
  12. I/O模型
  13. rs232接口定义
  14. java_26 缓冲流
  15. MRTG在Windows平台的安装及使用
  16. WPF 实现阴影效果
  17. Cocos Creator EditBox(编辑框/输入框)添加事件的两种方法
  18. maven不同环境的profile配置
  19. 在 ASP.NET MVC 中使用异步控制器
  20. redis的其他命令

热门文章

  1. ASP.NET EntityFrameworkCore code first 多对多设计
  2. js 跨域 Jquery取得iframe中元素的几种方法
  3. ORA-01033错误解决方案
  4. Intellij 2016非服务器激活
  5. Lua格式化输出
  6. 如何在LINUX中安装VM-Tools
  7. sublime text--你所不知道的12个秘密
  8. python 捕捉错误,exception,traceback和sys.exc_info()比较
  9. 苹果官方xcodeprojectbuild设置指南
  10. 错误 error C2678: 二进制“<”: 没有找到接受“const card”类型的左操作数的运算符(或没有可接受的转换)