Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Modbus
modbus多从机
Agile Modbus 简易从机接入实践
发布于 2022-08-02 13:45:02 浏览:3878
订阅该版
[tocm] # 简易从机接入接口 ## 说明 仓库:[https://github.com/loogg/agile_modbus](https://github.com/loogg/agile_modbus) Agile Modbus 提供了 `agile_modbus_slave_callback_t` 的一种实现方式,使用户能够简单方便接入。 使用示例可查看 `examples/slave`。 使用方式: ```C #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` 介绍 ```C 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。 - 接口调用过程 ![SlaveCallback.jpg](https://oss-club.rt-thread.org/uploads/20220802/47f8f74d9c3f2b6aac99c3c781763c06.jpg.webp "SlaveCallback.jpg") - `agile_modbus_slave_util_map` 介绍 ```C 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 功能码为例: ```C #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}}; ```
13
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Cfly
这家伙很懒,什么也没写!
文章
15
回答
24
被采纳
3
关注TA
发私信
相关文章
1
ModbusRTU协议栈漏发送最后一个字节
2
3.0 增加freemodbus,编译不过
3
RT_THREAD上面的串口MODBUSRTU为啥没功能码?
4
关于 freemodbus 里存在的一点问题分享
5
请教如何使用组件里的FreeMODBUS
6
求一个FreeModbus的从机测试程序
7
FreeModbus的从机调试说明(含测试程序)
8
rtt_freemodbus
9
freemodbus怎么配置到uart
10
FreeModeBus从机调试问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
2
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部