libmodbus icon indicating copy to clipboard operation
libmodbus copied to clipboard

i cant read modbus rtu data. what should i do?

Open sy-project opened this issue 3 years ago • 0 comments

libmodbus version

MAJOR 3 MINOR 1 MICRO 6

OS and/or distribution

WINDOW 10 64bit

Environment

develope PC : ryzen 5 1600 64bit / ram 64gb

develope tool : Qt Creator 5.0.2

target PC : intel i5 4gen / ram 8gb

modbus setting

MODBUS RTU SPEED 38400 STOP 1 DATA 8 PARITY NONE

Description

i want to read 34 data from modbus rtu connect. but it return trash value.

Expected behavior

read 34 data, and input to vector.

Actual behavior

cant read data.

OUTPUT

Opening COM4 at 38400 bauds (N, 8, 1) [01][03][00][00][00][22][C5][D3] Waiting for a confirmation... <01><03><00><00><00>

ERROR MESSAGE

ERROR CRC received 0x0 != CRC calculated 0x20F0

Steps to reproduce the behavior (commands or source code)

void cModbusConnect::run()
{
    qDebug() << "Modbus Start";
    while(true)
    {
DISCONNECT:
        QThread::msleep(200);
        if(!ConnectMB())
        {
            qDebug() << "Connection Failed";
            isConnected = false;
        }
        else
            break;
    }
    uint16_t* m_getdata = (uint16_t*)malloc(256*sizeof(uint16_t));
    int AlarmCheck[16] = {
        1, 2, 4, 8, 16, 32, 64, 128, 256, 512,
        1024, 2048, 4096, 8192, 16384, 32768
    };
    ModBusDataType dataTemp;
    while(isRunningProgram)
    {
        int rc = modbus_read_registers(mb, 0x0000, 34, m_getdata);

        if(rc == -1)
        {
            QThread::msleep(200);
            modbus_close(mb);
            modbus_free(mb);
            goto DISCONNECT;
        }

        if(m_getdata[18] != 0)
        {
            for(int i = 0; i < 16; i++)
            {
                if(m_getdata[18] == AlarmCheck[i])
                    m_getdata[18] = i + 1;
            }
        }

        if(!isRunChamber && ModbusData.size() > 1)
            ModbusData.erase(ModbusData.begin());
        dataTemp.TempNow = m_getdata[0];
        if(dataTemp.TempNow >= 65335 && dataTemp.TempNow < 65535)
            dataTemp.TempNow = dataTemp.TempNow - 65536;
        dataTemp.TempTarget = m_getdata[1];
        if(dataTemp.TempTarget >= 65335 && dataTemp.TempTarget < 65535)
            dataTemp.TempTarget = dataTemp.TempTarget - 65536;
        dataTemp.HumidNow = m_getdata[4];
        dataTemp.HumidTarget = m_getdata[5];
        dataTemp.isRun = m_getdata[9];
        if(dataTemp.isRun == 1)
            isRunChamber = false;
        else
            isRunChamber = true;
        dataTemp.alarm = m_getdata[18];
        dataTemp.RunTimeH = m_getdata[23];
        dataTemp.RunTimeM = m_getdata[24];
        dataTemp.RunTimeS = m_getdata[25];
        dataTemp.StepNow = m_getdata[27];
        dataTemp.StepFull = m_getdata[28];
        dataTemp.CycleNow = m_getdata[30];
        dataTemp.CycleFull = m_getdata[31];
        dataTemp.RemainTimeH = m_getdata[32];
        dataTemp.RemainTimeM = m_getdata[33];
        ModbusData.push_back(dataTemp);
        QThread::msleep(300);
    }
    modbus_close(mb);
    modbus_free(mb);
    isRunningProgram = false;
}

bool cModbusConnect::ConnectMB()
{
    mb = modbus_new_rtu(COMPORT[2].c_str(), 38400, 'N', 8, 1);
    if(mb == NULL)
    {
        qDebug() << "libmodbus error : " << modbus_strerror(errno);
        return false;
    }
    if(modbus_set_slave(mb, 1) == -1)
    {
        qDebug() << "set slave id error : " << modbus_strerror(errno);
        return false;
    }
    modbus_set_debug(mb, TRUE);
    if (modbus_connect(mb) == -1)
    {
        qDebug() << "connect failed : " << modbus_strerror(errno);
        modbus_free(mb);
        return false;
    }
    struct timeval response;
    response.tv_sec = 0;
    response.tv_usec = 10000;
    modbus_set_response_timeout(mb,response.tv_sec,response.tv_usec);
    qDebug() << "Open Modbus Success";

    isConnected = true;
    return true;
}

my class full source : https://github.com/sy-project/FITIVersion/tree/main/Modbus

sy-project avatar Feb 02 '22 00:02 sy-project