ESP32作为ModbusRTU主机读取从机数据

简介

ESP32 作为 ModbusRTU主机读取从机的数据,使用ESP32的串口2实现

代码改造

在 mb_master 的例程上修改

  1. 修改工程配置,将modbus模式修改成 RTU 模式,其他设置保持默认.
    修改模式
  2. demo工程解析
    程序运行时读取以下寄存器:
  • 保持寄存器 从寄存器0开始 读取6个寄存器
  • 保持寄存器 从寄存器10开始 读取58个寄存器,如果寄存器的内容不是0xAAAA,则将0xAAAA写入这58个寄存器中
  • 输入寄存器 从寄存器0开始 读取6个寄存器
  • 读取线圈 从线圈0开始 读取16个线圈值
// Example Data (Object) Dictionary for Modbus parameters:
// The CID field in the table must be unique.
// Modbus Slave Addr field defines slave address of the device with correspond parameter.
// Modbus Reg Type - Type of Modbus register area (Holding register, Input Register and such).
// Reg Start field defines the start Modbus register number and Reg Size defines the number of registers for the characteristic accordingly.
// The Instance Offset defines offset in the appropriate parameter structure that will be used as instance to save parameter value.
// Data Type, Data Size specify type of the characteristic and its data size.
// Parameter Options field specifies the options that can be used to process parameter value (limits or masks).
// Access Mode - can be used to implement custom options for processing of characteristic (Read/Write restrictions, factory mode values and etc).
const mb_parameter_descriptor_t device_parameters[] = {
    // { CID, Param Name, Units, Modbus Slave Addr, Modbus Reg Type, Reg Start, Reg Size, Instance Offset, Data Type, Data Size, Parameter Options, Access Mode}
    /* 读取地址为MB_DEVICE_ADDR1的从机 输入寄存器 从寄存器0开始读取,读取2个寄存器  设置寄存器的偏移地址(比如PLC的40000)读取出来的数据类型为float 读取出来的数据大小 4字节 读取出来的参数单位设置(最小值 -10 最大值 10);参数可读可写*/
    { CID_INP_DATA_0, STR("Data_channel_0"), STR("Volts"), MB_DEVICE_ADDR1, MB_PARAM_INPUT, 0, 2,
                    INPUT_OFFSET(input_data0), PARAM_TYPE_FLOAT, 4, OPTS( -10, 10, 1 ), PAR_PERMS_READ_WRITE_TRIGGER },
    /* 读取地址为MB_DEVICE_ADDR1的从机 保持寄存器 从寄存器0开始读取,读取2个寄存器  设置寄存器的偏移地址(比如PLC的40000)读取出来的数据类型为float 读取出来的数据大小 4字节 读取出来的参数单位设置(最小值 0 最大值 100);参数可读可写*/
    { CID_HOLD_DATA_0, STR("Humidity_1"), STR("%rH"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, 0, 2,
            HOLD_OFFSET(holding_data0), PARAM_TYPE_FLOAT, 4, OPTS( 0, 100, 1 ), PAR_PERMS_READ_WRITE_TRIGGER },
    { CID_INP_DATA_1, STR("Temperature_1"), STR("C"), MB_DEVICE_ADDR1, MB_PARAM_INPUT, 2, 2,
            INPUT_OFFSET(input_data1), PARAM_TYPE_FLOAT, 4, OPTS( -40, 100, 1 ), PAR_PERMS_READ_WRITE_TRIGGER },
    { CID_HOLD_DATA_1, STR("Humidity_2"), STR("%rH"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, 2, 2,
            HOLD_OFFSET(holding_data1), PARAM_TYPE_FLOAT, 4, OPTS( 0, 100, 1 ), PAR_PERMS_READ_WRITE_TRIGGER },
    { CID_INP_DATA_2, STR("Temperature_2"), STR("C"), MB_DEVICE_ADDR1, MB_PARAM_INPUT, 4, 2,
            INPUT_OFFSET(input_data2), PARAM_TYPE_FLOAT, 4, OPTS( -40, 100, 1 ), PAR_PERMS_READ_WRITE_TRIGGER },
    { CID_HOLD_DATA_2, STR("Humidity_3"), STR("%rH"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, 4, 2,
            HOLD_OFFSET(holding_data2), PARAM_TYPE_FLOAT, 4, OPTS( 0, 100, 1 ), PAR_PERMS_READ_WRITE_TRIGGER },
    { CID_HOLD_TEST_REG, STR("Test_regs"), STR("__"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, 10, 58,
            HOLD_OFFSET(test_regs), PARAM_TYPE_ASCII, 116, OPTS( 0, 100, 1 ), PAR_PERMS_READ_WRITE_TRIGGER },
    /* 读取地址为MB_DEVICE_ADDR1的从机 线圈 从寄存器0开始读取,读取8个线圈  设置线圈的偏移地址 读取出来的数据类型为U16 读取出来的数据大小 2字节 读取出来的参数单位设置(最小值 0 最大值 100);参数可读可写*/
    { CID_RELAY_P1, STR("RelayP1"), STR("on/off"), MB_DEVICE_ADDR1, MB_PARAM_COIL, 0, 8,
            COIL_OFFSET(coils_port0), PARAM_TYPE_U16, 2, OPTS( BIT1, 0, 0 ), PAR_PERMS_READ_WRITE_TRIGGER },
    { CID_RELAY_P2, STR("RelayP2"), STR("on/off"), MB_DEVICE_ADDR1, MB_PARAM_COIL, 8, 8,
            COIL_OFFSET(coils_port1), PARAM_TYPE_U16, 2, OPTS( BIT0, 0, 0 ), PAR_PERMS_READ_WRITE_TRIGGER }
};
  1. 编译,将程序下载到 ESP32 开发板中
  2. 打开 modbus slave 软件,模拟从机
    创建4个从机文件,分别是 保持寄存器的文件、输入寄存器的文件、线圈模拟的文件、测试寄存器的文件
    在这里插入图片描述

实验结果

实验结果

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
要在Arduino环境中使用ESP32作为Modbus RTU主机控制伺服电机,你需要了解伺服电机的Modbus寄存器映射和通信协议。不同的伺服电机可能有不同的寄存器配置和指令集。 以下是一个基本的示例代码,用于向Modbus从机发送控制指令: ```cpp #include <ModbusMaster.h> #include <HardwareSerial.h> // 定义Modbus串口 HardwareSerial ModbusSerial(2); // 使用ESP32的Serial2作为Modbus串口 // 定义Modbus从机地址 #define SLAVE_ID 1 // 创建ModbusMaster对象 ModbusMaster node; void setup() { Serial.begin(9600); // 初始化ModbusMaster对象 node.begin(SLAVE_ID, ModbusSerial); ModbusSerial.begin(9600, SERIAL_8N1); } void loop() { byte result; // 发送控制指令 result = node.writeSingleRegister(0x0010, 100); // 写入寄存器地址 0x0010,设置速度为100 // 如果指令发送成功 if (result == node.ku8MBSuccess) { Serial.println("Command sent successfully!"); } // 如果指令发送失败 else { Serial.print("Command failed: "); Serial.println(node.lastError()); } delay(1000); } ``` 在此代码中,我们使用了`ModbusMaster`库来实现Modbus RTU通信。 我们使用ESP32的Serial2作为Modbus串口,并创建了一个`HardwareSerial`对象来表示Modbus串口。 在`setup()`函数中,我们初始化了ModbusMaster对象,并设置了从机地址和Modbus串口。 在`loop()`函数中,我们使用`node.writeSingleRegister()`函数向从机写入控制指令。在此示例中,我们将速度设置为100,并将其写入寄存器地址0x0010。 请注意,你需要根据你的伺服电机的Modbus寄存器映射和控制指令进行适当的修改。具体的寄存器映射和指令集可以在伺服电机的用户手册或Modbus文档中找到。 运行代码后,ESP32将通过Modbus RTU协议向从机发送控制指令。请确保你的ESP32Modbus设备正确连接,并具有适当的权限和配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荻夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值