[连载]《C#通信(串口和互联网)框架的筹划与实现》- 6.电视宣布控制器的规划

目       录

第伍章           通信控制器的设计… 2

6.1           控制器接口… 2

6.2           串口控制器… 3

6.3           网络决定器… 5

6.4           通信控制管理器… 9

6.5           远程交互… 9

6.6           小结… 10

 

第5章     通信控制器的宏图

    
经过前几章的牵线,那章介绍通信控制器。首要承担对装备驱动(IRunDevice)、IO通道(IIOChannel)实行和谐、调度、以及事件做出响应,在此基础上实现轮询通信方式、并发通信格局和约束通讯方式的职责调度。由于串口和网络硬件链路本性的由来以及通讯机制差别,所以通信控制器的达成上也有十分的大差距。

6.1    控制器接口

    
控制器内置1个线程负责对装备驱动和IO实例进行职分协调、调度,也正是在《第6章
设备管理器的规划》、《第肆章
串口和网络的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; }
}

     控制层次结构图如下:

图片 1 

6.2    串口控制器

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

 图片 2

   
3个串口控制器内的持有装备安装的串口通信参数都是一模一样的,所以设备驱动(IRunDevice)接口的COM中的Port属性、IO接口(IIOChannel)的Key属性、以及串口控制器(IIOController)接口Key属性是均等的,都用来标识串口号。既然2个串口控制器中的全体设备都共用三个硬件串口,就控制了全体设施驱动之间的职务调度只可以动用轮询格局,三个设施发送和接到操作完未来,再调度下二个设备驱动,设备驱动之间正是串行工作格局,避免一个串口控制器内多个设备驱动同时操作串口IO导致数据错乱,影响健康通信。

   
1个串口控制器内的装置驱动是串行工作形式,假设把装有装备驱动都设置成2个串口号,在1个串口控制器下串行调度,那么就会潜移默化设备驱动的简报成效,某些设备的调度周期的公式如下:

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

     
那仅是一个反驳值,实际利用中要比这一个理论值要大,因为涉及到不类型的设施驱动共用二个串口号,在四个串口控制器下办事,处理的多寡流程、格局分化,例如:有恐怕数量保存在TXT文件中、有大概保留在SQL数据库中、有恐怕保存在NoSQL数据库中等等。

    
有人会想,岂不是在三个串口下挂载的配备越多作用越低,的确是这么的。不过,多少个串口控制器之间是互为工作格局。假使当场条件对通信效用有供给的话,能够增添串口服务器,也正是增多可用的串口硬件电路,把N个设备驱动平衡负载到差其他串口上,增添互动运维的串口控制器的节点,进而增强框架平台的运营成效。

   
可是,那样化解现在也推动一定的风险和瓶颈,就是对此数据的存款和储蓄,借使八个彼此的数据流同时向一个单线程的存款和储蓄介质写多少,那么又会造成互斥的光景,甚至导致意外的结果或越发,如下图:

图片 3 

     若是还要向Sql
Server、Oracle、Mysql等数据仓库储存款和储蓄数据,那么是没十分的;假设采纳文本文件、桌面数据库等储存数据,那么大概存在难题,能够分四个公文举行保存操作。DCS系统大多使用PI(Plant
Information
System)数据库。由此可知,作为2个系列来讲,须求完整统一筹划、考虑,那块须要越发注意。

6.3    互连网控制器

    
框架平台唯有2个网络控制器,互连网控制器内有三个独门的线程负责对具有互连网设施驱动进行轮询、并发、自小编控制形式通信调度。轮询通信方式与串口控制器类似,只是串行的调度全数网络设施驱动,然则框架唯有2个网络控制器,无法经过扩展网络控制器来拉长通讯效用,那种形式是互连网通信调度鸡肋;并发通信格局,线程会通过控制器中的线程集中发送全部设备的乞求命令数据,接收数据是经过IO异步监听来成功,异步接收到多少后再把数据分发到装备驱动的RunIODevice接口,实行数量处理;自作者控制通讯格局,发送命令数据的作用移交给了配备驱动本人,能够经过定时器来完毕发送命令数据的效用,线程不再负责发送命令数据,接收数据与出新通信情势一样。网络控制器的当中示意图如下:

 图片 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,
TValue>通信控制管理器的接口定义如下:

图片 5 

6.5    远程交互

    
在询问串口控制器和网络控制器的基本原理和效应后,还要考虑到二个利用场景:控制器不仅仅要与硬件进行数量交互,还有恐怕要把采访上来的数量转载到其余服务器或节点上,也正是框架平台要享有路由的效应,整合设备驱动采集上来的数额,实行李包裹装、转载。

   
从那一个利用场景来看,在开发设备驱动的时候,不符合在设施驱动的拍卖流程中开始展览转载、多事情处理,受条件、互连网、业务复杂度的震慑可能会阻塞控制器的调度,影响框架的完全运营作用。

   
在物联网建设中,多级互联、逐层转载是很广阔技术须要。为了化解这几个现实难题,框架平台提供了IApp瑟维斯应用服务接口,2回开发者能够把设备驱动中的数据音讯打包后传出到IAppService接口中,能够在那里实现缓存、转载等现实的工作服务。那样设计的重点目标是不影响框架平台实时的数码搜集,保障数据源的春风得意。

    IAppService具体的布署和行使以往《第十章
外部接口的筹划》中展开详细介绍。

6.6    小结

    
通信控制器完毕那后,理论上框架平台就能够跑起来了,但是距离大家开始筹划的对象还差很多办事要做,还不可能为一次开发提供非常大的便利。在此起彼伏的设计中,逐步的会把框架平台丰裕起来。

 

作者:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术缔盟:54256083

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

合法国网球限制赛址:http://www.bmpj.net

admin

网站地图xml地图