Skip to content

Commit bb80c06

Browse files
committed
Fixed error when running script for multiple devices
1 parent 66cc9e7 commit bb80c06

File tree

1 file changed

+31
-18
lines changed

1 file changed

+31
-18
lines changed

src/server/runtime/server_runscriptthread.cpp

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ typedef struct
3535
struct MemWork
3636
{
3737
mbServerDevice::MemoryBlock *devMemBlock;
38+
uint devMemChangeCounter;
3839
QSharedMemory *shm;
3940
MemoryBlockHeader *shmHeader;
4041
uint8_t *shmMem;
@@ -61,6 +62,18 @@ QSharedMemory::SharedMemoryError initMem(QSharedMemory &mem, size_t size)
6162
return QSharedMemory::NoError;
6263
}
6364

65+
QString getProcessIdString()
66+
{
67+
QString s;
68+
quint64 pid = static_cast<quint64>(QCoreApplication::applicationPid());
69+
while (pid)
70+
{
71+
s += QChar(static_cast<char>(pid % 26) + 'A');
72+
pid /= 26;
73+
}
74+
return s;
75+
}
76+
6477
mbServerRunScriptThread::mbServerRunScriptThread(mbServerDevice *device, const MBSETTINGS &scripts, bool useTemporary, QObject *parent) : QThread{parent},
6578
m_device(device)
6679
{
@@ -78,7 +91,8 @@ void mbServerRunScriptThread::run()
7891
QEventLoop eloop;
7992
mbCoreFileManager *fileManager = mbServer::global()->fileManager();
8093

81-
const QString prefix = QString("ModbusTools.Server.PORT1.PLC1");
94+
const QString prefix = QString("ModbusTools.Server.%1.%2").arg(getProcessIdString(), m_device->name());
95+
//const QString prefix = QString("ModbusTools.Server.PLC1");
8296
const QString sMemCtrl = prefix+QStringLiteral(".control");
8397
const QString sMem0x = prefix+QStringLiteral(".mem0x");
8498
const QString sMem1x = prefix+QStringLiteral(".mem1x");
@@ -130,26 +144,21 @@ void mbServerRunScriptThread::run()
130144
memWork[2].shmMask = reinterpret_cast<uint8_t*>(mem3x.data())+sizeof(MemoryBlockHeader)+m_device->count_3x_bytes();
131145
memWork[3].shmMask = reinterpret_cast<uint8_t*>(mem4x.data())+sizeof(MemoryBlockHeader)+m_device->count_4x_bytes();
132146

133-
//int szBytes0x = mem0x.size();
134-
//int szBytes1x = mem1x.size();
135-
//int szBytes3x = mem3x.size();
136-
//int szBytes4x = mem4x.size();
137-
138-
//void *ptrShmMem0 = memWork[0].shmMem;
139-
//void *ptrShmMem1 = memWork[1].shmMem;
140-
//void *ptrShmMem3 = memWork[2].shmMem;
141-
//void *ptrShmMem4 = memWork[3].shmMem;
142-
143-
//void *ptrShmMask0 = memWork[0].shmMask;
144-
//void *ptrShmMask1 = memWork[1].shmMask;
145-
//void *ptrShmMask3 = memWork[2].shmMask;
146-
//void *ptrShmMask4 = memWork[3].shmMask;
147-
148147
memWork[0].changeCounter = memWork[0].shmHeader->changeCounter;
149148
memWork[1].changeCounter = memWork[1].shmHeader->changeCounter;
150149
memWork[2].changeCounter = memWork[2].shmHeader->changeCounter;
151150
memWork[3].changeCounter = memWork[3].shmHeader->changeCounter;
152151

152+
// Initialize memory
153+
for (int i = 0; i < 4; i++)
154+
{
155+
memWork[i].devMemChangeCounter = memWork[i].devMemBlock->changeCounter();
156+
QSharedMemory &shm = *memWork[i].shm;
157+
shm.lock();
158+
memWork[i].devMemBlock->memGet(0, memWork[i].shmMem, memWork[i].devMemBlock->sizeBytes());
159+
shm.unlock();
160+
}
161+
153162
qDebug() << "Control: key =" << memCtrl.key() << " nativeKey =" << memCtrl.nativeKey();
154163

155164
control->flags |= 1;
@@ -237,15 +246,19 @@ void mbServerRunScriptThread::run()
237246
shm.lock();
238247
if (memWork[i].changeCounter != head->changeCounter)
239248
{
240-
qDebug() << "New Header:" << head->changeCounter << ". Offset:" << head->changeByteOffset << ". Count: " << head->changeByteCount;
249+
//qDebug() << "New Header:" << head->changeCounter << ". Offset:" << head->changeByteOffset << ". Count: " << head->changeByteCount;
241250
uint32_t byteOffset = head->changeByteOffset;
242251
memWork[i].devMemBlock->memSetMask(byteOffset, memWork[i].shmMem+byteOffset, memWork[i].shmMask+byteOffset, head->changeByteCount);
243252
memset(memWork[i].shmMask+byteOffset, 0, head->changeByteCount);
244253
head->changeByteOffset = 0xFFFFFFFF;
245254
head->changeByteCount = 0;
246255
memWork[i].changeCounter = head->changeCounter;
247256
}
248-
memWork[i].devMemBlock->memGet(0, memWork[i].shmMem, memWork[i].devMemBlock->sizeBytes());
257+
if (memWork[i].devMemChangeCounter != memWork[i].devMemBlock->changeCounter())
258+
{
259+
memWork[i].devMemChangeCounter = memWork[i].devMemBlock->changeCounter();
260+
memWork[i].devMemBlock->memGet(0, memWork[i].shmMem, memWork[i].devMemBlock->sizeBytes());
261+
}
249262
shm.unlock();
250263
}
251264
control->cycle++;

0 commit comments

Comments
 (0)