在线观看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功能接口函數(shù)詳解

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

2. 各類Modbus功能接口函數(shù)

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

MODBUS_API int modbus_read_bits(modbus t * ctx,int addr,int nb,uint8_t * dest):

此函數(shù)對(duì)應(yīng)于功能碼01(0x01)讀取線圈/離散量輸出狀態(tài)(Read CoilStatus/DOs),其中,所讀取的值存放于參數(shù)uint8_t * dest指向的數(shù)組空間因此dest指向的空間必須足夠大,其大小至少為nb * sizeof(uint8_t)個(gè)字節(jié)。

用法舉例:

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

#define SERVER ID 1
#define ADDRESS START 0
#define ADDRESS END 99
modbus_t * ctx;
uint8_t * tab_rp_bits;
int rc;
int nb;
ctx=modbus_new_tcp("127.0.0.1",502);
modbus_set_debug(ctx,TRUE);
if (modbus_connect(ctx)==-1)
{
 fprintf(stderr,"Connection failed:%s
", modbus_strerror(errno));
 modbus free(ctx);
 return -1;
}
//申請(qǐng)存儲(chǔ)空間并初始化
int nb = ADDRESS_END - ADDRESS_START;
tab_rp_bits = (uint8_t * ) malloc (nb * sizeof(uint8_t));
memset(tab_rp_bits, 0, nb * sizeof(uint8_t));
//讀取一個(gè)線圈
int addr =1;
rc =modbus_read_bits(ctx,addr,1,tab_rp_bits);
if (rc !=1)
{
 printf("ERROR modbus_read_bits_single (%d)
", rc);
 printf("address =%d
", addr);
}
//讀取多個(gè)線圈
rc =modbus_read_bits(ctx,addr,nb,tab_rp_bits);
if (rc !=nb)
{
 printf("ERROR modbus_read_bits
");
 printf("Address =%d,nb =%d
", addr, nb);
}
//釋放空間關(guān)閉連接
free(tab_rp_bits);
modbus_close(ctx);
modbus_free(ctx);

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

MODBUS_API int modbus_read_input_bits (modbus_t * ctx, intaddr, int nb,uint8_t * dest):

此函數(shù)對(duì)應(yīng)于功能碼02(0x02)讀取離散量輸入值(Read InputStatus/DIs),各參數(shù)的意義與用法,類似于函數(shù)modbus_read_bits()。

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

MODBUS_API int modbus_read_registers (modbus_t * ctx, intaddr, int nb,uint16_t * dest):

此函數(shù)對(duì)應(yīng)于功能碼03(0x03)讀取保持寄存器(Read HoldingRegister),其中,所讀取的值存放于參數(shù)uint16_t * dest指向的數(shù)組空間,因此dest指向的空間必須足夠大,其大小至少為nb * sizeof(uint16_t)個(gè)字節(jié)。

當(dāng)讀取成功后,返回值為讀取的寄存器個(gè)數(shù);若讀取失敗,則返回-1。此函數(shù)調(diào)用依賴關(guān)系如下圖6-5所示。

用法舉例:

d0954586-b775-11ef-93f3-92fbcf53809c.png

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

modbust * ctx;
uint16_t tab_reg[64];
int rc;
int i;
ctx=modbus_new_tcp("127.0.0.1",502);
if (modbusconnect(ctx)==-1)
{
 fprintf(stderr,"Connection failed:%s
", modbus_strerror(errno));
 modbus_free(ctx);
 return -1;
}
//從地址0開始連續(xù)讀取10個(gè)
rc =modbus_read_registers(ctx,0,10,tab_reg);
if (rc ==-1)
{
 fprintf(stderr,"%s
",modbus_strerror(errno));
 return -1;
}
for (i=0;i

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

MODBUS_API int modbus_read_input_registers (modbus_t * ctx,int addr, int nb, uint16_t * dest ):

此函數(shù)對(duì)應(yīng)于功能碼04(0x04)讀取輸人寄存器(Read Iput Register),各參數(shù)的意義與用法,類似于函數(shù) modbus_read_registers()。

此函數(shù)的調(diào)用依賴關(guān)系如下圖6-6所示。

圖6-6函數(shù)modbus_read input_registers()的調(diào)用依賴關(guān)系:

d0b219a4-b775-11ef-93f3-92fbcf53809c.png

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

MODBUS_API int modbus_write_bit(modbus_t * ctx,intcoil_addr,int status):

該函數(shù)對(duì)應(yīng)于功能碼05(0x05)寫單個(gè)線圈或單個(gè)離散輸出(ForceSingleCoil)。其中參數(shù)coil_addr代表線圈地址;參數(shù)status代表寫值取值只能是TRUE(1)或 FALSE(0)。

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

MODBUS_API int modbus_write_register(modbus_t * ctx,intreg_addr,int value):

該函數(shù)對(duì)應(yīng)于功能碼06(0x06)寫單個(gè)保持寄存器(Preset SingleRegister)。

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

MODBUS_API int modbus_write_bits(modbus_t * ctx, int addr,int nb,const uint8_t * data):

該函數(shù)對(duì)應(yīng)于功能碼15(0x0F)寫多個(gè)線圈(Force Multiple Coils)

參數(shù)addr代表寄存器起始地址,參數(shù)nb表示線圈個(gè)數(shù),而參數(shù)constuint8_t * data表示待寫入的數(shù)據(jù)塊。一般情況下,可以使用數(shù)組存儲(chǔ)寫入數(shù)據(jù),數(shù)組的各元素取值范圍只能是TRUE(1)或FALSE(0)。

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

MODBUS_API int modbus_write_registers(modbus_t * ctx, intaddr,int nb,const uint16_t * data):

該函數(shù)對(duì)應(yīng)于功能碼16(0x10)寫多個(gè)保持存器 (PresetMultipleRegisters)

參數(shù)addr代表寄存器起始地址,參數(shù)nb表示存器的個(gè)數(shù)而參數(shù)constuint16_t * data表示待寫人的數(shù)據(jù)塊。一般情況下,可以使用數(shù)組存儲(chǔ)寫入數(shù)據(jù)數(shù)組的各元素取值范圍是0~0xFFFF即數(shù)據(jù)類型uint16_t的取值范圍。

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

MODBUS_API int modbus_mask_registers(modbus_t * ctx, intaddr, uint16_t and_mask,uint16_t or_mask ):

modbus_mask_write_register()函數(shù)應(yīng)使用以下算法修改遠(yuǎn)程設(shè)備地址“addr”處的保持寄存器的值:

新值=(current value AND ‘a(chǎn)nd’)OR(‘or’ AND(NOT ‘a(chǎn)nd’))。

該功能使用Modbus功能代碼0x16(掩碼單個(gè)寄存器)。

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

MODBUS_API int modbus_write_and_read_registers (mobus_t *ctx ,
int writer_addr,
int writer_nb,
const uint16_t * src,
int read_addr,
int read_nb,
uint16_t * dest);

modbus_write_and_read_registers()函數(shù)應(yīng)將write_nb保持寄存器的內(nèi)容從數(shù)組“src”寫入遠(yuǎn)程設(shè)備的地址 write_addr,然后將read_nb保持寄存器的內(nèi)容讀取到遠(yuǎn)程設(shè)備的地址read_addr。讀取結(jié)果作為字值(16位)存儲(chǔ)在dest數(shù)組中。

必須注意分配足夠的內(nèi)存來(lái)存儲(chǔ)結(jié)果dest(至少nb *sizeof(uint16_t))。該功能使用Modbus功能代碼0x17(寫/讀寄存器)。

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

MODBUS_API int modbus_report_slave_id(modbus_t * ctx, intmax_dest, uint8_t * dest):

該函數(shù)對(duì)應(yīng)于功能碼17(0x11)報(bào)告從站ID。參數(shù)max_dest代表最大的存儲(chǔ)空間,參數(shù)dest用于存儲(chǔ)返回?cái)?shù)據(jù)。返回?cái)?shù)據(jù)可以包括如下內(nèi)容:從站ID狀態(tài)值(0x00=OFF狀態(tài),0xFF=ON狀態(tài))以及其他附加信息,具體的各參數(shù)意義由開發(fā)者指定。

用法舉例:

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

uint8_t tab_bytes[MODBUS_MAX_PDU_LENGTH];
...
 
rc =modbus_report_slave_id(ctx, MODBUS_MAX_PDU_LENGTH, tab_bytes);
if (rc>1)
{
 printf("Run Status Indicator: %s
",tab_bytes[1] ?"ON":"OFF");
}

3.數(shù)據(jù)處理的相關(guān)函數(shù)或宏定義

在libmodbus開發(fā)庫(kù)中,為了方便數(shù)據(jù)處理在modbus.h 文件中定義了一系列數(shù)據(jù)處理宏。

例如獲取數(shù)據(jù)的高低字節(jié)序宏定義:

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

#define MODBUS_GET_HIGH_BYTE (data) (((data) >>8)&0xFF)

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

#define MODBUS_GET_LOW_BYTE (data) ((data)&0xFF)

對(duì)于浮點(diǎn)數(shù)等多字節(jié)數(shù)據(jù)而言,由于存在字節(jié)序與大小端處理等的問(wèn)題,所以輔助定義了一些特殊函數(shù):

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

MODBUS_API float modbus_get_float (const uint16_t * src);
MODBUS_API float modbus_get_float_abcd (const uint16_t * src);
MODBUS_API float modbus_get_float_dcba (const uint16_t * src);
MODBUS_API float modbus_get_float_badc (const uint16_t * src);
MODBUS_API float modbus_get_float_cdab (const uint16_t * src);
MODBUS_API void modbus_set_float (float f,uint16_t * dest);
MODBUS_API void modbus_set_float_abcd (float f,uint16_t * dest);
MODBUS_API void modbus_set_float_dcba (float f,uint16_t * dest);
MODBUS_API void modbus_set_float_badc (float f,uint16_t * dest);
MODBUS_API void modbus_set_float_cdab (float f,uint16_t * dest);

當(dāng)然,可以參照f(shuō)loat類型的處理方法,繼續(xù)定義其他多字節(jié)類型的數(shù)據(jù)例如int32_t、uint32_t、int64_t、uint64_t以及double類型的讀寫函數(shù)。

聲明:本文內(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)注

    33

    文章

    8712

    瀏覽量

    152013
  • MODBUS
    +關(guān)注

    關(guān)注

    28

    文章

    1824

    瀏覽量

    77348
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    63010

原文標(biāo)題:Modbus接口與數(shù)據(jù)處理 - RZ MPU工業(yè)控制教程連載(41)

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)聯(lián)接口函數(shù)與libmodbus移植

    可以發(fā)現(xiàn),除了modbus.h包含的接口函數(shù)之外,modbus-rtu.h和modbus-tcp.h也包含了必要的
    的頭像 發(fā)表于 12-30 15:20 ?550次閱讀
    關(guān)聯(lián)<b class='flag-5'>接口</b><b class='flag-5'>函數(shù)</b>與libmodbus移植

    用于LabVIEW的NI Modbus庫(kù)

    NI LabVIEW實(shí)時(shí)模塊主控和伺服功能用于NI LabVIEW的NI Modbus程序庫(kù)作為一套可免費(fèi)下載的VI函數(shù)模塊,提供源自各類標(biāo)準(zhǔn)以太網(wǎng)或串口的
    發(fā)表于 12-18 17:14

    modbus詳解

    工控機(jī)和工業(yè)控制器等;典型的從設(shè)備如PLC可編程控制器等。Modbus通訊物理接口可以選用串口(包括RS232和RS485),也可以選擇以太網(wǎng)口。
    發(fā)表于 11-25 23:49

    modbus協(xié)議講解modbus-rtu以及modbus-tcp協(xié)議詳解

    modbus協(xié)議講解modbus-rtu以及modbus-tcp協(xié)議詳解,見附件。
    發(fā)表于 03-01 10:14

    Modbus詳解(全書+PDF)

    Modbus詳解,有需要的看看
    發(fā)表于 11-01 15:47

    Modbus功能碼的回調(diào)函數(shù)如何編寫呢

    FreeModbus從站設(shè)計(jì)(10)-Modbus功能碼的回調(diào)函數(shù)如何編寫關(guān)鍵詞:FreeModbus CubeMX HAL庫(kù) 串口 功能碼此系列的前面幾篇文章,主要是闡述了用HAL庫(kù)
    發(fā)表于 02-16 07:31

    PICC庫(kù)函數(shù)詳解

    PICC庫(kù)函數(shù)詳解
    發(fā)表于 04-18 20:13 ?132次下載

    Modbus通信協(xié)議詳解

    關(guān)于Modbus通信協(xié)議的詳解和應(yīng)用分析
    發(fā)表于 10-12 16:54 ?150次下載
    <b class='flag-5'>Modbus</b>通信協(xié)議<b class='flag-5'>詳解</b>

    Modbus_通訊協(xié)議詳解

    Modbus_通訊協(xié)議詳解,Modbus_通訊協(xié)議詳解
    發(fā)表于 12-08 14:13 ?0次下載

    Android開發(fā)手冊(cè)—API函數(shù)詳解

    Android開發(fā)手冊(cè)—API函數(shù)詳解
    發(fā)表于 10-17 09:01 ?13次下載
    Android開發(fā)手冊(cè)—API<b class='flag-5'>函數(shù)</b><b class='flag-5'>詳解</b>

    基于Android開發(fā)手冊(cè)—API函數(shù)詳解

    基于Android開發(fā)手冊(cè)—API函數(shù)詳解
    發(fā)表于 10-24 09:06 ?18次下載
    基于Android開發(fā)手冊(cè)—API<b class='flag-5'>函數(shù)</b><b class='flag-5'>詳解</b>

    單片機(jī)程序中,Modbus功能碼的回調(diào)函數(shù)如何編寫--FreeModbus從站設(shè)計(jì)(10)

    FreeModbus從站設(shè)計(jì)(10)-Modbus功能碼的回調(diào)函數(shù)如何編寫關(guān)鍵詞:FreeModbus CubeMX HAL庫(kù) 串口 功能碼此系列的前面幾篇文章,主要是闡述了用HAL庫(kù)
    發(fā)表于 12-20 18:49 ?9次下載
    單片機(jī)程序中,<b class='flag-5'>Modbus</b><b class='flag-5'>功能</b>碼的回調(diào)<b class='flag-5'>函數(shù)</b>如何編寫--FreeModbus從站設(shè)計(jì)(10)

    什么是type-c全功能接口 Type-C充電接口和type-c全功能接口有什么不同

    Type-C全功能接口,也被稱為USB-C全功能接口,是一種多功能的連接接口標(biāo)準(zhǔn)。它是由USB Implementers Forum(USB-IF)制定的一種標(biāo)準(zhǔn),并在現(xiàn)代設(shè)備中被廣泛
    的頭像 發(fā)表于 08-03 14:32 ?4.8w次閱讀

    STM32庫(kù)函數(shù)SystemInit()詳解

    STM32庫(kù)函數(shù)SystemInit()詳解
    的頭像 發(fā)表于 09-18 15:45 ?4281次閱讀
    STM32庫(kù)<b class='flag-5'>函數(shù)</b>SystemInit()<b class='flag-5'>詳解</b>

    Modbus功能詳解

    Modbus標(biāo)準(zhǔn)在協(xié)議中規(guī)定了以下3類Modbus功能碼。
    的頭像 發(fā)表于 10-29 14:35 ?1711次閱讀
    主站蜘蛛池模板: 色婷婷资源网 | 天堂成人 | 美女毛片在线观看 | 亚洲一区三区 | 你懂的网站在线播放 | 女人张开腿让男人捅爽 | 久久精品人人爽人人爽快 | 天天色色色 | 亚洲福利视频一区二区 | 亚洲国产综合人成综合网站00 | 久草资源在线播放 | 五月婷婷丁香色 | 国产精品免费一级在线观看 | 三级网站在线免费观看 | 不卡视频一区二区 | 欧美午夜片 | 亚洲 欧美 日韩 在线 中文字幕 | 国产精品成人观看视频国产奇米 | 黄色国产视频 | 国产一级毛片午夜 | 久久久久久久成人午夜精品福利 | 中文一区二区 | 亚洲图片欧美色图 | 日本黄色小视频在线观看 | 国产一区二区三区欧美精品 | 欧美日韩国产一区二区三区不卡 | 中文在线最新版天堂 | 中文字幕在线不卡 | 亚洲国产福利 | 国产特级毛片aaaaaa毛片 | 97精品伊人久久大香线蕉 | 玖玖在线 | 欧美一区二区视频在线观看 | 精品国产一区二区三区国产馆 | 色老头在线官方网站 | 五月天激激婷婷大综合丁香 | 三级色网站 | 女人张开腿让男人做爽爽 | 欧美黄色成人 | 四虎永久网址在线观看 | 国产精品日本亚洲777 |