11.3.7 RTU/TCP關(guān)聯(lián)接口函數(shù)
在文件modbus.h的最后位置,有如下語句
#include "modbus-tcp.h" #include "modbus-rtu.h"
可以發(fā)現(xiàn),除了modbus.h包含的接口函數(shù)之外,modbus-rtu.h和modbus-tcp.h也包含了必要的接口函數(shù)。
1. RTU模式關(guān)聯(lián)函數(shù)
MODBUS_API modbus_t * modbus_new_rtu(const char * device,int baud,char parity,int data_bit,int stop_bit):
此函數(shù)的功能是創(chuàng)建一個RTU類型的modbus_t結(jié)構(gòu)體。參數(shù)constchar * device代表串口字符串,在Windows操作系統(tǒng)下形態(tài)如“COMx”,有一點需要注意的是,對于串口1串口9來說,傳遞“COM1”“COM9”可以成功,但是如果操作對象為COM10及以上端口,則會出現(xiàn)錯誤。
產(chǎn)生這種奇怪現(xiàn)象的原因是:微軟預(yù)定義的標(biāo)準(zhǔn)設(shè)備中 含有“COM1”~“COM9”。所以,“COM1”~“COM9”作為文件名傳遞給函數(shù)時操作系統(tǒng)會自動地將之解析為相應(yīng)的設(shè)備。但對于COM10及以上的串口,“COM10”之類的文件名系統(tǒng)只視之為 一般意義上的文件,而非串行設(shè)備。為了增加對COM10及以上串行端口的支持,微軟規(guī)定,如果要訪問這樣的設(shè)備,應(yīng)使用這樣的文件名(以COM10 為例):\. COM10。
所以,使用時在代碼中可以如此定義:
const char * device = “\\.\COM10”;
在Linux操作系統(tǒng)下可以使用“/dev/ttySo”或“/dev/ttyUSB0”等形式的字符串來表示。而參數(shù)int baud表示串口波特率的設(shè)置值,例如:9600、19200、57600、115200等。
參數(shù)char parity表示奇偶校驗位,取值范圍:
①‘N’:無奇偶校驗;
②‘E’:偶校驗;
③‘O’:奇校驗。
參數(shù)int data_bit表示數(shù)據(jù)位的長度,取值范圍為5、6、7和8。
參數(shù)int stop_bit表示停止位長度,取值范圍為1或2。
用法舉例:
左右滑動查看完整內(nèi)容
modbus t *ctx; ctx=modbus_new_rtu("\\.\COM10",115200,'N',8,1); if (ctx ==NULL) { fprintf(stderr,"Unable to create the libmodbus context "); return -1; } modbus_set_slave(ctx,SLAVE_DEVICE_ID); if (modbus connect(ctx)==-1) { fprintf(stderr,"Connection failed:%s ",modbus_strerror(errno)); modbus_free(ctx); return -1; }
MODBUS_API int modbus_rtu_set_serial_mode (modbus_t * ctx,int mode):
該函數(shù)用于設(shè)置串口為MODBUS RTU RS232或MODBUSRTU_RS485模式,此函數(shù)只適用于Linux操作系統(tǒng)下。
左右滑動查看完整內(nèi)容
MODBUS_API int modbus_rtu_set_rts (modbus_t * ctx, int mode)。 MODBUS_API int modbus_rtu_set_custom_rts (modbus_t * ctx, void ( * set_rts) (modbus_t * ctx, int on))。 MODBUS_API int modbus_rtu_set_rts_delay (modbus_t * ctx, int us)。
以上函數(shù)只適用于Linux操作系統(tǒng)下,RTS即Request ToSend的縮寫,具體的意義可通過網(wǎng)絡(luò)搜索,一般情況下,此類函數(shù)可忽略。
2. TCP模式關(guān)聯(lián)函數(shù)
左右滑動查看完整內(nèi)容
MODBUS_API modbus_t * modbus_new_tcp (const char *ip_address, int port)。
此函數(shù)的功能是創(chuàng)建一個TCP/IPv4類型的modbus_t結(jié)構(gòu)體。
參數(shù)const char * ip_address為IP地址,port表示遠(yuǎn)端設(shè)備的端口號。
左右滑動查看完整內(nèi)容
MODBUS_API int modbus_tcp_listen (modbus_t * ctx, int nb_connection)。
此函數(shù)創(chuàng)建并監(jiān)聽一個TCP/IPv4上的套接字。
參數(shù)int nb_connection代表最大的監(jiān)聽數(shù)量,在調(diào)用此函數(shù)之前,必須首先調(diào)用modbus_new_tcp()創(chuàng)建 modbus_t結(jié)構(gòu)體。
MODBUS_API int modbus_tcp_accept(modbus_t * ctx,int * s)。
此函數(shù)接收一個TCP/IPv4類型的連接請求,如果成功將進(jìn)入數(shù)據(jù)接收狀態(tài)。
11.4 libmodbus移植
本節(jié)源碼位于如下目錄:
11.4.1 編譯安裝
libmodbus原生就支持Linux,所以不存在移植難度。
如下操作即可編譯libmodbus:
左右滑動查看完整內(nèi)容
$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux $ tar xzf libmodbus-3.1.10.tar.gz $ cd libmodbus-3.1.10/ $ ./autogen.sh $ ./configure --prefix=$PWD/tmp --host=aarch64-poky-linux CFLAGS="-mtune=cortex-a55 -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wformat -Wformat-se curity -Werror=format-security --sysroot=/opt/remi-sdk/sysroots/aa rch64-poky-linux" $ make $ make install $ ls tmp/ include lib share // 復(fù)制到工具鏈里 $ sudo cp -rf tmp/include/* /opt/remi-sdk/sysroots/aarch64-poky-linux/usr/include/ $ sudo cp -rfd tmp/lib/* /opt/remi-sdk/sysroots/aarch64-poky-linux/usr/lib64/ $ ls tests/.libs/ bandwidth-client bandwidth-server-one random-test-server unit-test-server bandwidth-server-many-up random-test-client unit-test-client version
在“tmp/include”目錄下生成了有文件,在“tmp/lib”目錄下生成了庫文件。在“tests/.libs/”目錄下生成了測試程序“unit-test-server”、“unit-test-client”。
把庫復(fù)制到開發(fā)板上,在Ubuntu上執(zhí)行如下命令:
左右滑動查看完整內(nèi)容
$ scp tmp/lib/*so* root@192.168.5.9:/usr/lib64/
11.4.2 上機(jī)測試
把測試程序和庫復(fù)制到開發(fā)板上,在Ubuntu上執(zhí)行如下命令:
左右滑動查看完整內(nèi)容
$ scp tests/.libs/unit-test-server root@192.168.5.9:/home/root $ scp tests/.libs/unit-test-client root@192.168.5.9:/home/root
在開發(fā)板上執(zhí)行如下命令,通過Modbus TCP協(xié)議進(jìn)行測試:
左右滑動查看完整內(nèi)容
root@myir-remi-1g:~# cd /home/root/ root@myir-remi-1g:~# ./unit-test-server tcp 127.0.0.1 & root@myir-remi-1g:~# ./unit-test-client tcp 127.0.0.1 Connecting to 127.0.0.1:1502 Client connection accepted from 127.0.0.1. Waiting for an indication... ** UNIT TESTING ** 1/1 No response timeout modification on connect: OK TEST WRITE/READ: [00][01][00][00][00][06][FF][05][01][30][FF][00] <00><01><00><00><00><06><05><01><30> <00> [00][01][00][00][00][06][FF][05][01][30][FF][00] Waiting for an indication... Waiting for a confirmation... <00><01><00><00><00><06> <05><01><30> <00> 1/2 modbus_write_bit: OK
-
接口
+關(guān)注
關(guān)注
33文章
8612瀏覽量
151302 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6838瀏覽量
123384 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4333瀏覽量
62696 -
LibModbus
+關(guān)注
關(guān)注
0文章
9瀏覽量
7260
原文標(biāo)題:關(guān)聯(lián)接口函數(shù)與libmodbus移植 - RZ MPU工業(yè)控制教程連載(42)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論