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

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

3天內不再提示

Agile Modbus簡易從機接入實踐說明

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

說明

Agile Modbus 提供了 agile_modbus_slave_callback_t 的一種實現(xià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 實現(xiàn)方式,需要 agile_modbus_slave_util_t 類型變量指針作為私有數(shù)據(jù)。

私有數(shù)據(jù)為 NULL,所有功能碼都能響應且為成功,但寄存器數(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); /
< 處理結束接口 */
} agile_modbus_slave_util_t;

寄存器相關

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

接口調用過程

1.jpg

agile_modbus_slave_util_map 介紹

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

注意事項:

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

bit 寄存器 < 250

register 寄存器 < 125

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

get 接口

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

set 接口

index: 地址域內的偏移

len: 長度

根據(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}};

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

    關注

    31

    文章

    5273

    瀏覽量

    119659
  • Agile
    +關注

    關注

    0

    瀏覽量

    6795
  • ModBus通信
    +關注

    關注

    0

    文章

    32

    瀏覽量

    2535
收藏 人收藏

    評論

    相關推薦

    agile_modbus移植例程分享

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

    agile_modbus遇到一個rtu主機要求crc16值要swap時如何處理呢

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

    分享一種Agile Modbus簡易接入接口實現(xiàn)方式

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

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

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

    如何打開并且使用agile_telnet呢

    1、介紹2.0開始agile_telnet作為agile_console的插件使用。如果只想使用telnet作為console設備,請訪問v1.0.0。1.1 目錄結構名稱說明inc
    發(fā)表于 08-24 15:27

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

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

    agile_modbus V1.1.2讀取48個寄存器時跑飛請問是我哪里沒有操作好嗎

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

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

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

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

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

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

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

    《電子DIY》之《單片實踐項目》之基于單片簡易數(shù)字秒表的設計(Proteus仿真與實物制作)

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

    MODBUS移植STM32,STM32做

    本文章實現(xiàn)MODBUS通信,并配置STM32做的功能。
    發(fā)表于 12-24 19:06 ?91次下載
    <b class='flag-5'>MODBUS</b>移植STM32,STM32做<b class='flag-5'>從</b><b class='flag-5'>機</b>

    agile_modbus例程分享

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

    【技術分享】如何實現(xiàn)建裝備接入基于Modbus的傳感信號

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

    如何實現(xiàn)建裝備接入基于Modbus的傳感信號

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