21.1 概述
ServerSuperIO以前所做的工作逐漸為形成回路控制或級聯控制打下基礎,例如:服務連接配接器和裝置驅動連接配接器的開發與應用。總之,是通過多種形式下發指令控制裝置(驅動)或傳感器,雲端控制站點或監測點的傳感器、App或者其他終端控制傳感器、根據傳感器的采集資料控制另一個傳感器等。
下面介紹雲端、App或者其他終端如何控制傳感器裝置(傳感器控制傳感器類似,請參見:
12.服務接口的開發,以及與雲端雙向互動)。根據通訊協定,結構化方案、不需要太多代碼即可完成相應的功能。效果如下圖:

21.2 結構示意圖
控制端發起控制指令,用ServerSuperIO服務接口開發一個簡單的代理服務,通過服務連接配接器IServiceConnector接口與裝置驅動進行互動,裝置驅動接收到控制指令後下發給裝置或傳感器,等待控制傳回的确認消息,再原路傳回給控制端。
21.3 通訊協定
有人問為什麼不使用MQTT協定,那如何相容不同裝置和傳感器的協定?以于中國現實情況,顯然還不能達到統一标準的水準,在經濟不好的情況下,企業也不可能投資替換掉原來的硬體裝置。也不符合ServerSuperIO設計的原則,就是要搞協定無關性,任何标準或非标準的協定都可以內建進來。如果想過一條河,把橋修好、把索道搭好、把船擺好…具體怎麼過河由你自己決定。
有人問ServerSuperIO都內建了什麼協定?上面已經給出了答案,另外我想說的是沒有任何一個架構可以包治百病。從相反的角度來考慮,如果像組态一樣把任何協定都加進來,企業又想拿出來多少的價值來對等交換呢,是以協定驅動還是交給大家來自己寫吧。
我們示範的協定如下圖:
21.4 控制端
控制端包括很多種:雲端向下級發送控制指令、App或Pc機軟體連接配接服務發送控制指令等等。發送控制指令如下圖:
21.5 代理服務(SSIO服務接口)
代理服務是通過ServerSuperIO的IService接口實作,在繼承類中使用ServerSuperIO架構本身的單例模式開發代理服務,代碼如下:
public override void StartService()
{
string devId = "ControlDeviceService";
Driver dev = new Driver();
dev.ReceiveRequestInfos += Dev_ReceiveRequestInfos;
dev.DeviceParameter.DeviceName = "控制裝置驅動器";
dev.DeviceParameter.DeviceAddr = 0;
dev.DeviceParameter.DeviceID = devId;
dev.DeviceParameter.DeviceCode = "";
dev.DeviceDynamic.DeviceID = devId;
dev.DeviceParameter.NET.RemoteIP = "127.0.0.1";
dev.DeviceParameter.NET.RemotePort = 9600;
dev.DeviceParameter.NET.ControllerGroup = "LocalGroup";
dev.CommunicateType = CommunicateType.NET;
dev.Initialize(devId);
IServer server = new ServerManager().CreateServer(new ServerConfig()
{
ServerName = "控制裝置服務",
ListenPort=6670,
ComReadTimeout = 1000,
ComWriteTimeout = 1000,
NetReceiveTimeout = 1000,
NetSendTimeout = 1000,
ControlMode = ControlMode.Singleton,
SocketMode = SocketMode.Tcp,
StartReceiveDataFliter = false,
ClearSocketSession = false,
StartCheckPackageLength = false,
CheckSameSocketSession = false,
});
server.AddDeviceCompleted += server_AddDeviceCompleted;
server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
server.SocketConnected += server_SocketConnected;
server.SocketClosed += server_SocketClosed;
server.Start();
server.AddDevice(dev);
}
dev.ReceiveRequestInfos事件是控制驅動繼承ServerSuperIO架構中RunDevice驅動類擴充的事件接口,ServerSuperIO單例模式接收到資料資訊,如果符合協定标準會把資料資訊回報給驅動程式的Communicate接口,ReceiveRequestInfos事件把資料資訊傳遞給代理服務訂閱該事件的Dev_ReceiveRequestInfos函數。代碼如下圖:
代理服務中的Dev_ReceiveRequestInfos函數,通過服務連接配接器接口IServiceConnector,根據DeviceCode(addr)把資訊傳遞給相應的裝置驅動。代碼如下圖:
代理服務通過ServiceConnectorCallback和ServiceConnectorCallbackError函數接口接收裝置驅動回報的結果資訊,如果中間出現異常會調用ServiceConnectorCallbackError,如果正常會調用ServiceConnectorCallback函數,ServiceConnectorCallback函數接口根據記錄的指令與IO通道的對應關系,再把結果發送給控制端。ServiceConnectorCallback代碼如下圖:
在這裡邊有一個注意的地方,就是裝置驅動在規定的時間内沒有回報控制指令的确認資訊,也就是傳感器沒有回報相應的資訊。這種情況要增加一個定時檢測服務,如果逾時沒有回報資訊,發送給控制端相應的消息。代碼如下圖:
21.6 裝置驅動
這個裝置驅動與傳感器相對應,之間互相過行資料互動。裝置驅動的RunServiceConnector接口負責接收代理服務Dev_ReceiveRequestInfos(OnServiceConnector)函數傳遞過來的指令資訊。代碼如下圖:
有兩點說明:1.接收到指令資料後可以通過OnSendData函數立即下發資料資訊,以設定的IP查找相應的IO通道,适用于自控模式。2. 接收到指令資料後放到this.Protocol.SendCache協定緩存中,等待下發指令,适用于輪詢、并發模式。
針對于傳回的結果對象ServiceConnectorCallbackResult的isAsyn參數,如果為true,說明通過AsyncServiceConnectorCallback callback傳回結果資訊,也就是說要等待傳感器傳回确認資訊,并且裝置驅動接收後再回報到代理服務;如果為false,說明會立即回報到代理服務,适用于傳遞資料資訊而不管與傳感器是否互動成功。
可以在這個函數中把callback參數進行臨時儲存,等待傳感器傳回确認資訊後在Communicate函數中觸發異步回調到代理服務。代碼如下圖:
21.7 Demo說明
打開兩個TestDevice程式,一個作為裝置傳感器,一個作為控制端,DeviceCode要以應;TestDeviceDriver是裝置驅動,在服務執行個體中加載,我用的是自控模式,使用TestSelfMain項目;ControlDeviceService是代理服務,在TestSelfMain中加載。具體參見工程代碼:
http://pan.baidu.com/s/1c1ZZLOO。
備注:将來我們的大資料平台,也可以通這種模式下發控制指令到站點。
1.
[連載]《C#通訊(序列槽和網絡)架構的設計與實作》2.[
開源]C#跨平台物聯網通訊架構ServerSuperIO(SSIO)介紹2.
應用SuperIO(SIO)和開源跨平台物聯網架構ServerSuperIO(SSIO)建構系統的整體方案3.
C#工業物聯網和內建系統解決方案的技術路線(資料源、資料采集、資料上傳與接收、ActiveMQ、Mongodb、WebApi、手機App)5.ServerSuperIO開源位址:
https://github.com/wxzz/ServerSuperIO物聯網&內建技術(.NET) QQ群:54256083
下載下傳位址:
http://www.bmpj.net/thread-14-1-1.html 1.C#跨平台物聯網通訊架構ServerSuperIO(SSIO)介紹 《連載 | 物聯網架構ServerSuperIO教程》1.4種通訊模式機制。 《連載 | 物聯網架構ServerSuperIO教程》2.服務執行個體的配置參數說明 《連載 | 物聯網架構ServerSuperIO教程》- 3.裝置驅動介紹 《連載 | 物聯網架構ServerSuperIO教程》-4.如開發一套裝置驅動,同時支援序列槽和網絡通訊。 《連載 | 物聯網架構ServerSuperIO教程》- 5.輪詢通訊模式開發及注意事項。 《連載 | 物聯網架構ServerSuperIO教程》- 6.并發通訊模式開發及注意事項 《連載 | 物聯網架構ServerSuperIO教程》- 7.自控通訊模式開發及注意事項 《連載 | 物聯網架構ServerSuperIO教程》- 8.單例通訊模式開發及注意事項 《連載 | 物聯網架構ServerSuperIO教程》- 9. 協定過濾器,解決一包多發、粘包、備援資料 《連載 | 物聯網架構ServerSuperIO教程》- 10.持續傳輸大塊資料流的兩種方式(如:檔案) 《連載 | 物聯網架構ServerSuperIO教程》- 11.實作裝置(驅動)與裝置(驅動)互動和級聯控制。 《連載 | 物聯網架構ServerSuperIO教程》- 12.服務接口的開發,以及與雲端雙向互動 《連載 | 物聯網架構ServerSuperIO教程》- 13.自定義視圖顯示接口開發,滿足不同的顯示需求 《連載 | 物聯網架構ServerSuperIO教程》- 14.配制工具介紹,以及裝置驅動、視圖驅動、服務執行個體的挂載 《連載 | 物聯網架構ServerSuperIO教程》- 15.資料持久化接口的使用 《連載 | 物聯網架構ServerSuperIO教程》- 16.OPC Server的使用步驟 《連載 | 物聯網架構ServerSuperIO教程》- 17.支援實時資料庫,高并發儲存測點資料 《連載 | 物聯網架構ServerSuperIO教程》- 18.內建OPC Client,及使用步驟 《連載 | 物聯網架構ServerSuperIO教程》-19.裝置驅動和OPC Client支援mysql、oracle、sqlite、sqlserver的持久化 《物聯網架構ServerSuperIO教程》-20.網絡通訊控制器分組,提高互動的負載平衡能力。v3.6.6 版本釋出