本文檔介紹 modbus庫如何移植到ARM開發板上,以及如何使用測試程序。 適用迅為iTOP-4412開發板丨4418開發板丨6818開發板丨IMX6開發板 1.什么是 modbus 網絡上關于 modbus 介紹的文章非常多,還有專門介紹 modbus 的書籍,這些資料大家 都可以利用起來,但是在這一小節中,作者希望幫助大家理解 modbus 的本質,modbus 到 底是用來做什么,用來解決什么問題和存在的價值。 第一個要重點理解的是:modbus 是一個“純數據協議”。 說到 modbus 協議,經常和 RS232 和 RS485 以及以太網聯系到一起。那么 modbus 和 RS485 協議有什么關系么?modbus 是純粹的數據協議,和 RS232、RS485 和網絡等協議沒 有一點關系,如果在串口 RS232 上使用 modbus 協議,modbus 只處理通過串口發送前和串 口接收后的數據,串口只是在發送數據前使用 modbus 協議來轉換數據,接收數據之后,將 數據通過 modbus 協議轉換出來。 第二個要重點理解的是:modbus 是一個“通用的純數據協議”。 怎么理解通用的數據協議呢?作者在讀書的時候,剛開始學習嵌入式,使用的是 51 單片 機,當時要調試程序的時候,一般執行到哪一步,就點亮一個燈或者拉高一個 IO,后來覺得 通過“點燈”調試程序是在太慢了,于是自己定義了“串口數據協議”,例如:執行到某一段 代碼,我就打印 0x01,這段代碼出現錯誤就打印 0x02...現在大家學習了 linux,都知道 linux 控制臺了,linux 控制臺對于程序員來說,主要就是用來調試程序的,帶代碼中添加 print 函 數就可以實現控制臺打印字符串。 那么作者當年自己定義的“串口數據協議”,就不是一個通用的協議,只能自己使用,但 是 linux 控制臺,無論哪一個 linux 工程師,操作的方式都是類似的。那么 linux 控制臺,在 所有的 linux 設備上使用方法就是通用的。 modbus 可以類比為普通話,如下對應關系: 福建人→閩南語→普通話 廣東人→粵語→普通話 東北人→東北話→普通話 四川人→四川話→普通話 福建人”比作“RS232”,“廣東人”和“東北人”比作 RS485,“四川人”比作 “以太網”...那么“普通話”就是 modbus 協議。modbus 協議和“人”這個硬件沒有關 系,和“人”的說法方式沒有關系,甚至機器人只要發聲是“普通話”,這個普通話也是 modbus 協議。 網上關于 modbus 的資料很多,有不少資料將 modbus 和 RS232 綁定,這一點是完全 錯誤的,請大家務必注意,modbus 只是一個“通用的純數據協議”。 modbus 是用于工業現場的總線協議,它不僅僅是在 PLC 或者單片機上可以使用,在任 何可以跑代碼的電子設備上都可以使用,因為 modbus 對硬件沒有任何定義。當然, modbus 應用范圍主要是在工業控制上。如果每一臺工業控制設備,都有一種自定義的協 議,那將是很恐怖的,modbus 協議可以用在所有控制設備上,所有的工業控制設備都可以 兼容 modbus 協議。 modbus 的本質是一個通用的純數據協議,modbus 是用來規范工業現場各種控制設備 的通信協議,通過 modbus 協議,控制設備通過網絡(RS485 和以太網等)可以和其它設備 之間通信,不同廠商的設備生產的設備可以很方便的連成工業網絡。 2.modbus 移植到 linux 2.1 modbus 源碼下載 作者將“libmodbus-3.1.4.tar.gz”下載,打包在“topeet_modbus.tar.gz”中,其中還 有移植好文件。 2.2 arm-linux 上的 modbus 移植和編譯 交叉編譯使用的編譯器是“arm-2009q3”,如下圖所示。 通過 ssh 將下載好的源碼壓縮包“libmodbus-3.1.4.tar.gz”拷貝到 Ubuntu 上,使用命 令“tar -vxf libmodbus-3.1.4.tar.gz”解壓,解壓后生成目錄“libmodbus-3.1.4”,如下 圖所示。 使用命令“mkdir install”,新建 install 路徑,用以安裝生成的文件,如下圖所示。 進入 libmodbus-3.1.4,執行命令./configure ac_cv_func_malloc_0_nonnull=yes -- host=arm-none-linux-gnueabi --enable-static --prefix=/home/minilinux/install/ 。 Host=后面的是編譯器前綴,--prefix=后面的是安裝目錄,可根據自己環境確定,如下圖所 示。 如下圖所示,執行完畢。 執行編譯命令“make”,如下圖所示。 編譯完成,如下圖所示。 執行安裝命令“make install”,則安裝到./configure 指定的目錄,作者這里是 “/home/minilinux/install/”目錄,如下圖所示。 安裝完成,如下圖所示。 查看安裝目錄 install,在 install 生成三個目錄:include、lib、share,如下圖所示。 如下圖所示,使用 file 命令查看 lib 目錄下的庫文件,可以發現其中的文件是 arm 架構 的。 將編譯出來的 lib 路徑下的所有文件拷貝到開發板的“/lib”目錄下。 至此,modbus 的 arm-linux 的庫文件編譯完成。 2.3 arm 的測試程序 進入目錄/home/minilinux/libmodbus-3.1.4/tests/,查看測試程序 random-test- server.c,如下圖所示,已經編譯出來了,但是還是需要修改一下源碼中的幾個參數,重新編 譯。 輸入命令 vim random-test-server.c 打開測試程序,里面 23 行 ctx =modbus_new_tcp("127.0.0.1", 1502); 改成 ctx = modbus_new_tcp(NULL, 1502);, 即 server 監控所有的 ip 地址,端口是 1502。 然后執行命令交叉編譯命令arm-none-linux-gnueabi-gcc -o random-test-server random-test-server.c - L/home/minilinux/install/lib -lmodbus -I/home/minilinux/install/include/modbus 生成可執行文件 random-test-server,如下圖所示。 如下圖所示,可執行文件是 arm 架構的。 至此,arm 服務端的測試例程“random-test-server”編譯完成。 2.3 x86-linux 的 modbus 移植和編譯 在 minilinux 目錄下再建一個文件夾,用于放 modbus 的 x86 的文件,如下圖所示,使 用命令“tar -vxf libmodbus-3.1.4.tar.gz -C x86-modbus/”,將源碼解壓到這個目錄下。 進入解壓出來的“/home/minilinux/x86-modbus/libmodbus-3.1.4”目錄,如下圖所 示,執行命令“./configure”,不用加任何參數,默認就是 GCC-x86 配置。 配置完成,如下圖所示。 執行“make”編譯命令,然后執行安裝命令“make install”,安裝完成,如下圖所 示。 進入 test 目錄,前面我們編譯的 arm 下的測試程序是 server,那么 Ubuntu 下運行的就應 該是 client 客戶端,如下圖所示。 客戶端需要服務端的 IP 地址,如下圖所示,作者的服務端(也就是開發板端)IP 是 “192.168.2.20”。 接著,修改 x86-modbus 目錄下的“random-test-client.c”文件,使用 vim 命令打開 random-test-client.c 文件,將 ctx = modbus_new_tcp("127.0.0.1", 1502); 改成 ctx = modbus_new_tcp(開發板 IP, 1502); 如下圖所示,然后保存退出。 執行命令:gcc -o random-test-client random-test-client.c `pkg-config --libs --cflags libmodbus` 編譯生成 random-test-client 可執行文件,如下圖所示,編譯出的可執行文件是 x86 的。 至此,x86 上的測試程序編譯完成。 3.測試 首先確保開發板和虛擬機 Ubuntu 可以 ping 通,如下圖所示,作者虛擬機的 IP 為 “192.168.2.200”,通過開發板可以 ping 通 Ubuntu。 其次,注意將前面編譯出的 arm 的庫文件拷貝到開發板上,如下圖所示。 在開發板上運行服務端程序,如下圖所示。 在虛擬機 Ubuntu 上運行客戶端程序“./random-test-client”,運行完畢如下圖所示 服務端運行完畢,如下圖所示。 至此,modbus 的移植和測試完成。
|