麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

[連載]《C#通訊(串口和網絡)框架的設計與實現》-6.通訊控制器的設計

2019-11-14 13:44:45
字體:
來源:轉載
供稿:網友

目       錄

第六章           通訊控制器的設計... 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; }}

     控制層次結構圖如下:

 

6.2    串口控制器

    每個(硬件)串口都對應一個串口控制器,每個串口控制器里都會有一個獨立的線程,也就是說用到多少個串口號就會有多少個控制器和線程。框架平臺可能會掛載多個設備驅動(插件),有可能一個設備驅動對應一個串口,也可能幾個設備驅動共用一個串口,那么也就是說串口控制器和設備驅動之間存在1對1或1對N的關系。結構示意圖如下:

 

    一個串口控制器內的所有設備設置的串口通訊參數都是一樣的,所以設備驅動(IRunDevice)接口的COM中的Port屬性、IO接口(IIOChannel)的Key屬性、以及串口控制器(IIOController)接口Key屬性是一致的,都用于標識串口號。既然一個串口控制器中的所有設備都共用一個硬件串口,就決定了所有設備驅動之間的任務調度只能采用輪詢模式,一個設備發送和接收操作完之后,再調度下一個設備驅動,設備驅動之間就是串行工作模式,避免一個串口控制器內多個設備驅動同時操作串口IO導致數據混亂,影響正常通訊。

    一個串口控制器內的設備驅動是串行工作模式,如果把所有設備驅動都設置成一個串口號,在一個串口控制器下串行調度,那么就會影響設備驅動的通訊效率,某個設備的調度周期的公式如下:

某個設備調度周期=(串口控制器所有設備數-1)* 單個設備驅動執行耗時

      這僅是一個理論值,實際應用中要比這個理論值要大,因為涉及到不類型的設備驅動共用一個串口號,在一個串口控制器下工作,處理的數據流程、方式不同,例如:有可能數據保存在TXT文件中、有可能保存在SQL數據庫中、有可能保存在NoSQL數據庫中等等。

     有人會想,豈不是在一個串口下掛載的設備越多效率越低,的確是這樣的。但是,多個串口控制器之間是并行工作模式。如果現場環境對通訊效率有要求的話,可以增加串口服務器,也就是增加可用的串口硬件電路,把N個設備驅動平衡負載到不同的串口上,增加并行運行的串口控制器的節點,進而提高框架平臺的運行效率。

    但是,這樣解決之后也帶來一定的風險和瓶頸,就是對于數據的存儲,如果多個并行的數據流同時向一個單線程的存儲介質寫數據,那么又會造成互斥的現象,甚至造成意想不到的結果或異常,如下圖:

 

     如果同時向Sql Server、OracleMySQL等數據庫存儲數據,那么是沒有問題的;如果采用文本文件、桌面數據庫等存儲數據,那么可能存在問題,可以分多個文件進行保存操作。DCS系統大多采用PI(Plant Information System)數據庫。總之,作為一個系統來講,需要整體設計、考慮,這塊需要特別注意。

6.3    網絡控制器

     框架平臺只有一個網絡控制器,網絡控制器內有一個獨立的線程負責對所有網絡設備驅動進行輪詢、并發、自控模式通訊調度。輪詢通訊模式與串口控制器類似,只是串行的調度所有網絡設備驅動,但是框架只有一個網絡控制器,不能通過增加網絡控制器來提高通訊效率,這種模式是網絡通訊調度雞肋;并發通訊模式,線程會通過控制器中的線程集中發送所有設備的請求命令數據,接收數據是通過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>通訊控制管理器的接口定義如下:

 

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


上一篇:介紹.NETCore

下一篇:C#基礎04

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人精品 | 黄色av片三级三级三级免费看 | 国内久久久久 | 久久久久99精品 | 国产噜噜噜 | 亚洲视频成人 | 午夜精品久久久久久中宇 | 色欧美视频 | 91色成人 | 操碰 | 男男羞羞视频网站国产 | 一区二区三区欧美在线观看 | 国产免费看片 | 亚洲男人的天堂在线视频 | 一本一本久久a久久精品综合小说 | 性视频久久 | 久久国产精品二国产精品 | 精品久久久久久久久久久αⅴ | 国产二区三区在线播放 | 国产91一区二区三区 | 毛片毛片 | 欧美一级二级毛片视频 | 日本中文字幕久久 | 黄色片免费在线播放 | 中文欧美日韩 | 欧美黄色性生活视频 | 日本成人一二三区 | 最近中文字幕一区二区 | 久草视频在线资源 | 91av视频大全 | 一级国产电影 | 欧美性受xxxx白人性爽 | 国产伦久视频免费观看视频 | 91成人亚洲| 天堂成人国产精品一区 | www视频免费观看 | 99re热精品视频 | 4480午夜| 国产精品美女久久久久久网站 | 中文字幕在线亚洲精品 | 精品亚洲免费 |