libmodbus
Copyright 2021, 月下麒麟
專案Source Code下載處-
git clone https://github.com/stephane/libmodbus.git (參考來源)
這份筆記主要用來記錄學習該libmodbus的疑問,
故於順序上會較凌亂,採用各個擊破的方式。
另外,因網路上這方面的文章較少,也想分享有關如何自學Open Source的方法。
(附上網路上的前輩寫的實例研討: 從 C++ 學習 C 高級技巧)
Modbus為眾多工業通訊協定中的一種,
就是讓機器用來互相溝通的一種語言。
該libmodbus就是一個開源程式碼,讓終端使用者下載到指定的機器設備上,
透由安裝與設定,就能在該機器設備上使用Modbus協定。
關於機器與通訊協定的關係,可參考下圖-
(白話例子:一個說英語,德語的人,可以跟只會說德語的人溝通)
這樣是不是更能明白關於通訊協定在機器上應用了呢
建議可先閱讀三份Modbus Specification,
閱讀specification一定很枯燥乏味,但務必要耐住性子,
至少先把第一份看完,嘗試去理解Modbus的行為,
其實文件內容就是機器間的溝通規則,並不難以理解,
就跟人溝通一樣,也是滿有趣。
1.Modbus功能代碼解釋及資料格式-
Modbus Application Protocol Specification V1.1b
2.Modbus應用於串列通訊
Modbus over Serial Line Specification & Implementation Guide V1.02
3.Modbus應用於TCP/IP通訊
Modbus Message on TCP/IP Implementation Guide V1.0a
1.從makefile理解安裝過程
2.從header理解有哪些函式宣告與定義
3.從unit test,可了解到設計者如何呼叫函式及實作
3-1.看printf,要印什麼東西,從輸出反推程式的意思!
4.再次閱讀Specification
(重複以上學習流程)
以上,學習方法僅供參考,畢竟每個人的學習方式不同,
只要找到最適合自己的即可。
如不想直接閱讀Modbus Specification也是可以的,
那就跟著筆者一起摸索Open Source Code有趣的世界吧,
一起 Trace程式碼 Go~
Reference:從這裡開始瀏覽libmodbus原始碼程式
欲認識對方的程式碼,可先從對方寫的範例程式或是測試程式開始
這邊提及一下有個struct會在source code裡面大量出現,
為指標ctx指向的modbus_t struct,
所以這一篇幅會先認識struct與其應用。
搜尋modbus_t其定義。
發現該modbus_t為_modbus結構的別名。
接著,再搜尋_modbus其定義,會發現到它是一個匿名結構。
method 1
method 2,這個寫法更簡短
method 3,不使用typedef,較冗長
誠如上述,這個malloc用法較為常見
在64位元架構下,指標大小都為8 bytes(64 bits / 8 bits )。
32位元之指標大小則為4 bytes。
*ptr為指標ptr的型別modbus_t的大小。
ptr為指標ptr本身的大小 (白話,就是指標大小)。
modbus_t* 為指標modbus_t本身的大小 (白話,就是指標大小)。
modbus_t為_modbus結構其所有成員加總的大小。
(如加總大小超過或不足4的倍數,得到的結構大小有所不同,筆者這部分涉獵不深,故無法詳細描述)
另外,malloc語法設計上會回傳指向一個不指定型別的指標
void* malloc (size_t size);
故再實際應用上,需要在加上欲指向之型別,詳細解釋可參考C_CPP看板
modbus_t *ctx;
ctx = (modbus_t *)malloc(sizeof(modbus_t));