当前位置: 首页 > news >正文

基于查表法的水流量算法设计与实现

写在前面

本文分享的是一种基于查表法的水流量的算法方案设计与实现,算法简单易懂,主要面向初学者,有两个目的:一是给初学者一些算法设计的思路引导;二是引导初学者学习怎样用C语言编程实现。

一、设计需求

  1. 基于“1990年国际温标纯水密表”,通过查表法求出水密度,下图是表的部分截图。
    请添加图片描述

  2. 线性信号(电磁流量计、4-20mA 输出涡街)流量公式:

q = q m a x ⋅ x A ⋅ k ρ q=q_{max}\cdot x_A \cdot k_\rho q=qmaxxAkρ

式中:
q m a x q_{max} qmax:满量程流量,单位与瞬时流量相同。
x A x_A xA:测量流量的模拟信号,0~100% (来自差压变送器未开方信号)。
k ρ k_\rho kρ:为补偿信号(无补偿设为1.0)。

k ρ = ρ i ρ d k_\rho=\frac{\rho_i}{\rho_d} kρ=ρdρi

式中:
ρ i \rho_i ρi:水的工作密度根据测量的温度也是查表得到,kg/m3。
ρ d \rho_d ρd:设计状态下蒸汽、水的密度(见生产单位出厂计算书),kg/m3。

注:蒸汽应有三个数表 (下面三个表均按照《1967IFC公式》)
(1)过热蒸汽密度表;
(2)饱和蒸汽(以压力自变量)密度表;
(3)饱和蒸汽(以温度自变量)密度表;
数表范围大小可根据用户适用范围确定。

二、算法分析

  • 问题1 q m a x q_{max} qmaxqmax的值是多少?

    :设定值 0~999999999。

  • 问题2:差压变送器的信号是什么?从哪里获得?

    :4~20mA,变送器输出。

  • 问题3:是否需要补偿信号?若需要回答以下问题。

    :需要补偿(更精确)

  • 问题4:计算 ρ i \rho_i ρi需要的“表”请提供。

    :查阅文献,下载表。

  • 问题5 ρ d \rho_d ρd的值是多少?

    :设定值0~999999999。

  • 问题6:本项目是水还是蒸汽?若是蒸汽则用哪个表,请提供表。

    :电磁测量的是水,按水的密度表。

三、算法实现

  • 实现语言:C语言
  • 测试环境:VSCode + GCC

程序包括三个文档,如下表:

文件名称包含函数功能
main.cmain()主函数,在该函数内编写测试用例
flowrate.c(1)LinearFlowRate()
(2)GetDensity()
(3)Search_Bin
(4)Destroy()
(5)Creat_SeqFromTab>
(1)求水的线性信号流量
(2)求密度,被LinearFlowRate调用
(3)在有序表中折半查找
(4)释放空间
(5)创建有序表
flowrate.hLinearFlowRate函数声明在H文件中声明的函数,可以被外部调用。

部分源码如下:
flowrate.c

/******************************************************************************************/
//功    能:求水的线性信号流量
//参    数:setQmax:满量程流量,单位与瞬时流量相同,人为设定,取值0~999999999
//	  	 	setDensity:设置状态下蒸汽、水的密度,单位kg/m3,人为设定,取值0~999999999
//	  		transmitterSignal:测量流量的模拟信号,取值0~100%,由4~20mA,压差变送器输出
//	  		temperature:实际采集的温度值
//返 回 值:实际的流量值
//作    者:MJY@二进制
//修改时间:2023-12-11
/*****************************************************************************************/
float LinearFlowRate(long setQmax,long setDensity, float transmitterSignal, float temperature )
{long density;int te;float realFlowrate;te = (int)(temperature*10);				//实际温度乘10是为了查表,表里对应的温度就是实际值的10倍。if ( (te > 409) && (te < 499) )  te = 409;		//这里做判断是因为水密度表里的温度在509-599,609-699,709-799,809-899,909-999没有。else if ((te > 509) && (te < 599))  te = 509;else if ((te > 609) && (te < 699))  te = 609;else if ((te > 709) && (te < 799))  te = 709;else if ((te > 809) && (te < 899))  te = 809;else if ((te > 909) && (te < 999))  te = 909;density = GetDensity(te);if (density){realFlowrate = setQmax * transmitterSignal * ((density / 1000.0) / setDensity); // (density / 1000.0)密度除以1000是因为表中密度是原来的一千倍,除以1000.0不是1000是为了不省略小数值。return realFlowrate;}else//密度返回0表示,表中未找到相对应的温度值{return 0.0; //返回0.0代表发生错误}
}

main.c

#include "flowrate.h"
#include <stdio.h>int main()
{float realFlowrate;realFlowrate = LinearFlowRate(1000, 1000, 0.5, 28.7);printf("%f\n", realFlowrate);system("pause"); return 0;
}

参考源码

源码链接


很高兴能帮助到你!

相关文章:

  • Jenkins的文档翻译
  • 【Linux】权限篇(一)
  • uniapp H5项目使用ucharts的Echart组件方式创建圆环
  • 刷题记录第五十一天-去除重复字母
  • 【STL】C++ string基本使用
  • 前端技术的新趋势:React、Vue与Angular的比较
  • 2023 英特尔On技术创新大会直播 |探索视觉AI的无限可能
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • 如何在Linux中查看正在运行的进程以及过滤特定端口和进程名称
  • LVS最终奥义之DR直接路由模式
  • 基于FPGA的简易BPSK和QPSK
  • 65 数学游戏
  • 【delphi11】delphi基础探索【三、基础组件和事件】
  • 巧用map实现springbean的命令模式
  • Python 时间日期处理库函数
  • 【comparator, comparable】小总结
  • 【css3】浏览器内核及其兼容性
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • HTML-表单
  • Less 日常用法
  • nginx 配置多 域名 + 多 https
  • vuex 学习笔记 01
  • Vue全家桶实现一个Web App
  • Web设计流程优化:网页效果图设计新思路
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 构建工具 - 收藏集 - 掘金
  • 王永庆:技术创新改变教育未来
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • ​第20课 在Android Native开发中加入新的C++类
  • ###STL(标准模板库)
  • #includecmath
  • ()、[]、{}、(())、[[]]命令替换
  • (6)添加vue-cookie
  • (LeetCode) T14. Longest Common Prefix
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)大型网站架构演变和知识体系
  • .gitignore文件设置了忽略但不生效
  • .java 9 找不到符号_java找不到符号
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [codeforces]Checkpoints
  • [ESP32 IDF]web server
  • [HTML API]HTMLCollection