Skip to content

Commit 9bc4200

Browse files
committed
Fixed issue 'Action value updates - Not Following Defined Register and Byte Order'
1 parent 78ff28e commit 9bc4200

File tree

4 files changed

+35
-8
lines changed

4 files changed

+35
-8
lines changed

src/core/sdk/mbcore.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -457,14 +457,15 @@ QList<quint8> toUnitsList(const QString &unitsStr, bool *ok)
457457
return lu;
458458
}
459459

460-
void changeByteOrder(char *data, int len)
460+
void changeByteOrder(void *data, int len)
461461
{
462+
char *d = reinterpret_cast<char*>(data);
462463
for (int i = 0; i < len/2; i++)
463464
{
464465
int n = 2*i, n1 = 2*i+1;
465-
char v = data[n];
466-
data[n] = data[n1];
467-
data[n1] = v;
466+
char v = d[n];
467+
d[n] = d[n1];
468+
d[n1] = v;
468469
}
469470
}
470471

src/core/sdk/mbcore.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ MB_EXPORT QString toUnitsString(const QList<quint8> units);
515515

516516
MB_EXPORT QList<quint8> toUnitsList(const QString &unitsStr, bool *ok = nullptr);
517517

518-
MB_EXPORT void changeByteOrder(char *data, int len);
518+
MB_EXPORT void changeByteOrder(void *data, int len);
519519

520520
inline void swapRegisters32(void *buff)
521521
{

src/server/runtime/server_runaction.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ mbServerRunAction::mbServerRunAction(const MBSETTINGS &settings)
3030
m_device = reinterpret_cast<mbServerDevice*>(settings.value(sAction.device).value<void*>());
3131
m_address = mb::toAddress(settings.value(sAction.address).toInt());
3232
m_period = settings.value(sAction.period).toInt();
33+
m_byteOrder = mb::enumDataOrderValue(settings.value(sAction.byteOrder), mb::LessSignifiedFirst);
34+
m_registerOrder = mb::enumDataOrderValue(settings.value(sAction.registerOrder), mb::LessSignifiedFirst);
3335
}
3436

3537
mbServerRunAction::~mbServerRunAction()
@@ -47,6 +49,24 @@ void mbServerRunAction::setValue(const QVariant &value)
4749
m_device->setValue(address(), dataType(), value);
4850
}
4951

52+
void mbServerRunAction::trySwap(void *d, int size)
53+
{
54+
// TODO: resolve this conditions in compiling stage
55+
if ((size > 1) && (m_byteOrder == mb::MostSignifiedFirst))
56+
mb::changeByteOrder(d, size);
57+
switch (size)
58+
{
59+
case 4:
60+
if (m_registerOrder == mb::MostSignifiedFirst)
61+
mb::swapRegisters32(d);
62+
break;
63+
case 8:
64+
if (m_registerOrder == mb::MostSignifiedFirst)
65+
mb::swapRegisters64(d);
66+
break;
67+
}
68+
}
69+
5070
int mbServerRunAction::init(qint64 time)
5171
{
5272
m_last = time;

src/server/runtime/server_runaction.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class mbServerRunAction
4444
inline int period() const { return m_period; }
4545
QVariant value() const;
4646
void setValue(const QVariant &value);
47+
void trySwap(void *d, int size);
4748

4849
public:
4950
virtual int init(qint64 time);
@@ -55,10 +56,10 @@ class mbServerRunAction
5556
mb::Address m_address;
5657
int m_period;
5758
qint64 m_last;
58-
59+
mb::DataOrder m_byteOrder;
60+
mb::DataOrder m_registerOrder;
5961
};
6062

61-
6263
template <typename T>
6364
class mbServerRunActionT : public mbServerRunAction
6465
{
@@ -84,7 +85,10 @@ class mbServerRunActionIncrement : public mbServerRunActionT<T>
8485
{
8586
QVariant v = this->value();
8687
T t = v.value<T>();
87-
this->setValue(t + m_increment);
88+
trySwap(&t, sizeof(t));
89+
t += m_increment;
90+
trySwap(&t, sizeof(t));
91+
this->setValue(t);
8892
this->m_last = time;
8993
}
9094
return 0;
@@ -116,6 +120,7 @@ class mbServerRunActionSine : public mbServerRunActionT<T>
116120
{
117121
qreal x = static_cast<qreal>(time-m_phaseShift)/m_sinePeriod;
118122
T v = static_cast<T>(m_amplitude*qSin(x*2*M_PI)+m_verticalShift);
123+
trySwap(&v, sizeof(v));
119124
this->setValue(v);
120125
this->m_last = time;
121126
}
@@ -147,6 +152,7 @@ class mbServerRunActionRandom : public mbServerRunActionT<T>
147152
{
148153
qreal x = static_cast<qreal>(RAND_MAX-qrand())/static_cast<qreal>(RAND_MAX); // koef is [0;1]
149154
T v = static_cast<T>(x*m_range+m_min);
155+
trySwap(&v, sizeof(v));
150156
this->setValue(v);
151157
this->m_last = time;
152158
}

0 commit comments

Comments
 (0)