WiFi Modbus 應用:在 Filogic 開發板, 實現無線連網的資料收集


        本文將在聯發科的 Filogic 130A 開發板上實現一個無線連網的資料收集方案, 利用工業常見的 Modbus 通訊協定收集產線設備的數據。隨著工廠智能化的發展,生產線上的設備,如:PLC測儀器...都具有聯網的功能,並能提供即時的產線資訊輸出,因此後端需要一個資料收集的方案將產線資訊整合。Filogic 130A 這塊板子除了無線連網功能外,還有 SD 卡介面和 FAT 檔案管理系統,請參考影片連結:"Implement SD + FTP server on Filogic 130A" https://youtu.be/C8EW4fvFUds。接下來,本文要介紹板子的 SDK [1] 所提供的 DNS (Domain Name System) 和 NTP (Network Time Procotol),並實現 Modbus 通訊功能,最後將數據資料依據當下的時間實時地記錄到 SD 卡裡面。完整的教學影片連結:https://youtu.be/TPryHb3H2oM


DSN & NTP

        關於數據收集,首先遇到第一個問題是時間,板子需要一個本地時間。因此,我們採用 NTP 協定取得網路時間,以便板子開機後能同步為本地時間。再者,另一個問題是 NTP 服務器常以 domain name 方式呈現,非 IP 位址方式。所以,我們還需要 DNS 的功能,將服務器的網域名稱轉成實體 IP 位址,這樣才能取得網路時間。這段正是要說明這塊 Filogic 開發板如何做到 DNS 和 NTP 的功能。

        在 Filogic 提供的 SDK 裡頭,它整合了一個第三方開源碼,為 LwIP (Light Weight IP),是一個 TCP/IP protocol stack。DNS 正是裡面所支援的通訊協定之一,因此我們只要呼叫 LwIP 函數庫就可以使用 DNS 的服務,如下所示。調用 dns_gethostbyname 函數,再給定一個自己的 callback 函數,這樣就能取得 domain name 的 IP 位址了。

            dns_init();   // 初始化 DNS
    ipaddr_aton("8.8.8.8", &rIP);
    dns_setserver(1, &rIP);   // 設定 DNS 服務器



        再來,關於 NTP 協定,雖然在 SDK 裡頭有這部分的源碼,但是 NTP 並沒有整合到系統的Makefile,所以需要我們手動地將它加到 module.mk 檔案裡,sntp.c 存放的目錄如下:

            SNTP_SRC = middleware/third_party/lwip/src/apps/sntp

            #source file
            C_FILES += $(SNTP_SRC)/sntp.c
            CFLAGS += -I$(SOURCE_DIR)/middleware/third_party/lwip/src/include/lwip/apps

然後,我們才能呼叫其函數庫,調用的方式如下。不過,sntp.c 程式碼直接拿來用還是有一點問題,需要自行再修改一下,才能符合自己的需求。
                sntp_setoperatingmode( SNTP_OPMODE_POLL );
                sntp_setserver(0, &hostIp);  // 設定 NTP 服務器的IP
                sntp_init();    // 啟動 NTP,取得時間
                vTaskDelay(100);

ut = time(NULL) + sntp_timestamp + (8*60*60);  // 加上 time zone
printf("%s\n", ctime(&ut));
最後測試的結果會獲得目前 UTC 的時間,然後再加上本地的時區就能得到本地時間。


Modbus 協定

        在工業設備的應用上,設備間的通訊以 Modbus 協定[2]為常見的標準之一。然而,在實體層線路的連接,常見以網路、RS-232、RS-485 等媒介相通,所以程式碼有 Modbus over TCP 或 Modbus over RS-232 之分。在這塊開發板上,實作一個 Modbus 資料擷取的程式,試著從設備讀取位址的數值,再記錄到 SD 卡裡。

        下圖所示,我們使用一個 ModSlave 工具在電腦上模擬工業設備的數據,而 Filogic 開發板每秒發出讀取資料的封包,我們再從 COM port 驗證數據收到的時間,比對兩邊的資料無誤。最後,這些數據依據我們希望的格式寫入 SD 卡內,完成收集的動作。


參考資料

[2] Modbus Application Protocol Spec V1.1b3

留言

此網誌的熱門文章

[筆記] Raspberry Pi 樹莓派的軟體開發

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[應用] STM32 DFU (Device Firmware Upgrade)

[模組] 無線資料傳輸:nRF905 和 nRF24L01 (以 Arduino 為控制器)

[筆記] Visual Studio 遠端偵錯的設定步驟

建立一個 MQTT 測試環境