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

架构是怎样练成的-楼宇监控系统案例

目录

概要

项目背景

原系统设计方案

改进后的设计方案

小结


概要

绝大多数人掌握的架构都是直接学习,慢慢地才能体会到一个架构的好处。架构是一种抽象,是为了复用目的而对代码做的抽象。通过一个项目的改造,理解架构是如何产生的,是因何产生的。

项目背景

这是一个楼宇集中监控系统,目的是对楼宇中感兴趣的设备进行集中监控,如门磁、配电柜、空调、温度湿度传感器、火警等各类安防、消防、能效、计算机设备,在中央控制室就可以尽在掌握。这些设备通过不同协议把数据传输至中央控制室,采用RS232/485端口传输数据的设备较多,每种设备有不同的串口协议,通过说明书可查数据解析格式。其他采用TCPIP等协议的设备也不在少数。 

原系统设计方案

  • 由于每种设备的属性各不相同,所以为每种设备设计一个数据库表,如有一栋大楼有50种设备,就需要设计50个表存储该设备的属性。例如UPS设备的属性有输入电压,旁路电压,输出电压,逆变器电压,输入电流,旁路电流,输出电流,逆变器电流,输入频率,旁路频率,输出频率,各相有用功率,标称功率,功率因素,电池备份时间,负载率,电池温度)。例如:配电设备的属性有相电压(Va,Vb,Vc),线电压(Vab,Vbc,Vca),三相电流(Ia,Ib,Ic),频率f,有功功率KW,无功功率KVAR,功率参数PF,有功电度KWH;
  • 如果新进一种设备,需要建立新的表,还要编写新的协议解析代码;
  • 如果增加新设备,需要开发新的界面,设置每个设备及其所在地点的映射关系;
  • 其他的维护不再赘述;

逻辑结构如下图所示。

一个楼宇的设备随时增减,这个项目方案会导致开发团队要做全周期的维护和开发,而且低效;

改进后的设计方案

改进后的方案逻辑图如下:

  • 设备属性表,采用<属性名,属性值>方式设计,一张表,包含所有设备的所有属性,可任意增删任何设备及其任何属性;
  • 协议的解析,一般是根据所规定的第几个字节代表什么含义获取数据,比如第3-5字节代表温度。采用BASIC代码解析,然后在C#中执行BASIC代码的方式解决(C#允许运行嵌入的BASIC脚本),对用户来说,只写写BASIC解析仍然比较困难,可开发一个协议解析工具,让用户在界面拖动即可;如果用户仍然没能力使用,可由项目维护人员帮忙写;
  • 比如新增一个设备,可从定义其属性开始,然后通过图形化界面设计工具,用户可定制该设备在某房间平面图上的位置,以及界面要显示的属性等等;
  • 一个房间定制好后,可能包含多个设备,为这多个设备创建其对象,采用多态性,实现设备图表的自动显示;

小结

架构就是把通用的部分尽可能地抽象成数据,以配置的方式提供给用户。

程序员可能还是无法完全摆脱维护,新增一个类型的设备时,需要补充创建一个新设备类,以便于支持多态机制的运行。但不需要修改源代码;此外,案例只考虑了RS232端口传输方式,其他方式有自己的协议,需要做分别处理。但好在设备使用的传输协议可以枚举的过来。

相关文章:

架构是怎样练成的-楼宇监控系统案例

目录 概要 项目背景 原系统设计方案 改进后的设计方案 小结 概要 绝大多数人掌握的架构都是直接学习&#xff0c;慢慢地才能体会到一个架构的好处。架构是一种抽象&#xff0c;是为了复用目的而对代码做的抽象。通过一个项目的改造&#xff0c;理解架构是如何产生的&…...

valgrind使用浅谈

1、Valgrind 简介 Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具&#xff0c;它可在以下平台上运行&#xff1a; X86/Linux、AMD64/Linux、ARM/Linux、ARM64/Linux、PPC32/Linux、PPC64/Linux、PPC64LE/Linu x、S390X/Linux、MIPS32/Linux、MIPS64/Li…...

强化学习专题:强化学习知识梳理(一)

2024/6/23&#xff1a; 前段时间有幸完成了大学期间的第一篇论文。在面试之前复盘一下关于自己论文中DQN的一些相关点。 浅谈主要区别&#xff08;在线 or 离线&#xff09; 首先&#xff0c;一切的开始是强化学习中时序差分方程&#xff0c;这体现了强化学习方法的优化策略。在…...

深入JVM:详解JIT即时编译器

文章目录 深入JVM&#xff1a;详解JIT即时编译器一、序言二、基础概念1、何为JIT即时编译2、热点代码 三、HotSpot内置的即时编译器1、C1编译器2、C2编译器3、分层编译3.1 协作流程 四、常见JIT优化技术1、方法内联2、逃逸分析&#xff08;1&#xff09;同步锁消除&#xff08;…...

ORBSLAM3_ROS_Ubuntu18_04环境搭建安装

orbslam3安装 ORB-SLAM3配置及安装教程&#xff08;2023.3&#xff09;_orbslam3安装-CSDN博客 换源&#xff0c;换成国内的 搜索software 安装工具 sudo apt install git sudo apt update sudo apt install gcc g cmake安装 cmake安装新版本 ubuntu20.04安装cmake详细…...

【opencv - C++ - Ubuntu】putText 显示中文最快方法

话不多说&#xff0c;直接上代码 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/freetype.hpp>using namespace std; using namespace cv;int main(void) {Mat image(1000, 1800, CV_8UC3, Scalar(200,162,33));Ptr<freetype::F…...

百度网盘下载速度慢的解决办法

目录 一、背景 二、解决办法 1、点击三个竖点&#xff0c;再点设置 2、点击传输&#xff0c;再点击去开启该功能 3、点击同意&#xff0c;开启优化速率 三、结果 四、备注 一、背景 当你不是百度网盘会员时&#xff0c;你在使用百度网盘下载时&#xff0c;是否下载速度太…...

Python api接口 异步

Python API接口异步编程简介 在现代的软件开发中&#xff0c;大多数应用都需要通过API接口与其他系统进行交互。Python是一种非常流行的编程语言&#xff0c;因此许多开发者选择使用Python来构建他们的API接口。在一些情况下&#xff0c;API接口需要进行异步编程&#xff0c;以…...

Java 和 Kotlin 单例模式写法对比

目录 1、饿汉模式 Java 写法&#xff1a; Kotlin 写法&#xff1a; Kotlin 这段代码反编译&简化后如下&#xff1a; 2、懒汉模式&#xff0c;静态同步方法 Java 写法&#xff1a; Kotlin 写法&#xff1a; Kotlin 这段代码反编译&简化后如下&#xff1a; 3、懒…...

解析connectionReset异常的原因与解决方案

解析connectionReset异常的原因与解决方案 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Java中connectionReset异常的原因及其解决方案。这…...

mindspore打卡第9天 transformer的encoder和decoder部分

mindspore打卡第9天 transformer的encoder和decoder部分 import mindspore from mindspore import nn from mindspore import ops from mindspore import Tensor from mindspore import dtype as mstypeclass ScaledDotProductAttention(nn.Cell):def __init__(self, dropout_…...

Python实现IPv4地址和16进制互相转换

Python实现IPv4地址和16进制互相转换 import socketdef ip_to_hex16(ipaddr):# 使用 socket 库中的方法将IP地址转换为网络字节序的二进制表示hex_bytes socket.inet_aton(ipaddr)# 将二进制数据转换为整数, 其中byteorderbig 表示使用大端字节序&#xff08;从高位到低位&…...

计算机视觉 | 基于图像处理和边缘检测算法的黄豆计数实验

目录 一、实验原理二、实验步骤1. 图像读取与预处理2. 边缘检测3. 轮廓检测4. 标记轮廓序号 三、实验结果四、完整代码 Hi&#xff0c;大家好&#xff0c;我是半亩花海。 本实验旨在利用 Python 和 OpenCV 库&#xff0c;通过图像处理和边缘检测算法实现黄豆图像的自动识别和计…...

深入分析 Android BroadcastReceiver (七)

文章目录 深入分析 Android BroadcastReceiver (七)1. 高级应用场景1.1 示例&#xff1a;动态权限请求1.2 示例&#xff1a;应用内通知更新 2. 安全性与性能优化2.1 示例&#xff1a;设置权限防止广播攻击2.2 示例&#xff1a;使用 LocalBroadcastManager2.3 示例&#xff1a;在…...

C++中的数据结构

一.STL标准库 结构:STL中有六大组件&#xff0c;分别是&#xff1a;容器&#xff0c;算法&#xff0c;迭代器&#xff0c;仿函数&#xff0c;配接器&#xff0c;配置器&#xff1b;以下分别介绍这六大组件中的最主要的三个。 1.容器 容器来配置存储空间&#xff0c;算法通过…...

武汉星起航:一站式服务,助力亚马逊卖家高效运营,实现收益飞跃

在跨境电商的浪潮中&#xff0c;武汉星起航电子商务有限公司以其独特的一站式跨境电商服务&#xff0c;为众多亚马逊卖家提供了强有力的支持&#xff0c;助力他们在不断发展的市场中脱颖而出&#xff0c;实现收益的大幅提升。 武汉星起航的一站式跨境电商服务&#xff0c;以其…...

从灵感到实践:Kimi辅助完成学术论文选题的文艺之旅

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 昨天我们为大家介绍了ChatGPT辅助完成实现设计&#xff08;AI与学术的交响&#xff1a;ChatGPT辅助下的实验设计新篇章&#xff09;。今天我们再来看看Kimi对于论文选题都能提供哪些帮助…...

华为od-C卷200分题目4 -电脑病毒感染

华为od-C卷200分题目4 -电脑病毒感染 一个局域网内有很多台电脑&#xff0c;分别标注为0 - N-1的数字。相连接的电脑距离不一样&#xff0c;所以感染时间不一样&#xff0c;感染时间用t表示。其中网络内一个电脑被病毒感染&#xff0c;其感染网络内所有的电脑需要最少需要多长…...

show-overflow-tooltip 解决elementui el-table标签自动换行的问题

elementui中 el-table中某一行的高度不想因为宽度不够而撑开换行展示的解决方法。可通过show-overflow-tooltip属性解决&#xff0c;如下 代码是这样的 <el-table-column width"80" prop"id" label"ID"></el-table-column> <el…...

数字社交的领航者:解析Facebook的引领作用

在当今数字化社会中&#xff0c;社交网络已经成为了人们日常生活不可或缺的一部分。而在众多社交平台中&#xff0c;Facebook凭借其巨大的用户基础和创新的技术应用&#xff0c;被公认为数字社交领域的领航者之一。本文将深入解析Facebook在数字社交中的引领作用&#xff0c;探…...

SVN的本地提交

一、下载SVN现在你有一个要被管理的文件夹并且下载好了SVN二、受管理的目录下建一个服务器&#xff08;Server&#xff09;&#xff0c;和要管理的文件夹一级&#xff0c;下图中被红色涂鸦的就是我要管理的文件夹2.1 双击进入svn_Serve的文件夹目录下&#xff0c;接下来如下图操…...

手把手教你用SSD2828点亮MIPI屏:从示波器波形到BIST画面的完整调试记录

SSD2828实战调试&#xff1a;从信号分析到MIPI屏幕点亮的全流程解析 当一块MIPI屏幕无法正常点亮时&#xff0c;硬件工程师的调试工作往往从示波器的波形分析开始。本文将基于SSD2828芯片的RGB转MIPI转换板开发经验&#xff0c;详细还原从信号异常到成功显示BIST画面的完整调试…...

收藏!AI覆盖率94%?程序员别慌,读懂这份报告保住你的饭碗!

Anthropic报告显示AI在程序员领域的理论覆盖率高达94%&#xff0c;但现实替代率仅为33%。AI尚无法大规模取代白领&#xff0c;主要因输出结果需人类承担后果、效率问题及无法替代岗位。高学历者中&#xff0c;机械执行者面临最大威胁&#xff0c;而拥有决策力、策略思考及复杂流…...

如何快速备份微信聊天记录:开源工具WeChatExporter完整指南

如何快速备份微信聊天记录&#xff1a;开源工具WeChatExporter完整指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾担心手机丢失或更换时&#xff0c;那些珍…...

实操:快速把零克云“云端龙虾”将OpenClaw接入飞书

使用零克云“云端龙虾”OpenClaw&#xff0c;将它接入你的飞书&#xff0c;可极大提高您的办公效率&#xff01;包括信息搜集与整理、整理文档&#xff0c;也可以进行日程与提醒管理&#xff0c;或者进行自媒体内容创作。如何快速把零克云OpenClaw“云端龙虾”接入飞书&#xf…...

英文论文怎么降AI?实测从88%降至20%的5大方法(附工具实测)

最近turnitin系统大升级&#xff0c;判定规则变得更加严格。很多不知道怎么给英文降ai的小伙伴对此都感到非常焦虑&#xff0c;检测报告里大面积的标蓝会导致稿件不合格被退回&#xff0c;手动降ai又要一直盯着屏幕改来改去&#xff0c;费时费力。 作为已经在这个领域摸爬滚打两…...

DSub:Android平台上最完整的Subsonic音乐客户端指南

DSub&#xff1a;Android平台上最完整的Subsonic音乐客户端指南 【免费下载链接】Subsonic Home of the DSub Android client fork 项目地址: https://gitcode.com/gh_mirrors/su/Subsonic DSub是一款专为Android设备设计的开源Subsonic客户端&#xff0c;让您能够随时随…...

ES数据库安装

ES数据库安装 # 拉取 Elasticsearch 镜像 docker pull public-docker-virtual.artsz.zte.com.cn/elasticsearch:8.8.2创建宿主机挂载目录# 统一放在 /data/es&#xff0c;便于管理mkdir -p /mnt/data/es/{data,config,logs,plugins}# 权限必须给足&#xff08;否则容器内用户无…...

别再只调包了!深入OpenCV底层:我是如何用‘土办法’手动提取特征实现水果分类的

从调包到造轮子&#xff1a;OpenCV手工特征工程实战水果分类 当所有人都在讨论如何用YOLOv8实现99%准确率时&#xff0c;我却在思考&#xff1a;如果回到没有预训练模型的时代&#xff0c;我们该如何用最基础的图像处理技术解决分类问题&#xff1f;这就像在自动驾驶时代重新学…...

三线制PT100测温,采集到的V5和V6电压怎么算温度?一个公式搞定

三线制PT100测温&#xff1a;从电压采集到温度计算的工程实践 在工业温度测量领域&#xff0c;铂电阻PT100因其出色的稳定性和较宽的测温范围(-200℃~850℃)成为中高温测量的首选。不同于常见的两线制接法&#xff0c;三线制PT100通过增加一条导线有效补偿了线路电阻带来的误差…...