•   
    •   
    •   
      •   
      •   
      •   
      •   
      •   
        •   
        •   
      •   
      •   
    •   
      •   
      •   
      •   
      •   
      •   
      •   
    •   
      •   
        •   
        •   
      •   
      •   
      •   
      •   
        •   
        •   
        •   
        •   
      •   
        •   
      •   
      •   
        •   
        •   
        •   
        •   
    •   
      •   
      •   
      •   
      •   
    •   
      •   
      •   
      •   
      •   
      •   
      •   
        •   
        •   
        •   
    •   
    •   
      •   
      •   
  •   
  •   

1.IOTGW 入門示範手冊:

本文件以 EBox-AIO-003 與 EBox-AIO-005 為例說明 元米科技 IOTGW 物聯網可程式閘道器的操作要點

補充說明:
■ DDCgw 是 元米科技 整合原有成熟的 MODBUS HMI 方案與 DDC32e 方案,應用現有流行的 Raspberry PI 與 NANOPI NEO 等單板電腦開發之網頁圖控物聯網可程式閘道器方案
■ IOTGW 是 元米科技 利用現有設備基於 DDCgw 方案建置的物聯網可程式閘道器
■ EBox-AIO-003 與 EBox-AIO-005 連立達科技所生產的基於 NANOPI NEO Core 的嵌入式電腦,是目前 元米科技 IOTGW 優先採用的平台設備


1.1.關於 EBox-AIO-003 與 EBox-AIO-005:

EBox-AIO-003 與 EBox-AIO-005 是 連立達科技 所生產的基於 NANOPI NEO Core 的嵌入式電腦,具備乙太網路、1 或 4 個 RS485 通訊端口,工業級別的設計,易安裝固定、易供電及各種信號保護功能,滿足了各類應用現場的安裝需求。


為了降低使用 DDCgw 方案的門檻 元米科技 利用 連立達科技 EBox-AIO 系列建構基於 DDCgw 方案的多功能可程式通訊閘道器(簡稱 IOTGW),使用者不須具備 Linux 操作技能,即可輕易的完成大部分 MODBUS TCP 與 MODBUS RTU 設備通訊與邏輯控制,並使利用簡易的圖控編輯器專案網頁圖控介面,以建構一個可區域控制及行動操控的物聯網資訊中心。本產品可以適用於小型樓宇監控系統、環境監控系統、節能監控系統以及機台設備遠端監控系統等應用場合。
DDCgw 物聯網可程式閘道器方案資料參考資訊 .
關於 EBox-AIO-003 與 EBox-AIO-005細部規格資料參考 .

1.2.基本操作-從送電開始:

自 元米科技 出貨之 EBox-AIO-003 與 EBox-AIO-005 皆已完成 IOTGW 系統安裝與授權,可以直接依照以下步驟執行,如果直接自連立達購買之設備則被需另外像元米科技洽詢安裝方式與購買授權。

1.2.1.找到設備:

將設備依照規格連接電源(輸入電壓:DC 9-24VDC),並將乙太網路線連接到具備 DHCP server 的局網(LAN)中即可利用 ICDT Network scanner 應用程式找到設備。



執行 Network scanner 程式後將程式 Interface 處選擇 目前設備連接局網的介面,按下 Scan 進行搜尋,找到的設備會顯示於清單中,如果出現 (DDCGW/EBox-AIO-003) 或 (DDCGW/EBox-AIO-005) 即為本設備,注意其中的 EBox-AIO-003 為預設的 Host name ,可能因為被改過而有不同。

在找到的設備上點兩下可以進到 TCP Scan 畫面,點選 Scan 後會依照 TCP Ports 清單中掃描,預設的 IOTGW 會開啟 80 與 502 兩個 TCP Server,分別做為網頁伺服器(HTTP Server) 與 MODBUS TCP Server,在左側清單的 80 上點兩下即可透過預設瀏覽器開啟網頁畫面



下載ICDT Network scanner


1.2.2.登入網頁:

透過 Network Scanner 或直接在瀏覽器輸入 EBox-AIO-003 或 EBox-AIO-005 的 IP 即可連結到其首頁,未上傳過圖控專案前,首頁畫面會出現三個連結:
DDC Editor : 連結到設備 DDC 編輯器畫面 /ddc/
Online Menu : 連結到設備 線上手冊 /codemirror/mode/menu.html
HMI Editor : 連結到專案編輯器下載頁面



點選 DDC Editor 或直接於瀏覽器輸入設備 IP/ddc/ (例如 192.168.1.124/ddc/) 會進入 DDC 編輯器畫面 ,進入前會要求輸入帳號與密碼,未變更前的帳號/密碼為 root/root (注意小寫),如果輸入錯誤畫面會延遲一段時間再重新跳出登入畫面



登入完成後即可進入 DDC 編輯器畫面,畫面說明可以參考 Online Menu


1.2.3.變更帳號密碼:

點選右上角系統設定處可以顯示系統設定畫面
設備設定處 Host name 可以設定設備名稱,用於辨識設備;MODBUS TCP Server Port 設定 MODBUS TCP Server 通訊埠號,預設為 502。
帳號 與 密碼 用於 DDC 編輯器登錄以及專案圖控畫面上傳,預設的 帳號/密碼 為 root/root,專案設置時加以變更,以避免專案 DDC 程式、控制參數 與 專案圖控畫面被遠端任意變更。變更 帳號/密碼 後忘記此帳號密碼可能造成設備無法再進行編輯與除錯。
變更 帳號/密碼 提交後立即生效,目前密碼可以點擊密碼旁眼睛圖示已開啟或關閉顯示


1.2.4.變更網路設定:

出廠的 IOTGW 是採用 DHCP 的 動態 IP 模式,實際應用時需要設定為靜態 IP 以方便 MODBUS TCP Client 與網頁瀏覽器訪問。
靜態 IP 除了可以透過 DHCP Server 綁定外,也可以直接將網頁設定 DHCP 選擇 否
,並輸入 IP 地址、子網路遮罩 (Subnet Mask)、Gateway 與 DNS。如果無法確定應該設置的內容,相關設定參數請洽網管人員。
完成設定並提交後,並須重啟網路才能生效。
必須注意重啟網路可能使設備作業系統重新啟動


1.2.5.關於 DDC 任務:

DDCgw 具備一個主任務以及 20 個周邊任務,於 DDC 編輯器左上角選單可以選擇 主任務 (Main) 以及 周邊任務(Task 1 ~ Task 20),選擇後如果該任務有控制程式,會出現 "讀取程式" 按鈕,按下後可以下載目前的控制程式


1.2.5.1.主任務:

主程式任務,強制每秒(或 0.1 秒)執行一個週期,用於主要操作與定時設定
通訊相關程式只有 RTU Slave 可以(而且必須)寫在主程式,其餘都必須寫在周邊任務,以確保主任務的執行週期,其他如 時間延遲 或執行 app 等功能同樣不能寫在 主任務 中
主程式重新啟動時,周邊任務會同步重新啟動
編寫程式時須留意該函數是否適用於主程式任務,於程式手冊的『函數/指令』單元會針對限定用途的函數註明使用任務類型

1.2.5.2.周邊任務:

周邊任務,用於通訊周邊的獨立執行序,程式執行週期視通訊與延遲時間而定
周邊任務可個別重新啟動
周邊任務應盡可能為簡易的任務,並避免與其他任務重複存取相同暫存器或周邊
編寫程式時須留意該函數是否適用於周邊任務,於程式手冊的『函數/指令』單元會針對限定用途的函數註明使用任務類型

1.2.6.關於線上操作說明:

DDC 編輯器右側操作說明可方便查閱程式使用要點,如果右側為除錯視窗時,按下右上角書本圖示即可完成切換
顯上上方清單 + 處可以打開清單, - 處可以收攏清單,按下文字可以在下方說明內文切換到該處

下方說明內文處如果是範例程式碼,會在點選後複製到左側的程式編輯區

操作說明最下方 ▲ 按鈕可以將上方清單全部內容收攏,▼按鈕可以將上方清單全部打開以方便閱讀。操作說明最下方右側箭頭按鈕可以將本說明書以全頁方式顯示

最下方中間的文字方塊可以輸入函數等關鍵字(完成輸入需按下 Enter),以利快速搜尋相關內容


1.2.7.關於除錯視窗:

DDC 編輯器右側除錯視窗可方便查閱設備狀況與顯示除錯資訊,如果右側為操作說明時,按下右上角視窗圖示即可完成開啟/暫停/繼續運行除錯視窗
除錯視窗可以顯示系統資訊以及選擇任務的通訊與除錯(debug函數資訊),並接受除錯指令



按下視窗下方 ! 按鈕或於指令欄輸入 ? 並按下 Enter將顯示指令提示,輸入各項指令以進行查閱或讀取/設定變數,除錯指令詳細說明請查閱操作說明『除錯視窗』單元



除錯視窗於運行模式時會顯示目前(左上任務選單)選擇任務的通訊與除錯資訊,須注意系統資訊與除錯資訊(debug函數資訊)同一設備同一時間內僅能於於一個瀏覽視窗顯示,同時開啟超過一個除錯將無法正常顯示。要停止除錯視窗運行模式的資訊,只要在按一下右上角暫停按鈕即可

1.3.程式基礎說明:

1.3.1.讀取、開啟與存檔:

DDC 編輯器左上角選單可以選擇 主任務 (Main) 以及 周邊任務(Task 1 ~ Task 20),選擇後如果該任務有控制程式,會出現『"讀取程式』 按鈕,按下後可以下載目前的控制程式,如果目前程式編輯區有未儲存的內容,會詢問是否覆蓋



按下『開啟程式』按鈕可以自電腦讀取預存的 DDC 程式



按下『清除程式』按鈕可以清空程式編輯區,同時會清除錯視窗的內容



按下『下載副本』按鈕可以程式編輯區的內容(不是控制器內的程式)依照任務為預設檔名下載存檔


1.3.2.編輯、驗證與上傳程式:

程式編輯區輸入程式時,如果輸入的變數或函數大小寫或拼字錯誤,會成為紅色寫下方出現波浪線以標示錯誤,按下由上方『驗證程式』按鈕可以進一步程式是否錯誤,如果錯誤右側會顯示錯誤行號與錯誤提示。



完成驗證無誤後右側會顯示整理後的程式碼,並且出現『寫入程式』按鈕



按下『寫入程式』按鈕出現覆蓋的提示



完成寫入程式後,會出現重載任務的選項,選擇『確定』重載主任務會將全部的周邊任務全部一起重新啟動,如果是周邊任務則只會重新啟動該任務本身



重新啟動時,如點選由上角的『除錯視窗』圖示可以看到除新啟動的相關資訊。
如果上傳程式後選擇『取消』重載任務,則新的程式不會被執行,因此會發生執行程式與存檔程式不一致的狀況。

如果 DDC 任務被鎖定則無法上傳刪除,程式鎖定與解鎖


1.3.3.刪除與重新程式:

選擇任務為周邊且有程式時會出現『刪除程式』的按鈕,按下並『確認』後會刪除程式



如果 DDC 任務被鎖定則無法上傳刪除,程式鎖定與解鎖




選擇任務為周邊且有程式時會出現『重新啟動』的按鈕,選擇主任務則會有『全部重載』按鈕,點選後選擇『確定』重載主任務會將全部的周邊任務全部一起重新啟動,如果是周邊任務則只會重新啟動該任務本身


1.3.4.變數:

IOTGW 內部有 2000 個 16 位元 的 Holging Register 程式中以 R0~R1999 表,2000 個 1 位元的 Coil 程式中以 C0~C1999 代表,另外有 2000 個 32 位元 Branch 運算暫存器,程式中以 B0~B1999 為代表。

由於 Holding Register 16 位元 (0~FFFFh)數值範圍0~65535,因此程式存取控制器內部 Holding Register 可做多項數值格式或倍率變化,以因應不同場合,必須注意.F等一次使用兩個 Register 的應用方式則後續一個編號應保留不可使用。例如 R100.F 則需要保留 R101 不可使用。Holding Register 的數值變化可以參考操作說明的 『Holding Register格式變化』單元

Branch 為 32 位元內部運算記憶體,預設為浮點數方式儲存,亦可加格式符號 .U (例如 B0.U)以強制做4 位元組整數存取,或加.S (例如 B10.S)以強制做4 位元組符號整數存取。浮點數與整數存存方式無法混用
Branch 可以參考操作說明的 『Branch』單元

1.3.5.程式語法要點:

DDC 程式採用循環方式執行,執行完畢後會從最開始處執行,如果時間低於一個程式週期時間(0.1秒或1秒),會延遲到一個程式週期時間才執行。主任務(Main Task)會盡可以於一個程式週期時間內執行完畢,因此主任務不支援時間延遲函數如 dealy()、pause()、until()、period()等,也不支援需要等待的通訊函數,如 mbtcp() 、mqttclient(),以及 run() 執行外部程式功能。
而例如 setuid() 、setenv() 等重要功能設定,為了避免混淆不允許則僅限於主任務使用

DDC 程式編輯的方式與 C 語言相近,但不需要加分號 ,每行也只能有一種函數或運算元(例如+)。程式中運算元(例如+)與變數必須以空格隔開

程式編輯可以利用 // 加註解或 /* */ 做區塊註解,註釋內容會連同程式一起儲存於控制器中,以增加程式可讀性

編輯器允許以自定變數代替記憶體、變數或常數,以增加。自定變數必須前後以‘$’符號標示,例如 ‘$power$’ ,於使用該自定變數時,必須在前面加以定義。
例如 #define $power$ = C1,編譯器自動會以 C1 取代隨後遇到的 $power$。如果未事先定義,則會在編譯時產生錯誤提示。自定變數長度不得超過 30 個字元。(參考『自定變數 』)

程式支援 條件式 if / elif / else / endif ,允許巢式多層次運算 (參考『條件式』)

基本邏輯與算數運算 如 + - * & | 等運算允許一次多個變數,例如 R1 = R2 + R3 + R4 + 0.5
基本邏輯與算數運算 除了用算術子表示外,也可以利用函數方式表示,例如 如 R1 = R2 + R3 + R4 + 0.5 也可以用 R1 = add(R2, R3, R4, 0.5)

部分函數的變數會限制變數類型,例如 函數的輸出變數必須為 Coil (C0~C1999) 或 Register (R0~R1999) 或 Branch (B0~B1999) 或 GPIO (GPIO0~GPIO19)

部分函數的後面參數可以省略以使用用設值,但如果少了不能省略的參數會顯示錯誤

部分函數會依照參數類型(例如字串、數值、暫存器等)不同,而有不同的功能 例如 mqttclient()


相同的時間變數在不同函數可能有不同的效果,例如 DATE 在 debug() 函數會顯示今天的日期,作為數值運算時(例如 R33 = DATE) 則會是今天是當年的第幾天;而 TIME 在 debug() 函數會顯示目前的時間,作為數值運算時(例如 R33 = TIME) 則會是現在在當天過了多少秒;DTIME 在 debug() 函數會顯示目前的日期時間,作為數值運算時(例如 R33 = DTIME) 則會是程式啟動到目前的秒數

程式碼中必須注意大小寫是不同的,例如 DATE 是代表目前日期的變數,而 date 則是日期運算的函數

1.3.6.空氣線圖程式範例:

這是簡易的程式範例,展示自定變數的應用與程式的寫法,提供乾球溫度與相對溼度的輸入以計算公制及英制的溼球溫度、露點溫度、焓值等空氣屬性

//空氣線圖計算範例
#define $temp_c$ = R300.d1
#define $temp_f$ = R301.d1
#define $humid$ = R302.d1
#define $wet_c$ = R303.d1
#define $wet_f$ = R304.d1
#define $dew_c$ = R305.d1
#define $dew_f$ = R306.d1
#define $btu$ = R307.d1
#define $kjkg$ = R308.d1

B0 = $temp_c$ *1.8
$temp_f$ = B0 + 32
$wet_c$ = wetbulb($temp_c$, $humid$ ,0)
$wet_f$ = wetbulb($temp_f$, $humid$ ,1)
$dew_c$ = dewpoint($temp_c$, $humid$ ,0)
$dew_f$ = dewpoint($temp_f$, $humid$ ,1)
$kjkg$ = enthalpy($temp_c$, $humid$ ,0)
$btu$ = enthalpy($temp_f$, $humid$ ,1)


圖控編輯範例

1.4.程式進階說明:

1.4.1.程式除錯:

1.4.1.1.除錯視窗與 debug 函數:

為了便於除錯,程式可以在關鍵位置加上 debug() 函數,將關鍵數值輸出到除錯視窗,debug() 函數的允許多個參數,可以字串、常數或暫存器,實務上可以利用字串標示程式輸出的的相對位置
(例如 debug(TIME, "temp1:", R1.d1, "Humid1:", R2.d1) )




除了 debug() 函數的輸出,除錯視窗同時會顯示程式啟動狀態、運行時間以及異常資訊,如果使用通訊功能,則會顯示通訊程式碼,以利除錯。您可以暫停視窗的讀取以利判讀資訊。

須注意系統資訊與除錯資訊(debug函數資訊) 同一設備同一時間內僅能於於一個瀏覽視窗顯示,同時開啟超過一個除錯將無法正常顯示

1.4.1.2.快速存取視窗:

除了 debug() 函數搭配除錯視窗進行除錯,您也可以利用快速存取視窗觀察即時數值與改變暫存器數值。操作『讀取程式』並『驗證程式』後,點選『快速存取』可開啟快速存取視窗並載入程式使用的暫存器,您也可以視窗上的利用 + 與 x 按鈕以增加或移除變數,相較於除錯視窗使用快速存取視窗除錯的注意要點如下:

◆快速存取視窗顯示變數的即時數值,這代表數值可能被程式其他位置的運算結果、其他任務運算結果或透過通訊介面被改變,因此不一定代表程式的運算輸出
◆改變快速存取視窗上的變數時,其方框底色會變色,此時不會更新及時數值也不會寫出,一直到按下 Enter 使底色回復為止
◆ Register 可以利用與程式相同的格式代碼以利判讀,例如 R100.F




1.4.2.程式鎖定與解鎖:

由於各個任務有屬於自己的 DDC 程式,想避免錯誤操作刪除或修改了 DDC 程式,除了存檔備份外,可以透過除錯視窗以除錯指令鎖定與解鎖程式,鎖定後的程式除非解鎖,否則無法刪除或變更。
點選右上角視窗圖示以開啟除錯視窗,為避免除錯訊息干擾操作,可以在按一下(原本視窗圖示)相同位置的暫停圖示,以暫停接收除錯訊息。於除錯視窗下方除錯指令列輸入 list 並按下 Enter 可以查詢目前所有任務的 DDC 程式,主任務為 Main.ddc,其餘周邊任務為 Task_1.ddc ~ Task_20.ddc,如果程式的附檔名 由 .ddc 變為 .dlc 時,表示該 DDC 程式為鎖定狀態。

解除鎖定狀態的 DDC 程式必須在除錯指令列輸入 list-Main.dlc 並按下 Enter,此處以 Main 主任務為例,周邊任務則改為 Task_1.dlc ~ Task20.dlc。必須注意且除鎖定的附檔名必須為 .dlc

鎖定DDC 程式必須在除錯指令列輸入 list+Main.ddc 並按下 Enter,此處以 Main 主任務為例,周邊任務則改為 Task_1.ddc ~ Task20.ddc。必須注意且鎖定程式的附檔名必須為 .ddc



1.4.3.查詢執行中的任務:

於除錯視窗命令列輸入 tasks 可以看到運行中的任務,CMD 的其中 ddcgw 00 表示主任務,ddcgw 01 表示 Task 1 周邊任務、ddcgw 02 表示 Task 2 周邊任務,依此類推
TIME 欄位表示該任務執行的 CPU 時間,非啟動到目前的時間;MEM 表示占用到多少全部記憶體比例;CPU 表示 CPU 占用比(數字越大越耗 CPU 運算資源)


1.4.4.改變執行週期時間:

DDC 程式用設為每一秒鐘執行一次(周邊任務可能因為時間延遲函數或通訊函數而超過此週期時間執行一次),如果需要用到按鈕開關或其他需要較高速的應用,可以透過 booster() 函數改變。
加速運算 booster(v) v 為 1 時週期時間為 0.1 秒,v 為 0 時程式週期時間為 1 秒,未執行此函數時預設會以每秒一次執行。除了周邊控制等即時性要求較高場合外,其餘建議維持每秒一次以降低 CPU 負荷( 即 booster(0) )

1.4.5.全區變數的應用:

自定義變數利用易於辨識的名稱取代只有符號與數字組成的記憶體位置,可以大幅增加程式的可讀性與可攜帶性。使用時必須在每個任務程式的最前面宣告使用到的變數。
如果希望所有程式皆使用相同的變數名稱時,可以利用全域變數 功能加以簡化。全區變數會在各項任務程式前被載入,如果後面的程式重複定義了相同名稱的變數,則後面的定義會被忽略。

1.4.5.1.關於自定義變數:

個項任務的程式皆可以個以 #define 來別定義變數,例如
#define $Chiller$ = C2 則程式 C1 = $Chiller$ & C3 ,則 程式會被 C1 = C2 & C3 取代




如果使用了未預先定義的變數,則會出現錯誤


1.4.5.2.寫入全域變數:

程式編輯區選擇 主任務(Main) 寫入以 /*global*/ 為開頭,內容包含一個以上的 自定變數 #define 且不可包含其他的函數的程式後,按下驗證程式時會詢問 “寫入程式至 Global”,確認後即寫入並覆蓋全域變數。
必須注意全域變數是各自任務執行前被載入,因此必須在主任務 全部重載 後才會生效


1.4.5.3.讀取全域變數:

在除錯視窗輸入指令 global 後,如果有預先存入的全域變數檔案,將會取代目前程式編輯區的內容。(目前編輯內容會被直接替代,但仍可以在程式編輯區按下 Ctrl-Z 以回復其一狀態)


1.4.5.4.刪除全域變數:

無效的全域變數除了佔用變數記憶區塊外,並不會影響程式運作,如果仍要刪除,可以在除錯視窗輸入指令 list- Global.ddc 進行刪除,如果是鎖定狀態(.dlc),則需先輸入 list- Global.dlc 進行解鎖


1.4.6.執行外部 app:

外部 app 必須以安裝在指定 app 子路徑下的可執行檔,因此除非訂製版韌體出廠預先載入的功能,否則只能在取得 SSH 連線的授權下,透過 sftp 協議傳送至指定路徑,並利用 chmod +x 賦予 root 執行權限,這是為了避免執行為被授權的指令,造成資安風險。

執行外部程式的方式 為 out = run(timeout_ms, "command", v1, v2, v3, …)
R0 = run(5000, "led.py %0.0f %0.0f %0.0f", R32.u, R33.u, R34.u)
表示將執行 app 路徑下 led.py 可執行檔,並將 R32.u, R33.u, R34.u 當成其指令列下的參數,其中 5000 代表此程式允許執行時間為 5000 mS,逾時將強制結束,如果 timeout_ms 參數為 0 則不限定執行時間,因此不會強制關閉 app。如果 timeout_ms 處改輸入 Coil 暫存器,例如 R0 = run(C100, "led.py %0.0f %0.0f %0.0f", R32.u, R33.u, R34.u) ,則會在 C100 為 1 時執行 app ,C100 為 0 時關閉 app。
輸出(R0)為0表示執行失敗,1 表示執行成功並於時間內結束,2 表示因逾時被強制中斷,3則為其他原因被中斷
執行資訊會在 debug 視窗顯示

1.4.6.1.python 範例-複製記錄到 SD:

mkdir /mnt/SD
mount /dev/mmcblk1p1 /mnt/SD

1.4.7.資料記錄與查詢:

1.4.8.環境變數:

使用 setenv() 可以設定環境變數,設定時須注意僅適用於主程式,變數都是字串,第二次重啟主程式才會生效。詳情參考 setenv()

1.4.8.1.啟動與關閉 Watchdog:

Watchdog 功能用以監視主程式任務是否正常執行,當主程式任務停止運作後會在指定的時間內使整個作業系統重新啟動。一旦開啟 Watchdog 後,除非關閉 Watchdog,否則不能關閉主程式任務。

開啟 Watchdog 並且於停止執行 10 秒後重啟系統範例:

//執行 10 秒後重啟系統, 第二次重啟主程式才會生效
//僅適用於主程式
setenv("WATCHDOG","10")


關閉 Watchdog範例 :

//停止 Watchdog, 第二次重啟主程式才會生效
//僅適用於主程式
setenv("WATCHDOG","0")

1.4.8.2.設定程式狀態 LED:

setenv("LEDGPIO", "0") 可以將 GPIO0 作為主程式任務狀態燈,正常運轉時 LED 燈將亮一秒滅一秒的週期閃爍,效果與 GPIO0 = SEC % 2 相同

1.4.8.3.關閉網頁網路參數設定功能:

程式碼加入setenv("NETCONF", "0") 將關閉系統網路參數設定功能,以防止錯誤操作造成網路異常。設定後網路設定欄位將消失,直到程式碼加入setenv("NETCONF", "1") 或無除錯命令列輸入 env-NETCONF=0

1.4.8.4.自動鎖住 DDC 檔案:

程式碼加入 setenv("LOCKDDC","1") 將自動鎖住 DDC 檔案,必須先解鎖後才能寫入程式,以防止誤操作。設定後程式上傳會將副檔名由 .ddc 改成 .dlc 而無法再上傳會刪除 ,t除了將程式碼加入setenv("LOCKDDC", "0") 或無除錯命令列輸入 env-LOCKDDC=1 以取除此功能外,也可以在命令列輸入 list-Main.dlc 將 Main.dlc 改為 Main.ddc 以執行上傳動作,但上傳後仍會自動鎖定(改成 .dlc 副檔名)


1.5.GPIO 控制:

EBox-AIO-003 與 EBox-AIO-005 可以透過 GPIO 變數控制包含 LED 燈、蜂鳴器、按鈕、開關以及多用途 GPIO 輸入輸出點,其中 GPIO 點必須另外搭配搭配專用的Digital I/O 轉換模組與外接模組,EBox-AIO-005 由於 GPIO11 與 GPIO12 已做為 RS485 通訊埠用途無法使用
另外 GPIO3 與 GPIO4 如果作為 I2C 通訊用途時也不可再使用

GPIO 控制於 DDC 程式中以變數 GPIO0~ GPIO18 表示,如果變數在輸出處會被設成 OUT,否則設為 INPUT,但如果該點被限制用途,則無法任意變更(例如 LED 燈只能作為輸出,按鈕與開關只能作為輸入)
作為輸出用途時不需注意避免被其他周邊任務覆蓋輸出指令。

1.5.1.GPIO 代號與用途:

變數代號       	周邊代號   	硬體代號      	輸入輸出說明
GPIO0 A06 Status LED OUT(0 亮)
GPIO1 G08 GPIO1 I/O
GPIO2 G09 GPIO2 I/O
GPIO3 A12 GPIO3 I/O
GPIO4 A11 GPIO4 I/O
GPIO5 C03 GPIO5 I/O
GPIO6 A17 GPIO6 I/O
GPIO7 A07 GPIO7 I/O
GPIO8 L11 GPIO8 I/O
GPIO9 A16 GPIO9 I/O
GPIO10 A15 GPIO10 I/O
GPIO11 A14 GPIO11 I/O(A003 Only)
GPIO12 A13 GPIO12 I/O(A003 Only)
GPIO13 A02 DIP 1/2 IN(0 ON)
GPIO14 A03 DIP 2/2 IN(0 ON)
GPIO15 C02 Tack Button IN(0 按下)
GPIO16 G11 Beeper OUT(1響)
GPIO17 C00 U-def1 LED OUT(1亮)
GPIO18 C01 U-def2 LED OUT(1 亮)

說明周邊代號為 CPU IO 接腳代號;硬體代號則參考 EBox-AIO-003EBox-AIO-005 手冊

1.5.2.範例-主程式運行狀態燈 與 啟動音:

本範例寫於主程式中,以狀態 LED 燈明滅表示主程式正常運行,並於主程式啟動時響一聲,作為啟動提示音,範例程式碼如下:

//主程式狀態 LED 燈(GPIO0)每兩秒明滅一次
GPIO0 = SEC % 2
//主程式啟動時響一聲蜂鳴器(GPIO16)
GPIO16 = INIT


GPIO0 = SEC % 2 程式與 setenv("LEDGPIO", "0") 功能相同

1.5.3.範例-警報蜂鳴器控制 與 按鈕確認:

這是將蜂鳴器作為警報器當 CPU 溫度過高時響起,範例程式碼如下:
//設定程式每 0.1 秒執行一次以增加按鈕按下偵測機率
booster(1)

C1 = TEMP >= 40
C2 = ondelay(C1,5)
//CPU 溫度達 40 度時且持續 5 秒觸發一次,溫度降至 40 以下回到 40 度才會再觸發
C3 = oneshot(C2)
//C3 觸發時蜂鳴器響
if C3
GPIO16 = 1
endif

//按鈕(GPIO15 Tack Button) 按下(數值為 0 ) 關閉蜂鳴器
if !GPIO15
GPIO16 = 0
endif

1.5.4.範例-指撥開關控制 RTU Master 通訊速率:

這是將兩位指撥開關作為 RS485 RTU Master 通訊速率選擇的範例,USER LED 會顯示兩位指撥開關選擇狀態,指撥開關改變時 為 RS485 RTU Master 通訊速率會隨之改變,依此範例也可以改作程式運行功能選擇等功能,範例程式碼如下:
//本範例僅適用於周邊任務
//將指撥開關狀態讀到 LED 燈顯示
GPIO17 = !GPIO13
GPIO18 = !GPIO14
//程式啟動時給速率選擇暫存器 R2 一個無效數值
if( INIT )
R2 = 100
endif

//讀取指撥開關狀態至 R1
R1 = 0
if( !GPIO13 )
R1 = 1
endif
if( !GPIO14 )
R1 = R1 + 2
endif

if (R1 == R2)
//指撥開關狀態 與 速率選擇暫存器相同不須動作
else
//指撥開關狀態 與 速率選擇暫存器不相同關閉通訊以重新開啟
close()
//依照 指撥開關狀態 依照速率 開啟 RS485 RTU Master 通訊
if (R1 == 0)
C1 = rtu( "COM1" ,9600 ,0 ,1 ,500 ,1)
endif
if (R1 == 1)
C1 = rtu( "COM1" ,19200 ,0 ,1 ,500 ,1)
endif
if (R1 == 2)
C1 = rtu( "COM1" ,38400 ,0 ,1 ,500 ,1)
endif
if (R1 == 3)
C1 = rtu( "COM1" ,57600 ,0 ,1 ,500 ,1)
endif
//儲存指撥開關狀態 至 速率選擇暫存器
R2 = R1
endif
//RS485 RTU Master 自 Slave 1 Holding Register 40001~40032 共讀取 32 個至 R100~R131
//rw() 函數表示如果 R100~R131 有變更也會寫出到 Slave 1 Holding Register 40001~40032
C2 = rw(R100,1,#40001,32)

1.6.通訊程式範例:

1.6.1.提供 MODBUS TCP 通訊介面:

設備支援單一個 MODBUS TCP Server ,以讀取設備內 Coil 與 Register, Server TCP Port 由頁面設備設定處進行設定,預設為 502 Port。




MODBUS TCP Server不需要額外設定,就可以利用 UID 0 或 UID 255 進行讀取,測試時可以使用 ICDT MODBUS TCP Client 軟體進行測試。



測試時必須將 用 UID 設為 0 或 255,其餘會顯示 Slave device Failure 錯誤訊息 。

您可以利用 setuid() 函數將指定位置與數量的點位映射到指定的 UID位置,以利讀取。映射的動作會將 Coil 與 Register 同步映射,且 UID 0 與 255 以原本的位置仍然可以讀取


//將 R100~R163 與 C100~C163 對應到 UID 1 R0~R63/C0~C63中
//此設定同時會對 MODBUS RTU Slave 通訊生效
// setuid () 僅適用於主程式任務
setuid(1, 100, 64)




映射後UID 0 Reg Address 100 與 UID 1 Reg Address 0 開始 64 的點讀到的內容是相同的

1.6.2.提供 MODBUS RTU 通訊介面:

設備支援單一個 MODBUS RTU Slave 通訊,通訊格式由 rtu() 函數在主程式任務設定。
設定時必須指定 RTU 的 通訊埠,EBox-AIO-003 只有一個 COM1 ;EBox-AIO-005 有 COM1~COM4 4個 RTU 的 通訊埠。


//將 COM1(/dev/ttyS1) 接口設為 MODBUS RTU Slave,速率為 9600 bps,無同位(0:None;1:odd;2:even),1個停止位元
//執行失敗會寫0 至 C0,否則為1
C0 = rtu("COM1", 9600, 0, 1)
// 將 R100~R163 與 C100~C163 對應到 Slave Address 1 R0~R63/C0~C63中, 未設定則僅可以從 Slave Address 0 或 Slave Address 255 讀取
setuid(1, 100, 64)


測試時可以使用 ICDT MODBUS RTU Master 軟體進行測試。讀寫的位置與內容應該與 MODBUS TCP Client 程式測試結果一致。





通訊的內容可以在主程式任務地除錯視窗看到


1.6.3.讀取其他 MODBUS TCP 設備:

1.6.4.讀取其他 MODBUS RTU 設備:

1.6.5.將 RS485 迴路作為 MODBUS TCP To MODBUS RTU 協議轉換:

1.6.6.MQTT 訂閱與發佈-使用 mqttgo.io:

1.6.6.1.關於 mqttgo.io:

mqttgo.io 是 小霸王實驗室 免費無限流量的 MQTT Broker 服務,不需要申請帳號即可使用。由於資訊發布於免費的伺服器資訊任何人皆可以獲得,因此建議用於測試或傳輸非重要資訊應用場合。由於的使用者不可使用 # 或 /# 或 + 或 /+ 訂閱根路徑的主題(Topic),因此只要較長不被猜到第一層主題名稱,風險即可大幅降低。
測試時可以下載免費的 ICDT MQTT Tools 作為驗證工具

1.6.6.2.MQTT 訂閱:

訂閱時使用 mqttclient 函數,參數依序為 broker 地址,port 號 與 訂閱主題,此處以訂閱主題以mqtttest20200616/ 開始的內容,並且利用自定義變數功能定義每項獲得內容標題符合時的存放記憶體,以下方程式碼為例,會將收到 mqtttest20200616/temp_RA 的內容取數值並除以10後存放於 R232 處,將 mqtttest20200616/co2_RA 的內容取數值存放於 R234 處


#define $temp_RA$ = R232.d1
#define $humid_RA$ = R233.d1
#define $temp_OA$ = R240.d1
#define $humid_OA$ = R241.d1
#define $pm25_RA$ = R236
#define $co2_RA$ = R234

C200 = mqttclient( "tcp://mqttgo.io" ,1883 ,"mqtttest20200616/+")

debug(TIME)
//(顯示時間只為利於觀察)




您可以開啟 ICDT MQTT Tools 選擇 client 並將 Subscribe 處輸入 mqtttest20200616/+ ,並於下方 Topic 處輸入 mqtttest20200616/co2_RA 等主題名稱,於 Payload 輸入數值後發布(Publish)加以測試,並開且 快速存取視窗觀察結果



1.6.6.3.MQTT 發布:

MQTT 的發布相對較於單純,只要利用 mqttclient 指定 broker 地址與 port 號,並於定時利用 mqttpublish 將要發布的內容傳送即可。其中 "%0.1f" 表示以小數點後取一位的方式顯示數值,數值格式化的方式類似 C 語言,但所有暫存器內部儲存方式最終都是浮點數,因此只能採用 f 不可以使用 d 等其他格式

C200 = mqttclient( "tcp://mqttgo.io" ,1883)

if( MIN.p )
C201 = mqttpublish( "mqtttest20200616/temp_RA" ,"%0.1f" ,R32.d1 )
C202 = mqttpublish( "mqtttest20200616/humid_RA" ,"%0.1f" ,R33.d1 )
C203 = mqttpublish( "mqtttest20200616/temp_OA" ,"%0.1f" ,R40.d1 )
C204 = mqttpublish( "mqtttest20200616/humid_OA" ,"%0.1f" ,R41.d1 )
C205 = mqttpublish( "mqtttest20200616/pm25_RA" ,"%0.1f" ,R36 )
C206 = mqttpublish( "mqtttest20200616/co2_RA" ,"%0.1f" ,R34 )
else
debug(TIME)
//(顯示時間只為利於觀察)
endif





您可以開啟 ICDT MQTT Tools 選擇 client 並將 Subscribe 處輸入 mqtttest20200616/+ 做發布的觀察


1.7.網頁圖控編輯與上傳:

1.8.其他操作:

1.8.1.SSH 連線:

注意事項:
出廠預設的 SSH 連線是關閉的,如果需要連線必須於出廠前事先聲明,並取得 root 帳號密碼。
使用 SSH 連線操作並執行程式安裝前,請確定可以掌握 Linux 指令與安裝的程式安全,以免影響設備效能與網路安全
SSH 連線可以透過 DDC 編輯器除錯指令列 restart sshd 以開啟連線,使用 stop sshd 以關閉連線無連線需求時建議關閉連線。首次登入 SSH 請以 passwd 指令修改密碼,以保護資訊安全。
/root/icdtgw 路徑是主要執行目錄,請勿任意對 /root/icdtgw/app 以外路徑做任何變動,並且避免使用 rm -rf * 等指令刪除資料,以避免務操作造成系統檔案受損

1.8.2.RTC:

2.關於 ICDT (元米科技有限公司):


元米科技有限公司(Intelligent Control Design & Technology Co., Ltd)前身為元米智控研發工作室(Intelligent Control Design House),自2012年5月成立後,致力於自動控制方案的開發,並成功推出性價比(C/P值)極高的 DDC8 方案。為便於業務推展,並使客戶與合作夥伴獲得更多的保障,於2013年6月21日正式登記成立為『元米科技有限公司』,並陸續推動 DDC32 方案與 Web Embedded 方案,以及 BACnet 通訊協定相關方案(元米科技為 BACnet 編號 676 供應商),以期服務更多有需求的合作伙伴。


元米科技有限公司以成熟的、低成本的整合方為客戶打造高價值、持續服務的可程式控制方案,人性化的操作介面,讓您自有品牌不再是夢想,更多的資訊請造訪網站:
http://www.icdt.com.tw

3.關於本手冊:

本手冊適用於 IOTGW@EBox-AIO-003 與 IOTGW@EBox-AIO-005 程式 V0.10 版以後。
手冊版本 V1.00 版,完稿日期 2022/5/27
關於本程式有任何問題或建議,請 E-mail 至 eric.icdt@msa.hinet.net