QPLCManager::syncSymbolRead 函数:从 PLC 同步读取符号值
该代码是一个名为 'syncSymbolRead' 的函数,用于从 PLC 中同步读取符号的值,并更新本地程序中符号的值。
函数接收两个参数:
param:一个 void 类型的指针,表示参数。period:一个整数,表示周期。
函数内部定义了以下变量:
ppValues:一个PlcVarValue类型的指针数组,用于存储从 PLC 读取的值。ulNumOfValues:一个unsigned long类型的变量,表示ppValues数组的长度。plcSymbol:一个PlcSymbol类型的引用,表示 PLC 符号。symbolList:一个PlcSymbol类型的指针,表示符号列表。pHandler:一个CPLCHandler类型的指针,表示 PLC 处理程序。varList:一个HVARLIST类型的变量,表示同步读取的符号列表。
函数首先检查 PLC 处理程序的状态是否为运行中。如果状态为运行中,则调用 SyncReadVarListFromPlc 函数从 PLC 中同步读取符号的值,并将结果存储在 ppValues 数组中,同时更新 ulNumOfValues 的值。
如果读取成功,则函数遍历符号列表,将每个符号的值更新为 ppValues 数组中相应的值。如果符号的类型为 DATATYPE_BIT,则将其值的第一个字节复制到 pbuf 中;否则,将整个值的字节复制到 pbuf 中。
最后,函数发出一个信号,表示符号的值已经更新。函数最后调用 QThread::msleep 函数使程序暂停 500 毫秒。
代码示例:
void QPLCManager::syncSymbolRead(void* param, int period) {
long result;
PlcVarValue** ppValues = NULL;
unsigned long ulNumOfValues = 0;
QPLCManager* plcManager = static_cast<QPLCManager*>(param);
PlcSymbol& plcSymbol = plcManager->GetPlcSymbol();
PlcSymbol* symbolList = plcManager->mSymbolList;
CPLCHandler* pHandler = plcManager->mPLCHandler;
HVARLIST varList = plcManager->mSyncList;
if (STATE_RUNNING == pHandler->GetState()) {
result = pHandler->SyncReadVarListFromPlc(varList, &ppValues, &ulNumOfValues);
if (RESULT_OK == result && ppValues != NULL && ulNumOfValues == symbolList->size()) {
{
for (unsigned long n = 0; n < symbolList->size(); n++) {
symbol* s = symbolList->at(n);
if (s->typeId == DATATYPE_BIT)
memcpy(s->pbuf, ppValues[n]->byData, 1);
else
memcpy(s->pbuf, ppValues[n]->byData, s->size);
}
emit plcManager->symbolValueUpdated(0, 0);
}
}
}
QThread::msleep(500);
}
原文地址: https://www.cveoy.top/t/topic/mQgr 著作权归作者所有。请勿转载和采集!