[连载]《C#通讯(串口和网络)框架的宏图以及实现》-1.报道框架介绍

目       录

[连载]《C#通讯(串口和网)框架的筹划及实现》-
0.前曰

季节           设备驱动管理器的设计… 2

 

4.1           接口定义… 2

目       录

4.2           设备容器… 7

先是章           通讯框架介绍… 2

4.3           生成设备ID.. 7

1.1           通讯的本质… 2

4.4           对设备容器操作的互斥… 8

1.2           框架简介… 3

4.5           获得装备列表… 8

1.3           解决现实问题… 4

4.6           设备计数器的特种用处… 8

1.4           应用场景… 5

4.7           小结… 10

1.5           框架下特点… 6

 

1.6           框架设计特点… 7

季回     设备驱动管理器的筹划

   
设备驱动管理器是本着IRunDevice设备驱动接口的治本,是框架重要的局部之一。不管设备驱动管理器怎么设计、以什么形式有,在概念上必将是存的。设计好的设备驱动管理器对于框架平台的稳定运行重大。

  
于介绍装备驱动管理器之前,先简单介绍一下IO控制器(IIOController),它根本担负对IO和装备进行调度,并令装置运行,在《第5章节
串口和网的IO设计》进行详尽的牵线。也就是说一个IO控制器可能会见指向承诺多单设施驱动(插件)。

  
早期的时,每个IO控制器都出一个配备驱动管理器。在框架平台启动的下,根据设备驱动之报导参数将相应的设备驱动分配到对应的IO管理器;当IO参数有变动的时刻,会接触事件,把该设施驱动从即IO控制器移动及任何一个IO控制器。

  
从工作角度来考虑,这样做并从未呀问题,并且直接运转的那个稳定。但是,从模块化、扩展性角度来设想,不是不过美好,如果以另地方调用某一个设施驱动时,不能够一直、很快的找到该设备驱动,必要遍历IO控制器又配合相应的配备驱动,并且操作麻烦与效率不愈。

  
于对框架平台展开重构的时刻,把该问题进行了重新考虑,并把相互关联的题目共化解。把每个IO控制器中之装置驱动管理器进行了做,用一个配备驱动管理器来就框架平台的和谐工作。

  
这块涉及到之技能并无碍事,也大容易了解,但是在规划过程中得留意有细节问题,这些问题或者影响框架平台的安宁。

1.7           插件式应用框架… 9

4.1    接口定义

    先定义一个接口(IDeviceManager<TKey,
TValue>),确定设备驱动管理器都如完成什么功效,增加设备、删除设备、获得装备及列表、以及另外的效益。接口代码如下:

public interface IDeviceManager<TKey, TValue> : IEnumerable<TValue> where TValue : IRunDevice
{
       /// <summary>
       /// 新建设备的ID,且唯一
       /// </summary>
       /// <returns></returns>
       string BuildDeviceID();

       /// <summary>
       /// 增加设备
       /// </summary>
       /// <param name="key"></param>
       /// <param name="val"></param>
       void AddDevice(TKey key, TValue val);

       /// <summary>
       /// 删除设备
       /// </summary>
       /// <param name="key"></param>
       void RemoveDevice(TKey key);

       /// <summary>
       /// 移除所有设备
       /// </summary>
       void RemoveAllDevice();

       /// <summary>
       /// 获得值集合
       /// </summary>
       /// <returns></returns>
       List<TValue> GetValues();

       /// <summary>
       /// 获得关键字集合
       /// </summary>
       /// <returns></returns>
       List<TKey> GetKeys();

       /// <summary>
       /// 获得设备的ID和名称
       /// </summary>
       /// <returns></returns>
       Dictionary<int, string> GetDeviceIDAndName();

       /// <summary>
       /// 获得高优先运行设备
       /// </summary>
       /// <param name="vals"></param>
       /// <returns></returns>
       TValue GetPriorityDevice(TValue[] vals);

       /// <summary>
       /// 获得单个设备
       /// </summary>
       /// <param name="key"></param>
       /// <returns></returns>
       TValue GetDevice(TKey key);

       /// <summary>
       /// 获得设备数组
       /// </summary>
       /// <param name="para">IP或串口号</param>
       /// <param name="ioType">通讯类型</param>
       /// <returns></returns>
       TValue[] GetDevices(string para, CommunicationType ioType);

       /// <summary>
       /// 获得指定IP和工作模式的网络设备
       /// </summary>
       /// <param name="remoteIP"></param>
       /// <param name="workMode"></param>
       /// <returns></returns>
       TValue[] GetDevices(string remoteIP, WorkMode workMode);

       /// <summary>
       /// 获得指定工作模式的网络设备
       /// </summary>
       /// <param name="workMode"></param>
       /// <returns></returns>
       TValue[] GetDevices(WorkMode workMode);

       /// <summary>
       /// 获得设备数组
       /// </summary>
       /// <param name="ioType"></param>
       /// <returns></returns>
       TValue[] GetDevices(CommunicationType ioType);

       /// <summary>
       /// 按设备类型获得设备
       /// </summary>
       /// <param name="devType"></param>
       /// <returns></returns>
       TValue[] GetDevices(Device.DeviceType devType);

       /// <summary>
       /// 判断设备是否存在
       /// </summary>
       /// <param name="key"></param>
       /// <returns></returns>
       bool ContainDevice(TKey key);

       /// <summary>
       /// 根据输入参数,判断是否包括设备
       /// </summary>
       /// <param name="para">IP或串口号</param>
       /// <param name="ioType">设备通讯类型</param>
       /// <returns></returns>
       bool ContainDevice(string para, CommunicationType ioType);

       /// <summary>
       /// 设置用户级别
       /// </summary>
       /// <param name="userlevel"></param>
       void SetUserLevel(UserLevel userlevel);

       /// <summary>
      /// 设置是否注册
       /// </summary>
       /// <param name="isreg"></param>
       void SetIsRegLicense(bool isreg);

       /// <summary>
       /// 获得可用设备数
       /// </summary>
       int Count { get; }

       /// <summary>
       /// 获得设备的计数器的值
       /// </summary>
       /// <param name="key"></param>
       ///<returns></returns>
       int GetCounter(TKey key);

       /// <summary>
       /// 设置计数器的值
       /// </summary>
       /// <param name="key"></param>
       /// <param name="val"></param>
       void SetCounter(TKey key, int val);
}

 4.2    设备容器

  
设备驱动管理器是本着Dictionary<Key,Value>的卷入,Key是设备驱动的ID,Value是IRunDevice设备驱动接口。设备驱动管理器需要跨线程应用,所以针对Dictionary操作而加线程同步锁。

   当时用的是.NET Framework 2.0框架,没有ConcurrentDictionary(Of TKey,
TValue)字典类,这个近乎的保有国有和叫保障之分子还是线程安全的,使用原子性操作,适合多个线程之间又采取。再重复构时可以行使ConcurrentDictionary类代替Dictionary类,因为ConcurrentDictionary的具备操作使用到了Monitor线程同步类,不待自己更拓展打包。

   不贴ConcurrentDictionary类的源代码了,具体用参考MSDN。

1.8           开发环境… 10

4.3    生成设备ID

    查寻设备驱动管理器中最好要命之装置ID,并以这基础及加1。这块代码很简短,

如下:

public string BuildDeviceID()
{
       if(_dic.Count>0)
       {
          int maxID=_dic.Max(d => d.Value.DeviceParameter.DeviceID);
          return (++maxID);
       }
       else
       {
              return 0;
       }
}

   
增加设备驱动是得转移设备ID,一般采用手动增加设备驱动,所以当这块不需要加线程同步锁。

1.9           第三着组件… 11

4.4    对装备容器操作的排外

框架平台有组件要共享设备驱动管理器,所以会干到跨线程应用,特别

凡是当集合有变更的时,可能会见出现异常。例如:启动框架平台的下,IO控制器已经起步,IO控制器从设备驱动管理器提取自己的设备列表,但是这来或还没有加载了设备驱动,当起新的配备驱动增加至装备驱动管理时,可能会见掀起冲突。

   
所以,在添设备、删除设备和博装备列表的上多了线程同步锁,例如:lock
(_SyncLock)。

1.10        小结… 12

4.5    获得装备列表

发出差不多只得到装备的构造函数(GetDevices),主要是满足不同之运场景。

求参见“4.1接口定义”。

   
另外,获得大优先运行设备的GetPriorityDevice函数在上一章节既介绍了。

 

4.6    设备计数器的特殊用途

    在接口定义中生SetCounter和GetCounter两个函数,用在简报过程遭到。

   
应用场景是这么的,在产出和约束通讯模式面临,设备驱动一直处在在通讯正常的情下,但是忽然发线路中断或外原因促成无法接收至多少常常,那么设备驱动一直无法接及数量,也无力回天对通讯状态进行检测和反相应的多寡信息,也就是说现实情况已经来变动,但是设备驱动却无法取得响应。

   
为了防范这种场面的起,设备驱动每次发送数据时,通过GetCounter函数获得当前设施驱动之计数器,对计数器(变量)+1操作,并经过SetCounter函数把计数器(变量)再写及装备驱动管理器中。在那个接收数据的下,执行同一之流程,但是实施-1操作。如果直接发送数据,而从不接收至数常常,当前装备驱动的计数器就会一直以抬高。如果过量等于有值的当儿,就会见通过RunIODevice(new
byte[]{})驱动当前设施,执行总体设施处理流程,二次开发的代码块就见面于调用,来完成此类应用场景的状态改变以及数目变动。代码如下:

int counter = DeviceManager.GetInstance().GetCounter(dev.DeviceParameter.DeviceID.ToString());
int sendNum = SessionSocketManager.GetInstance().Send(dev.DeviceParameter.NET.RemoteIP, data);
if (sendNum == data.Length && sendNum != 0)
{
       DeviceMonitorLog.WriteLog(dev.DeviceParameter.DeviceName, "发送请求数据");
       Interlocked.Increment(ref counter);
}
else
{
       Interlocked.Increment(ref counter);
       DeviceMonitorLog.WriteLog(dev.DeviceParameter.DeviceName, "尝试发送数据失败");
}
dev.ShowMonitorIOData(data, "发送");
if (counter >= 3)
{
       try
       {
              dev.RunIODevice(new byte[] { });
       }
       catch (Exception ex)
       {
              DeviceMonitorLog.WriteLog(dev.DeviceParameter.DeviceName, ex.Message);
              GeneralLog.WriteLog(ex);
       }
       Interlocked.Exchange(ref counter, 0);
}
DeviceManager.GetInstance().SetCounter(dev.DeviceParameter.DeviceID.ToString(), counter);

  
对于发送和接收数据会以不同之线程上完,在针对计数器(变量)进行+1和-1操作的上以到了Interlocked类,用于多个线程共享的变量提供原子操作,防止在多处理器上并行操作时或许引发的不胜或者数中损坏。

 

4.7    小结

  
这样改造后,不仅可于IO控制器对配备进行引用,也足以当旁零件使用。如果碰到类似之情状,希望下ConcurrentDictionary类。

 

笔者:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

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

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

先是章     通讯框架介绍

1.1    通讯的本色

    
通讯就是信之传递,信息传递而且分为:单为信息传送与双向信息传送。用喇叭进行广播是只有为信息传递,打电话是双向信息传送。

    
单向信息传递相对较为简单,只待为信息接收者实时发送数据,而未用无信息是否到,以及达晚是否开展了拍卖。这种消息传递方式适用于对数据完整性要求不赛的下场景,例如:采集温度传感器的数。但是,如果数据源或是传感器比较多的话,要考虑到连发量的题目,随着互联网技术的发展,并发问题是得非常好之化解。

    
双向信息传递相对比较复杂,不仅关系到发送数据的题目,还涉及到消息握手、数据补传等同样多元互动问题。如果将双向信息传递非要是分成客户端以及服务端的话,还波及到是啊一样正在预先发起信息传递,客户端主动往服务端发送数据,服务端接收及数码后展开拍卖;但是,有时候服务端不欲接到客户端的数量,只有当服务端向客户端发送请求命令后,客户端根据指令才足以回到相应的数码。在跟硬件进行双向通讯的时候,还涉嫌到载波通道是半双工和统双工的题目,半双工是相同时刻以通路及不得不A向B或B向A发送数据,只能单为数传;全双工是A向B发送数据,同时B向A也足以发送数据,发送和接收数据两者可以同步进行。这种信息传送方式适用于对数码完全性要求比大之运场景。

   
不管是就为信息传送,还是双向信息传递,都涉及传输协议、编码方式和数目校验。传输协议是会封装和分析并且能够相互理解的数码格式,它是同等栽多少则方式,可以以专业的协议方式,例如:Modbus、XMPP、AMQP、MQTT等,也堪下由定义协议;有矣导协议后,在传过程被还关系到编码方式,例如:GBK、UTF、ASCII,有或当编码的基础及还要开展加密,以保证数据的安全性;为了多少包完全性、可解析性,还要加对数据的校验,一般下较多的校验方式吗CRC。传输协议、编码方式和数量校验的目的仅仅生一个:防止数据在传过程被遭干扰,或让恶心篡改,给数处理造成意外的名堂。打个比喻,一个华夏人数说普通话,一个外人说美式英文,语法不同等,编码格式不平等,结果导致叙听不知道、文字看无晓得,如果误认为是在骂人,有或还要起一绑架。

   
现在为主都是面向对象开发方式,new出来一个目标,把对象的性能赋值后,直接拿目标传给接口函数完成发送数据。这种操作方法要开发者重新多之关切业务规模,从而掩盖了好多技术细节,例如:序列化、协议、编码、字节约流的操作等等。

   
但是,SuperIO保持对根字节流(byte[])的操作,更多之关注通讯框架、数据协议、数据缓存、数据处理流程、设备驱动、插件、二次开发等方面。因为在物联网时代,将会见当广大数据源,包括:各种传感器、手机、PC端、智能硬件、传统嵌入式设备等等,协议众多,并且十分不便统一,所以极直接的操作数据就是字节流(byte[])。另外,很早以前传输技术不发达(300波特率),同时给寄存器的仓储限制,为了削减数据量,1独字节的8员如代表8栽状态类型。

   
在物联网时代,将面临各种通讯情况,例如:一个串口通道,一对一、一针对多的计通讯;一个大网IP通道,一对一、一对大多的简报。所以,没有一个好之框架支撑是心有余而力不足满足通用性的求。

    
有人问题串口通讯、网络通讯怎么开,有人回复这些很容易,但是要是将上述问题同任何题目都考虑周全的语句虽是一个犬牙交错的题材,并且有点问题不是生好解决。

1.2    框架简介

     
如果一个商行之硬件产品多,协议而各不相同,每一个硬件产品还指向承诺平等拟及位机软件,需要专人保护。而客户的需求逐步变化,造成维护本较高,并且阻碍了店铺之快速腾飞。另外,就算修改同类硬件产品的配套软件,也可能引致新的BUG出现。

    
随着市场和店提高的待,需要组合、重盖软件系统为适应环境、硬件的缕缕变动,降低人力、运维成本,释放劳动力。

    
所以,对于提高及得等级、或是一个成熟之号必然使起软件框架当作支持,这是打作业角度考虑发展使框架的必然性。

    
技术面,框架是一个系统全体要有的只是复用设计,通常由同组接口、抽象类和接近里的通力合作组成。随着信息化的进步,软件出品之开销也越加复杂化,解决问题的复杂度也以连的增进。IT界也在追寻多种措施,包括制定各种软件开发标准以及业内、开发还高级更产生生产力的编程语言、开发再好的编译器和周转时以及不需要编译的解释性开发语言、开发功能强大以及重新通用性的零部件库、探索适用不同应用场景的设计模式等。

    
从软件工程角度出发,在统筹范围要使用非常的软件构架和设计模式来达成我们预料的靶子:

  • n  尽量提高软件之可重用性,避免不必要之复编码工作。
  • n  增加组装的封装性。
  • n  提高软件之模块化程度。
  • n  不同功能模块之间能够无缝集成。
  • n  软件具有灵活的可扩展性。
  • n  软件出品之恢弘以及开实现标准化。
  • n  软件出品有所面向不同应用范围的适应性和爱移植性。

   
为了落实这些要求,在统筹范围上,越来越多之软件出品开始使用以框架的构思进行软件结构设计。应用框架都是一个给普遍使用的术语,它变成软件开始着同栽死实用又常用的宏图、开发规范。

   
我们必定见了不少自称“框架”的软件出品,也许有人会发不屑,有些代码量很少之次竟然也称好是某种形式之采取框架?事实上,应用框架无关乎规模大小,就比如房子一样,摩天大楼和民房都是房子,只不过它们的圈及精巧度大小不一样而已。

    在绑架构师眼里,代码都是索要统筹之,都是有框架的。

1.3    解决现实问题

    在工业领域,经常遇到软硬件中的多少交互,并且面临着千丝万缕的当场条件:

(1)复杂的、多样的报导协议。有正式的协商,例如:Modbus等,也出广大基于标准协议修改的磋商格式、以及从定义协和格式,并且距离。对于不好的软件架构,疲于应对,增加设备或者协商而本着周软件拓展梳理,往往在这过程中冒出新的问题还是BUG。

(2)针对不同用户对软件界面或效益的要求来甚酷异,使的满足不同用户的示要求,可以于定义数据展示界面。

(3)在举行并项目之上,输入输出数据的多样性。首先,要合并其他厂家的设施,要求数开展连接。其次,还有许多凡是其他厂家要拼自己家之配备,就干的输出数据的题材,数据格式要求为是千差万别。  

(4)通讯链路的多种性,对于和一个装备或者要支持RS232/RS485/RS422、RJ45、3G/4G等通讯方式,所以于一个配备要对准诺又简报方式(串口和网),也给我们的支付造成十分特别之拦路虎。

(5)软件各版、以及软件及硬件之间的兼容性好不同,管理起来复杂。

  
为了缓解上述博问题,开发一个软件框架,支持二次开发。在非对准软件框架改动的情况下,能够很便利的连片设备、维护设备、集成设备、处理装置业务数据等。软件框架相对稳定,把爱生成的一些进行灵活设计。

1.4    应用场景

   
作为一个框架平台,在多变产品晚而固定它的运场景,在规划框架之前如果来鲜明的认,并以统筹过程遭到频频深化应用目标。

   
在成品下方面,框架平台或只要配置于PC机上,与多硬件、传感器进行多少交互,并于本土开展数据存储。

    
在路以方面,框架平台或部署于劳务器端,与客户端(PC机、硬件、传感器等)进行数量交互,并蕴藏到多少中。

    
既然框架平台在PC机上及服务端都或行使,那么框架和框架内也时有发生数据交互的可能性。

    
所以,框架平台的并行场景包括个别者:第一、与硬件产品竞相。第二、与软件出品互。基本就半上面考虑:

1)框架平台应用在PC机上

一言九鼎行使在自动站的工控机上,通过RS485/RS232、RJ45、4-20mA等方式

征集硬件装置的数据信息。同时,通讯平台跟劳动器端的软件拓展交互,负责上传数据信息,以及接受控制命令等。

2)框架平台运用在服务器端上

顶设备以3G/4G、有线专网、卫星等及报道平台连接,进行多少交互,终

捧设备连:PC机、移动终端(手机)、监测装备及传感器等。

    基于上述考虑,框架平台的用场景布局图如下:

 葡京娱乐总站平台 1

1.5    框架下特点

  对于框架的特征,我们如果发生略、清晰的筹划,其中包:功能范围、性能层面、应用规模、运行层面、二次开发层面等等
,这些用深化我们当设计、开发进程的靶子。这些不仅使描写在张上,更如记在脑里。SuperIO在规划的下,简单的排列有了它们的特性,尽管稍特点是新兴完美的,如下:

  • n  快速构建通讯数据收集平台软件之宿主程序

  • 快速构建设备驱动,以及有关的合计驱动、命令缓冲、自定义参数与实时数据性等

  • 快速二次开发图形显示、数据输出、服务令,并坐插件的款式展开挂载。
  • n  一个装置驱动,同时支持串口(COM)和网(TCP Server/Tcp
    Client)通讯机制,可以随意切换

  • 内置协议驱动,可以管第三方协议转换成为自定义之协议,协议的面目是针对字节流的操作。

  • 内置设备命令缓冲器,可以设置命令发送的优先级别,保证令的飞快响应。

  • 因服务令插件的法子对OPC服务、4-20mA输出、LED大屏显示、短信服务等开展二次开发。
  • n  快速开、运行平稳、扩展性强大
  • n  适用工业及位机软件,以及系统集成中采集远程设备数量
  • n  支持Windows XP/7/8/8.1、Windows Server 2003/2008/2012

1.6    框架设计特征

   
有些书说了平深堆设计特征,有接触于人不可思议,没见出层次感,我道对于此类框架的风味极其关键的不外乎个别触及:稳定性、扩展性、性能。

稳定性

     
对于一个实时数据收集框架来说,首要之计划特性就是政通人和,这是其他一切特点的前提。不克出现异常后软件无故退出的景象、不可知起关闭软件后经过无法退的气象、不克冒出无法响应数据的状况、不可知起无法处理数量的情景等等。

    
基于可能存在的这些地下的题材,我们设考虑:容错机制、模块无缝对接、记录日志等。

    
容错机制是具备软件都有的一种体制,核心思想是对怪状态的处理办法。对于操作一般性的效能,如果出现异常状态,我们恐怕无待了多之干涉,只需要进行日志记录就是得了,对于再次操作同样的力量可证明异常状态的可重复性,根据日志信息方可来对的进行解决;对于事务性的天职,对充分状态的处理会发强增选,可以略的笔录非常信息、可以销毁当前的资源,重新开任务,直接任务成功、可以过来至出现异常状态的节点等,根据不同之面貌,选择处理的方法呢未一致。就一定给,某人说错话了,要进行弥补,那就如扣即之环境以及面对的总人口,如果是好爱人,这事就是终于过去了。

    
模块无缝过渡要求我们本着接口、抽象类及近似的模块划分、设计粒度有不行好的握住,更多的体现于经验者。模块之间是一个契约关系,如何履契约会涉及到无数设计模式的选择,所以说对计划模块的把握程度直接影响软件框架的成熟度。就好于少独人口对话,说话方式、语意都不克相互理解,就生或话不投机半句子多。

    
记录日志是享有软件要要有的特点,这也咱解查错误提供了颇要命的福利。日志记录来不少开源之型好拿来直接下,例如常用之Log4Net。但是,有时空研究就东西的日子,自己吗能写一个适用于自己的日志库了。

    
稳定性是软件运行的顶直白反应,是颇具实时性框架设计极端要紧考虑的素,也是最为麻烦上的。

扩展性

     
用户可能比较设计者更体贴稳定性,但是用户不仅满足吃平安,还会提出各种新需要,更多的体现在力量点。如果扩展性不好,对于开发者来说是万步深渊。

     
所以,可扩展性是下框架最显著的性状有,它表示应用框架的功能有所生长力量。没有扩大能力的施用框架毫无使用价值跟含义,因为框架本身就是为着供一个合并之上下文环境被现实的用使用。应用框架的只是扩展性使我们能够根据一个阳台实现不同之效益,满足不同之下需求,有些需要是框架本身即支持之。

    
框架的只是扩展性主要是由此连续和集聚两栽艺术实现之。继承方式是恃经派生类继承基类或接口,通过录取基类的功效并定义新的功效的道实现力量扩展;聚合方式是凭调用不同之种组合也一个新路而恢宏出全新的效果。研究Framework框架源代码,能够深切感受及持续和聚集的企图。

     
如果单说扩展性会于人闹把失之空洞,那么我们还要考虑模块化、可重用性、可维护性等等。

     
模块化,并无是拿每个功能还编译成一个DLL程序集就可称模块化,一个序集里也堪模块化。从框架层面在逻辑上横向、纵向对模块和层次开展分,以降模块之间的耦合度,不会见因一个模块的转变而影响外模块,划分模块时保证模块之间输入输出的统一性。

     
可重用性,也足以称之为可复用性,是权代码质量之重要性标志之一。既然是框架设计之中一个目的就是提高效率,减少没有必要的再工作,降低资金。一般的话,框架而选用好是离散存在的函数、可以是包好之类库、可以是包裹好的群类库,以利我们于看似功能、业务受到使用。

      
可维护性,根据业务需要变化会方便开展反之力量,也是扩展性的着眼点。保证我们尽量少修改代码完成需求要同时非影响软件的整运行。

性能

    
性能是软件运行效率的重要性指标,是指向软件运行极限的考验。例如,不管挂载多少设备驱动,用户要求1秒钟要是读取一次于有设施的数量,如果实现不了,用户说抱歉,我们不克签合同。

    
在互联网行业对性能的渴求再胜、更完善,有不少指标性的参数,例如:响应时间、延迟时间、吞吐量、并发量、资源利用率等等,所以一般只要对软件、服务拓展压力测试。在风行业方面呢不防借鉴运用先进的框架或第三着组件,例如:消息队列框架(kafka、ActiveMq、RabbitMq、ZeroMq、EQueue),响应式消息框架(Akka.net)、作业调度框架(Quartz.net)等等,这些能够促进提高软件、系统的执行效率以及性能。

    
当然,对于性来讲,软件就是一个端,更多之尚论及到网络布局、服务器部署等方面,是均等宗综合性的构造。

    
对于平安、扩展性、性能,它是一个总体的老三只面。相信大家还扣留了F1角,要求赛车在全速行驶过程中维系不翻车,高速行驶对轮胎磨损很严重,并且要求在那个紧缺的日子外利对轮胎的换。

1.7    插件式应用框架

    
插件技术是在软件的设计与出进程遭到,将全方位应用程序划分为宿主程序和插件对象少组成部分,宿主程序会调用插件对象,插件对象能够以宿主程序及实现团结之逻辑,而两端的竞相基于相同种集体的通信契约。宿主程序可以独自为插件对象存在,即使没其它插件对象,宿主程序的运行也无受影响,因此,我们可以避免改变宿主程序的情景下通过增减插件或修改插件的措施加码还是调整职能。由于使用了插件技术之宿主程序有所了一个框架的本质特征,因此可以以它当是同等种植插件式框架。插件式框架能够有效地降落效果对象同对象管理逻辑中的耦合程度,并以耦合置于最妙的档次。

    
对大部分处理器用户和软件开发者而言,插件式应用框架其实到头来不达到啊秘密之东西,事实上,几乎每个人还早就用了有插件式功能的软件出品。这些软件有大有小,从操作简便的比如说播放器软件及复杂桀骜的各种正规应用软件,都或多或丢失用了插件机制,只是于最终用户而言,由于经常满足于下相同慢慢悠悠成熟软件,很少有人刻意去关注这些软件应用的是何许的架体系。

     Visual Studio
IDE、Elipse等还是插件式的开发工具,并贯彻了很强大的插件机制,也促使这些软件变的更为强。

     一般要,一磨蹭软件、一个框架下插件机制的因由要基于以下3碰:

  • n  可以在不必对先后开展双重编译和通告之口径下扩展程序的法力。
  • n  可以以不需要程序源代码的环境下吧顺序增加新的作用。

  • 以一个主次的事务逻辑不断出反、新的规则不断在时能活适应。

   
实现插件机制一般发生3种技术:基于动态连接库DLL的插件、基于组件对象模型COM的插件、以及基于.NET反射技术的插件。

    SuperIO是下反射技术实现的插件机制,在后头的段中进行详细介绍。

1.8    开发条件

开语言

使用C#支付的SuperIO框架,当然使用另外语言也得以兑现,例如:JAVA。

葡京娱乐总站平台开发工具

一律开始采取的凡Visual Studio 2008器进行支付,后来升级至Visual Studio
2012,并对准SuperIO进行了再次编译。

支持框架

如出一辙开始用的是Framework 2.0框架进行开发,后来荣升至Framework
4.0,为了配合于逊色版本的操作系统(Windows xp
sp3),最高版本的框架只能以Framework 4.0,再大版本的框架在Windows xp
sp3下无法运转。如下图:

 葡京娱乐总站平台 2

编译环境

行使X86平台对品种进展编译,如果开发插件也待用X86平台拓展编译,主要考虑到32个以及64个操作系统的通用性。如下图:

 葡京娱乐总站平台 3

开发条件:

如出一辙开始以Windows xp sp3操作系统下展开开,后来晋级到Windows 8/8.1。

1.9    第三正组件

    使用Developer
Express套件对框架的UI部分进行布局,主要行使在Menu、MdiTabForm、DockPanel这三只地方。

   
使用PCOMM.DLL对串口通道进行操作,没有以微软自从带的SerialPort组件,因为这组件和一些工业串口卡无配合,请参见:SerialPort操作PCI-1621D多弄错口卡,出现异常”参数不正确”

   
OPC服务端利用的凡OPC基金会的WtOPCSvr.dll组件,但是这个得正版授权。OPC客户端应用的凡OPCDAAuto.dll组件。可以于http://pan.baidu.com/s/1pJ7lZWf下载SuperIO_Demo.rar事例代码,里边生完整的OPC服务端和客户端的代码。事例证明:http://www.bmpj.net/article-11-1.html。

1.10     小结

    
从软件设计角度,框架是一个但复用的软件架构解决方案,规定了使用的系统布局,阐明软件体系结构中各层次中及其层次中各级组件间的毅力关系,责任分配与决定流程,表现为同组接口,抽象类和实例之中协作的方式。

    
框架决定了一个软件的精力,一个吓的框架还能够推进我们针对她的穿梭维护、重构、完善。

 

产一致一味将介绍(SuperIO)框架总体的计划性。

 

笔者:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083