[连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计

简介: 目       录 C#通讯(串口和网络)框架的设计与实现... 1 (SuperIO)- 框架的总体设计... 1 第二章           框架总体的设计... 2 2.1           宿主程序设计.

目       录

C#通讯(串口和网络)框架的设计与实现... 1

(SuperIO)- 框架的总体设计... 1

第二章           框架总体的设计... 2

2.1           宿主程序设计... 2

2.2           通讯机制设计... 7

  2.2.1    串口通讯机制... 8

     2.2.1.1   轮询模式... 9

  2.2.2    网络通讯机制... 9

     2.2.2.1   轮询模式... 9

     2.2.2.2   并发模式... 10

     2.2.2.3   自控模式... 11

2.3           层次示意图... 12

2.4           模型对象示意图... 13

2.5           小结... 13

 

第二章     框架总体的设计

2.1    宿主程序设计

    作为插件式应用框架,要有一个宿主程序来承载、加载插件,为插件、驱动提供可运行的环境,使宿主程序与插件无缝对接。宿主程序与插件的关系是水和鱼的关系,有水没鱼,水就失去了价值;有鱼没水,鱼就会死去。从关系的角度来分析,开发框架的目的是什么?是与其他事物发生关系,包括:开发者、二次开发者、应用者、插件、甚至其他软件或组件等。发生的关系越多、相处越融洽,证明这个框架的价值越高。所以说,一个好的框架平台,不仅体现了开发者的技术,同时反应了开发者的情商。

    SuperIO框架使用NET反射技术开发插件管理机制,在本章中不详细介绍具体的技术细节,在《第8章 插件引擎设计》中再进行详细的介绍技术应用。

    那么一个框架的宿主程序应该怎么样去设计呢?或是说从哪些方面去考虑设计问题?在开发SuperIO框架的时候,一直在思考这个问题。首先,这个问题不应该从技术角度去考虑,而应该从人的角度去考虑如何做,应用者的角度、二次开发者的角度来规划宿主程序。

    从应用角度来分析,宿主程序应该包括:用户管理、设备驱动管理、设备状态监视方式、自定义UI插件显示方式、自定义输出数据插件操作方式、服务插件的服务方式、软件运行的监视方式、串口IO通道监视方式、网络IO通道监视方式等等。这些是我们从大的方向规划的,还需要再进一步细化,指引我们的开发工作。

    用户管理,要支持多用户以及用户权限分配。针对实时数据采集框架,面对现场应用的时候,肯定会涉及到两个角色:使用人员、工程师人员。针对使用人员的权限定位:可以查看参数和数据信息。针对工程师人员的权限定位:不仅拥有使用人员的权限,还可以修改参数。用户管理的菜单,如下图:

     设备驱动管理,设备驱动(插件)是通过接口、抽象类设计的框架核心部分之一,可以把二次开发好的设备插件加载到框架中运行,完成数据采集、校验、解析、处理等相关操作,以及进行命令、数据的交互。同时,设备驱动管理还应该具体删除相关的设备插件的功能。增加设备插件,如下图:

     

     设备状态监视方式,我们可以把它称为“设备运行器”,它并不是对不同类型设备驱动的所有参数、属性等数据进行简单显示,而是对设备通用参数、属性、实时状态等数据进行显示、监视,例如:设备ID、设备名称、地址、通讯类型、IO参数、IO状态、通讯状态、设备状态、报警状态、设备类型和编号等。如下图:

     自定义UI插件显示方式,二次开发者在规范的接口基础上开发数据显示方式,挂载到框架的配置文件中,当用户单击某一个显示视图的时候,以Tab Form的形式显示,并且可以单击按钮进行关闭,如下图:

   

     自定义输出数据插件操作方式,这种输出数据的是对实时数据的导出,更多的是以事务性的服务存在,可以把一类的设备数据输出成多种数据格式。输出数据插件可以通过配置文件进行加载,只要设备驱动有数据更新,就把数据通过接口传递给输出数据插件,进行输出操作。不在配置文件中配置插件信息,则程序不进行加载,不进行输出操作。所以,这种事务性的服务不需要界面来完成,可以在宿主程序启动时通过代码来完成。

     服务插件的服务方式,这种服务是长期运行的事务性任务,所以更复杂一些。有些服务需要随宿主程序启动而自动运行,有些服务需要人工手动启动才运行。在宿主程序启动的时候要把服务的信息加载到菜单上,菜单里显示的这些服务可能有些已经启动了,有些需要通过单击操作,显示窗体并填写必要的信息后才可能启动。所以,宿主程序与服务插件不是单向交互,而是双向数据、事件交互。例如:把设备的数据采集上来、处理之后,要把数据上传到服务中心或其他区域,就可以开发一个插件来完成这项任务,如下图:

     软件运行的监视方式,这是一种实时日志监视器,可以监视框架运行情况、以及设备的运行情况。把异常的信息可以友好的显示出来,把异常的详细信息保存到日志文件。我们可以把它称为“运行监测器”,对于实时数据采集框架的运行是很有帮助的。如下图:

   

     串口IO通道监视方式,当某一个设备驱动以串口方式通讯时,当串口参数动态发生改变时会在串口监视器反映当前串口IO状态,例如:增加串口、删除串口、串口号和波特率的改变等。如下图:

     网络IO通道监视方式,相对好设计一些,只需要对Socket实例的连接和断开进行事件反映,Socket实例有效时把信息增加到网络监视器中,Socket实例无效时,并释放了相关资源后,从网络监视器删除相关信息。如下图:

      基于以上的分析,我们需要构建一个完整的宿主程序,必要的功能要有,但是这个程序不一定很复杂,因为有些功能、响应、属性、数据等可以放到设备插件中完成,在《第3章   设备驱动的设计》中详细介绍设计情况。构建的宿主程序,如下图:

     如果光有了宿主程序,那么还没有分析全面。还需要以二次开发者的角度分析宿主程序是否能够与二次开发者保持良好的关系。这里涉及到宿主程序存在的形式问题,宿主程序作为SuperIO框架的一部分,是一个整体的组件。希望二次开发者继承宿主程序就可以快速构建一个自己的主程序,可以在此基础上扩展功能,这样的话,需要把宿主程序的关键控件的访问权限设置成protected。另外,宿主程序还需要一个配置文件,把二次开发者关心的参数可设置,例如:标题、版本号、公司名称等。

    经过上述的过程,我们就对宿主程序有一个清晰认识和规划。界面的骨架已经搭建出来,在后期的开发过程序中从细节着手,逐步实现这些功能。但是,这样一个简单的界面需要很多类、模块等支撑。以后章节会对每个模块进行详细设计说明。                                

2.2    通讯机制设计

    对于实时数据采集框架,通讯部分始终是软件的核心,要求高实时性、高稳定性。软件框架决定了软件运行的稳定性,以及以后的扩展性,所以需要对通讯机制、控制方式进行良好的设计。

    在《1.通讯框架介绍》中的已经对应用场景进行了介绍,所以决定了软件框架在通讯方面的应用有两种方式:主动请求和被动接收。

    主动请求方式又可以称之为呼叫应答方式或主从方式。也就是说,主动权在软件框架端,只有软件框架主动发送请求命令,从机(硬件设备、传感器等)接收到命令后并且检验数据的完整性,以及确定是否发给自己的命令,校验成功后,返回指定的数据信息,完成一次完整的链路通讯过程。呼叫应答通讯方式,如下图:

   被动接收方式是软件框架实时监测IO通道,只要有数据信息就会提取出来,进行数据校验,检验成功后,分析、处理、保存数据信息。例如设备、传感器等定时发送状态数据。这种通讯方式,如下图:

 

    在复杂的应用场景中,这两种通讯方式都有可能存在,此类情况一般是采用以太网链路进行通讯。针对只有外接串口的设备可以通过以太网转换模块来接入。

   

2.1.1    串口通讯机制

由于串口通讯的特性限制,避免多个硬件设备连接到串口总线出现数据混乱

现象,一般采用轮询模式的呼叫应答通讯机制。

2.1.1.1     轮询模式

当有多个设备连接到通讯平台时,通讯平台会轮询调度设备进行通讯任务。某一时刻只能有一个设备发送请求命令、等待接收返回数据,这个设备完成发送、接收(如果遇到超时情况,则自动返回)后,下一个设备才进行通讯任务,依次轮询设备。如下图:

2.2.2    网络通讯机制

   轮询通讯机制是保证数据有序的发送、接收,避免并发数据在串口总线上出现混乱,但是这种通讯机制是以降低性能为代价的,适用于串口通讯,在以太网通讯中显然无法充分利用网络通讯的优势。以太网是独立信道、可以全双工通讯。为了充分发挥以太网的优势,在轮询通讯机制的基础上增加了并发通讯模式、自控通讯模式。一是为了提高通讯的性能,二是为了二次开发有更多自主控制权。

2.2.2.1     轮询模式

   以太网轮询通讯模式与串口通讯模式一致,如下图:

2.2.2.2    并发模式

     并发通讯模式是集中发送所有设备的请求指令,现在SuperIO框架是采用循环同步方式发送请求命令。还有进一步提高的机会,采用并行异步方式集中发送请求命令。硬件设备接收到指令后进行校验,校验成功后返回对应指令的数据,通讯平台异步监听到数据信息后,进行接收操作,然后再进行数据的分发、处理等。如下图:

2.2.2.3    自控模式

     自控通讯模式与并发通讯模式类似,区别在于发送指令操作交给设备驱动本身进行控制,或者说交给二次开发者,二次开发者可以通过时钟定时用事件驱动的方式发送指令数据。硬件设备接收到指令后进行校验,校验成功后返回对应指令的数据,通讯平台异步监听到数据信息后,进行接收操作,然后再进行数据的分发、处理等。

      自控通讯模式可以为二次开发者提供精确的定时请求实时数据机制,使通讯机制更灵活、自主。如下图:

      并发模式和自控模式都可被动接收数据,应用场景更加灵活,使软件框架和硬件设备的开发过工作更自由。

2.3   层次示意图

2.4    模型对象示意图

2.5    小结

   框架的总体设计是指引开发的方向性的原则,保证在后续开发的过程不偏离我们思考的初中。宿主程序规范了应用的方向、通讯机制规范了交互的原则、以及在层次上、对象模型上进一步解构框架的组成。

   层次示意图和模型对象示意图是后来补充画的,这部分工作应该在框架开发前就应该进行规划,这对理解框架很有帮助,并且可以避免减少走弯路的可能性。

 

下一章:第3章 设备驱动的设计

 

作者:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

文档下载:http://pan.baidu.com/s/1pJ7lZWf

官方网址:http://www.bmpj.net

 

相关文章
|
4月前
|
设计模式 安全 测试技术
深入理解与应用自动化测试框架 — 以Selenium为例网络防线的构筑者:洞悉网络安全与信息安全的核心要素
【5月更文挑战第29天】 在快速迭代的软件开发过程中,自动化测试已成为提高测试效率、确保软件质量的重要手段。本文将深入探讨自动化测试框架Selenium的核心概念、架构以及实际应用中的关键技巧,旨在为读者提供一篇系统性的分析与实践指南。文章首先概述了自动化测试的必要性和Selenium框架的基本特征;随后详细剖析了Selenium的组件结构,并结合实例讲解如何高效地设计和执行测试用例;最后,讨论了当前自动化测试面临的挑战及未来发展趋势。
|
21天前
|
存储 算法 Java
Java中的集合框架深度解析云上守护:云计算与网络安全的协同进化
【8月更文挑战第29天】在Java的世界中,集合框架是数据结构的代言人。它不仅让数据存储变得优雅而高效,还为程序员提供了一套丰富的工具箱。本文将带你深入理解集合框架的设计哲学,探索其背后的原理,并分享一些实用的使用技巧。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往高效编程的大门。
|
1月前
|
数据采集 存储 中间件
Python进行网络爬虫:Scrapy框架的实践
【8月更文挑战第17天】网络爬虫是自动化程序,用于从互联网收集信息。Python凭借其丰富的库和框架成为构建爬虫的首选语言。Scrapy作为一款流行的开源框架,简化了爬虫开发过程。本文介绍如何使用Python和Scrapy构建简单爬虫:首先安装Scrapy,接着创建新项目并定义爬虫,指定起始URL和解析逻辑。运行爬虫可将数据保存为JSON文件或存储到数据库。此外,Scrapy支持高级功能如中间件定制、分布式爬取、动态页面渲染等。在实践中需遵循最佳规范,如尊重robots.txt协议、合理设置爬取速度等。通过本文,读者将掌握Scrapy基础并了解如何高效地进行网络数据采集。
123 6
|
12天前
|
JSON 测试技术 C#
C#/.NET/.NET Core优秀项目框架推荐榜单
C#/.NET/.NET Core优秀项目框架推荐榜单
|
1月前
|
机器学习/深度学习 人工智能 PyTorch
AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比
AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比
57 1
|
19天前
|
开发者 C# Android开发
Xamarin 与 .NET:解锁现代化移动应用开发的超级武器——深入探讨C#与.NET框架如何赋能跨平台应用,实现高效编码与卓越性能
【8月更文挑战第31天】Xamarin 与 .NET 的结合为开发者提供了强大的平台,用于构建现代化移动应用。通过 C# 和 .NET 框架,Xamarin 可以实现一次编写、多平台运行,覆盖 iOS、Android 和 Windows。这种方式不仅节省了开发时间和成本,还保证了应用的一致性和高质量。Xamarin 是一个开源框架,专为跨平台移动应用开发设计,允许使用 C# 语言和 .NET 核心库构建原生应用,并访问各平台特定功能。微软维护的 Xamarin 是 Visual Studio 生态系统的一部分,极大地提高了开发效率。
48 0
|
19天前
|
测试技术 数据库
探索JSF单元测试秘籍!如何让您的应用更稳固、更高效?揭秘成功背后的测试之道!
【8月更文挑战第31天】在 JavaServer Faces(JSF)应用开发中,确保代码质量和可维护性至关重要。本文详细介绍了如何通过单元测试实现这一目标。首先,阐述了单元测试的重要性及其对应用稳定性的影响;其次,提出了提高 JSF 应用可测试性的设计建议,如避免直接访问外部资源和使用依赖注入;最后,通过一个具体的 `UserBean` 示例,展示了如何利用 JUnit 和 Mockito 框架编写有效的单元测试。通过这些方法,不仅能够确保代码质量,还能提高开发效率和降低维护成本。
34 0
|
19天前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
49 0
|
19天前
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
32 0
|
1月前
|
Java 应用服务中间件 Linux
(九)Java网络编程无冕之王-这回把大名鼎鼎的Netty框架一网打尽!
现如今的开发环境中,分布式/微服务架构大行其道,而分布式/微服务的根基在于网络编程,而Netty恰恰是Java网络编程领域的无冕之王。Netty这个框架相信大家定然听说过,其在Java网络编程中的地位,好比JavaEE中的Spring。