在上一次的物聯網 Modbus 補完計畫(二)中,我們提到了 RTU 與 ASCII 兩種傳輸模式差異之處。接下來我們要繼續看第二個部分關於 Modbus TCP 的確認機制。
經過了兩次的補完計畫,不知道你是否又對物聯網 Modbus 協議有更進一步了解呢? 接下來我們繼續聊聊要補完計畫的第三部分。如果你有機會翻閱官網的 Modbus 協議白皮書的話,在第 6 頁的地方有提到 Modbus 有 4 個 Modbus 資料模型 (Data Model) ,在它的說明欄位告訴我們跟 I/O 系統與應用有關,然後,然後就沒有了!包含我自己,我相信第一次看到書上這段落的朋友也是一頭霧水?!這 4 個資料模型究竟要表達什麼意思? 所謂的對應 IO 系統具體指的又是甚麼?這次我們就來接著來說個明白吧。
所謂物聯網的 I/O 模組指的是把 Input/Output (輸入/輸出) 的數據通道集成起來的功能模塊,這些數據通道就是物聯網裝置們與世界溝通的介面。具備 IO 能力的物聯網裝置還蠻多元的,從構造相對簡單的 IO 卡、功能強一點 PLC (可程式化邏輯控制單元),強調高速通訊能力的 Controller (控制器) 以及強調平台化擴充能力強大 IPC(工業電腦) 等等… 。它們的硬體底層設計都與 x86 的電腦架構類似,有負責運算的晶片,負責存儲資料的記憶體。
教科書上習慣把電腦與人腦相互類比,這裡也稍微借用一下這個觀念,不妨暫時把 IO 模組想像成我們的手腳、眼耳鼻舌。我們來想一下當想要拿起一個桌上的蘋果時會發生甚麼事?首先,眼睛會接收到桌上的蘋果反射過來的光線(訊號輸入),大腦判斷並記住蘋果的位置、大小、距離等資訊後(CPU 計算 + 記憶體),接著開始伸手拿蘋果(訊號輸出)。物聯網裝置的 IO 模組運作慨念就像我們的手眼一樣,都是透過先訊號輸入,再用計算器計算,最後按照計算結果執行訊號輸出,我們可以肯定物聯網裝置就是虛擬世界與實體世界互動、也是資訊數位化的關鍵。
物聯網裝置跟電腦一樣處理資料過程仰賴記憶體,不同類型的資料必須放在不同的記憶體空間。記憶體空間是一種抽象化的概念,就暫時把它視為類似於我們 building,一開始裡面都是連續的尚未分隔的空間,有點像剛蓋好的毛胚屋。RD 會按照功能需求去規劃這些數據儲存空間,就像設計師規劃客廳、廚房、衛浴與臥室等居住空間一樣。各個空間的規劃原則上不會允許重疊,如此才能確保不同資料間不會發生互相覆蓋導致記憶體錯誤發生。按照 Modbus 白皮書的說明,Data Model 總共有 4 類,分別是 Discretes Inputs(讀取輸入), Coils(讀寫線圈), Input Registers(讀取輸入暫存器) 跟 Holding Registers(讀寫持有暫存器),按照數據處理的規模大小還可以區分為兩組 bit(位元)跟 Word(字),前面兩種負責bit 類型的資料,後面兩個負責字(Word, 2bytes) 等級以上的資料。
Discretes Inputs 中文翻譯叫做讀取輸入,它只能處理 0 或 1 這類只有兩種資料變化數據並且要求資料輸入後只能「唯讀」,只能看不能改。所謂的兩種狀態的資料類型指的是 0 或 1,“有”或“沒有”,“開”與“關”等。在 DIgital IO 卡或是在 PLC 上都能看到處理這種訊號的通道叫做 Digital Input (DI),它會偵測輸入來源的電壓變化轉換成數值 (0 或 1) 寫入定義好的 Discretes Inputs 的記憶體區間裡面,接著上層應用系統就透過通訊下指令來取得資料。
電腦很會處理這種只要 1 個 bit 就能處理兩種狀態的資料,為了提高存儲效率還會把 8 個連續的 Discretes Input bits 集合成 1 個 byte 處理,對於 Digital IO 卡產品而言,本來 8 個 DI 通道 (DI0, DI1,… DI7),需要經過 8 次的問答才能得到,現在只要經過一次通訊就能拿回 8 個通道的數據,有效節省傳輸成本。
Coil 中文翻譯叫做線圈,原意是電線繞圈後的電子元件,具體的可以先簡單想成就像牆壁上的一個電燈開關。在 Digital IO 卡上看到的 DO (Digital Output) 或是 PLC 上的 Y 點位都是,這些 DO 通道可以接受上層系統的指令來決定自己的開關狀態。 Coils 也是處理 1 個 bit 的資料型態與 Discretes Inputs 的差別是 Coils 的數值是可以被讀寫的,上層系統可以按照需求來改寫 DO 的對應的 Coils 數值。假設我們在某一張 Digital IO 卡的第一個 DO 通道上並接了一個 LED 電泡,只要對所在的記憶體位址寫入 1 或 0 就能打開裡面的繼電器開關,做到遠程控制電燈開關的效果了。
在計算機裡的 Registers 就是暫存器。Input 的意思跟前面的 Discretes Input 一樣,都具備「唯讀輸入」意思。相對 Discretes Input 跟 Coil 是處理只有兩種型態的資料,Input Registers 跟 Output registers 就可以運用在類比 Analog 輸入與輸出的資料處理上。類比的訊號例如自然界的光線、溫度、壓力、電波等電腦無法直接處理,必須量測到還要經過取樣才能進來電腦裡,產品的 Input Registers 大小會影響到要存儲的數據量與精度,在 IO 卡上或 PLC 上負責接收類比訊號的通道是 Analog Input (AI)。另外,由於 Input register 具備唯讀特性,所以也會被廠商設計用來存放產品資訊,例如產品的名稱、韌體版本、出廠日期等基本資訊。
看到這裡你大概也猜到 Holding register 的用途了,跟 Input Register 類似可以處理 Analog Output 是一塊可以讀寫記憶體空間。類比訊號輸出的過程與訊號上述的類比訊號輸入相反,必須提供要輸出類比訊號的特徵給裝置的 Holding Register 裏面,例如電壓範圍、頻率等。負責數位轉類比的元件看到後就會知道要如何盡可能地還原出我們想要的類比訊號。為什麼會說盡可能?因為連續的訊號對數位裝置來說可以被視為解析度無限大的訊號,數位訊號都是取樣過跟原始的類比訊號相比永遠會有落差,所以在類比訊號重建的時候就得靠演算技術來"猜測"兩點之間的樣子。一斑而言取樣率越高、算法越好輸出的類比訊號自然就會更漂亮,比較不會有刺刺的感覺。
簡單來說,在 Modbus 協議規範的 4 個 Data Model 都是 4 種不同用途的記憶體暫存器,都是物聯網裝置與上層系統的數據緩衝區(Buffer)。而 Modbus 協會不能把話說死,只能白皮書給出的是一個設計指導原則讓廠商來 follow,所以並沒有嚴格規定一定要在哪個記憶體位置放置哪一種資料,讓廠商們按照自己的產品需求規劃暫存器的記憶體空間,所以廠商就算要把 1 bit 的資料放到 1 byte 裡面來處理是沒問題。對於我們使用者來說,只要能確定知道自己想讀寫的數據放在哪個暫存器位址就可以了。