@@ -35,6 +35,7 @@ typedef struct
3535struct 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+
6477mbServerRunScriptThread::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