Win10+VS2022下libmodbus的modbus_read_bits读取线圈失败,用法是否有误?
问题:Modbus TCP读取线圈/保持寄存器失败,写入正常
在Win10+VS2022环境下使用libmodbus库,按设备手册提供的线圈地址,成功实现12个线圈的开关控制。但调用modbus_read_bits函数读取线圈状态时,返回值始终小于0,读取操作失败。已仔细确认线圈地址无误(能正常控制线圈开关可证明),尝试读取设备保持寄存器也以失败告终。设备厂商仅提供串口连接模式下的Modbus指令,对TCP连接模式参考价值极低,且目前无法联系到厂商。
代码实现
#include <conio.h> #include <iostream> #include "libmodbus/modbus.h" #pragma comment(lib,"modbus.lib") const char IP_addr[] = "192.168.1.232"; const short port_number = 10000; modbus_t* MyModbus; uint8_t read_buffer[1024]; uint8_t write_buffer[1024]; uint16_t read_buffer_16[1024]; uint16_t write_buffer_16[1024]; int main() { //Create a connection and initialize MyModbus MyModbus = modbus_new_tcp(IP_addr, port_number); // Set the slave phone number modbus_set_slave(MyModbus, 1); modbus_set_response_timeout(MyModbus, 0, 1000 * 1000);//0s+1000*1000us=1000ms //connecte device int myerror = modbus_connect(MyModbus); if (myerror < 0) { modbus_free(MyModbus); std::cout << "IP_addr=" << IP_addr << "\t Connection failed! \n Press any key to exit!" << std::endl; _getch(); return 0; } else std::cout << "IP_addr=" << IP_addr << "\t successful connection" << std::endl; //Initializes the write buffer with all values set to 0xFF memset(write_buffer, 0xFF, sizeof(uint8_t) * 12); write_buffer[4] = 0x00;//close it write_buffer[6] = 0x00; write_buffer[8] = 0x00; modbus_write_bits(MyModbus, 0x00, 12, write_buffer); std::cout << "Coil 4,6,8 closed, the rest of the coil open \n"; char key = getchar(); //Querying coil status memset(read_buffer, 0x00, sizeof(uint8_t) * 12); myerror = modbus_read_bits(MyModbus, 0x00, 12, read_buffer);//here if (myerror > 0) for (int i = 0; i < 12; i++) std::cout << std::hex << (int)read_buffer[i] << ", "; else std::cout << "Coil status query failed!" << std::endl; key = getchar(); modbus_close(MyModbus); modbus_free(MyModbus); std::cout << "\n Disconnect the device!\n"; return 0; }
程序输出
IP_addr=192.168.1.232 successful connection
Coil 4,6,8 closed, the rest of the coil open
Coil status query failed!Disconnect the device!
设备状态验证
厂商配套软件可正常查看线圈状态:DO按钮红色表示线圈开启,黑色表示关闭,当前状态为线圈4、6、8关闭,其余开启(与代码写入的状态一致)。
咨询问题
- 我对
modbus_read_bits函数的使用是否存在问题? - 读取线圈状态还有哪些特殊情况需要注意?
内容的提问来源于stack exchange,提问作者lanse_blue_wind
相关产品推荐
相关产品推荐

