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

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

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

Agile Modbus簡(jiǎn)易從機(jī)接入實(shí)踐說明

冬至子 ? 來源:Cfly ? 作者:Cfly ? 2023-07-22 11:52 ? 次閱讀

說明

Agile Modbus 提供了 agile_modbus_slave_callback_t 的一種實(shí)現(xiàn)方式,使用戶能夠簡(jiǎn)單方便接入。

使用示例可查看 examples/slave。

使用方式:

#include "agile_modbus.h"
#include "agile_modbus_slave_util.h"
const agile_modbus_slave_util_t slave_util = {
/* User implementation */
};
agile_modbus_slave_handle(ctx, read_len, 0, agile_modbus_slave_util_callback, &slave_util, NULL);
agile_modbus_slave_util_callback 介紹

Agile Modbus 提供的一種 agile_modbus_slave_callback_t 實(shí)現(xiàn)方式,需要 agile_modbus_slave_util_t 類型變量指針作為私有數(shù)據(jù)。

私有數(shù)據(jù)為 NULL,所有功能碼都能響應(yīng)且為成功,但寄存器數(shù)據(jù)依然為 0。

agile_modbus_slave_util_t 介紹

typedef struct agile_modbus_slave_util {
const agile_modbus_slave_util_map_t *tab_bits; / *< 線圈寄存器定義數(shù)組 /
int nb_bits; /
< 線圈寄存器定義數(shù)組數(shù)目 */
const agile_modbus_slave_util_map_t *tab_input_bits; / *< 離散量輸入寄存器定義數(shù)組 /
int nb_input_bits; /
< 離散量輸入寄存器定義數(shù)組數(shù)目 */
const agile_modbus_slave_util_map_t *tab_registers; / *< 保持寄存器定義數(shù)組 /
int nb_registers; /
< 保持寄存器定義數(shù)組數(shù)目 */
const agile_modbus_slave_util_map_t *tab_input_registers; / *< 輸入寄存器定義數(shù)組 /
int nb_input_registers; /
< 輸入寄存器定義數(shù)組數(shù)目 */
int (*addr_check)(agile_modbus_t *ctx, struct agile_modbus_slave_info *slave_info); / < 地址檢查接口 */
int (*special_function)(agile_modbus_t ctx, struct agile_modbus_slave_info slave_info); / < 特殊功能碼處理接口 */
int (*done)(agile_modbus_t *ctx, struct agile_modbus_slave_info *slave_info, int ret); /
< 處理結(jié)束接口 */
} agile_modbus_slave_util_t;

寄存器相關(guān)

用戶需要實(shí)現(xiàn) bits、input_bits、registers、input_registers 定義。如果某個(gè)寄存器定義為 NULL,該寄存器對(duì)應(yīng)的功能碼能響應(yīng)且為成功,但寄存器數(shù)據(jù)都為 0。

接口調(diào)用過程

1.jpg

agile_modbus_slave_util_map 介紹

typedef struct agile_modbus_slave_util_map {
int start_addr; / *< 起始地址 /
int end_addr; /
< 結(jié)束地址 */
int (*get)(void *buf, int bufsz); / **< 獲取寄存器數(shù)據(jù)接口 */
int (set)(int index, int len, void buf, int bufsz); / < 設(shè)置寄存器數(shù)據(jù)接口 */
} agile_modbus_slave_util_map_t;

注意事項(xiàng):

起始地址和結(jié)束地址決定的寄存器個(gè)數(shù)有限制。更改函數(shù)內(nèi)部 map_buf 數(shù)組大小可使其變大。

bit 寄存器 < 250

register 寄存器 < 125

接口函數(shù)為 NULL,寄存器對(duì)應(yīng)的功能碼能響應(yīng)且為成功。

get 接口

將地址域內(nèi)的數(shù)據(jù)全部拷貝到 buf 中。

set 接口

index: 地址域內(nèi)的偏移

len: 長(zhǎng)度

根據(jù) index 和 len 修改數(shù)據(jù)。

示例
以 01 功能碼為例:

#include
#include
#include "agile_modbus.h"
#include "agile_modbus_slave_util.h"
static uint8_t _tab_bits[10] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1};
static int get_map_buf(void *buf, int bufsz)
{
uint8_t *ptr = (uint8_t *)buf;
pthread_mutex_lock(&slave_mtx);
for (int i = 0; i < sizeof(_tab_bits); i++) {
ptr[i] = _tab_bits[i];
}
pthread_mutex_unlock(&slave_mtx);
return 0;
}
static int set_map_buf(int index, int len, void *buf, int bufsz)
{
uint8_t *ptr = (uint8_t *)buf;
pthread_mutex_lock(&slave_mtx);
for (int i = 0; i < len; i++) {
_tab_bits[index + i] = ptr[index + i];
}
pthread_mutex_unlock(&slave_mtx);
return 0;
}
const agile_modbus_slave_util_map_t bit_maps[1] = {
{0x041A, 0x0423, get_map_buf, set_map_buf}};

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

    關(guān)注

    31

    文章

    5425

    瀏覽量

    123652
  • Agile
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    6871
  • ModBus通信
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    2772
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    agile_modbus移植例程分享

    最近項(xiàng)目使用了rtt,公司原有的modbus功能有些不完整,查了下發(fā)現(xiàn)agile_modbus挺適合現(xiàn)在的我,于是根據(jù)手冊(cè)和例程進(jìn)行了移植,基本實(shí)現(xiàn)了需要的功能,我的控制器是f103的,串口2做主
    發(fā)表于 07-14 10:00

    agile_modbus遇到一個(gè)rtu主機(jī)要求crc16值要swap時(shí)如何處理呢

    agile_modbus是支持多主機(jī)的,但遇到一個(gè)rtu主機(jī)要求crc16值要swap時(shí)如何處理?遇到modbus的主機(jī)要求CRC16值要SWAP時(shí)該如何處理呢?
    發(fā)表于 08-02 10:40

    分享一種Agile Modbus簡(jiǎn)易機(jī)接入接口實(shí)現(xiàn)方式

    說明Agile Modbus 提供了 agile_modbus_slave_callback_t 的一種實(shí)現(xiàn)方式,使用戶能夠簡(jiǎn)單方便接入。使
    發(fā)表于 08-03 10:47

    使用agile_modbus接收不到數(shù)據(jù)是怎么回事

    是這樣的,我使用RTT Studio基于STM32F407芯片開發(fā)。在使用agile_modbus時(shí),發(fā)現(xiàn)數(shù)據(jù)可以定時(shí)發(fā)出。但是接收不到數(shù)據(jù)(使用串口調(diào)試助手定時(shí)發(fā)送數(shù)據(jù)過來(01 03 02 00
    發(fā)表于 08-22 12:17

    如何打開并且使用agile_telnet呢

    1、介紹2.0開始agile_telnet作為agile_console的插件使用。如果只想使用telnet作為console設(shè)備,請(qǐng)?jiān)L問v1.0.0。1.1 目錄結(jié)構(gòu)名稱說明inc
    發(fā)表于 08-24 15:27

    基于RT-Thread實(shí)現(xiàn)的Agile Modbus協(xié)議棧

    直接使用?! ∮捎谄涫褂眉?C 開發(fā)、不涉及硬件,完全可以在串口上跑 tcp 協(xié)議,在網(wǎng)絡(luò)上跑 rtu 協(xié)議?! ≈С址?modbus 格式的自定義協(xié)議?! ⊥瑫r(shí)支持多主機(jī)和多機(jī)?! ∈褂煤?jiǎn)單,只需要將 rtu 或 tcp
    發(fā)表于 10-08 15:04

    agile_modbus V1.1.2讀取48個(gè)寄存器時(shí)跑飛請(qǐng)問是我哪里沒有操作好嗎

    各位前輩好。使用agile_modbus V1.1.2版本。V1.1.1使用一直沒有問題。1.1.2的時(shí)候,修改registers.c,數(shù)量為128個(gè)。modbus——poll讀取47個(gè)時(shí)候沒有問題,48個(gè)的時(shí)候就跑飛了。請(qǐng)問是我哪里沒有操作好嗎?
    發(fā)表于 11-01 11:10

    【HD-G2UL-EVM開發(fā)板體驗(yàn)】Modbus通訊之Modbus機(jī)實(shí)現(xiàn)

    說明在上一篇文章中已經(jīng)使用libmodbus庫(kù)實(shí)現(xiàn)了Modbus的主機(jī)并實(shí)現(xiàn)了與機(jī)Modbus Slave)的通訊。詳見帖子:https
    發(fā)表于 01-16 17:12

    RT-Thread中Agile Modbus軟件包的使用

    _rtu_init / agile_modbus_tcp_init 初始化 RTU/TCP 環(huán)境  * 2.agile_modbus_set_slave 設(shè)置機(jī)地址  * 3.清空接
    發(fā)表于 02-10 16:46

    使用agile_modbus主機(jī)協(xié)議棧出現(xiàn)丟包是怎么回事?

    使用agile_modbus主機(jī)協(xié)議棧,接10個(gè)機(jī),測(cè)試發(fā)現(xiàn)從機(jī)接的越多,丟包率越高。實(shí)際測(cè)試10個(gè)
    發(fā)表于 09-03 14:38

    MODBUS轉(zhuǎn)profibus網(wǎng)關(guān)接入profibus的總線案例

    一篇簡(jiǎn)易Modbus轉(zhuǎn)Profibus網(wǎng)關(guān) 將ABB?ACS530變頻器接入Profibus總線案例 本案例控制的主要對(duì)象是污水處理廠控制抽水泵的變頻器參數(shù)的顯示與報(bào)警。系統(tǒng)主PLC選用西門子
    的頭像 發(fā)表于 10-29 10:14 ?2105次閱讀
    <b class='flag-5'>MODBUS</b>轉(zhuǎn)profibus網(wǎng)關(guān)<b class='flag-5'>接入</b>profibus的總線案例

    《電子DIY》之《單片機(jī)實(shí)踐項(xiàng)目》之基于單片機(jī)簡(jiǎn)易數(shù)字秒表的設(shè)計(jì)(Proteus仿真與實(shí)物制作)

    《單片機(jī)實(shí)踐項(xiàng)目》之基于單片機(jī)簡(jiǎn)易數(shù)字秒表的設(shè)計(jì)(八十二)鏈接:添加鏈接描述
    發(fā)表于 11-12 20:21 ?20次下載
    《電子DIY》之《單片<b class='flag-5'>機(jī)</b><b class='flag-5'>實(shí)踐</b>項(xiàng)目》之基于單片<b class='flag-5'>機(jī)</b>的<b class='flag-5'>簡(jiǎn)易</b>數(shù)字秒表的設(shè)計(jì)(Proteus仿真與實(shí)物制作)

    agile_modbus例程分享

    最近項(xiàng)目使用了rtt,公司原有的modbus功能有些不完整,查了下發(fā)現(xiàn)agile_modbus挺適合現(xiàn)在的我,于是根據(jù)手冊(cè)和例程進(jìn)行了移植,基本實(shí)現(xiàn)了需要的功能
    的頭像 發(fā)表于 07-19 15:10 ?2534次閱讀
    <b class='flag-5'>agile_modbus</b>例程分享

    【技術(shù)分享】如何實(shí)現(xiàn)建機(jī)裝備接入基于Modbus的傳感信號(hào)

    重工機(jī)械車機(jī)總線系統(tǒng)通常走CAN總線,作為綜合復(fù)雜的控制系統(tǒng),往往需要將Modbus傳感器信號(hào)接入機(jī)系統(tǒng),今天就來分享如何將行業(yè)常見Modbus
    的頭像 發(fā)表于 08-04 11:55 ?668次閱讀
    【技術(shù)分享】如何實(shí)現(xiàn)建<b class='flag-5'>機(jī)</b>裝備<b class='flag-5'>接入</b>基于<b class='flag-5'>Modbus</b>的傳感信號(hào)

    如何實(shí)現(xiàn)建機(jī)裝備接入基于Modbus的傳感信號(hào)

    重工機(jī)械車機(jī)總線系統(tǒng)通常走CAN總線,作為綜合復(fù)雜的控制系統(tǒng),往往需要將Modbus傳感器信號(hào)接入機(jī)系統(tǒng),今天就來分享如何將行業(yè)常見Modbus
    的頭像 發(fā)表于 08-05 08:28 ?805次閱讀
    如何實(shí)現(xiàn)建<b class='flag-5'>機(jī)</b>裝備<b class='flag-5'>接入</b>基于<b class='flag-5'>Modbus</b>的傳感信號(hào)

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品