完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在尝试使用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个回答
|
|
要在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示例应该能够正确地读取电表的寄存器值。 |
|
|
|
只有小组成员才能发言,加入小组>>
540浏览 6评论
451浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
433浏览 5评论
435浏览 4评论
406浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-14 23:18 , Processed in 0.599586 second(s), Total 50, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号