C++ Modbusclient作为控制台应用程序;卡在连接状态循环中”;

C++ Modbusclient作为控制台应用程序;卡在连接状态循环中”;,c++,qt,c++11,widget,console-application,C++,Qt,C++11,Widget,Console Application,我正在努力将Modbusmaster示例(qt示例)转换为控制台应用程序,这是一个小部件应用程序。我想在本地奴隶和我的主人之间建立联系。我所面临的问题是,我的代码正在将其状态更改为“连接状态”,陷入困境,不想建立连接。这就是为什么,我发现Modbus库是有限的,它只与小部件表单兼容。 有人能告诉我我的猜测是否正确吗。 下面是我的代码: #include <QCoreApplication> #include <QDebug> #include <QModbusDat

我正在努力将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();
}

#包括
#包括
#包括
#包括
#包括//将此围嘴添加到50ms回路检查中
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
维护;
T.modbus设备=新的QModbusTcpClient();
如果(!T.modbusDevice)qDebug()setConnectionParameter(QModbusDevice::NetworkAddressParameter,“127.0.0.1”);
T.modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter,502);
T.modbus设备->连接设备();
while(true){

qDebug()我可能错了,但我认为您看到的
qmodbus设备::ConnectingState
实际上意味着您的服务器已启动并正在运行,正在等待连接

我猜您缺少的是从Modbus客户端打开连接。您可以使用不同的工具,我猜运行 这是个好主意。否则,你可以使用或任何其他你喜欢的工具

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

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

至少,您应该使用一些默认值定义一个映射,或者从命令行选项中获取它们

首先,您需要使用以下内容定义寄存器映射:

    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();
您可以复制示例中的函数,但不必从小部件获取数据,您必须从命令行加载默认值或其他内容


回答您的问题:不,应该没有限制,并且您应该能够从命令行运行服务器。我想知道,当您有类似的优秀替代方案时,为什么有头脑正常的人会希望这样做。但老实说,我不会错过太多的睡眠疑惑。

谢谢您的帮助,但我的问题是:使用Qt library允许您使用信号和插槽。一旦信号发出,插槽将被激活。在没有无穷大的循环中阻塞我的函数将阻止我的函数,这就是为什么我不断获得状态QModbusDevice::ConnectionState的原因