Modbusclient 作为控制台应用程序,"Stuck in Connectingstate loop"

Modbusclient as a console application, "Stuck in Connectingstate loop"

我正在努力将 Modbusmaster 示例(qt 示例)(一个小部件应用程序)转换为控制台应用程序。我想在本地奴隶和我的主人之间建立联系。我面临的问题是我的代码正在将其状态更改为“连接状态”,卡住并且不想建立连接。这就是为什么,我认为 Modbus 库是有限的,它只与小部件形式兼容。 有人可以告诉我我的猜测是否正确。 在下面你会找到我的代码:

#include <QCoreApplication>
#include <QDebug>
#include <QModbusDataUnit>
#include<iostream>
#include <QTimer>// this bib was add to the 50ms Loop check
#include <string>
#include <QString>
#include <QThread>
#include <QModbusTcpClient>
#include <QModbusDataUnit>
#include <QUrl>




int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Mainmodbus T ;
    T.modbusDevice = new QModbusTcpClient();




    if (!T.modbusDevice) qDebug()<<"error 1";


    if (T.modbusDevice->state() != QModbusDevice::ConnectedState) {


            T.modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "127.0.0.1");
            T.modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, 502);

            T.modbusDevice->connectDevice();


            
            while(true){
            qDebug()<<T.modbusDevice->state();}



            }

    return a.exec();
}

我可能是错的,但我认为您看到的 QModbusDevice::ConnectingState 实际上意味着您的服务器已启动并且 运行 正在和 正在等待连接

我想您缺少的是从 Modbus 客户端打开连接。您可以使用不同的工具来做到这一点,我想 运行宁 client example 会是个好主意。否则,您可以使用 QModMaster 或您喜欢的任何其他工具。

从客户端打开连接后,服务器上的状态应更改为 QModbusDevice::ConnectedState

请注意,您构建的服务器只是一个空的shell,没有定义寄存器映射,因此如果您从客户端查询任何寄存器的内容,您将得到一个错误。

至少,您应该至少定义一个具有一些默认值的映射或从命令行选项中获取它们。为此,您需要更仔细地查看 server example

首先你需要定义这样的寄存器映射:

    QModbusDataUnitMap reg;
    reg.insert(QModbusDataUnit::Coils, { QModbusDataUnit::Coils, 0, 10 });
    reg.insert(QModbusDataUnit::DiscreteInputs, { QModbusDataUnit::DiscreteInputs, 0, 10 });
    reg.insert(QModbusDataUnit::InputRegisters, { QModbusDataUnit::InputRegisters, 0, 10 });
    reg.insert(QModbusDataUnit::HoldingRegisters, { QModbusDataUnit::HoldingRegisters, 0, 10 });

    modbusDevice->setMap(reg);

    setupDeviceData();

然后对于 setupDeviceData();,您可以复制示例中的函数,但不是从小部件获取数据,而是必须从命令行加载默认值或其他内容。

回答您的问题:不,应该没有限制,您应该能够从命令行 运行 服务器。我想知道为什么 his/her 头脑正常的人会在你有像 libmodbus 这样的优秀替代品时想要这样做。但老实说,我不会因为想太多而失眠。