stephane / libmodbus

A Modbus library for Linux, Mac OS, FreeBSD and Windows
http://libmodbus.org
GNU Lesser General Public License v2.1
3.44k stars 1.75k forks source link

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

Closed sy-project closed 2 years ago

sy-project commented 2 years ago

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
stephane commented 2 years ago

Sorry I don't intend to read the code of your custom wrapper around libmodbus.