Closed sy-project closed 2 years ago
MAJOR 3 MINOR 1 MICRO 6
WINDOW 10 64bit
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
i want to read 34 data from modbus rtu connect. but it return trash value.
read 34 data, and input to vector.
cant read data.
OUTPUT
Opening COM4 at 38400 bauds (N, 8, 1) [01][03][00][00][00][22][C5][D3] Waiting for a confirmation...
Sorry I don't intend to read the code of your custom wrapper around libmodbus.
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