[ESP32]:基于esp-modbus实现serial从机

[ESP32]:基于esp-modbus实现serial从机

开发环境:

  • esp idf 5.1
  • esp-modbus 1.0.13

使用如下指令添加组件,或者访问esp-modbus

idf.py add-dependency "espressif/esp-modbus^1.0.13"

1.mb_register_area_descriptor_t

对于slave而言,最重要的定义你的reg area

// 离散输入寄存器
mb_register_area_descriptor_t descrete_reg_area = {
    .type = MB_PARAM_DISCRETE,
    .start_offset = 0x0000,
    .address = (void *)&discrete_reg_params,
    .size = sizeof(discrete_reg_params_t),
};
ESP_ERROR_CHECK(mbc_slave_set_descriptor(descrete_reg_area));

// 线圈
mb_register_area_descriptor_t coil_reg_area = {
    .type = MB_PARAM_COIL,
    .start_offset = 0x0000,
    .address = (void *)&coil_reg_params,
    .size = sizeof(coil_reg_params_t),
};
ESP_ERROR_CHECK(mbc_slave_set_descriptor(coil_reg_area));

// 保持寄存器
mb_register_area_descriptor_t holding_reg_area = {
    .type = MB_PARAM_HOLDING,
    .start_offset = 0x0000,
    .address = (void *)&holding_reg_params,
    .size = sizeof(holding_reg_params_t),
};
ESP_ERROR_CHECK(mbc_slave_set_descriptor(holding_reg_area));

可以看到我们这里定义了输入寄存器,保持寄存器、线圈

其中,偏移默认为0x0000,如果要修改的话,记得同步改上位机的偏移地址

2.等待主机读取

这个比较简单,主要根据event做对应的动作就行

while (1)
{
    mb_event_group_t event = mbc_slave_check_event(MB_READ_WRITE_MASK);

    if (event & MB_EVENT_DISCRETE_RD)
    {
        // 主机读取离散输入寄存器
        ESP_ERROR_CHECK(mbc_slave_get_param_info(&reg_info, 10));
        ESP_LOGI(TAG, "DISCRETE READ");
    }
    else if (event & MB_EVENT_COILS_RD)
    {
        // 主机读取线圈
        ESP_LOGI(TAG, "COIL READ");
    }
    else if (event & MB_EVENT_COILS_WR)
    {
        // 主机写线圈
        ESP_LOGI(TAG, "COIL WRITE");
        ESP_LOGI(TAG, "Coil: %d %d", coil_reg_params.coils_port_0, coil_reg_params.coils_port_1);
    }
    else if (event & MB_EVENT_HOLDING_REG_RD)
    {
        // 主机读取保持寄存器
        ESP_LOGI(TAG, "HOLDING READ");
    }
    else if (event & MB_EVENT_HOLDING_REG_WR)
    {
        // 主机写保持寄存器
        ESP_LOGI(TAG, "HOLDING WRITE");
        ESP_LOGI(TAG, "Holding: %d %d", holding_reg_params.holding_0, holding_reg_params.holding_1);
    }
}

感觉做从机比主机简单一点。

简单跑一个实验:
我们设置保持寄存器的两个值为1234和7788

holding_reg_params_t holding_reg_params = {1234, 7788};

在这里插入图片描述

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值