跨平臺SCADA系統(組態軟件)開發6

六、服務端實現

6.1 概述

本章所說的服務端,是“儀器-工控機-服務器-客戶端”架構中的服務端,並不實現採集功能(採集功能已在前面的章節講述)。我們要實現的服務端是有高實時性的,當數據發生改變時,迅速地推送給客戶端。同時,客戶端上的反控操作,能快速地反映到儀器上。

MQTT是實現此類服務端較好的技術選擇。以“設備名.因子名”爲主題,當採集到變化的數據時,發佈相應主題。客戶端根據當前顯示需要,訂閱相關的主題。同時,工控機訂閱一個專門的反控主題,任何客戶端的反控操作都發布該主題。

 

6.2 服務端技術實現

使用MQTTnet開發MQTT服務器,同時支持TCP模式和WebSocket模式。爲了支持WebSocket,必須建立一個ASP.NET Core項目,然後修改Program.cs爲:

public static void Main(string[] args)
{
    BuildWebHost(args).Run();
}

private static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseKestrel(o =>
    {
        o.ListenAnyIP(9022, l => l.UseMqtt());//TCP
        o.ListenAnyIP(9021);//WebSocket
    })
.UseStartup<Startup>()
.Build();

修改Startup.cs爲:

public void ConfigureServices(IServiceCollection services)
{
    services
    .AddHostedMqttServer(mqttServer => mqttServer.WithoutDefaultEndpoint())
    .AddMqttConnectionHandler()
    .AddConnections();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapMqtt("/mqtt");
    });

    app.UseMqttServer(server =>
    {
        //處理MQTT消息
    });
}

 

對MQTT服務器來說,工控機和網頁客戶端都是客戶端,如下圖所示:

由於存在反控,工控機分別訂閱了不同的反控主題。而對客戶端來說,它是一個整體的展現,並不太關心什麼數據來自哪個工控機。所以,在反控時,服務端需要對反控命令進行分發。

 

6.3 客戶端技術實現

客戶端使用mqtt.js實現功能,通過WebSocket的方式連接服務端。所有因子的主題爲一個保留主題,基本客戶端剛連接就可以收到最新的因子列表。它再通過這個列表訂閱相關的因子主題,得到因子的最新數值。

下面,我們模擬了一個從儀器到工控機,到服務端,再到客戶端的場景。

8臺虛擬Modbus設備,約700個因子:

模擬兩臺工控機,每臺採集4臺儀器:

模擬MQTT服務端:

模擬Web客戶端:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章