在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Modbus RTU客戶端及服務(wù)器端的編程與實(shí)驗(yàn)

瑞薩MCU小百科 ? 來(lái)源:瑞薩MCU小百科 ? 2024-12-31 16:38 ? 次閱讀

11.5 Modbus RTU客戶端編程與實(shí)驗(yàn)

瑞米派開(kāi)發(fā)板作為client(主設(shè)備),去訪問(wèn)Modbus傳感器(作為Server)。

本節(jié)源碼位于如下目錄:

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

11.5.1 硬件連接

硬件連接原理圖如下:

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

實(shí)物連接圖如下:

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

11.5.2 傳感器點(diǎn)表

對(duì)于Modbus設(shè)備,怎么訪問(wèn)它們?它們的寄存器分別有什么功能?這在“點(diǎn)表”里描述,每個(gè)寄存器被稱為一個(gè)“點(diǎn)”。

百問(wèn)網(wǎng)的溫濕度傳感器的點(diǎn)表如下:

設(shè)備
地址
寄存器
地址
寄存器
類別
用途 描述
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位有符號(hào)整數(shù)
0001H AI 讀取濕度 單位0.1%RH
16位有符合整數(shù)

11.5.3 程序解析

代碼在如下目錄里:

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

假設(shè)執(zhí)行如下命令:

左右滑動(dòng)查看完整內(nèi)容

./modbus_client /dev/ttySC4 read

程序運(yùn)行的情景分析如下

1. 初始化與連接

代碼如下:

左右滑動(dòng)查看完整內(nèi)容

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行:分配一個(gè)modbus_t結(jié)構(gòu)體。

第39行:設(shè)置要訪問(wèn)的Modbus傳感器地址。

第41行:打開(kāi)串口設(shè)備。

2. 讀取傳感器數(shù)據(jù)

代碼如下:

左右滑動(dòng)查看完整內(nèi)容

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個(gè)AI寄存器。

第54行:打印溫濕度值。

11.5.4 上機(jī)實(shí)驗(yàn)

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

把代碼上傳到Ubuntu。

然后,在Ubuntu下執(zhí)行如下命令進(jìn)行編譯:

左右滑動(dòng)查看完整內(nèi)容

$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux
$ make
$ scp modbus_client [email protected]:/mnt

最后,在開(kāi)發(fā)板上執(zhí)行如下命令:

左右滑動(dòng)查看完整內(nèi)容

# 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服務(wù)器端編程與實(shí)驗(yàn)

要把瑞米派當(dāng)做一個(gè)Modbus服務(wù)器(傳感器)來(lái)使用,需要有另一個(gè)開(kāi)發(fā)板作為客戶端。為了方便實(shí)驗(yàn),本課程使用同一個(gè)瑞米派開(kāi)發(fā)板,它運(yùn)行2個(gè)程序:一個(gè)模擬服務(wù)器,另一個(gè)模擬客戶端。

本節(jié)源碼位于如下目錄:

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

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

11.6.1 硬件連接

硬件連接原理圖如下:

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

實(shí)物連接圖如下:

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

11.6.2 程序解析

代碼在如下目錄里:

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

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

1. 初始化與連接

代碼如下:

左右滑動(dòng)查看完整內(nèi)容

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 個(gè) DO 寄存器,對(duì)應(yīng) beep1,beep2,led1,led2,led3 */
50 0,
51 NB_INPUT_BITS,
52 0,
53 NB_REGISTERS,
54 0,
55 NB_INPUT_REGISTERS); /* 2 個(gè) AI 寄存器,對(duì)應(yīng)溫度和濕度 */
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行:分配一個(gè)modbus_t結(jié)構(gòu)體。

第46行:設(shè)置自己的傳感器地址。

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

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

第59~60行:設(shè)置2個(gè)數(shù)組的值為0,這2個(gè)數(shù)組將用來(lái)跟Modbus寄存器進(jìn)行比較,這樣才能知道Client程序有沒(méi)有修改這些值。

第62行:打開(kāi)串口設(shè)備。

2. 等待Client程序發(fā)來(lái)請(qǐng)求

代碼如下:

左右滑動(dòng)查看完整內(nèi)容

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

第71行:讀取請(qǐng)求。

3. 模擬溫濕度傳感器

代碼如下:

左右滑動(dòng)查看完整內(nèi)容

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

4. 回復(fù)數(shù)據(jù)給Client

代碼如下:

左右滑動(dòng)查看完整內(nèi)容

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

如果Client發(fā)來(lái)的請(qǐng)求是讀取溫濕度值的話,那么第86行就會(huì)回復(fù)數(shù)據(jù)給它。

5. 模擬蜂鳴器和LED操作

代碼如下:

左右滑動(dòng)查看完整內(nèi)容

91 /* 根據(jù) client 設(shè)置的數(shù)值,假裝操作蜂鳴器和 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 }

代碼比較簡(jiǎn)單,不再贅述。

11.6.3 上機(jī)實(shí)驗(yàn)

把代碼上傳到Ubuntu。

然后,在Ubuntu下執(zhí)行如下命令進(jìn)行編譯:

左右滑動(dòng)查看完整內(nèi)容

$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux
$ make
$ scp modbus_client [email protected]:/home/root
$ scp modbus_server [email protected]:/home/root

最后,在開(kāi)發(fā)板上執(zhí)行如下命令(先執(zhí)行 modbus_server):

左右滑動(dòng)查看完整內(nèi)容

# 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%

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2561

    文章

    52198

    瀏覽量

    761711
  • MODBUS
    +關(guān)注

    關(guān)注

    28

    文章

    1950

    瀏覽量

    78651
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9596

    瀏覽量

    86969
  • RTU
    RTU
    +關(guān)注

    關(guān)注

    0

    文章

    427

    瀏覽量

    29153

原文標(biāo)題:Modbus RTU客戶端及服務(wù)器端的編程與實(shí)驗(yàn) - RZ MPU工業(yè)控制教程連載(43)

文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    服務(wù)器端模式下的TCP通信

    我是誰(shuí)——ESP8266,連接家里路由成功之后,會(huì)自動(dòng)獲得一個(gè)IP,這是服務(wù)器端IP 誰(shuí)要和我連接——因?yàn)槭窃谖译娔X上使用網(wǎng)絡(luò)調(diào)試助手模擬TCP客戶端,所以客戶端
    的頭像 發(fā)表于 12-30 09:15 ?4726次閱讀
    <b class='flag-5'>服務(wù)器端</b>模式下的TCP通信

    MKW45B41Z客戶端無(wú)法從服務(wù)器獲取服務(wù)是為什么?

    。MKW45B41Z (自定義板) 充當(dāng)中央設(shè)備客戶端角色。MKW45 客戶端掃描外圍設(shè)備(NRF 連接)設(shè)備并連接到外圍設(shè)備(NRF 連接)設(shè)備。連接 MKW45(自定義板卡)后,客戶端無(wú)法從
    發(fā)表于 03-28 07:40

    用隊(duì)列實(shí)現(xiàn)的1對(duì)N的TCP服務(wù)器端,自動(dòng)回復(fù)信息總發(fā)錯(cuò)客戶端

    本帖最后由 kaneiqi1210 于 2014-7-17 12:43 編輯 如題,我仿照教材用隊(duì)列做的TCP一對(duì)多的服務(wù)器端,在1對(duì)1時(shí),沒(méi)問(wèn)題,而在1對(duì)多時(shí),就出現(xiàn),自動(dòng)回復(fù)信息至不正確的客戶端(即非發(fā)送信息的客戶端
    發(fā)表于 07-17 09:31

    TCP視頻服務(wù)器&客戶端 - 版本LabVIEW 2012

    客戶端功能:顯示服務(wù)器采集到的視頻,實(shí)時(shí)調(diào)整服務(wù)器采集視頻的分辨率。客戶端需要輸入服務(wù)器端的ip地址和端口號(hào)。以這兩個(gè)程序?yàn)榛A(chǔ),可以加個(gè)
    發(fā)表于 01-22 14:22

    qt tcp程序在服務(wù)器端發(fā)送數(shù)據(jù)之前能接收客戶端發(fā)送的數(shù)據(jù)嗎?

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

    一個(gè)服務(wù)器,多個(gè)客戶端,怎么向指定的客戶端發(fā)數(shù)據(jù)

    我用labview做服務(wù)器,單片機(jī)做客戶端客戶端幾百個(gè),怎么區(qū)分客戶端,給指定的客戶發(fā)發(fā)數(shù)據(jù)
    發(fā)表于 06-01 09:26

    labview怎么實(shí)現(xiàn)服務(wù)器端一直等待客戶端發(fā)送數(shù)據(jù)啊

    我現(xiàn)在在做labview的服務(wù)器端,但是當(dāng)客戶端發(fā)送數(shù)據(jù)結(jié)束后,我的服務(wù)器端會(huì)報(bào)錯(cuò)。報(bào)錯(cuò)的意思就是說(shuō)客戶端關(guān)閉,我想知道怎么實(shí)現(xiàn)才可以讓客戶端
    發(fā)表于 08-12 14:34

    為什么LWIP的TCP客戶端服務(wù)器端斷開(kāi)后繼續(xù)發(fā)送數(shù)據(jù)就無(wú)法檢測(cè)到連接狀態(tài)?

    發(fā)現(xiàn)LWIP的TCP客戶端有個(gè)BUG,當(dāng)服務(wù)器端開(kāi)之后,如果還繼續(xù)發(fā)送數(shù)據(jù),那就不能檢測(cè)到連接狀態(tài)。求助求助
    發(fā)表于 10-29 20:26

    4412開(kāi)發(fā)板Qt網(wǎng)絡(luò)編程-TCP實(shí)現(xiàn)服務(wù)器客戶端

    更改組件名稱注釋,完成后如圖 : 步驟三:服務(wù)器端編程:1.創(chuàng)建 QTcpServer 對(duì)象2.創(chuàng)建監(jiān)聽(tīng)端口,使得客戶端可以使用這個(gè)端口訪問(wèn)服務(wù)器,使用 listen 函數(shù)。bool
    發(fā)表于 04-28 15:33

    監(jiān)控系統(tǒng)客戶端服務(wù)端設(shè)計(jì)

    項(xiàng)目開(kāi)發(fā)報(bào)告1 項(xiàng)目簡(jiǎn)介1.1 概述1.2 開(kāi)發(fā)環(huán)境1.3 其他支持1.4 應(yīng)用界面1.4.1 服務(wù)器端1.4.2 客戶端1.5 程序使用2 項(xiàng)目開(kāi)發(fā)2.1 搭建基于實(shí)驗(yàn)平臺(tái)數(shù)據(jù)庫(kù)2.1.1 數(shù)據(jù)庫(kù)
    發(fā)表于 12-21 07:02

    網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶端和TCP服務(wù)器端應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶端和TCP服務(wù)器端應(yīng)用程序免費(fèi)下載。
    發(fā)表于 08-30 08:00 ?16次下載
    網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP<b class='flag-5'>客戶端</b>和TCP<b class='flag-5'>服務(wù)器端</b>應(yīng)用程序免費(fèi)下載

    TCP通信服務(wù)器端客戶端同機(jī)互傳的簡(jiǎn)單示例程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是TCP通信服務(wù)器端客戶端同機(jī)互傳的簡(jiǎn)單示例程序免費(fèi)下載初學(xué)者學(xué)習(xí)。本例子是本計(jì)算機(jī)labview程序之間的通信,如果要想實(shí)現(xiàn)計(jì)算機(jī)與計(jì)算機(jī)之間的通信,需要設(shè)置例子里面的IP。
    發(fā)表于 10-25 08:00 ?9次下載
    TCP通信<b class='flag-5'>服務(wù)器端</b>和<b class='flag-5'>客戶端</b>同機(jī)互傳的簡(jiǎn)單示例程序免費(fèi)下載

    數(shù)據(jù)是怎么樣保證準(zhǔn)確的從客戶端發(fā)送到服務(wù)器端

    你有想過(guò)嗎,在計(jì)算機(jī)網(wǎng)絡(luò)當(dāng)中,數(shù)據(jù)是怎么樣保證準(zhǔn)確的從客戶端發(fā)送到服務(wù)器端的?中間涉及到了哪些理論?
    的頭像 發(fā)表于 07-01 10:09 ?2299次閱讀

    Linux下TCP網(wǎng)絡(luò)編程-創(chuàng)建服務(wù)器客戶端

    這篇文章介紹在Linux下的socket編程,完成TCP服務(wù)器客戶端的創(chuàng)建,實(shí)現(xiàn)數(shù)據(jù)通信。
    的頭像 發(fā)表于 08-14 09:26 ?2694次閱讀
    Linux下TCP網(wǎng)絡(luò)<b class='flag-5'>編程</b>-創(chuàng)建<b class='flag-5'>服務(wù)器</b>與<b class='flag-5'>客戶端</b>

    服務(wù)端測(cè)試和客戶端測(cè)試區(qū)別在哪

    服務(wù)端測(cè)試和客戶端測(cè)試是軟件開(kāi)發(fā)過(guò)程中的兩個(gè)重要環(huán)節(jié),它們分別針對(duì)服務(wù)器端客戶端的軟件進(jìn)行測(cè)試。本文將詳細(xì)介紹服務(wù)端測(cè)試和
    的頭像 發(fā)表于 05-30 15:27 ?4140次閱讀
    主站蜘蛛池模板: 色多多网址 | 国产理论最新国产精品视频 | 欧美五月婷婷 | 久久99精品福利久久久 | 日本三级欧美三级香港黄 | 成人性欧美丨区二区三区 | 94在线| 日本一区二区不卡视频 | 久操资源在线 | 免费在线播放毛片 | 你懂的免费 | 黄色三级视频 | 国产性较精品视频免费 | 视频免费播放 | 俺也操| 免费人成黄页在线观看日本 | 美女三级在线 | 国产热 | 午夜资源| 被公侵犯肉体中文字幕一区二区 | 天堂资源在线官网bt | 国产高清一区二区三区四区 | 男人j桶进女人免费视频 | 韩国一区二区三区视频 | 天天看天天射天天碰 | 国产欧美一区二区三区观看 | 操日韩| 日本人zzzwww | 色色色色色色网 | 亚洲午夜精品久久久久久抢 | 一本到卡二卡三卡视频 | 美女扒开内裤让男人桶 | 欧美两性网| 国产午夜精品一区二区三区 | 亚洲一区二区三区四区在线 | l欧美18一19sex性 | 午夜小视频在线播放 | 丁香婷婷综合五月综合色啪 | 你懂得国产 | 日本午夜大片 | 亚洲美女爱爱 |