Skip to content

Commit f221919

Browse files
committed
Fix issue when DataViewItem size was greater that size of single Modbus packet. Its now working with data oversized ignored
1 parent ddd24a3 commit f221919

File tree

3 files changed

+134
-82
lines changed

3 files changed

+134
-82
lines changed

src/client/runtime/client_runitem.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,14 @@ void mbClientRunItem::readDataFromMessage()
6565
if (Modbus::StatusIsGood(status))
6666
{
6767
uint16_t innerOffset = m_offset - m_message->offset();
68-
if (m_message->getData(innerOffset, count(), m_data.data()))
68+
Modbus::StatusCode s = m_message->getData(innerOffset, count(), m_data.data());
69+
if (Modbus::StatusIsGood(s))
6970
{
7071
update(m_data, status, timestamp);
7172
return;
7273
}
7374
else
74-
status = Modbus::Status_Bad;
75+
status = s;
7576
}
7677
update(status, timestamp);
7778
}

src/client/runtime/client_runmessage.cpp

Lines changed: 108 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@ mbClientRunMessage::mbClientRunMessage(mbClientRunItem *item, uint16_t maxCount,
2828
: QObject{parent}
2929
{
3030
//m_refCount = 0; // Note: g++ initialize it incorrectly using default constructor somehow (detected for Ubuntu 22.04, 64 bit)
31+
m_maxCount = maxCount;
3132
m_offset = item->offset();
3233
m_count = item->count();
34+
if (m_count > m_maxCount)
35+
m_count = m_maxCount;
3336
m_writeOffset = 0;
3437
m_writeCount = 0;
3538
m_period = item->period();
36-
m_maxCount = maxCount;
3739
m_status = Modbus::Status_Uncertain;
3840
m_timestamp = 0;
3941
addItemPrivate(item);
@@ -46,8 +48,11 @@ mbClientRunMessage::mbClientRunMessage(uint16_t offset, uint16_t count, uint16_t
4648
: QObject{parent}
4749
{
4850
//m_refCount = 0; // Note: g++ initialize it incorrectly using default constructor somehow (detected for Ubuntu 22.04, 64 bit)
51+
m_maxCount = maxCount;
4952
m_offset = offset;
5053
m_count = count;
54+
if (m_count > m_maxCount)
55+
m_count = m_maxCount;
5156
m_writeOffset = 0;
5257
m_writeCount = 0;
5358
m_period = 0;
@@ -67,25 +72,55 @@ mbClientRunMessage::~mbClientRunMessage()
6772
qDeleteAll(m_items);
6873
}
6974

70-
uint16_t mbClientRunMessage::offset() const { return m_offset; }
75+
uint16_t mbClientRunMessage::offset() const
76+
{
77+
return m_offset;
78+
}
7179

72-
uint16_t mbClientRunMessage::count() const { return m_count; }
80+
uint16_t mbClientRunMessage::count() const
81+
{
82+
return m_count;
83+
}
7384

74-
uint16_t mbClientRunMessage::maxCount() const { return m_maxCount; }
85+
uint16_t mbClientRunMessage::maxCount() const
86+
{
87+
return m_maxCount;
88+
}
7589

76-
uint32_t mbClientRunMessage::period() const { return m_period; }
90+
uint32_t mbClientRunMessage::period() const
91+
{
92+
return m_period;
93+
}
7794

78-
void *mbClientRunMessage::innerBuffer() { return m_buff; }
95+
void *mbClientRunMessage::innerBuffer()
96+
{
97+
return m_buff;
98+
}
7999

80-
int mbClientRunMessage::innerBufferSize() const { return MB_MAX_BYTES; }
100+
int mbClientRunMessage::innerBufferSize() const
101+
{
102+
return MB_MAX_BYTES;
103+
}
81104

82-
int mbClientRunMessage::innerBufferBitSize() const { return innerBufferSize() * MB_BYTE_SZ_BITES; }
105+
int mbClientRunMessage::innerBufferBitSize() const
106+
{
107+
return innerBufferSize() * MB_BYTE_SZ_BITES;
108+
}
83109

84-
int mbClientRunMessage::innerBufferRegSize() const { return innerBufferSize() / MB_REGE_SZ_BYTES; }
110+
int mbClientRunMessage::innerBufferRegSize() const
111+
{
112+
return innerBufferSize() / MB_REGE_SZ_BYTES;
113+
}
85114

86-
Modbus::StatusCode mbClientRunMessage::status() const { return m_status; }
115+
Modbus::StatusCode mbClientRunMessage::status() const
116+
{
117+
return m_status;
118+
}
87119

88-
mb::Timestamp_t mbClientRunMessage::timestamp() const { return m_timestamp; }
120+
mb::Timestamp_t mbClientRunMessage::timestamp() const
121+
{
122+
return m_timestamp;
123+
}
89124

90125
bool mbClientRunMessage::addItem(mbClientRunItem *item)
91126
{
@@ -127,14 +162,14 @@ void mbClientRunMessage::setDeleteItems(bool del)
127162
m_deleteItems = del;
128163
}
129164

130-
bool mbClientRunMessage::getData(uint16_t /*innerOffset*/, uint16_t /*count*/, void * /*buff*/) const
165+
Modbus::StatusCode mbClientRunMessage::getData(uint16_t /*innerOffset*/, uint16_t /*count*/, void * /*buff*/) const
131166
{
132-
return false;
167+
return Modbus::Status_Bad;
133168
}
134169

135-
bool mbClientRunMessage::setData(uint16_t /*innerOffset*/, uint16_t /*count*/, const void * /*buff*/)
170+
Modbus::StatusCode mbClientRunMessage::setData(uint16_t /*innerOffset*/, uint16_t /*count*/, const void * /*buff*/)
136171
{
137-
return false;
172+
return Modbus::Status_Bad;
138173
}
139174

140175
void mbClientRunMessage::prepareToSend()
@@ -257,135 +292,147 @@ void mbClientRunMessageWrite::prepareToSend()
257292
// ---------------------------------------------- READ_COILS ----------------------------------------------
258293
// --------------------------------------------------------------------------------------------------------
259294

260-
bool mbClientRunMessageReadCoils::getData(uint16_t innerOffset, uint16_t count, void *buff) const
295+
Modbus::StatusCode mbClientRunMessageReadCoils::getData(uint16_t innerOffset, uint16_t count, void *buff) const
261296
{
262-
return Modbus::StatusIsGood(Modbus::readMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize()));
297+
uint32_t c;
298+
return Modbus::readMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize(), &c);
263299
}
264300

265-
bool mbClientRunMessageReadCoils::setData(uint16_t innerOffset, uint16_t count, const void *buff)
301+
Modbus::StatusCode mbClientRunMessageReadCoils::setData(uint16_t innerOffset, uint16_t count, const void *buff)
266302
{
267-
return Modbus::StatusIsGood(Modbus::writeMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize()));
303+
uint32_t c;
304+
return Modbus::writeMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize(), &c);
268305
}
269306

270307

271308
// --------------------------------------------------------------------------------------------------------
272309
// ----------------------------------------- READ_DISCRETE_INPUTS ----------------------------------------
273310
// --------------------------------------------------------------------------------------------------------
274311

275-
bool mbClientRunMessageReadDiscreteInputs::getData(uint16_t innerOffset, uint16_t count, void *buff) const
312+
Modbus::StatusCode mbClientRunMessageReadDiscreteInputs::getData(uint16_t innerOffset, uint16_t count, void *buff) const
276313
{
277-
return Modbus::StatusIsGood(Modbus::readMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize()));
314+
uint32_t c;
315+
return Modbus::readMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize(), &c);
278316
}
279317

280-
bool mbClientRunMessageReadDiscreteInputs::setData(uint16_t innerOffset, uint16_t count, const void *buff)
318+
Modbus::StatusCode mbClientRunMessageReadDiscreteInputs::setData(uint16_t innerOffset, uint16_t count, const void *buff)
281319
{
282-
return Modbus::StatusIsGood(Modbus::writeMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize()));
320+
uint32_t c;
321+
return Modbus::writeMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize(), &c);
283322
}
284323

285324

286325
// --------------------------------------------------------------------------------------------------------
287326
// ---------------------------------------- READ_HOLDING_REGISTERS ----------------------------------------
288327
// --------------------------------------------------------------------------------------------------------
289328

290-
bool mbClientRunMessageReadHoldingRegisters::getData(uint16_t innerOffset, uint16_t count, void *buff) const
329+
Modbus::StatusCode mbClientRunMessageReadHoldingRegisters::getData(uint16_t innerOffset, uint16_t count, void *buff) const
291330
{
292-
return Modbus::StatusIsGood(Modbus::readMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize()));
331+
uint32_t c;
332+
return Modbus::readMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize(), &c);
293333
}
294334

295-
bool mbClientRunMessageReadHoldingRegisters::setData(uint16_t innerOffset, uint16_t count, const void *buff)
335+
Modbus::StatusCode mbClientRunMessageReadHoldingRegisters::setData(uint16_t innerOffset, uint16_t count, const void *buff)
296336
{
297-
return Modbus::StatusIsGood(Modbus::writeMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize()));
337+
uint32_t c;
338+
return Modbus::writeMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize(), &c);
298339
}
299340

300341

301342
// --------------------------------------------------------------------------------------------------------
302343
// ----------------------------------------- READ_INPUT_REGISTERS -----------------------------------------
303344
// --------------------------------------------------------------------------------------------------------
304345

305-
bool mbClientRunMessageReadInputRegisters::getData(uint16_t innerOffset, uint16_t count, void *buff) const
346+
Modbus::StatusCode mbClientRunMessageReadInputRegisters::getData(uint16_t innerOffset, uint16_t count, void *buff) const
306347
{
307-
return Modbus::StatusIsGood(Modbus::readMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize()));
348+
uint32_t c;
349+
return Modbus::readMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize(), &c);
308350
}
309351

310-
bool mbClientRunMessageReadInputRegisters::setData(uint16_t innerOffset, uint16_t count, const void *buff)
352+
Modbus::StatusCode mbClientRunMessageReadInputRegisters::setData(uint16_t innerOffset, uint16_t count, const void *buff)
311353
{
312-
return Modbus::StatusIsGood(Modbus::writeMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize()));
354+
uint32_t c;
355+
return Modbus::writeMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize(), &c);
313356
}
314357

315358

316359
// --------------------------------------------------------------------------------------------------------
317360
// ------------------------------------------- WRITE_SINGLE_COIL ------------------------------------------
318361
// --------------------------------------------------------------------------------------------------------
319362

320-
bool mbClientRunMessageWriteSingleCoil::getData(uint16_t /*innerOffset*/, uint16_t /*count*/, void *buff) const
363+
Modbus::StatusCode mbClientRunMessageWriteSingleCoil::getData(uint16_t /*innerOffset*/, uint16_t /*count*/, void *buff) const
321364
{
322365
// ignoring offset and count
323366
reinterpret_cast<uint8_t*>(buff)[0] = m_buff[0];
324-
return true;
367+
return Modbus::Status_Good;
325368
}
326369

327-
bool mbClientRunMessageWriteSingleCoil::setData(uint16_t /*innerOffset*/, uint16_t /*count*/, const void *buff)
370+
Modbus::StatusCode mbClientRunMessageWriteSingleCoil::setData(uint16_t /*innerOffset*/, uint16_t /*count*/, const void *buff)
328371
{
329372
// ignoring offset and count
330373
m_buff[0] = reinterpret_cast<const uint8_t*>(buff)[0];
331-
return true;
374+
return Modbus::Status_Good;
332375
}
333376

334377

335378
// --------------------------------------------------------------------------------------------------------
336379
// ----------------------------------------- WRITE_SINGLE_REGISTER ----------------------------------------
337380
// --------------------------------------------------------------------------------------------------------
338381

339-
bool mbClientRunMessageWriteSingleRegister::getData(uint16_t /*innerOffset*/, uint16_t /*count*/, void *buff) const
382+
Modbus::StatusCode mbClientRunMessageWriteSingleRegister::getData(uint16_t /*innerOffset*/, uint16_t /*count*/, void *buff) const
340383
{
341384
// ignoring offset and count
342385
reinterpret_cast<uint16_t*>(buff)[0] = reinterpret_cast<const uint16_t*>(m_buff)[0];
343-
return true;
386+
return Modbus::Status_Good;
344387
}
345388

346-
bool mbClientRunMessageWriteSingleRegister::setData(uint16_t /*innerOffset*/, uint16_t /*count*/, const void *buff)
389+
Modbus::StatusCode mbClientRunMessageWriteSingleRegister::setData(uint16_t /*innerOffset*/, uint16_t /*count*/, const void *buff)
347390
{
348391
// ignoring offset and count
349392
reinterpret_cast<uint16_t*>(m_buff)[0] = reinterpret_cast<const uint16_t*>(buff)[0];
350-
return true;
393+
return Modbus::Status_Good;
351394
}
352395

353396
// --------------------------------------------------------------------------------------------------------
354397
// ----------------------------------------- READ_EXCEPTION_STATUS ----------------------------------------
355398
// --------------------------------------------------------------------------------------------------------
356399

357-
bool mbClientRunMessageReadExceptionStatus::getData(uint16_t innerOffset, uint16_t count, void *buff) const
400+
Modbus::StatusCode mbClientRunMessageReadExceptionStatus::getData(uint16_t innerOffset, uint16_t count, void *buff) const
358401
{
359-
return Modbus::StatusIsGood(Modbus::readMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize()));
402+
return Modbus::readMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize());
360403
}
361404

362405
// --------------------------------------------------------------------------------------------------------
363406
// ----------------------------------------- WRITE_MULTIPLE_COILS -----------------------------------------
364407
// --------------------------------------------------------------------------------------------------------
365408

366-
bool mbClientRunMessageWriteMultipleCoils::getData(uint16_t innerOffset, uint16_t count, void *buff) const
409+
Modbus::StatusCode mbClientRunMessageWriteMultipleCoils::getData(uint16_t innerOffset, uint16_t count, void *buff) const
367410
{
368-
return Modbus::StatusIsGood(Modbus::readMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize()));
411+
uint32_t c;
412+
return Modbus::readMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize(), &c);
369413
}
370414

371-
bool mbClientRunMessageWriteMultipleCoils::setData(uint16_t innerOffset, uint16_t count, const void *buff)
415+
Modbus::StatusCode mbClientRunMessageWriteMultipleCoils::setData(uint16_t innerOffset, uint16_t count, const void *buff)
372416
{
373-
return Modbus::StatusIsGood(Modbus::writeMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize()));
417+
uint32_t c;
418+
return Modbus::writeMemBits(innerOffset, count, buff, m_buff, innerBufferBitSize(), &c);
374419
}
375420

376421

377422
// --------------------------------------------------------------------------------------------------------
378423
// --------------------------------------- WRITE_MULTIPLE_REGISTERS ---------------------------------------
379424
// --------------------------------------------------------------------------------------------------------
380425

381-
bool mbClientRunMessageWriteMultipleRegisters::getData(uint16_t innerOffset, uint16_t count, void *buff) const
426+
Modbus::StatusCode mbClientRunMessageWriteMultipleRegisters::getData(uint16_t innerOffset, uint16_t count, void *buff) const
382427
{
383-
return Modbus::StatusIsGood(Modbus::readMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize()));
428+
uint32_t c;
429+
return Modbus::readMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize(), &c);
384430
}
385431

386-
bool mbClientRunMessageWriteMultipleRegisters::setData(uint16_t innerOffset, uint16_t count, const void *buff)
432+
Modbus::StatusCode mbClientRunMessageWriteMultipleRegisters::setData(uint16_t innerOffset, uint16_t count, const void *buff)
387433
{
388-
return Modbus::StatusIsGood(Modbus::writeMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize()));
434+
uint32_t c;
435+
return Modbus::writeMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize(), &c);
389436
}
390437

391438

@@ -397,14 +444,16 @@ mbClientRunMessageMaskWriteRegister::mbClientRunMessageMaskWriteRegister(uint16_
397444
{
398445
}
399446

400-
bool mbClientRunMessageMaskWriteRegister::getData(uint16_t innerOffset, uint16_t count, void *buff) const
447+
Modbus::StatusCode mbClientRunMessageMaskWriteRegister::getData(uint16_t innerOffset, uint16_t count, void *buff) const
401448
{
402-
return Modbus::StatusIsGood(Modbus::readMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize()));
449+
uint32_t c;
450+
return Modbus::readMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize(), &c);
403451
}
404452

405-
bool mbClientRunMessageMaskWriteRegister::setData(uint16_t innerOffset, uint16_t count, const void *buff)
453+
Modbus::StatusCode mbClientRunMessageMaskWriteRegister::setData(uint16_t innerOffset, uint16_t count, const void *buff)
406454
{
407-
return Modbus::StatusIsGood(Modbus::writeMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize()));
455+
uint32_t c;
456+
return Modbus::writeMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize(), &c);
408457
}
409458

410459

@@ -423,12 +472,14 @@ mbClientRunMessageReadWriteMultipleRegisters::mbClientRunMessageReadWriteMultipl
423472
m_writeCount = writeCount;
424473
}
425474

426-
bool mbClientRunMessageReadWriteMultipleRegisters::getData(uint16_t innerOffset, uint16_t count, void *buff) const
475+
Modbus::StatusCode mbClientRunMessageReadWriteMultipleRegisters::getData(uint16_t innerOffset, uint16_t count, void *buff) const
427476
{
428-
return Modbus::StatusIsGood(Modbus::readMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize()));
477+
uint32_t c;
478+
return Modbus::readMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize(), &c);
429479
}
430480

431-
bool mbClientRunMessageReadWriteMultipleRegisters::setData(uint16_t innerOffset, uint16_t count, const void *buff)
481+
Modbus::StatusCode mbClientRunMessageReadWriteMultipleRegisters::setData(uint16_t innerOffset, uint16_t count, const void *buff)
432482
{
433-
return Modbus::StatusIsGood(Modbus::writeMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize()));
483+
uint32_t c;
484+
return Modbus::writeMemRegs(innerOffset, count, buff, m_buff, innerBufferRegSize(), &c);
434485
}

0 commit comments

Comments
 (0)