0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Agile Modbus简易从机接入实践说明

冬至子 来源:Cfly 作者:Cfly 2023-07-22 11:52 次阅读

说明

Agile Modbus 提供了 agile_modbus_slave_callback_t 的一种实现方式,使用户能够简单方便接入。

使用示例可查看 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 实现方式,需要 agile_modbus_slave_util_t 类型变量指针作为私有数据。

私有数据为 NULL,所有功能码都能响应且为成功,但寄存器数据依然为 0。

agile_modbus_slave_util_t 介绍

typedef struct agile_modbus_slave_util {
const agile_modbus_slave_util_map_t *tab_bits; / *< 线圈寄存器定义数组 /
int nb_bits; /
< 线圈寄存器定义数组数目 */
const agile_modbus_slave_util_map_t *tab_input_bits; / *< 离散量输入寄存器定义数组 /
int nb_input_bits; /
< 离散量输入寄存器定义数组数目 */
const agile_modbus_slave_util_map_t *tab_registers; / *< 保持寄存器定义数组 /
int nb_registers; /
< 保持寄存器定义数组数目 */
const agile_modbus_slave_util_map_t *tab_input_registers; / *< 输入寄存器定义数组 /
int nb_input_registers; /
< 输入寄存器定义数组数目 */
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;

寄存器相关

用户需要实现 bits、input_bits、registers、input_registers 定义。如果某个寄存器定义为 NULL,该寄存器对应的功能码能响应且为成功,但寄存器数据都为 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); / **< 获取寄存器数据接口 */
int (set)(int index, int len, void buf, int bufsz); / < 设置寄存器数据接口 */
} agile_modbus_slave_util_map_t;

注意事项:

起始地址和结束地址决定的寄存器个数有限制。更改函数内部 map_buf 数组大小可使其变大。

bit 寄存器 < 250

register 寄存器 < 125

接口函数为 NULL,寄存器对应的功能码能响应且为成功。

get 接口

将地址域内的数据全部拷贝到 buf 中。

set 接口

index: 地址域内的偏移

len: 长度

根据 index 和 len 修改数据。

示例
以 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}};

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5343

    浏览量

    120351
  • Agile
    +关注

    关注

    0

    文章

    8

    浏览量

    6805
  • ModBus通信
    +关注

    关注

    0

    文章

    32

    浏览量

    2563
收藏 人收藏

    评论

    相关推荐

    agile_modbus移植例程分享

    最近项目使用了rtt,公司原有的modbus功能有些不完整,查了下发现agile_modbus挺适合现在的我,于是根据手册和例程进行了移植,基本实现了需要的功能,我的控制器是f103的,串口2做主
    发表于 07-14 10:00

    agile_modbus遇到一个rtu主机要求crc16值要swap时如何处理呢

    agile_modbus是支持多主机的,但遇到一个rtu主机要求crc16值要swap时如何处理?遇到modbus的主机要求CRC16值要SWAP时该如何处理呢?
    发表于 08-02 10:40

    分享一种Agile Modbus简易接入接口实现方式

    说明Agile Modbus 提供了 agile_modbus_slave_callback_t 的一种实现方式,使用户能够简单方便接入。使
    发表于 08-03 10:47

    使用agile_modbus接收不到数据是怎么回事

    是这样的,我使用RTT Studio基于STM32F407芯片开发。在使用agile_modbus时,发现数据可以定时发出。但是接收不到数据(使用串口调试助手定时发送数据过来(01 03 02 00
    发表于 08-22 12:17

    如何打开并且使用agile_telnet呢

    1、介绍2.0开始agile_telnet作为agile_console的插件使用。如果只想使用telnet作为console设备,请访问v1.0.0。1.1 目录结构名称说明inc
    发表于 08-24 15:27

    基于RT-Thread实现的Agile Modbus协议栈

    直接使用。  由于其使用纯 C 开发、不涉及硬件,完全可以在串口上跑 tcp 协议,在网络上跑 rtu 协议。  支持符合 modbus 格式的自定义协议。  同时支持多主机和多。  使用简单,只需要将 rtu 或 tcp
    发表于 10-08 15:04

    agile_modbus V1.1.2读取48个寄存器时跑飞请问是我哪里没有操作好吗

    各位前辈好。使用agile_modbus V1.1.2版本。V1.1.1使用一直没有问题。1.1.2的时候,修改registers.c,数量为128个。modbus——poll读取47个时候没有问题,48个的时候就跑飞了。请问是我哪里没有操作好吗?
    发表于 11-01 11:10

    【HD-G2UL-EVM开发板体验】Modbus通讯之Modbus实现

    说明在上一篇文章中已经使用libmodbus库实现了Modbus的主机并实现了与Modbus Slave)的通讯。详见帖子:https
    发表于 01-16 17:12

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

    _rtu_init / agile_modbus_tcp_init 初始化 RTU/TCP 环境  * 2.agile_modbus_set_slave 设置地址  * 3.清空接
    发表于 02-10 16:46

    使用agile_modbus主机协议栈出现丢包是怎么回事?

    使用agile_modbus主机协议栈,接10个,测试发现从接的越多,丢包率越高。实际测试10个
    发表于 09-03 14:38

    MODBUS转profibus网关接入profibus的总线案例

    一篇简易Modbus转Profibus网关 将ABB ACS530变频器接入Profibus总线案例 本案例控制的主要对象是污水处理厂控制抽水泵的变频器参数的显示与报警。系统主PLC选用西门子
    的头像 发表于 10-29 10:14 1862次阅读
    <b class='flag-5'>MODBUS</b>转profibus网关<b class='flag-5'>接入</b>profibus的总线案例

    《电子DIY》之《单片实践项目》之基于单片简易数字秒表的设计(Proteus仿真与实物制作)

    《单片实践项目》之基于单片简易数字秒表的设计(八十二)链接:添加链接描述
    发表于 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>数字秒表的设计(Proteus仿真与实物制作)

    agile_modbus例程分享

    最近项目使用了rtt,公司原有的modbus功能有些不完整,查了下发现agile_modbus挺适合现在的我,于是根据手册和例程进行了移植,基本实现了需要的功能
    的头像 发表于 07-19 15:10 1949次阅读
    <b class='flag-5'>agile_modbus</b>例程分享

    【威廉希尔官方网站 分享】如何实现建装备接入基于Modbus的传感信号

    重工机械车总线系统通常走CAN总线,作为综合复杂的控制系统,往往需要将Modbus传感器信号接入系统,今天就来分享如何将行业常见Modbus
    的头像 发表于 08-04 11:55 511次阅读
    【威廉希尔官方网站
分享】如何实现建<b class='flag-5'>机</b>装备<b class='flag-5'>接入</b>基于<b class='flag-5'>Modbus</b>的传感信号

    如何实现建装备接入基于Modbus的传感信号

    重工机械车总线系统通常走CAN总线,作为综合复杂的控制系统,往往需要将Modbus传感器信号接入系统,今天就来分享如何将行业常见Modbus
    的头像 发表于 08-05 08:28 685次阅读
    如何实现建<b class='flag-5'>机</b>装备<b class='flag-5'>接入</b>基于<b class='flag-5'>Modbus</b>的传感信号