乐鑫技术交流
直播中

王鹏

8年用户 1420经验值
私信 关注
[问答]

请问如何在Modbus_master示例中更改地址?

我正在尝试使用modbus_master示例读取电表的寄存器值。电表的输入寄存器从30001到30156。
寄存器长度:2
寄存器类型:浮点型(只读)
波特率:9600
从站ID:1
在device_param.c中,我尝试更改值


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}
    // Parameter: Data channel 0 : Data channel 0 = Voltage
    { CID_DATA_CHAN_0, STR("Data_channel_0"), STR("Volts"), MB_DEVICE_ADDR1, MB_PARAM_INPUT, 0x30021,2,
                    INPUT_OFFSET(data_chan0), PARAM_TYPE_FLOAT, 2, OPTS( 0, 0, 0 ), PAR_PERMS_READ },
    { CID_HUMIDITY_1, STR("Humidity_1"), STR("%rH"), MB_DEVICE_ADDR1, MB_PARAM_INPUT, 0x30021, 2,
            HOLD_OFFSET(mb_device1_humidity), PARAM_TYPE_FLOAT, 2, OPTS( 0, 65535, 1 ), PAR_PERMS_READ },
    // Parameter: Temperature_2 : Temperature from device slave address = 1
    { CID_TEMPERATURE_1, STR("Temperature_1"), STR("°C"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, 0x30021, 2,
            HOLD_OFFSET(mb_device1_temperature), PARAM_TYPE_FLOAT, 2, OPTS( 0, 0, 0 ), PAR_PERMS_READ },
    // Parameter: Humidity_2 : Humidity from device slave address = 2
    { CID_HUMIDITY_2, STR("Humidity_2"), STR("%rH"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, 0x30021, 2,
            HOLD_OFFSET(mb_device2_humidity), PARAM_TYPE_FLOAT, 2, OPTS( 0, 100, 1 ), PAR_PERMS_READ },
    // Parameter: Temperature_2 : Temperature from device slave address = 2
    { CID_TEMPERATURE_2, STR("Temperature_2"), STR("°C"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, 0x30021, 2,
            HOLD_OFFSET(mb_device2_temperature), PARAM_TYPE_FLOAT, 2, OPTS( -40, 80, 1 ), PAR_PERMS_READ }


但是什么都没用,我在控制台中一直坚持下去:

I (473) sense_main: Characteristic (Data_channel_0) data = 0x0000 read successful.
E (623) MB_CONTROLLER_MASTER: mbc_master_get_parameter(111): SERIAL master get parameter failure error=(0x107).
E (623) sense_main: Characteristic (Humidity_1) read value fail, err = 259 (ESP_ERR_INVALID_STATE).
I (693) sense_main: Characteristic (Temperature_1) data = 0x0000 read successful.
E (853) MB_CONTROLLER_MASTER: mbc_master_get_parameter(111): SERIAL master get parameter failure error=(0x107).
E (853) sense_main: Characteristic (Humidity_2) read value fail, err = 259 (ESP_ERR_INVALID_STATE).
I (923) sense_main: Characteristic (Temperature_2) data = 0x0000 read successful.

如何更改此0x0000?

回帖(1)

风尚男人

2024-6-24 16:39:43
要在Modbus_master示例中更改地址,您需要按照以下步骤操作:

1. 首先,找到`device_param.c`文件中的`device_parameters`数组。这个数组包含了所有参数的配置信息。

2. 根据您的需求,您需要读取电表的输入寄存器,这些寄存器的地址范围是从30001到30156。每个寄存器占用2个寄存器空间,类型为浮点型(只读)。

3. 您需要为每个寄存器创建一个新的参数配置。假设您要读取前10个寄存器(从30001到30020),您可以按照以下格式添加它们:

```c
const mb_parameter_descriptor_t device_parameters[] = {
    // Parameter: Data channel 0 : Data channel 0 = Voltage
    { 0, "Voltage", "", 30001, MB_PARAM_TYPE_HOLDING, 0, 2, 0, DATA_TYPE_FLOAT, 4, PARAM_ACCESS_READ, 0 },

    // Add more parameters for the remaining registers
    { 1, "Parameter1", "", 30003, MB_PARAM_TYPE_HOLDING, 0, 2, 0, DATA_TYPE_FLOAT, 4, PARAM_ACCESS_READ, 0 },
    { 2, "Parameter2", "", 30005, MB_PARAM_TYPE_HOLDING, 0, 2, 0, DATA_TYPE_FLOAT, 4, PARAM_ACCESS_READ, 0 },
    // ...
    { 9, "Parameter9", "", 30019, MB_PARAM_TYPE_HOLDING, 0, 2, 0, DATA_TYPE_FLOAT, 4, PARAM_ACCESS_READ, 0 }
};
```

4. 请注意,每个参数的`Modbus Slave Addr`字段已更改为相应的寄存器地址。您可以根据需要添加更多的参数配置。

5. 确保您的Modbus从站ID设置为1,这通常在`device_param.c`文件的`mb_device_info_t device_info`结构中设置。如果尚未设置,请添加以下代码:

```c
mb_device_info_t device_info = {
    .slave_id = 1,
    .model_id = 0,
    .version = 0
};
```

6. 最后,确保您的波特率设置为9600。这通常在初始化Modbus通信时设置。在您的示例中,可能在某个函数中设置,例如:

```c
modbus_set_baudrate(dev, 9600);
```

按照这些步骤操作后,您的Modbus_master示例应该能够正确地读取电表的寄存器值。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分