色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Modbus RTU客戶端及服務器端的編程與實驗

瑞薩MCU小百科 ? 來源:瑞薩MCU小百科 ? 2024-12-31 16:38 ? 次閱讀

11.5 Modbus RTU客戶端編程與實驗

瑞米派開發板作為client(主設備),去訪問Modbus傳感器(作為Server)。

本節源碼位于如下目錄:

3652ef10-c72d-11ef-9310-92fbcf53809c.png

11.5.1 硬件連接

硬件連接原理圖如下:

3671307e-c72d-11ef-9310-92fbcf53809c.png

實物連接圖如下:

367d2532-c72d-11ef-9310-92fbcf53809c.png

11.5.2 傳感器點表

對于Modbus設備,怎么訪問它們?它們的寄存器分別有什么功能?這在“點表”里描述,每個寄存器被稱為一個“點”。

百問網的溫濕度傳感器的點表如下:

設備
地址
寄存器
地址
寄存器
類別
用途 描述
03H 0000H DO 控制器蜂鳴1 1-響
0001H DO 控制器蜂鳴2 1-響
0002H DO 控制LED1 1-亮
0003H DO 控制LED2 1-亮
0004H DO 控制LED3 1-亮
0000H AI 讀取溫度 單位0.1攝氏度
16位有符號整數
0001H AI 讀取濕度 單位0.1%RH
16位有符合整數

11.5.3 程序解析

代碼在如下目錄里:

36eb6e20-c72d-11ef-9310-92fbcf53809c.png

假設執行如下命令:

左右滑動查看完整內容

./modbus_client /dev/ttySC4 read

程序運行的情景分析如下

1. 初始化與連接

代碼如下:

左右滑動查看完整內容

33 ctx = modbus_new_rtu(argv[1], 115200, 'N', 8, 1);
34 if (ctx == NULL) {
35 fprintf(stderr, "Unable to allocate libmodbus context
");
36 return -1;
37 }
38
39 modbus_set_slave(ctx, SERVER_ID);
40
41 if (modbus_connect(ctx) == -1) {
42 fprintf(stderr, "Connection failed: %s
", modbus_strerror(errno));
43 modbus_free(ctx);
44 return -1;
45 }

第33行:分配一個modbus_t結構體。

第39行:設置要訪問的Modbus傳感器地址。

第41行:打開串口設備。

2. 讀取傳感器數據

代碼如下:

左右滑動查看完整內容

47 if (!strcmp(argv[2], "read"))
48 {
49 while (1)
50 {
51 rc = modbus_read_input_registers(ctx, 0, 2, vals);
52 if (rc == 2)
53 {
54 printf("Temprature = %d.%dC, Humity = %d.%d%%
", vals[0]/10, val
s[0]%10, vals[1]/10, vals[1]%10);
55 }
56 else
57 {
58 printf("modbus_read_input_registers err: %d, %s
", rc, strerror
(errno));
59 }
60 sleep(2);
61 }
62 }

第51行:讀取2個AI寄存器。

第54行:打印溫濕度值。

11.5.4 上機實驗

注意:假設你在“/home/ubuntu/apps/libmodbus-3.1.10”目錄下編譯了Libmodbus,并且在“/home/ubuntu/apps/libmodbus-3.1.10/tmp”目錄下安裝了Libmodbus。如果你的路徑不一樣,需要修改后續程序的Makefile。

把代碼上傳到Ubuntu。

然后,在Ubuntu下執行如下命令進行編譯:

左右滑動查看完整內容

$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux
$ make
$ scp modbus_client root@192.168.5.9:/mnt

最后,在開發板上執行如下命令:

左右滑動查看完整內容

# cd /mnt
# ./modbus_client /dev/ttySC4 beep1 on
modbus_write_bit ok
# ./modbus_client /dev/ttySC4 beep1 off
modbus_write_bit ok
# ./modbus_client /dev/ttySC4 led1 on
modbus_write_bit ok
# ./modbus_client /dev/ttySC4 led1 off
modbus_write_bit ok
# ./modbus_client /dev/ttySC4 read
Temprature = 32.0C, Humity = 39.2%
Temprature = 31.9C, Humity = 39.2%

11.6 Modbus RTU服務器端編程與實驗

要把瑞米派當做一個Modbus服務器(傳感器)來使用,需要有另一個開發板作為客戶端。為了方便實驗,本課程使用同一個瑞米派開發板,它運行2個程序:一個模擬服務器,另一個模擬客戶端。

本節源碼位于如下目錄:

3723757c-c72d-11ef-9310-92fbcf53809c.png

硬件框圖與連接如下所示。

11.6.1 硬件連接

硬件連接原理圖如下:

3746beb0-c72d-11ef-9310-92fbcf53809c.png

實物連接圖如下:

376a0730-c72d-11ef-9310-92fbcf53809c.png

11.6.2 程序解析

代碼在如下目錄里:

37a37934-c72d-11ef-9310-92fbcf53809c.png

“modbus_server.c”代碼解析如下。

1. 初始化與連接

代碼如下:

左右滑動查看完整內容

40 ctx = modbus_new_rtu(argv[1], 115200, 'N', 8, 1);
41 if (ctx == NULL) {
42 fprintf(stderr, "Unable to allocate libmodbus context
");
43 return -1;
44 }
45
46 modbus_set_slave(ctx, SERVER_ID);
47
48 mb_mapping = modbus_mapping_new_start_address(0,
49 NB_BITS, /* 5 個 DO 寄存器,對應 beep1,beep2,led1,led2,led3 */
50 0,
51 NB_INPUT_BITS,
52 0,
53 NB_REGISTERS,
54 0,
55 NB_INPUT_REGISTERS); /* 2 個 AI 寄存器,對應溫度和濕度 */
56 memset(mb_mapping->tab_bits, 0, NB_BITS);
57 memset(mb_mapping->tab_input_registers, 0, NB_INPUT_REGISTERS*2);
58
59 memset(old_bits, 0, NB_BITS);
60 memset(old_regs, 0, NB_INPUT_REGISTERS*2);
61
62 if (modbus_connect(ctx) == -1) {
63 fprintf(stderr, "Connection failed: %s
", modbus_strerror(errno));
64 modbus_free(ctx);
65 return -1;
66 }

第40行:分配一個modbus_t結構體。

第46行:設置自己的傳感器地址。

第48~55行:分配Modbus寄存器。

第56~57行:設置DO、AI寄存器初始值為0。

第59~60行:設置2個數組的值為0,這2個數組將用來跟Modbus寄存器進行比較,這樣才能知道Client程序有沒有修改這些值。

第62行:打開串口設備。

2. 等待Client程序發來請求

代碼如下:

左右滑動查看完整內容

68 while (1)
69 {
70 do {
71 rc = modbus_receive(ctx, query);
72 /* Filtered queries return 0 */
73 } while (rc == 0);

第71行:讀取請求。

3. 模擬溫濕度傳感器

代碼如下:

左右滑動查看完整內容

82 /* 使用隨機數模擬溫度、濕度 */
83 mb_mapping->tab_input_registers[0] = rand() % 1000; /* 溫度,單位:0.1C */
84 mb_mapping->tab_input_registers[1] = rand() % 1000; /* 濕度,單位:0.1% */

4. 回復數據給Client

代碼如下:

左右滑動查看完整內容

86 rc = modbus_reply(ctx, query, rc, mb_mapping);
87 if (rc == -1) {
88 //break;
89 }

如果Client發來的請求是讀取溫濕度值的話,那么第86行就會回復數據給它。

5. 模擬蜂鳴器和LED操作

代碼如下:

左右滑動查看完整內容

91 /* 根據 client 設置的數值,假裝操作蜂鳴器和 LED */
92 if (mb_mapping->tab_bits[0] != old_bits[0])
93 {
94 printf("set beep1 %s
", mb_mapping->tab_bits[0] ? "on" : "off");
95 old_bits[0] = mb_mapping->tab_bits[0];
96 }
97
98 if (mb_mapping->tab_bits[1] != old_bits[1])
99 {
100 printf("set beep2 %s
", mb_mapping->tab_bits[1] ? "on" : "off");
101 old_bits[1] = mb_mapping->tab_bits[1];
102 }
103
104 if (mb_mapping->tab_bits[2] != old_bits[2])
105 {
106 printf("set led1 %s
", mb_mapping->tab_bits[2] ? "on" : "off");
107 old_bits[2] = mb_mapping->tab_bits[2];
108 }
109
110 if (mb_mapping->tab_bits[3] != old_bits[4])
111 {
112 printf("set led2 %s
", mb_mapping->tab_bits[4] ? "on" : "off");
113 old_bits[3] = mb_mapping->tab_bits[4];
114 }
115
116 if (mb_mapping->tab_bits[4] != old_bits[4])
117 {
118 printf("set led3 %s
", mb_mapping->tab_bits[4] ? "on" : "off");
119 old_bits[4] = mb_mapping->tab_bits[4];
120 }

代碼比較簡單,不再贅述。

11.6.3 上機實驗

把代碼上傳到Ubuntu。

然后,在Ubuntu下執行如下命令進行編譯:

左右滑動查看完整內容

$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux
$ make
$ scp modbus_client root@192.168.5.9:/home/root
$ scp modbus_server root@192.168.5.9:/home/root

最后,在開發板上執行如下命令(先執行 modbus_server):

左右滑動查看完整內容

# cd /home/root
# ./modbus_server /dev/ttySC2 &
# ./modbus_client /dev/ttySC4 beep1 on
modbus_write_bit ok
# ./modbus_client /dev/ttySC4 beep1 off
modbus_write_bit ok
# ./modbus_client /dev/ttySC4 led1 on
modbus_write_bit ok
# ./modbus_client /dev/ttySC4 led1 off
modbus_write_bit ok
# ./modbus_client /dev/ttySC4 read
Temprature = 64.9C, Humity = 42.1%
Temprature = 36.2C, Humity = 2.7%
Temprature = 69.0C, Humity = 5.9%

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2551

    文章

    51192

    瀏覽量

    754405
  • MODBUS
    +關注

    關注

    28

    文章

    1810

    瀏覽量

    77071
  • 服務器
    +關注

    關注

    12

    文章

    9218

    瀏覽量

    85588
  • RTU
    RTU
    +關注

    關注

    0

    文章

    414

    瀏覽量

    28702

原文標題:Modbus RTU客戶端及服務器端的編程與實驗 - RZ MPU工業控制教程連載(43)

文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    服務器端模式下的TCP通信

    我是誰——ESP8266,連接家里路由成功之后,會自動獲得一個IP,這是服務器端IP 誰要和我連接——因為是在我電腦上使用網絡調試助手模擬TCP客戶端,所以客戶端
    的頭像 發表于 12-30 09:15 ?4555次閱讀
    <b class='flag-5'>服務器端</b>模式下的TCP通信

    用隊列實現的1對N的TCP服務器端,自動回復信息總發錯客戶端

    本帖最后由 kaneiqi1210 于 2014-7-17 12:43 編輯 如題,我仿照教材用隊列做的TCP一對多的服務器端,在1對1時,沒問題,而在1對多時,就出現,自動回復信息至不正確的客戶端(即非發送信息的客戶端
    發表于 07-17 09:31

    TCP視頻服務器&客戶端 - 版本LabVIEW 2012

    客戶端功能:顯示服務器采集到的視頻,實時調整服務器采集視頻的分辨率。客戶端需要輸入服務器端的ip地址和端口號。以這兩個程序為基礎,可以加個
    發表于 01-22 14:22

    qt tcp程序在服務器端發送數據之前能接收客戶端發送的數據嗎?

    寫了一個tcp的客戶端服務器端,是服務器端客戶端發送文件,但是我想在服務器端發送之前先讓客戶端
    發表于 04-22 20:06

    一個服務器,多個客戶端,怎么向指定的客戶端發數據

    我用labview做服務器,單片機做客戶端客戶端幾百個,怎么區分客戶端,給指定的客戶發發數據
    發表于 06-01 09:26

    labview怎么實現服務器端一直等待客戶端發送數據啊

    我現在在做labview的服務器端,但是當客戶端發送數據結束后,我的服務器端會報錯。報錯的意思就是說客戶端關閉,我想知道怎么實現才可以讓客戶端
    發表于 08-12 14:34

    為什么LWIP的TCP客戶端服務器端斷開后繼續發送數據就無法檢測到連接狀態?

    發現LWIP的TCP客戶端有個BUG,當服務器端開之后,如果還繼續發送數據,那就不能檢測到連接狀態。求助求助
    發表于 10-29 20:26

    4412開發板Qt網絡編程-TCP實現服務器客戶端

    更改組件名稱注釋,完成后如圖 : 步驟三:服務器端編程:1.創建 QTcpServer 對象2.創建監聽端口,使得客戶端可以使用這個端口訪問服務器,使用 listen 函數。bool
    發表于 04-28 15:33

    監控系統客戶端服務端設計

    項目開發報告1 項目簡介1.1 概述1.2 開發環境1.3 其他支持1.4 應用界面1.4.1 服務器端1.4.2 客戶端1.5 程序使用2 項目開發2.1 搭建基于實驗平臺數據庫2.1.1 數據庫
    發表于 12-21 07:02

    客戶端服務器和網絡技術

    基于服務器的計算代表著一種應用程序部署方法。 對以下基于服務器的計算環境而言,瘦客戶端是理想的客戶端設備: 借助 Windows 2000 或 Windows Server 2003
    發表于 07-02 16:46 ?17次下載
    瘦<b class='flag-5'>客戶端</b>的<b class='flag-5'>服務器</b>和網絡技術

    網絡調試和串口調試集合UDP TCP客戶端和TCP服務器端應用程序免費下載

    本文檔的主要內容詳細介紹的是網絡調試和串口調試集合UDP TCP客戶端和TCP服務器端應用程序免費下載。
    發表于 08-30 08:00 ?16次下載
    網絡調試和串口調試集合UDP TCP<b class='flag-5'>客戶端</b>和TCP<b class='flag-5'>服務器端</b>應用程序免費下載

    TCP通信服務器端客戶端同機互傳的簡單示例程序免費下載

    本文檔的主要內容詳細介紹的是TCP通信服務器端客戶端同機互傳的簡單示例程序免費下載初學者學習。本例子是本計算機labview程序之間的通信,如果要想實現計算機與計算機之間的通信,需要設置例子里面的IP。
    發表于 10-25 08:00 ?9次下載
    TCP通信<b class='flag-5'>服務器端</b>和<b class='flag-5'>客戶端</b>同機互傳的簡單示例程序免費下載

    數據是怎么樣保證準確的從客戶端發送到服務器端

    你有想過嗎,在計算機網絡當中,數據是怎么樣保證準確的從客戶端發送到服務器端的?中間涉及到了哪些理論?
    的頭像 發表于 07-01 10:09 ?2104次閱讀

    Linux下TCP網絡編程-創建服務器客戶端

    這篇文章介紹在Linux下的socket編程,完成TCP服務器客戶端的創建,實現數據通信。
    的頭像 發表于 08-14 09:26 ?2514次閱讀
    Linux下TCP網絡<b class='flag-5'>編程</b>-創建<b class='flag-5'>服務器</b>與<b class='flag-5'>客戶端</b>

    服務端測試和客戶端測試區別在哪

    服務端測試和客戶端測試是軟件開發過程中的兩個重要環節,它們分別針對服務器端客戶端的軟件進行測試。本文將詳細介紹服務端測試和
    的頭像 發表于 05-30 15:27 ?3174次閱讀
    主站蜘蛛池模板: 中文字幕在线视频在线看| 大胸美女被吊起来解开胸罩| 国产产乱码一二三区别免费| 日本粉嫩学生毛绒绒| 超碰人人澡人人胔| 色综合久久综合网观看| 国产毛片AV久久久久精品| 亚洲乱码中文字幕久久| 久久999视频| 99视频网址| 天天操夜夜噜| 久草精品在线| 99久久精品免费看国产免费| 双性精跪趴灌满h室友4p| 韩国伦理电影在线神马网| 最新黄色在线| 三级黄色在线看| 精品国产自在自线官方| 99视频网址| 亚洲理论在线a中文字幕| 蜜柚影院在线观看免费高清中文| gratis videos欧美最新| 性饥渴姓交HDSEX| 免费国产精品视频| 国产免费久久爱久久啪| 最新国产三级在线不卡视频| 无码人妻少妇色欲AV一区二区| 老女人与小伙子露脸对白| 囯产免费精品一品二区三区视频 | 暖暖 视频 在线 观看 高清| 国产成人久久精品激情| 中文字幕AV在线一二三区| 日韩特黄特色大片免费视频| 久久艹伊人| 国产高清视频在线观看不卡v| 中国欧美日韩一区二区三区| 特黄特黄aaaa级毛片免费看| 男男肉肉互插腐文| 国产亚洲精品视频在线网| eussse手机电影在线观看| 亚洲色婷婷久久精品AV蜜桃|