NoSQL[连载]《C#通讯(串口和网络)框架的设计与实现》- 6.通讯控制器的宏图

目       录

第六章           通讯控制器的设计… 2

6.1           控制器接口… 2

6.2           串口控制器… 3

6.3           网络决定器… 5

6.4           通讯控制管理器… 9

6.5           远程交互… 9

6.6           小结… 10

 

第六章     通讯控制器的统筹

    
经过前几章的介绍,那章介绍通讯控制器。首要承担对配备驱动(IRunDevice)、IO通道(IIOChannel)举行协调、调度、以及事件做出响应,在此基础上实现轮询通讯形式、并发通讯格局和约束通讯情势的任务调度。由于串口和网络硬件链路特性的原故以及通讯机制不一样,所以通讯控制器的贯彻上也有很大区别。

6.1    控制器接口

    
控制器内置一个线程负责对装备驱动和IO实例举办任务协调、调度,相当于在《第4章
设备管理器的统筹》、《第5章
串口和网络的IO设计》实现的底子上构建了一个更高层次的调和机制,并落实设备与IO的匹配、不同的报导机制。

    
不管串口通讯控制器和网络通讯控制器如何兑现,都会延续自统一的(IIOController)接口,接口定义的代码如下:

public interface IIOController
{
       /// <summary>
       /// 当然是否工作
       /// </summary>
       bool IsWorked { set; get; }

       /// <summary>
       /// IO控制器的关键字。
       /// </summary>
       string Key { get; }

       /// <summary>
       /// 启动服务
       /// </summary>
       void StartService();

       /// <summary>
       /// 停止服务
       /// </summary>
       void StopService();

       /// <summary>
       /// IO控制器类型
       /// </summary>
       CommunicationType ControllerType { get; }
}

     控制层次结构图如下:

NoSQL 1 

6.2    串口控制器

   
每个(硬件)串口都对应一个串口控制器,每个串口控制器里都会有一个独立的线程,也就是说用到稍微个串口号就会有些许个控制器和线程。框架平台可能会挂载三个设施驱动(插件),有可能一个设备驱动对应一个串口,也恐怕多少个装备驱动共用一个串口,那么也就是说串口控制器和配备驱动之间存在1对1或1对N的涉嫌。结构示意图如下:

 NoSQL 2

   
一个串口控制器内的装有装备安装的串口通讯参数都是均等的,所以设备驱动(IRunDevice)接口的COM中的Port属性、IO接口(IIOChannel)的Key属性、以及串口控制器(IIOController)接口Key属性是同样的,都用于标识串口号。既然一个串口控制器中的所有设备都共用一个硬件串口,就决定了具备装备驱动之间的任务调度只好采取轮询格局,一个配备发送和收受操作完将来,再调度下一个设施驱动,设备驱动之间就是串行工作形式,制止一个串口控制器内两个设备驱动同时操作串口IO导致数据错乱,影响正常通讯。

   
一个串口控制器内的配备驱动是串行工作情势,假诺把所有装备驱动都设置成一个串口号,在一个串口控制器下串行调度,那么就会潜移默化设施驱动的简报功能,某个设备的调度周期的公式如下:

某个设备调度周期=(串口控制器所有设备数-1)* 单个设备驱动执行耗时

     
这仅是一个理论值,实际使用中要比这些理论值要大,因为关乎到不类型的配备驱动共用一个串口号,在一个串口控制器下工作,处理的数据流程、形式各异,例如:有可能数量保存在TXT文件中、有可能保留在SQL数据库中、有可能保存在NoSQL数据库中等等。

    
有人会想,岂不是在一个串口下挂载的装备越多功效越低,的确是这么的。然则,多少个串口控制器之间是相互工作情势。假使当场条件对通讯功用有要求的话,可以扩展串口服务器,也就是充实可用的串口硬件电路,把N个设备驱动平衡负载到不同的串口上,扩展相互运行的串口控制器的节点,进而增进框架平台的运转效用。

   
然则,这样解决将来也牵动一定的高风险和瓶颈,就是对于数据的积存,假如四个互相的数据流同时向一个单线程的存储介质写多少,那么又会招致互斥的场景,甚至导致意外的结果或特别,如下图:

NoSQL 3 

     如果还要向Sql
Server、Oracle、Mysql等数据库存储数据,那么是未曾问题的;假若应用文本文件、桌面数据库等储存数据,那么可能存在问题,可以分四个文件举行保存操作。DCS系统大多使用PI(Plant
Information
System)数据库。总而言之,作为一个系列来讲,需要完整统筹、考虑,这块需要特别注意。

6.3    网络控制器

    
框架平台唯有一个网络控制器,网络控制器内有一个独自的线程负责对具有网络设施驱动举行轮询、并发、自控形式通讯调度。轮询通讯格局与串口控制器类似,只是串行的调度所有网络设施驱动,但是框架唯有一个网络控制器,无法透过扩大网络控制器来增强通讯功用,那种情势是网络通讯调度鸡肋;并发通讯形式,线程会通过控制器中的线程集中发送所有装备的哀求命令数据,接收数据是透过IO异步监听来形成,异步接收到数量后再把多少分发到设备驱动的RunIODevice接口,举行数据处理;自控通讯格局,发送命令数据的功力移交给了设施驱动本身,可以通过定时器来形成发送命令数据的效果,线程不再负责发送命令数据,接收数据与产出通讯格局一样。网络控制器的内部示意图如下:

 NoSQL 4

    
针对网络通讯,轮询通讯形式是不可能发挥其优势的,所以扩展了出现通讯格局和约束通讯格局。后两种简报形式会用到《第4章
设备驱动管理器的计划性》的“4.6  
设备计数器的出格用途”的计划,设备驱动计数器尽管超出等于某个值的时候,就会由此RunIODevice(new
byte[]{})驱动当前装备,执行总体设施处理流程,以变更设备驱动的运转境况,实际上当前配备驱动处于“通讯中断”状态。

    发送数据代码如下:

public void ControllerSend(IRunDevice dev, byte[] data)
{
       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);
}

     异步接收、分多少的代码如下:

private void NETDeviceController_ReceiveSocketData(object source, ReceiveSocketDataArgs e)
{
       if (GlobalProperty.GetInstance().ControlMode == ControlMode.Parallel || GlobalProperty.GetInstance().ControlMode == ControlMode.Self)
       {
              int counter = 0;
              IRunDevice dev = null;
              IRunDevice[] list = DeviceManager.GetInstance().GetDevices(e.RemoteIP, CommunicationType.NET);
              for (int i = 0; i < list.Length; i++)
              {
                     dev = list[i];
                     if (String.CompareOrdinal(dev.DeviceParameter.NET.RemoteIP, e.RemoteIP) == 0)
                     {
                            dev.ShowMonitorIOData(e.ReceiveData, "接收");
                            dev.AsyncRunIODevice(e.ReceiveData);
                            counter = DeviceManager.GetInstance().GetCounter(dev.DeviceParameter.DeviceID.ToString());
                            Interlocked.Decrement(ref counter);
                            if (counter < 0)
                            {
                                   Interlocked.Exchange(ref counter, 0);
                            }                  DeviceManager.GetInstance().SetCounter(dev.DeviceParameter.DeviceID.ToString(), counter);
                     }
              }
       }
}

6.4    通讯控制管理器

   
通讯控制管理器负责对串口控制器和网络控制器举行田间管理,实际上是对Dictionary<Key,Value>进行的包装,所有关乎到操作控制器的地点都是经过操纵管理器来形成的。IIOControllerManager<TKey,
电视alue>通讯控制管理器的接口定义如下:

NoSQL 5 

6.5    远程交互

    
在打听串口控制器和网络控制器的基本原理和效应后,还要考虑到一个采用场景:控制器不仅仅要与硬件举办数据交互,还有可能要把采访上来的数码转发到其他服务器或节点上,也就是框架平台要具备路由的效率,整合设备驱动采集上来的多寡,进行包装、转发。

   
从这些利用场景来看,在开发设备驱动的时候,不符合在装置驱动的拍卖流程中开展转发、多事情处理,受条件、网络、业务复杂度的震慑恐怕会卡住控制器的调度,影响框架的完整运行效能。

   
在物联网建设中,多级互联、逐层转发是很广泛技术需求。为了化解这多少个现实问题,框架平台提供了IApp瑟维斯(Service)应用服务接口,二次开发者可以把设备驱动中的数据信息打包后传出到IApp瑟维斯(Service)(Service)接口中,可以在这里实现缓存、转发等具体的事体服务。那样设计的要紧目标是不影响框架平台实时的数目收集,保证数据源的安居。

    IAppService具体的计划性和采取将来《第7章
外部接口的计划》中开展详尽介绍。

6.6    小结

    
通讯控制器实现这后,理论上框架平台就可以跑起来了,可是距离我们伊始筹划的目的还差很多工作要做,还无法为二次开发提供很大的有利。在持续的宏图中,逐渐的会把框架平台充分起来。

 

作者:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

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

合法网址:http://www.bmpj.net

网站地图xml地图