如圖 4.1 所示,整個系統通訊分為兩個部分,分別是 PC 和 Master 之間透過 TCP/IP 做通訊,另外一個是 Master 和 Slave 之間透過 2.4GHz 無線傳輸做通訊。所以我們必 需先規劃 Scenario。
圖 4.1 系統方塊圖
如圖 4.2 所示為整個系統通訊的簡易 Scenario 規劃,接下來我們說明流程:
(1) 首先由 PC 端透過 TCP/IP 下 Command 給 Master,Master 在收到 Command 之後會 判斷是不是有效的 Command,然後回傳 ACK 給 PC,代表有收到有效 Command 或是 Command 格式錯誤!
(2) 接著 Master 就會將 Command 透過 2.4GHz 無線傳輸傳送給所有的 Slave。
(3) Slave 在接收到 Command 之後,一樣會先判斷是否為有效 Command,防止無線傳 輸訊號受到雜訊干擾導致資料錯誤,接著會判斷是否需要回應(ID 是否相同),若 要回應訊息的話,會依照 Slave ID 排序時間回傳 ACK 給 Master。
(4) 當 Master 所設定的通訊時間 timeout 之後,Master 會判斷是否該回應的 Slave 都有 回應,若是沒有的話便會再下 Command 給 Slave,這個動作目前最多重複做 10
31
機會,但若是超過 10 次的話,那就代表可能是無線通訊干擾太嚴重、Slave 遺失、
A7105 天線、、等問題。
(5) 接下來 Master 會將 Slave 資料統整後回傳 Reply 給 PC。
(6) PC 在接收到 Master 的 Reply 之後也會回傳 ACK 給 Master 代表有收到資料。
圖 4.2 Scenario
4-2. Command 封包格式
Scenario 定義完畢之後,接下來就要定義封包格式。我們的通訊有分 TCP/IP 和 2.4GHz 無線傳輸,因此為了方便,兩種通訊皆定義同樣的封包格式,參考 Modbus 的定義(如圖 4.3),一個封包分為 Slave Address、Function Code、Data 和 CRC。然而 因為只區分 Slave Address 的話,在頻道相同的情況下,不同的 Master 下 Command,
但是 Slave 都會去執行,為了能夠區分每個 Master 只能控制自己群組內的 Slave,因 此我們多加定義一個 Byte 為 Master Address,用以區別每個群組的 Slave 是屬於哪一 個 Master,當今天 Slave 收到控制訊號時,若是 Slave ID 相同但 Master ID 不同的話,
則不會進行動作。定義的封包格式如圖 4.4 所示,Master ID 1 byte、Slave ID 1 byte、
Function Code 1 byte、Data 1 byte 和 CRC 2 bytes。
圖 4.3 Modbus frame [6]
圖 4.4 Command 的封包格式
下圖 4.5 是 A7105 的封包格式,其中 Preamble 4 bytes、ID code 4 bytes 和 CRC 2 bytes 是不能變更的,可以設計的部分只有在 Payload,最大長度為 256 bytes,因此我 們定義 Payload 的格式和圖 4.4 的 Command 封包格式相同,使得 TCP/IP 和 2.4GHz 無線傳輸的封包定義皆相同。
33
4-3. Command Set
Command Set 總共有分 13 種:
(1) Write Multiple Coils (0x0F):燈光控制 (2) Read Coils (0x01):讀取燈光控制的資訊 (3) Add New Slave (0x41):加入群組
(4) Read ID&SN Table (0x03):讀取 Master 目前儲存的 Slave ID Table 和 SN Table (5) Write Group frequency (0x10):更換工作頻率
(6) Read Group frequency (0x17):讀取工作頻率 (7) Delete Slave (0x06):刪除 Slave
(8) Read ADE7758 Data (0x42):讀取電力量測的資料 (9) Read RSSI (0x43):設定頻率,讀取 RSSI 的量測結果 (10) Read Master ID (0x45):讀取 Master ID
(11) Write Master ID (0x46):更換 Master ID
(12) Reload Master Data (0x44):重新載入資料給 Master (13) Error Message (0xFF):Master 回報 PC 的錯誤資訊
4-4. Master 程式規劃與設計
Master 是本系統的程式主要的重點,因為他必需彙整所有 Slave 的資料並且與 PC 做溝通,在程式規劃上,Master 的主程式只會依序去檢查各項旗標,判別是否該做什 麼動作,因此在所有旗標都沒有被設定的情況下,Master 是保持在一直檢查旗標的狀 態,這樣的好處是 Master 會依照我們所設定的優先權去處理各項事務,並請讓 CPU 一直處於 standby 的狀態,一有事情需要處理即可馬上處理。圖 4.6 為規劃的 Master 程式流程圖。
(1) 首先程式會先做系統初始化,包含對 MCU 的初始化、A7105 的初始化和讀取 EEPROM 的資料。
(2) 第一個判斷是否接收到 PC 的 Command,如果有收到 Command 的話就會判斷格 式是否正確,然後回應 ACK,並且針對 Command 作相對應的動作。
(3) 第二個判斷是否要執行加入群組的 Command,如果是的話則開始進行加入群組的 規劃流程。
(4) 第三個判斷是否要下 Command 給 Slave,因此要使 A7105 進入 TX 狀態開始傳送 資料。
(5) 第四個判斷是否有接收到 Slave 的資料,如果有的話則進入副程式判斷收到的訊 息為何並作相對應的動作,例如刪除 Slave 的旗標、、等。
(6) 第五個判斷是否需要回報 PC,當所有的通訊完成或是已經 timeout 的話,Master 則會將資訊回傳給 PC,並且回傳完資料後做相對應的動作,例如將資料寫入 EEPROM、更換工作頻率、、等。
(7) 最後一個判斷是否需要做 RSSI 量測,因為量測的時間較長,而且在量測的期間可 以任意穿插 Command 進行動作(其餘 Command 皆不能被穿插),因此最後再判斷 即可,如果需要動作的話則是讀取 A7105 上 RSSI 的資料並且在 MCU 上做運算,
35
圖 4.6 Master 程式流程圖
4-5. Slave 程式規劃與設計
Slave 的程式相較於 Master 就簡單許多,如圖 4.7 所示:
(1) 首先程式會先做系統初始化,包含對 MCU 的初始化、A7105 的初始化和讀取 EEPROM 的資料。
(2) 第一個判斷是否接收到來自 Master 的 Command,如果是的話則會依據 Command 做相對應的動作,當然也會收到來自其他 Slave 的 ACK,但是會判斷為無效的 Command。
(3) 第二個判斷是否要回傳訊息給 Master 的話,則會使 A7105 進入 TX 狀態開始傳送 資料。
(4) 最後一個判斷是否要執行加入群組的 Command,如果是的話則開始進行加入群組 的規劃流程。
圖 4.7 Slave 程式流程圖
37
4-6. PC 程式規劃與設計
圖 4.8 是 PC 端控制介面:
(1) 首先輸入 Master 的 IP Address 和 TCP/IP Port,然後與 Master 做連線的動作。
(2) 接著可以再 “Send Data”的方框下開始輸入各種 Command,輸入完 Command 之後 按下 “Send” 按鈕則會自動將訊息傳送給 Master。
(3) 如果 Master 有回傳訊息的話,會直接在 “Receive Data”的方框下看到資訊。
(4) 左邊目前有設計兩個 Slave 以及所對應的燈光控制,當按鈕按下的時候將會自動 下 Command 給 Master 要求哪個燈光該如何動作。
圖 4.8 PC 端控制介面