Skip to content

Commit 8a7a22f

Browse files
author
Ананьев Александр
committed
Correct storing address space values on changes
1 parent a64ac89 commit 8a7a22f

5 files changed

Lines changed: 144 additions & 43 deletions

File tree

omodsim/modbusdataunitmap.cpp

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#include <QDebug>
2+
#include "modbusdataunitmap.h"
3+
4+
///
5+
/// \brief ModbusDataUnitMap::addUnitMap
6+
/// \param id
7+
/// \param pointType
8+
/// \param pointAddress
9+
/// \param length
10+
///
11+
void ModbusDataUnitMap::addUnitMap(int id, QModbusDataUnit::RegisterType pointType, quint16 pointAddress, quint16 length)
12+
{
13+
_dataUnits.insert(id, {pointType, pointAddress, length});
14+
updateDataUnitMap();
15+
}
16+
17+
///
18+
/// \brief ModbusDataUnitMap::removeUnitMap
19+
/// \param pointType
20+
///
21+
void ModbusDataUnitMap::removeUnitMap(int id)
22+
{
23+
_dataUnits.remove(id);
24+
updateDataUnitMap();
25+
}
26+
27+
///
28+
/// \brief ModbusDataUnitMap::begin
29+
/// \return
30+
///
31+
QModbusDataUnitMap::ConstIterator ModbusDataUnitMap::begin()
32+
{
33+
return _modbusDataUnitMap.begin();
34+
}
35+
36+
///
37+
/// \brief ModbusDataUnitMap::end
38+
/// \return
39+
///
40+
QModbusDataUnitMap::Iterator ModbusDataUnitMap::end()
41+
{
42+
return _modbusDataUnitMap.end();
43+
}
44+
45+
///
46+
/// \brief ModbusDataUnitMap::setData
47+
/// \param data
48+
///
49+
void ModbusDataUnitMap::setData(const QModbusDataUnit& data)
50+
{
51+
const auto addr = data.startAddress();
52+
const auto length = data.valueCount();
53+
const auto type = data.registerType();
54+
55+
const auto idx = addr - _modbusDataUnitMap[type].startAddress();
56+
for(int i = 0; i < length; i++)
57+
{
58+
_modbusDataUnitMap[type].setValue(idx + i, data.value(i));
59+
}
60+
}
61+
62+
///
63+
/// \brief ModbusDataUnitMap::updateDataUnitMap
64+
///
65+
void ModbusDataUnitMap::updateDataUnitMap()
66+
{
67+
QMultiMap<QModbusDataUnit::RegisterType, QModbusDataUnit> multimap;
68+
for(auto&& unit : _dataUnits)
69+
{
70+
multimap.insert(unit.registerType(), unit);
71+
}
72+
73+
QModbusDataUnitMap modbusMap;
74+
for(auto&& type: multimap.uniqueKeys())
75+
{
76+
quint16 startAddress = 65535;
77+
quint16 endAddress = 0;
78+
for(auto&& unit : multimap.values(type))
79+
{
80+
startAddress = qMin<quint16>(startAddress, unit.startAddress());
81+
endAddress = qMax<quint16>(endAddress, unit.startAddress() + unit.valueCount());
82+
}
83+
84+
const quint16 length = endAddress - startAddress;
85+
if(length > 0)
86+
modbusMap.insert(type, {type, startAddress, length});
87+
88+
for(int i = 0; i < length; i++)
89+
{
90+
modbusMap[type].setValue(i, _modbusDataUnitMap[type].value(i));
91+
}
92+
}
93+
_modbusDataUnitMap = modbusMap;
94+
}

omodsim/modbusdataunitmap.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#ifndef MODBUSDATAUNITMAP_H
2+
#define MODBUSDATAUNITMAP_H
3+
4+
#include <QModbusDataUnit>
5+
6+
///
7+
/// \brief The ModbusDataUnitMap class
8+
///
9+
class ModbusDataUnitMap
10+
{
11+
public:
12+
explicit ModbusDataUnitMap() = default;
13+
14+
void addUnitMap(int id, QModbusDataUnit::RegisterType pointType, quint16 pointAddress, quint16 length);
15+
void removeUnitMap(int id);
16+
17+
void setData(const QModbusDataUnit& data);
18+
19+
QModbusDataUnitMap::ConstIterator begin();
20+
QModbusDataUnitMap::Iterator end();
21+
22+
operator QModbusDataUnitMap(){
23+
return _modbusDataUnitMap;
24+
}
25+
26+
private:
27+
void updateDataUnitMap();
28+
29+
private:
30+
QMap<int, QModbusDataUnit> _dataUnits;
31+
QModbusDataUnitMap _modbusDataUnitMap;
32+
};
33+
34+
35+
#endif // MODBUSDATAUNITMAP_H

omodsim/modbusmultiserver.cpp

Lines changed: 11 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
ModbusMultiServer::ModbusMultiServer(QObject *parent)
99
: QObject{parent}
1010
,_deviceId(1)
11+
,_simulator(new DataSimulator(this))
1112
{
12-
_simulator = QSharedPointer<DataSimulator>(new DataSimulator(this));
1313
}
1414

1515
///
@@ -45,56 +45,28 @@ void ModbusMultiServer::setDeviceId(quint8 deviceId)
4545
}
4646

4747
///
48-
/// \brief ModbusServer::addUnitMap
48+
/// \brief ModbusMultiServer::addUnitMap
49+
/// \param id
4950
/// \param pointType
5051
/// \param pointAddress
5152
/// \param length
5253
///
5354
void ModbusMultiServer::addUnitMap(int id, QModbusDataUnit::RegisterType pointType, quint16 pointAddress, quint16 length)
5455
{
55-
_modbusDataUnitMap.insert(id, {pointType, pointAddress, length});
56+
_modbusDataUnitMap.addUnitMap(id, pointType, pointAddress, length);
5657
reconfigureServers();
5758
}
5859

5960
///
60-
/// \brief ModbusServer::removeUnitMap
61-
/// \param pointType
61+
/// \brief ModbusMultiServer::removeUnitMap
62+
/// \param id
6263
///
6364
void ModbusMultiServer::removeUnitMap(int id)
6465
{
65-
_modbusDataUnitMap.remove(id);
66+
_modbusDataUnitMap.removeUnitMap(id);
6667
reconfigureServers();
6768
}
6869

69-
///
70-
/// \brief ModbusServer::createDataUnitMap
71-
/// \return
72-
///
73-
QModbusDataUnitMap ModbusMultiServer::createDataUnitMap()
74-
{
75-
QMultiMap<QModbusDataUnit::RegisterType, QModbusDataUnit> multimap;
76-
for(auto&& unit : _modbusDataUnitMap)
77-
{
78-
multimap.insert(unit.registerType(), unit);
79-
}
80-
81-
QModbusDataUnitMap modbusMap;
82-
for(auto&& type: multimap.uniqueKeys())
83-
{
84-
quint16 startAddress = 65535;
85-
quint16 endAddress = 0;
86-
for(auto&& unit : multimap.values(type))
87-
{
88-
startAddress = qMin<quint16>(startAddress, unit.startAddress());
89-
endAddress = qMax<quint16>(endAddress, unit.startAddress() + unit.valueCount());
90-
}
91-
92-
const quint16 length = endAddress - startAddress;
93-
if(length > 0) modbusMap.insert(type, {type, startAddress, length});
94-
}
95-
return modbusMap;
96-
}
97-
9870
///
9971
/// \brief ModbusMultiServer::findModbusServer
10072
/// \param cd
@@ -210,11 +182,9 @@ void ModbusMultiServer::connectDevice(const ConnectionDetails& cd)
210182
}
211183

212184
modbusServer->setServerAddress(_deviceId);
185+
modbusServer->setMap(_modbusDataUnitMap);
213186

214-
const auto dataUintMap = createDataUnitMap();
215-
modbusServer->setMap(dataUintMap);
216-
217-
for(auto data : dataUintMap)
187+
for(auto data : _modbusDataUnitMap)
218188
{
219189
_modbusServerList.first()->data(&data);
220190
modbusServer->setData(data);
@@ -280,9 +250,8 @@ void ModbusMultiServer::reconfigureServers()
280250
{
281251
if(!_modbusServerList.isEmpty())
282252
{
283-
const auto dataUintMap = createDataUnitMap();
284253
for(auto&& s : _modbusServerList)
285-
s->setMap(dataUintMap);
254+
s->setMap(_modbusDataUnitMap);
286255
}
287256
}
288257

@@ -346,6 +315,7 @@ QModbusDataUnit ModbusMultiServer::data(QModbusDataUnit::RegisterType pointType,
346315
///
347316
void ModbusMultiServer::setData(const QModbusDataUnit& data)
348317
{
318+
_modbusDataUnitMap.setData(data);
349319
for(auto&& s : _modbusServerList)
350320
{
351321
s->blockSignals(true);

omodsim/modbusmultiserver.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <QModbusServer>
66
#include <QModbusTcpServer>
77
#include "datasimulator.h"
8+
#include "modbusdataunitmap.h"
89
#include "modbuswriteparams.h"
910
#include "connectiondetails.h"
1011

@@ -138,7 +139,6 @@ private slots:
138139
void on_dataWritten(QModbusDataUnit::RegisterType table, int address, int size);
139140

140141
private:
141-
QModbusDataUnitMap createDataUnitMap();
142142
QSharedPointer<QModbusServer> findModbusServer(const ConnectionDetails& cd) const;
143143
QSharedPointer<QModbusServer> findModbusServer(ConnectionType type, const QString& port) const;
144144
QSharedPointer<QModbusServer> createModbusServer(const ConnectionDetails& cd);
@@ -149,7 +149,7 @@ private slots:
149149

150150
private:
151151
quint8 _deviceId;
152-
QMap<int, QModbusDataUnit> _modbusDataUnitMap;
152+
ModbusDataUnitMap _modbusDataUnitMap;
153153
QList<QSharedPointer<QModbusServer>> _modbusServerList;
154154
QSharedPointer<DataSimulator> _simulator;
155155
};

omodsim/omodsim.pro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ SOURCES += \
5151
main.cpp \
5252
mainwindow.cpp \
5353
menuconnect.cpp \
54+
modbusdataunitmap.cpp \
5455
modbusmultiserver.cpp \
5556
qfixedsizedialog.cpp \
5657
qhexvalidator.cpp \
@@ -89,6 +90,7 @@ HEADERS += \
8990
formmodsim.h \
9091
mainwindow.h \
9192
menuconnect.h \
93+
modbusdataunitmap.h \
9294
modbuslimits.h \
9395
modbusmultiserver.h \
9496
modbussimulationparams.h \

0 commit comments

Comments
 (0)