基于查表法的水流量算法设计与实现
写在前面
本文分享的是一种基于查表法的水流量的算法方案设计与实现,算法简单易懂,主要面向初学者,有两个目的:一是给初学者一些算法设计的思路引导;二是引导初学者学习怎样用C语言编程实现。
一、设计需求
-
基于“1990年国际温标纯水密表”,通过查表法求出水密度,下图是表的部分截图。

-
线性信号(电磁流量计、4-20mA 输出涡街)流量公式:
q = q m a x ⋅ x A ⋅ k ρ q=q_{max}\cdot x_A \cdot k_\rho q=qmax⋅xA⋅kρ
式中:
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.c | main() | 主函数,在该函数内编写测试用例 |
| flowrate.c | (1)LinearFlowRate() (2)GetDensity() (3)Search_Bin (4)Destroy() (5)Creat_SeqFromTab> | (1)求水的线性信号流量 (2)求密度,被LinearFlowRate调用 (3)在有序表中折半查找 (4)释放空间 (5)创建有序表 |
| flowrate.h | LinearFlowRate函数声明 | 在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;
}
参考源码
源码链接
很高兴能帮助到你!
相关文章:
基于查表法的水流量算法设计与实现
写在前面 本文分享的是一种基于查表法的水流量的算法方案设计与实现,算法简单易懂,主要面向初学者,有两个目的:一是给初学者一些算法设计的思路引导;二是引导初学者学习怎样用C语言编程实现。 一、设计需求 基于“19…...
Python:复制、移动文件到指定文件夹
需要考虑的问题: 指定文件夹是否存在,不存在则创建在指定文件夹中是否存在同名文件,是覆盖还是另存为 import os import shutil import tracebackdef copyfile(srcfile, dstpath, replaceFalse):"""复制文件到指定文件夹par…...
类和对象(中篇)
类的六个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数: 用户没有显式实现,编译器会…...
简单几步完成SVN的安装
介绍以及特点 SVN:Subversion,即版本控制系统。 1.代码版本管理工具 2.查看所有的修改记录 3.恢复到任何历史版本和已经删除的文件 4.使用简单上手快,企业安全必备 下载安装 SVN的安装分为两部分,第一部分是服务端安装&…...
NFS原理详解
一、NFS介绍 1)什么是NFS 它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录。 NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中。 在本地的NFS客户端的机器看来,NFS服务器端共享的目录就好像自己的磁…...
查询后矩阵的和
说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 问题描述 给你一个整数 n 和一个下标从 0 开始的 二维数组 queries ,其中 queries[i] [t…...
Flutter实现丝滑的滑动删除、移动排序等-Dismissible控件详解
文章目录 Dismissible 简介使用场景常用属性基本用法举例注意事项 Dismissible 简介 Dismissible 是 Flutter 中用于实现可滑动删除或拖拽操作的一个有用的小部件。主要用于在用户对列表项或任何其他可滑动的元素执行删除或拖动操作时,提供一种简便的实现方式。 使…...
JDK bug:ciObjectFactory::create_new_metadata:原因完全解析
文章目录 1、问题2.详细日志2.关键日志3.结论4.JDK:bug最终bug链接: 京东遇到过类似bug各位大佬如果有更详细的解答可以留言。 1、问题 服务不通,接口404,查看日志有一下截图,还有一个更详细的日志 2.详细日志 # #…...
【数据结构】并查集的简单实现,合并,查找(C++)
文章目录 前言举例: 一、1.构造函数2.查找元素属于哪个集合FindRoot3.将两个集合归并成一个集合Union4.查找集合数量SetCount 二、源码 前言 需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规…...
2023美团商家信息
2023美团商家电话、地址、经纬度、评分、均价、执照......
0155 - Java 数组
1 数组介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。 即:数(数据)组(一组)就是一组数据 2 数组的使用 2.1 使用方式一 2.2 使用方式二 3 数组使用注意事项和细节 数组是多个相同类型数据的组合,实现对这些数据…...
Java 语言有哪些特点
Java语言具有以下特点: 简单易学:Java语法相对简单,与C相比更容易上手。 面向对象:Java是一门纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的特性。 平台无关性:Java程序可以在不同的操作系统…...
SAP 特殊采购类50简介----虚拟件
今天我们测试一下特殊类50,也就是我们常说的虚拟件。 虚拟物料是库存中实际不存在的物料清单(BOM)的子装配件,它用于简化物料清单。尽管虚拟物料出现在物料清单中,但生产订单显示制造虚拟物料所需的组件,而不是虚拟物料本身。 我们举个列子,生产的手机是有包装的,有盒子…...
C语言——内存函数的使用与模拟实现
大家好,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流 本文由:残念ing 原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客,欢迎各位…...
Mysql索引事务(面试高频)
文章目录 目录 文章目录 前言 一 . 索引 1.1 概念 1.2 作用 1.3 使用场景 1.4 存储引擎 二 . 事务 2.1 事务的概念 2.2 事务四大特性 前言 大家好,今天给大家绍一下mysql索引和事务 一 . 索引 1.1 概念 索引是一种特殊的文件,包含着对数据表中的所有记录的引用指针…...
SpringCloudGateway 3.1.4版本 Netty内存泄漏问题解决
一、 产生的异常 当时是服务器访问不到服务了,上去一看,无法申请资源OutOfDirectMemoryError了,内存级别的东西让人一阵头大,赶紧在线下模拟, 1. 减少分配的堆外内存,打开Netty的监测工具等有助于复现的…...
STM32内部是怎么工作的
STM32是怎么工作的 1 从孩子他妈说起2 早期计算机的组成2.1 五大元件(1)第一个出场的是电容元件(2)第二个出场的是二极管(3)第三个出场的是电阻元件(4)第四个出场的是电感࿰…...
MyBatis的配置文件
目录 MyBatis配置 1.properties标签 2.typeAliases标签 3.Mappers标签 一个最全面的MyBatis配置文件可能会包含各种不同的设置和选项,根据实际情况,可以根据需要添加或删除配置。以下是一个包含各种可能设置的示例。 这个配置文件包含了环境设置、数…...
MCU平台下确定栈空间大小的方法
本文介绍MCU平台下确定栈空间大小的方法。 通常使用IDE开发MCU程序在生成Image文件时,Image文件被划分为代码区,数据区,BSS区,堆区,栈区。其中,代码区,数据区,BSS区空间大小由编译器…...
Flink系列之:SQL提示
Flink系列之:SQL提示 一、动态表选项二、语法三、例子四、查询提示五、句法六、加入提示七、播送八、随机散列九、随机合并十、嵌套循环十一、LOOKUP十二、进一步说明十三、故障排除十四、连接提示中的冲突案例十五、什么是查询块 SQL 提示可以与 SQL 语句一起使用来…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
