11.3.7 RTU/TCP關聯接口函數
在文件modbus.h的最后位置,有如下語句
#include "modbus-tcp.h" #include "modbus-rtu.h"
可以發現,除了modbus.h包含的接口函數之外,modbus-rtu.h和modbus-tcp.h也包含了必要的接口函數。
1. RTU模式關聯函數
MODBUS_API modbus_t * modbus_new_rtu(const char * device,int baud,char parity,int data_bit,int stop_bit):
此函數的功能是創建一個RTU類型的modbus_t結構體。參數constchar * device代表串口字符串,在Windows操作系統下形態如“COMx”,有一點需要注意的是,對于串口1串口9來說,傳遞“COM1”“COM9”可以成功,但是如果操作對象為COM10及以上端口,則會出現錯誤。
產生這種奇怪現象的原因是:微軟預定義的標準設備中 含有“COM1”~“COM9”。所以,“COM1”~“COM9”作為文件名傳遞給函數時操作系統會自動地將之解析為相應的設備。但對于COM10及以上的串口,“COM10”之類的文件名系統只視之為 一般意義上的文件,而非串行設備。為了增加對COM10及以上串行端口的支持,微軟規定,如果要訪問這樣的設備,應使用這樣的文件名(以COM10 為例):\. COM10。
所以,使用時在代碼中可以如此定義:
const char * device = “\\.\COM10”;
在Linux操作系統下可以使用“/dev/ttySo”或“/dev/ttyUSB0”等形式的字符串來表示。而參數int baud表示串口波特率的設置值,例如:9600、19200、57600、115200等。
參數char parity表示奇偶校驗位,取值范圍:
①‘N’:無奇偶校驗;
②‘E’:偶校驗;
③‘O’:奇校驗。
參數int data_bit表示數據位的長度,取值范圍為5、6、7和8。
參數int stop_bit表示停止位長度,取值范圍為1或2。
用法舉例:
左右滑動查看完整內容
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):
該函數用于設置串口為MODBUS RTU RS232或MODBUSRTU_RS485模式,此函數只適用于Linux操作系統下。
左右滑動查看完整內容
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)。
以上函數只適用于Linux操作系統下,RTS即Request ToSend的縮寫,具體的意義可通過網絡搜索,一般情況下,此類函數可忽略。
2. TCP模式關聯函數
左右滑動查看完整內容
MODBUS_API modbus_t * modbus_new_tcp (const char *ip_address, int port)。
此函數的功能是創建一個TCP/IPv4類型的modbus_t結構體。
參數const char * ip_address為IP地址,port表示遠端設備的端口號。
左右滑動查看完整內容
MODBUS_API int modbus_tcp_listen (modbus_t * ctx, int nb_connection)。
此函數創建并監聽一個TCP/IPv4上的套接字。
參數int nb_connection代表最大的監聽數量,在調用此函數之前,必須首先調用modbus_new_tcp()創建 modbus_t結構體。
MODBUS_API int modbus_tcp_accept(modbus_t * ctx,int * s)。
此函數接收一個TCP/IPv4類型的連接請求,如果成功將進入數據接收狀態。
11.4 libmodbus移植
本節源碼位于如下目錄:
11.4.1 編譯安裝
libmodbus原生就支持Linux,所以不存在移植難度。
如下操作即可編譯libmodbus:
左右滑動查看完整內容
$ 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 // 復制到工具鏈里 $ 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”。
把庫復制到開發板上,在Ubuntu上執行如下命令:
左右滑動查看完整內容
$ scp tmp/lib/*so* root@192.168.5.9:/usr/lib64/
11.4.2 上機測試
把測試程序和庫復制到開發板上,在Ubuntu上執行如下命令:
左右滑動查看完整內容
$ 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
在開發板上執行如下命令,通過Modbus TCP協議進行測試:
左右滑動查看完整內容
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
-
接口
+關注
關注
33文章
8612瀏覽量
151273 -
操作系統
+關注
關注
37文章
6836瀏覽量
123360 -
函數
+關注
關注
3文章
4332瀏覽量
62675 -
LibModbus
+關注
關注
0文章
9瀏覽量
7258
原文標題:關聯接口函數與libmodbus移植 - RZ MPU工業控制教程連載(42)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論