You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:57:40