說明
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)用過程
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}};
-
寄存器
+關(guān)注
關(guān)注
31文章
5425瀏覽量
123652 -
Agile
+關(guān)注
關(guān)注
0文章
8瀏覽量
6871 -
ModBus通信
+關(guān)注
關(guān)注
0文章
33瀏覽量
2772
發(fā)布評(píng)論請(qǐng)先 登錄
agile_modbus移植例程分享
agile_modbus遇到一個(gè)rtu主機(jī)要求crc16值要swap時(shí)如何處理呢
分享一種Agile Modbus簡(jiǎn)易從機(jī)接入接口實(shí)現(xiàn)方式
使用agile_modbus接收不到數(shù)據(jù)是怎么回事
如何打開并且使用agile_telnet呢
基于RT-Thread實(shí)現(xiàn)的Agile Modbus協(xié)議棧
agile_modbus V1.1.2讀取48個(gè)寄存器時(shí)跑飛請(qǐng)問是我哪里沒有操作好嗎
【HD-G2UL-EVM開發(fā)板體驗(yàn)】Modbus通訊之Modbus從機(jī)實(shí)現(xiàn)
RT-Thread中Agile Modbus軟件包的使用
使用agile_modbus主機(jī)協(xié)議棧出現(xiàn)丟包是怎么回事?
MODBUS轉(zhuǎn)profibus網(wǎng)關(guān)接入profibus的總線案例

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

agile_modbus例程分享

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

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

評(píng)論