[连载]《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; }
}

     控制层次结构图如下:

图片 1 

6.2    串口控制器

   
每个(硬件)串口都对应一个串口控制器,每个串口控制器里还见面来一个独的线程,也就是说用到稍微只失误口号就是会见发小个控制器和线程。框架平台或会见挂载多独装备驱动(插件),有或一个配备驱动对应一个串口,也或几只设备驱动共用一个串口,那么为即是说串口控制器和设备驱动中存在1针对1或1对N之关联。结构示意图如下:

 图片 2

   
一个串口控制器内之兼具装备安装的串口通讯参数还是同的,所以设备驱动(IRunDevice)接口的COM中的Port属性、IO接口(IIOChannel)的Key属性、以及串口控制器(IIOController)接口Key属性是一样的,都用来标识串口号。既然一个串口控制器中的富有设施还共同用一个硬件串口,就控制了所有装备驱动中的任务调度只能利用轮询模式,一个装备发送和接受操作结束后,再调度下一个设备驱动,设备驱动中就是串行工作模式,避免一个串口控制器内大多独装备驱动同时操作串口IO导致数据错乱,影响健康通讯。

   
一个串口控制器内之装备驱动是串行工作模式,如果把富有装备驱动都安装成一个差口号,在一个串口控制器下串行调度,那么即使会见潜移默化设施驱动之报导效率,某个设备的调度周期的公式如下:

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

     
这仅是一个答辩价值,实际利用被如果较是理论值要非常,因为涉及到非种的装置驱动共用一个差口号,在一个串口控制器下工作,处理的数目流程、方式各异,例如:有或数量保存在TXT文件被、有或保留于SQL数据库被、有或保存在NoSQL数据库被等等。

    
有人会想,岂不是在一个串口下挂载的设施更多效率进一步小,的确是如此的。但是,多个错口控制器之间是并行工作模式。如果现场条件对通讯效率来求的言辞,可以追加串口服务器,也尽管是充实可用之串口硬件电路,把N个设备驱动平衡负载到不同之串口上,增加互动运行的串口控制器的节点,进而增进框架平台的运转效率。

   
但是,这样化解后也拉动一定的风险和瓶颈,就是对数据的存储,如果多独相的数据流同时于一个单线程的存储介质写多少,那么又见面促成互斥的气象,甚至招致意外的结果要么特别,如下图:

图片 3 

     如果以向Sql
Server、Oracle、Mysql等数据库存储数据,那么是从未有过问题的;如果使用文本文件、桌面数据库等储存数据,那么可能是问题,可以分多单文件进行保存操作。DCS系统大多采用PI(Plant
Information
System)数据库。总之,作为一个体系来讲,需要总体设计、考虑,这块需要特别注意。

6.3    网络控制器

    
框架平台仅出一个网络控制器,网络控制器内发出一个独的线程负责对具有网络设施驱动进行轮询、并发、自控模式通讯调度。轮询通讯模式及串口控制器类似,只是串行的调度所有网络设施驱动,但是框架只有一个大网控制器,不能够经过长网络控制器来提高通讯效率,这种模式是网络通讯调度鸡肋;并作通讯模式,线程会通过控制器中之线程集中发送所有设施的要命令数据,接收数据是经IO异步监听来就,异步接收至数量后再度将数据分发及装备驱动之RunIODevice接口,进行数量处理;自控通讯模式,发送命令数据的功用移交给了设备驱动本身,可以透过定时器来好发送命令数据的职能,线程不再承担发送命令数据,接收数据与出新通讯模式一样。网络控制器的其中示意图如下:

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

图片 5 

6.5    远程交互

    
在询问串口控制器和网控制器的基本原理和功力后,还要考虑到一个使用场景:控制器不仅仅要和硬件进行数据交互,还出或使管采上的数码转发到任何服务器或节点上,也尽管是框架平台要拥有路由的效用,整合设备驱动采集上的多寡,进行打包、转发。

   
从这利用场景来拘禁,在开发设备驱动的下,不吻合在装备驱动之处理流程中展开转向、多工作处理,受条件、网络、业务复杂度的熏陶恐怕会见阻塞控制器的调度,影响框架的总体运行效率。

   
在物联网建设负,多级互联、逐层转发是雅广泛技术需求。为了缓解者实际题材,框架平台供了IAppService应用服务接口,二次开发者可以把设备驱动着之多少信息打包后传到IAppService接口中,可以以此实现缓存、转发等实际的事务服务。这样设计之要目的是勿影响框架平台实时的数额收集,保证数据源之安居。

    IAppService具体的规划以及以将来《第7回
外部接口的统筹》中进行详尽介绍。

6.6    小结

    
通讯控制器实现就晚,理论及框架平台就会走起了,但是距我们开始计划的目标还不一多工作一经开,还非能够为二次开发提供好酷之利。在继续的筹划受到,慢慢的会将框架平台丰富起来。

 

作者:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

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

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

相关文章