找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2371|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

迅為iTOP-開(kāi)發(fā)板-modbus移植和使用文檔

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表