说到模型、模式等概念,我们大概知道什么意思。虽然说不出具体定义,但日常生活或成长过程中肯定接触过。比如,我们从小学开始接触的纸质的考勤表(矩阵,也算是人工智能的根),表格中打勾代表1,空格代表0...。也就是我们几乎都具备了设计模型的能力,但怎么能让现实问题或需求分解成多个模型并将他们用代码标识出来,最终让计算机能够进行处理或计算这个过程离不开编程思想及编写程序(函数)。本文以数据中心基础设施管理系统DCIM(Data Center Infrastructure management)为例,简要讨论模块化编程案例。
1、DCIM系统需求及架构设想
在设计较复杂的程序时,一般采用自顶向下的方法,将问题划分为几个部分,各个部分再进行细化,直到分解为较好解决问题为止。利用函数,不仅可以实现程序的模块化,使得程序设计更加简单和直观,而且还可以把程序中经常用到的一些计算或操作编写成通用函数,以供随时调用。
DCIM(数据中心基础设施管理系统)接入数据中心电力运行、配电监控系统、环境监控系统和安装的设备等数据,提供电力容量管理、温湿度监控管理、UPS电池监控管理、动环告警管理、设备管理、数字运维、能耗分析、智能化巡检、智能运营等业务功能。使整个数据中心的管理更加智能化,提升整体运维效率及运营水平。
DCIM(数据中心基础设施管理系统)应采用可靠稳定的操作系统及编程语言(例如本例企图底层用C语言构建一样),以保证系统的通用性和安全性。DCIM应采用分层模块化设计架构,对整个数据中心进行集中管理,并具有良好的扩容性,可在满足现有需求的同时,可根据后继不断扩容的需求,快速灵活地接入新设备、新系统。其架构示意图1如下所示:
图1 DCIM模块化架构图
2、将模块化架构改为功能(函数)
根据需求构建了图1所示的架构之后,接下来我们通过编程思想尝试用函数来描述(编程)图1的各模块。我们首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来,并定义和调试好各个框架之间的输入、输出链接关系。模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化,将上面模块改为函数后的示意图如下图2所示:
图2 DCIM的函数示意图
3、用C语言“实现”各功能(函数)
用C语言开发软件系统时,为了方便用户大都采用菜单(menu)方式。软件运行时,首先在屏幕上显示出各种功能,用户只要按一些简单的键,便可以进入相应的功能,就像在饭店点菜一样。图3为上述DCIM模拟程序运行后菜单的示意。
图3 DCIM模拟程序主菜单
它共有6个功能,用户只要按一个数字(如“6”),便可进入下一层相应的功能——南向接口。该层又是一个菜单,用户继续选择。
图4 DCIM模拟程序子菜单
上图3和4所对应的部分代码截图如下,完整代码详见本文附件1:
图5 DCIM菜单部分代码
通常程序实现时,主菜单由主函数提供,下面的各级子菜单由各级子函数提供。最末一级的菜单,才提供一些具体的功能。菜单程序是一种常见的程序。它主要由两部分内容构成:
(1)显示菜单——由一些显示操作提供。
(2)根据用户的选择转向相应的函数——由选择结构实现。
从这个过程可以看出,编程过程中理解需求并将其改变为合理的结构(或架构)看起来不需要懂代码而更需要理解业务本身,也是非常关键的环(当然编写程序也很重要)。现实生活中,虽然我们不写程序,但不知不觉中采用编程思维,比如将一个复杂项目分解多个子项目并制定里程碑事件(整体计划),之后按阶段计划逐步进入子项目的实施推进。以上菜单的具体实现代码详见本文附件1所示的dcim.h头文件和main.c源文件,具体代码函的意思不再赘述,感兴趣者可以自行测试。在我看来,看此段代码好比到施工现场看施工过程一样,只是在这个现场中一个码农刚刚开始了“搬砖”任务。
4、结束语
也许以上程序给我们产生回到“文本时代”的感觉。虽然这样文本菜单看起来很过时(或很low),但计算机专业人员反而更喜欢这样简单直接或直白的方式跟计算机进行“交流”,不喜欢中间接入“中介”--图形化界面。大多数非专业用户喜欢图形化界面,也是日常生活中计算机常用的形式。
实际上现在DCIM已经跨越了面向过程和面向对象的编程思想,开始应用面向模式的编程思想(即,我们的注意力转向教授智能机器而不是直接编程,现在讨论这些为时过早)。图像化界面程序开发多数采用面向对象的编程思想,接下来的文章中进一步讨论。
附件1:DCIM模拟系统完整代码
//main.c 源文件
#include
#include
#include
#include "dcim.h"
char printMainMenu();
char printSubMain();
int main() {
int menuID;
//init(); //初始化函数,相当于建筑工程中的准备材料并运到现场
while (1) {
menuID = printMainMenu();
switch (menuID) {
case '1': resourMgmt(); break;
case '2': performanceMgmt(); break;
case '3': troubleMgmt(); break;
case '4': CustomerMgmt(); break;
case '5': pueMgmt(); break;
case '6':
while (1) {
menuID = printSubMain();
switch (menuID) {
case '1': DEMSapi(); break;
case '2': BAapi(); break;
case '3': PUEapi(); break;
case '4': DNCCapi(); break;
case '5': Pwoer(); break;
}
if (menuID == '0') break;
}
break;
case '0': exit(EXIT_SUCCESS);
}
}
//fclose(fp); --关闭初始化init()函数中打开的文件
return 0;
}
//打印主菜单
char printMainMenu() {
char menuID;
system("cls");
printf("***********数据中心基础设施管理系统(DCIM )**********************\\n");
printf("* *\\n");
printf("* ------------------------------------------ *\\n");
printf("* | Data Center Infrastructure management | *\\n");
printf("* ------------------------------------------ *\\n");
printf("* *\\n");
printf("* 1)资源管理 *\\n");
printf("* 2)性能管理 *\\n");
printf("* 3)故障管理 *\\n");
printf("* 4)客户管理 *\\n");
printf("* 5)能效管理 *\\n");
printf("* 6)南向接口 *\\n");
printf("* 0)退出软件 *\\n");
printf("* *\\n");
printf("* ----------------------------------------- *\\n");
printf("* 请在上述功能中选择(1——6) *\\n");
printf("* *\\n");
printf("******************************************************************\\n");
fflush(stdin);
menuID = getch();
return menuID;
}
//打印子菜单
char printSubMain() {
char menuID;
system("cls");
printf("*****************南向接口信息*************************************\\n");
printf("* *\\n");
printf("* 1)动力环监控系统 *\\n");
printf("* 2)BA楼宇智能化系统 *\\n");
printf("* 3)能耗系统 *\\n");
printf("* 4)冷机群控系统 *\\n");
printf("* 5)电力系统 *\\n");
printf("* 0)返回主菜单 *\\n");
printf("* *\\n");
printf("******************************************************************\\n");
fflush(stdin);
menuID = getch();
return menuID;
}
//dcim.h 头文件需要独立放到另一个文件
int resourMgmt() {
};
int performanceMgmt() {
return 0;
};
int troubleMgmt() {
return 0;
};
int CustomerMgmt() {
return 0;
};
int pueMgmt() {
return 0;
};
int DEMSapi() {
return 0;
};
int BAapi() {
return 0;
};
int PUEapi() {
return 0;
};
int DNCCapi() {
return 0;
};
int Pwoer() {
return 0;
};
-
操作
+关注
关注
0文章
43浏览量
19031 -
程序
+关注
关注
117文章
3817浏览量
82210 -
函数
+关注
关注
3文章
4365浏览量
63914
发布评论请先 登录
VerilogHDL模块化程序设计
《通过uart协议理解何为接口设计何为模块化设计(封装)》含程序和视频
C语言模块化程序设计理解
C语言模块化程序设计需理解哪些呢
c++程序设计_基于proteus的51单片机开发实例30-模块化程序设计


飞凌嵌入式携手中移物联,谱写全国产化方案新生态
4月22日,飞凌嵌入式“2025嵌入式及边缘AI技术论坛”在深圳成功举办。中移物联网有限公司(以下简称“中移物联”)携OneOS操作系统与飞凌嵌入式共同推出的工业级核心板亮相会议展区,操作系统产品部高级专家严镭受邀作《OneOS工业操作系统——助力国产化智能制造》主题演讲。

ATA-2022B高压放大器在螺栓松动检测中的应用
实验名称:ATA-2022B高压放大器在螺栓松动检测中的应用实验方向:超声检测实验设备:ATA-2022B高压放大器、函数信号发生器,压电陶瓷片,数据采集卡,示波器,PC等实验内容:本研究基于振动声调制的螺栓松动检测方法,其中低频泵浦波采用单频信号,而高频探测波采用扫频信号,利用泵浦波和探测波在接触面的振动声调制响应对螺栓的松动程度进行检测。通过螺栓松动检测

MOS管驱动电路——电机干扰与防护处理
此电路分主电路(完成功能)和保护功能电路。MOS管驱动相关知识:1、跟双极性晶体管相比,一般认为使MOS管导通不需要电流,只要GS电压(Vbe类似)高于一定的值,就可以了。MOS管和晶体管向比较c,b,e—–>d(漏),g(栅),s(源)。2、NMOS的特性,Vgs大于一定的值就会导通,适合用于源极接地时的情况(低端驱动),只要栅极电压达到4V或10V就可以

压敏(MOV)在电机上的应用剖析
一前言有刷直流电机是一种较为常见的直流电机。它的主要特点包括:1.结构相对简单,由定子、转子、电刷和换向器等组成;2.通过电刷与换向器的接触来实现电流的换向,从而使电枢绕组中的电流方向周期性改变,保证电机持续运转;3.具有调速性能较好等优点,可以通过改变电压等方式较为方便地调节转速。有刷直流电机在许多领域都有应用,比如一些电动工具、玩具、小型机械等。但它也存

硬件原理图学习笔记
这一个星期认真学习了硬件原理图的知识,做了一些笔记,方便以后查找。硬件原理图分为三类1.管脚类(gpio)和门电路类输入输出引脚,上拉电阻,三极管与门,或门,非门上拉电阻:正向标志作用,给悬空的引脚一个确定的状态三极管:反向三极管(gpio输出高电平,NP两端导通,被控制端导通,电压为0)->NPN正向三极管(gpio输出低电平,PN两端导通,被控制端导通,

TurMass™ vs LoRa:无线通讯模块的革命性突破
TurMass™凭借其高传输速率、强大并发能力、双向传输、超强抗干扰能力、超远传输距离、全国产技术、灵活组网方案以及便捷开发等八大优势,在无线通讯领域展现出强大的竞争力。

RZT2H CR52双核BOOT流程和例程代码分析
RZT2H是多核处理器,启动时,需要一个“主核”先启动,然后主核根据规则,加载和启动其他内核。本文以T2H内部的CR52双核为例,说明T2H多核启动流程。

干簧继电器在RF信号衰减中的应用与优势
在电子测试领域,RF(射频)评估是不可或缺的一部分。无论是研发阶段的性能测试,还是生产环节的质量检测,RF测试设备都扮演着关键角色。然而,要实现精准的RF评估,测试设备需要一种特殊的电路——衰减电路。这些电路的作用是调整RF信号的强度,以便测试设备能够准确地评估RF组件和RF电路的各个方面。衰减器的挑战衰减器的核心功能是校准RF信号的强度。为了实现这一点,衰

ElfBoard嵌入式教育科普|ADC接口全面解析
当代信息技术体系中,嵌入式系统接口作为数据交互的核心基础设施,构成了设备互联的神经中枢。基于标准化通信协议与接口规范的技术架构,实现了异构设备间的高效数据交换与智能化协同作业。本文选取模数转换接口ADC作为技术解析切入点,通过系统阐释其工作机理、性能特征及重要参数,为嵌入式学习者爱好者构建全维度接口技术认知框架。

深入理解C语言:C语言循环控制
在C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循环控制语句,如break、continue和goto,用于改变程序的执行流程,使代码更加灵活和可控。本文将详细介绍这些语句的作用及其应用场景,并通过示例代码进行说明。Part.1break语句C语言中break语句有两种

第 21 届(顺德)家电电源与智能控制技术研讨会圆满落幕--其利天下斩获颇丰
2025年4月25日,其利天下应大比特之邀出席第21届(顺德)家电电源与智能控制技术研讨会,已圆满落幕。一、演讲回顾我司研发总监冯建武先生在研讨会上发表了主题为《重新定义风扇驱动:一套算法兼容百种电机的有效磁链观测器方案》的演讲,介绍了我司研发自适应技术算法(简称),该方案搭载有效磁链观测器,适配百种电机类型,结合FOC算法可实现免调参稳定启动、低速静音控制

来自资深工程师对ELF 2开发板的产品测评
来自资深工程师对ELF 2开发板的使用测评

飞凌嵌入式2025嵌入式及边缘AI技术论坛圆满结束
飞凌嵌入式「2025嵌入式及边缘AI技术论坛」在深圳深铁皇冠假日酒店盛大举行,此次活动邀请到了200余位嵌入式技术领域的技术专家、企业代表和工程师用户,共享嵌入式及边缘AI技术的盛宴!

常用运放电路总结记录
一、电压跟随器电压跟随器,电路图如下:电路分析:(本文所有的运放电路分析,V+表示运放同向输入端的电压,V-表示反向输入端的电压。)1.1电压跟随器反馈电阻需不需要?在上面的电压跟随器示例中,我画上了一个反馈电阻R99,大家在学习的运放的时候,可能很多地方也会提一下这个反馈电阻,很多地方会说可加可不加,效果一样。电阻需不需要加:但是本文这里个人建议使用电压跟

运放-运算放大器经典应用电路大全-应用电路大全-20种经典电路
20种运放典型电路总结,电路图+公式1、运放的符号表示2、集成运算放大器的技术指标(1)开环差模电压放大倍数(开环增益)大Ao(Ad)=Vo/(V±V-)=107-1012倍;(2)共模抑制比高KCMRR=100db以上;(3)输入电阻大ri>1MW,有的可达100MW以上;(4)输出电阻小ro=几W-几十W3、集成运放分析方法(V+=V-虚短,ib-=ib
评论