该代码是一个名为 '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);
}
QPLCManager::syncSymbolRead 函数:从 PLC 同步读取符号值

原文地址: https://www.cveoy.top/t/topic/mQgr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录