GvlManager.cpp 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090
  1. #include "GvlManager.h"
  2. #include "VPGlobal.h"
  3. #include "WindowAppVariableTable.h"
  4. #include "Preferences.h"
  5. // 单例模式
  6. GvlManager* GvlManager::m_pGvlManager = nullptr;
  7. GvlManager::GvlManager()
  8. {
  9. // 创建默认的全局变量分组
  10. this->initSystemGvl();
  11. // 创建默认值变量分组(目前用于存储DataLink默认变量)
  12. this->initDefaultValues();
  13. }
  14. /// <summary>
  15. /// 添加新的变量组
  16. /// </summary>
  17. /// <param name="strGroup"></param>
  18. /// <param name="varType"></param>
  19. /// <param name="gvlMode"></param>
  20. GVL* GvlManager::addNewGroup(const QString& strGroup, TOOL_TYPE varType, GVL_MODE gvlMode)
  21. {
  22. // 检查是否冲突
  23. if (m_Gvls.contains(strGroup))
  24. {
  25. qDebug() << "[Error] GvlManager::addNewGroup - but [" << strGroup << "] is exist.";
  26. return m_Gvls[strGroup];
  27. }
  28. // 添加新的空变量组
  29. GVL* newGroup = new GVL(strGroup, varType, gvlMode);
  30. this->m_Gvls.insert(strGroup, newGroup);
  31. return newGroup;
  32. }
  33. /// <summary>
  34. /// 添加新的变量
  35. /// </summary>
  36. /// <param name="strGroup"></param>
  37. /// <param name="pNewVar"></param>
  38. /// <param name="varType"></param>
  39. bool GvlManager::addNewVariable(const QString& strGroup, VARIABLE* pNewVar)
  40. {
  41. // 获取所属变量组
  42. GVLS::iterator it = this->m_Gvls.find(strGroup);
  43. if (it != this->m_Gvls.end())
  44. {
  45. // 设置变量归属的父指针
  46. pNewVar->setParent(it.value());
  47. // pNewVar->pOriginalTool = it.value();
  48. it.value()->Variables.push_back(pNewVar);
  49. return true;
  50. }
  51. else
  52. {
  53. qWarning() << "[Error] GvlManager::addNewVariable - but [" << strGroup << "] is not exist.";
  54. return false;
  55. }
  56. }
  57. /// <summary>
  58. /// 2022-3-8添加新的默认变量(和正常变量分开存储)
  59. /// </summary>
  60. /// <param name="pNewVar"></param>
  61. /// <returns></returns>
  62. bool GvlManager::addNewDefaultVariable(VARIABLE* pNewVar)
  63. {
  64. pNewVar->setParent(m_defaultValueGvl);
  65. // pNewVar->pOriginalTool = m_defaultValueGvl;
  66. m_defaultValueGvl->Variables.push_back(pNewVar);
  67. return true;
  68. }
  69. /// <summary>
  70. /// 绑定UI和变量
  71. /// </summary>
  72. /// <param name="pTable"></param>
  73. /// <param name="strVarFullName"></param>
  74. void GvlManager::bindUIAndVariable(QTableWidget* pTable, QString& strVarFullName)
  75. {
  76. this->m_GvlTables.insert(strVarFullName, pTable);
  77. }
  78. /// <summary>
  79. /// 删除一个变量
  80. /// </summary>
  81. /// <param name="strGroup"></param>
  82. /// <param name="nIndex"></param>
  83. void GvlManager::delVariable(const QString& strGroup, const int& nIndex)
  84. {
  85. VARIABLES& vars = m_Gvls[strGroup]->Variables;
  86. // 清理此变量的内存
  87. delete vars[nIndex]->value.Ptr;
  88. *vars[nIndex]->value.Ptr = nullptr;
  89. vars[nIndex]->value.Ptr = nullptr;
  90. delete vars[nIndex];
  91. vars[nIndex] = nullptr;
  92. // 清理数组中的对应元素
  93. vars.erase(vars.begin() + nIndex);
  94. ////// 删除此group下的nIndex变量
  95. ////for (QVector<VARIABLE>::iterator it = vars.begin(); it != vars.end();)
  96. ////{
  97. //// if (it->item == pRunningBlock)
  98. //// {
  99. //// it = vars.erase(it);
  100. //// }
  101. //// else
  102. //// {
  103. //// it++;
  104. //// }
  105. ////}
  106. debugAllVariables();
  107. }
  108. /// <summary>
  109. /// 移除一个变量(无需释放内存)
  110. /// </summary>
  111. /// <param name="strGroup"></param>
  112. /// <param name="nIndex"></param>
  113. void GvlManager::removeVariable(const QString& strGroup, const int& nIndex)
  114. {
  115. VARIABLES& vars = m_Gvls[strGroup]->Variables;
  116. vars.erase(vars.begin() + nIndex);
  117. // TODO:此处可能没有释放DB触发变量的Event,对应的Task端应该需要同时删除此Event的绑定
  118. }
  119. /// <summary>
  120. /// 移除一个变量(无需释放内存)
  121. /// </summary>
  122. /// <param name="strGroup"></param>
  123. /// <param name="strName"></param>
  124. void GvlManager::removeVariable(const QString& strGroup, const QString& strName)
  125. {
  126. if (!m_Gvls.contains(strGroup))
  127. {
  128. return;
  129. }
  130. VARIABLES& vars = m_Gvls[strGroup]->Variables;
  131. for (VARIABLES::iterator iter = vars.begin(); iter != vars.end();)
  132. {
  133. if ((* iter)->strName == strName)//进行路径匹配
  134. {
  135. vars.erase(iter);//删除该行
  136. }
  137. else
  138. {
  139. iter++;
  140. }
  141. }
  142. // TODO:此处可能没有释放DB触发变量的Event,对应的Task端应该需要同时删除此Event的绑定
  143. }
  144. /// <summary>
  145. /// 变量交换顺序
  146. /// </summary>
  147. /// <param name="strGroup"></param>
  148. /// <param name="nIndex1"></param>
  149. /// <param name="nIndex2"></param>
  150. void GvlManager::exchangeVariable(const QString& strGroup, const int& nIndex1, const int& nIndex2)
  151. {
  152. VARIABLE* varTmp = m_Gvls[strGroup]->Variables[nIndex1];
  153. m_Gvls[strGroup]->Variables[nIndex1] = m_Gvls[strGroup]->Variables[nIndex2];
  154. m_Gvls[strGroup]->Variables[nIndex2] = varTmp;
  155. debugAllVariables();
  156. }
  157. /// <summary>
  158. /// /2022-3-2 绑定硬件组态指针和DB数据表
  159. /// </summary>
  160. /// <param name="pHdwTool"></param>
  161. /// <param name="strDBGroup"></param>
  162. void GvlManager::bindHdwToolAndDB(TOOL* pTool, const QString& strDBGroup)
  163. {
  164. if ((pTool == nullptr) || (pTool->pDllPtr == nullptr))
  165. {
  166. return;
  167. }
  168. DllTool* pHdwTool = pTool->pDllPtr;
  169. GVL* pDB = this->getGvl(strDBGroup);
  170. if (pDB == nullptr)
  171. {
  172. qWarning() << "Failed to find Gvl :" << strDBGroup;
  173. return;
  174. }
  175. pHdwTool->setBindDB(pDB);
  176. pTool->strHdwInstName = strDBGroup;
  177. pDB->strHdwInstName = pHdwTool->getInstanceName();
  178. // 保存对应关系
  179. m_DBToTool.insert(strDBGroup, pTool);
  180. }
  181. /// <summary>
  182. /// 2022-3-8 解绑硬件组态和指针
  183. /// (此处只是添加了函数,但是尚未调用,需要额外加一下,在删除硬件工具和删除DB数据表的时候都需要调用)
  184. /// </summary>
  185. /// <param name="pHdwTool"></param>
  186. /// <param name="strDBGroup"></param>
  187. void GvlManager::unbindHdwToolAndDB(TOOL* pTool, const QString& strDBGroup)
  188. {
  189. if ((pTool == nullptr) || (pTool->pDllPtr == nullptr))
  190. {
  191. return;
  192. }
  193. DllTool* pHdwTool = pTool->pDllPtr;
  194. // DB端解绑
  195. if (m_Gvls.contains(strDBGroup))
  196. {
  197. GVL* pDB = this->getGvl(strDBGroup);
  198. if (pDB != nullptr)
  199. {
  200. pDB->strHdwInstName.clear();
  201. }
  202. }
  203. // Dll端解绑
  204. pHdwTool->unbindDB();
  205. pTool->strHdwInstName.clear();
  206. // 移除绑定信息
  207. m_DBToTool.remove(strDBGroup);
  208. }
  209. /// <summary>
  210. /// 检查是否与本组变量重名
  211. /// </summary>
  212. /// <param name="strGroup"></param>
  213. /// <param name="newName"></param>
  214. /// <returns></returns>
  215. bool GvlManager::isDuplicated(const QString& strGroup, const QString& newName)
  216. {
  217. if (m_Gvls.find(strGroup) ==m_Gvls.end())
  218. {
  219. return false;
  220. }
  221. VARIABLES& vars = m_Gvls[strGroup]->Variables;
  222. QVectorIterator<VARIABLE*> it(vars);
  223. while (it.hasNext())
  224. {
  225. const VARIABLE* var = it.next();
  226. if (var->strName == newName)
  227. {
  228. return true;
  229. }
  230. }
  231. return false;
  232. }
  233. /// <summary>
  234. /// 检查用户输入的变量类型和数值是否匹配
  235. /// </summary>
  236. /// <param name="strGroup"></param>
  237. /// <param name="newType"></param>
  238. /// <param name="newValue"></param>
  239. /// <returns></returns>
  240. bool GvlManager::isValueValid(const QString& newType, const QString& newValue)
  241. {
  242. // 如果是字符串,那么所有的都合法
  243. if (newType == Utility::getTypeString(VALUE_TYPE::Type_String))
  244. {
  245. return true;
  246. }
  247. // 如果是bool类型,只有true false 和 1 0 合法
  248. else if (newType == Utility::getTypeString(VALUE_TYPE::Type_Bool))
  249. {
  250. if (newValue == "true" || newValue == "false" || newValue == "1" || newValue == "0")
  251. {
  252. return true;
  253. }
  254. else
  255. {
  256. return false;
  257. }
  258. }
  259. // 如果是int类型
  260. else if (newType == Utility::getTypeString(VALUE_TYPE::Type_Int))
  261. {
  262. return Utility::isIntString(newValue);
  263. }
  264. // 如果是float类型
  265. else if (newType == Utility::getTypeString(VALUE_TYPE::Type_Float))
  266. {
  267. return Utility::isFloatString(newValue);
  268. }
  269. return true;
  270. }
  271. /// <summary>
  272. /// 检查用户输入的变量类型和数值是否匹配
  273. /// </summary>
  274. /// <param name="type"></param>
  275. /// <param name="newValue"></param>
  276. /// <returns></returns>
  277. bool GvlManager::isValueValid(const VALUE_TYPE newType, const QString& newValue)
  278. {
  279. // 如果是字符串,那么所有的都合法
  280. if (newType == VALUE_TYPE::Type_String)
  281. {
  282. return true;
  283. }
  284. // 如果是bool类型,只有true false 和 1 0 合法
  285. else if (newType == VALUE_TYPE::Type_Bool)
  286. {
  287. if (newValue == "true" || newValue == "false" || newValue == "1" || newValue == "0")
  288. {
  289. return true;
  290. }
  291. else
  292. {
  293. return false;
  294. }
  295. }
  296. // 如果是int类型
  297. else if (newType == VALUE_TYPE::Type_Int)
  298. {
  299. return Utility::isIntString(newValue);
  300. }
  301. // 如果是float类型
  302. else if (newType == VALUE_TYPE::Type_Float)
  303. {
  304. return Utility::isFloatString(newValue);
  305. }
  306. return true;
  307. }
  308. /// <summary>
  309. /// 本分组是否是全局变量
  310. /// </summary>
  311. /// <param name="strGroup"></param>
  312. /// <returns></returns>
  313. bool GvlManager::isGlobalGvl(const QString& strGroup)
  314. {
  315. if (m_Gvls.contains(strGroup))
  316. {
  317. if (m_Gvls[strGroup]->Type == TOOL_TYPE::TOOL_TYPE_GLOBAL_VARIABLE)
  318. {
  319. return true;
  320. }
  321. }
  322. return false;
  323. }
  324. /// <summary>
  325. /// 本分组是否是硬件变量
  326. /// </summary>
  327. /// <param name="strGroup"></param>
  328. /// <returns></returns>
  329. bool GvlManager::isHardwareGvl(const QString& strGroup)
  330. {
  331. return (strGroup== CATEGORY_TOOL_HARDWARE);
  332. }
  333. /// <summary>
  334. /// 本分组是否是Pou局部变量
  335. /// </summary>
  336. /// <param name="strGroup"></param>
  337. /// <returns></returns>
  338. bool GvlManager::isLocalGvl(const QString& strGroup)
  339. {
  340. if (m_Gvls.contains(strGroup))
  341. {
  342. if (m_Gvls[strGroup]->Type == TOOL_TYPE::TOOL_TYPE_LOCAL_VARIABLE)
  343. {
  344. return true;
  345. }
  346. }
  347. return false;
  348. }
  349. /// <summary>
  350. /// 更新持久化状态
  351. /// </summary>
  352. /// <param name="strGroup"></param>
  353. /// <param name="nIndex"></param>
  354. /// <param name="newValue"></param>
  355. void GvlManager::updatePersit(const QString& strGroup, const int& nIndex, bool newValue)
  356. {
  357. // 有效性检查
  358. VARIABLES& vars = m_Gvls[strGroup]->Variables;
  359. if (nIndex >= vars.size())
  360. {
  361. return;
  362. }
  363. VARIABLE* var = m_Gvls[strGroup]->Variables[nIndex];
  364. // 检查值是否有变动,没有变动就不更新了
  365. if (var->bSerialized == newValue)
  366. {
  367. qDebug() << "[GVL] Change " << strGroup << "-Index: " << nIndex << " persistent, but is the same. ";
  368. return;
  369. }
  370. var->bSerialized = newValue;
  371. qDebug() << "[GVL] Change " << strGroup << "-Index: " << nIndex << " bPersit to " << newValue;
  372. debugVariable(var);
  373. }
  374. /// <summary>
  375. /// 更新Value
  376. /// </summary>
  377. /// <param name="strGroup"></param>
  378. /// <param name="nIndex"></param>
  379. /// <param name="newValue"></param>
  380. bool GvlManager::updateValue(const QString& strGroup, const int& nIndex, const QString& newValue)
  381. {
  382. // 需要跳过不显示的变量
  383. int nVarIndex = nIndex;
  384. {
  385. VARIABLES& vars = m_Gvls[strGroup]->Variables;
  386. for (int i = 0; i< vars.size(); i++)
  387. {
  388. VARIABLE* var = m_Gvls[strGroup]->Variables[i];
  389. if (!var->bShow)
  390. {
  391. nVarIndex++;
  392. }
  393. }
  394. }
  395. // 参数有效性检查
  396. VARIABLES& vars = m_Gvls[strGroup]->Variables;
  397. if (nVarIndex >= vars.size())
  398. {
  399. return false;
  400. }
  401. VARIABLE* var = m_Gvls[strGroup]->Variables[nVarIndex];
  402. // 检查值是否和类型匹配
  403. if (!this->isValueValid(var->value.type, newValue))
  404. {
  405. qDebug() << "[GVL] Change " << strGroup << "-Index: " << nVarIndex << " value, but is invalid. ";
  406. //// 也要更新值,但是这个值是一个无效值,无法使用
  407. //var->value.strValueString = newValue;
  408. //var->bValid = false;
  409. // debugVariable(var);
  410. return false;
  411. }
  412. // 可以更新值了
  413. //var->value.strValueString = newValue;
  414. var->setValue(newValue);
  415. //// 置为有效值
  416. //var->bValid = true;
  417. vDebug() << "[GVL] Change " << strGroup << "-Index: " << nVarIndex << " value to " << newValue;
  418. // 2022-9-1,由于DB变量增加了触发Task执行的特性,如果是DB变量更新,并且带有触发特性,还需要向TaskManager发送触发信号
  419. if (m_Gvls[strGroup]->gvlMode == GVL_MODE::GVL_DB)
  420. {
  421. if (var->eventTrigger != nullptr)
  422. {
  423. // 2022-9-25,由于WaitTool需要支持等待某一个值触发,所以ToolEvent中保存每次DB变量的最新值
  424. var->eventTrigger->m_triggerValue = var->value;
  425. // 发送到TaskManager触发Task执行
  426. // NOTICE:此处注意不能用postEvent,否则会自动释放掉这个事件指针造成程序崩溃
  427. QCoreApplication::sendEvent((QObject*)g_pTaskManager, var->eventTrigger);
  428. vDebug() << "[GVL] Post " << var->strFullName << " event trigger to task.";
  429. }
  430. }
  431. // debugVariable(var);
  432. return true;
  433. }
  434. /// <summary>
  435. /// 更新Comment
  436. /// </summary>
  437. /// <param name="strGroup"></param>
  438. /// <param name="nIndex"></param>
  439. /// <param name="newComment"></param>
  440. bool GvlManager::updateComment(const QString& strGroup, const int& nIndex, const QString& newComment)
  441. {
  442. // 需要跳过不显示的变量
  443. int nVarIndex = nIndex;
  444. {
  445. VARIABLES& vars = m_Gvls[strGroup]->Variables;
  446. for (int i = 0; i < vars.size(); i++)
  447. {
  448. VARIABLE* var = m_Gvls[strGroup]->Variables[i];
  449. if (!var->bShow)
  450. {
  451. nVarIndex++;
  452. }
  453. }
  454. }
  455. // 参数有效性检查
  456. VARIABLES& vars = m_Gvls[strGroup]->Variables;
  457. if (nVarIndex >= vars.size())
  458. {
  459. return false;
  460. }
  461. VARIABLE* var = m_Gvls[strGroup]->Variables[nVarIndex];
  462. // 检查值是否有变动,没有变动就不更新了
  463. if (var->strComment == newComment)
  464. {
  465. qDebug() << "[GVL] Change " << strGroup << "-Index: " << nVarIndex << " value, but is the same. ";
  466. return true;
  467. }
  468. var->strComment = newComment;
  469. qDebug() << "[GVL] Change " << strGroup << "-Index: " << nVarIndex << " Comment to " << newComment;
  470. debugVariable(var);
  471. return true;
  472. }
  473. /// <summary>
  474. /// 更新通讯地址(仅DB模式)
  475. /// </summary>
  476. /// <param name="strGroup"></param>
  477. /// <param name="nIndex"></param>
  478. /// <param name="newAddress"></param>
  479. /// <returns></returns>
  480. bool GvlManager::updateDbCommAddress(const QString& strGroup, const int& nIndex, const QString& newAddress)
  481. {
  482. // 参数有效性检查
  483. VARIABLES& vars = m_Gvls[strGroup]->Variables;
  484. if (nIndex >= vars.size())
  485. {
  486. return false;
  487. }
  488. VARIABLE* var = m_Gvls[strGroup]->Variables[nIndex];
  489. // 检查值是否有变动,没有变动就不更新了
  490. if (var->strCommAddress == newAddress)
  491. {
  492. qDebug() << "[GVL] Change " << strGroup << "-Index: " << nIndex << " value, but is the same. ";
  493. return true;
  494. }
  495. var->strCommAddress = newAddress;
  496. qDebug() << "[GVL] Change " << strGroup << "-Index: " << nIndex << " Comment to " << newAddress;
  497. debugVariable(var);
  498. return true;
  499. }
  500. /// <summary>
  501. /// 输出一个全局变量的详细信息(For Debug)
  502. /// </summary>
  503. /// <param name="var"></param>
  504. void GvlManager::debugVariable(const VARIABLE* var)
  505. {
  506. qDebug() << "[" << var->parent()->strName << "] - " << var->strName
  507. <<"(Persis: " << var->bSerialized << ")"
  508. << "\n\t[Type] - " << Utility::getTypeString(var->value.type)
  509. << "\n\t[Value] - " << var->getValueString()
  510. // << "\n\t[ValueString] - " << var->value.strValueString
  511. << "\n\t[Comment] - " << var->strComment;
  512. }
  513. /// <summary>
  514. /// 输出目前所有的全局变量信息
  515. /// </summary>
  516. void GvlManager::debugAllVariables()
  517. {
  518. QMapIterator<QString, GVL*> it(m_Gvls);
  519. qDebug() << "================ All Variables =========================";
  520. while (it.hasNext())
  521. {
  522. qDebug() << "Group: " << it.next().key();
  523. const GVL* gvl = it.value();
  524. QVectorIterator<VARIABLE*> it2(gvl->Variables);
  525. while (it2.hasNext())
  526. {
  527. const VARIABLE* var = it2.next();
  528. qDebug() << "\t" << var->strName << " - " << var->bSerialized
  529. << " " << Utility::getTypeString(var->value.type)
  530. << " " << var->getValueString() << " " << var->strComment;
  531. }
  532. }
  533. qDebug() << "=============================================================\n";
  534. }
  535. /// <summary>
  536. /// 根据名字获取指定变量
  537. /// </summary>
  538. /// <param name="strGroupName"></param>
  539. /// <param name="strVarName"></param>
  540. /// <returns></returns>
  541. VARIABLE* GvlManager::getVariableByName(const QString& strGroupName, const QString& strVarName)
  542. {
  543. if (m_Gvls.contains(strGroupName))
  544. {
  545. const VARIABLES& vars = m_Gvls[strGroupName]->Variables;
  546. for (auto var : vars)
  547. {
  548. if (var->strName == strVarName)
  549. {
  550. return var;
  551. }
  552. }
  553. }
  554. return nullptr;
  555. }
  556. /// <summary>
  557. /// 根据名字获取指定的默认值
  558. /// </summary>
  559. /// <param name="strValueName"></param>
  560. /// <returns></returns>
  561. const VARIABLE* GvlManager::getDefaultValueByName(const QString& strValueName) const
  562. {
  563. return m_defaultValueGvl->getInterfaceByName(strValueName);
  564. }
  565. /// <summary>
  566. /// 获取本分组的变量数
  567. /// </summary>
  568. /// <param name="strGroupName"></param>
  569. /// <returns></returns>
  570. int GvlManager::getVariablesCountByGroup(const QString& strGroupName)
  571. {
  572. if (m_Gvls.contains(strGroupName))
  573. {
  574. return m_Gvls[strGroupName]->Variables.size();
  575. }
  576. else
  577. {
  578. return 0;
  579. }
  580. }
  581. /// <summary>
  582. /// 2022-9-1 获取全部带有Event触发特性的变量
  583. /// </summary>
  584. /// <returns></returns>
  585. QHash<QString, VARIABLE*> GvlManager::getAllEventVariables()
  586. {
  587. QHash<QString, VARIABLE*> eventVars;
  588. QMapIterator<QString, GVL*> it(m_Gvls);
  589. while (it.hasNext())
  590. {
  591. // 取出每一个变量组
  592. const GVL* pGvl = it.next().value();
  593. // 取出本变量组中的变量
  594. const VARIABLES& vars = pGvl->Variables;
  595. // 遍历所有变量,找到具有触发机制的变量,添加到界面中
  596. for (VARIABLE* var : vars)
  597. {
  598. if (var->eventTrigger != nullptr)
  599. {
  600. eventVars.insert(var->strFullName, var);
  601. }
  602. }
  603. }
  604. return eventVars;
  605. }
  606. /// <summary>
  607. /// 获取需要序列化的分组(跳过系统内置变量)
  608. /// </summary>
  609. /// <returns></returns>
  610. QList<GVL*> GvlManager::getAllSerializedGvls()
  611. {
  612. QList<GVL*> gvls;
  613. QMapIterator<QString, GVL*> it(m_Gvls);
  614. while (it.hasNext())
  615. {
  616. // 需要跳过系统内置变量和硬件变量
  617. if (it.next().key() != GROUP_NAME_SYSTEM
  618. && it.key() != GROUP_NAME_HARDWARE
  619. && it.key() != GROUP_NAME_DEFAULVALUE
  620. )
  621. {
  622. gvls.push_back(it.value());
  623. }
  624. }
  625. return gvls;
  626. }
  627. /// <summary>
  628. /// 删除指定Pou分组
  629. /// </summary>
  630. /// <param name="strGroupName"></param>
  631. void GvlManager::removeGvl(const QString& strGroupName)
  632. {
  633. // 2022-2-22 ,此处如果是SYSTEM分组的话,需要跳过(这种情况应该不会出现才对)
  634. if (strGroupName == GROUP_NAME_SYSTEM)
  635. {
  636. qWarning() << "[Warning] VariablesManager::removeVariablesGroup - name: System Group";
  637. return;
  638. }
  639. // 删除变量组
  640. m_Gvls.remove(strGroupName);
  641. // 删除变量表格
  642. m_GvlTables.remove(strGroupName);
  643. // TODO: 是否需要清空相关内存?
  644. }
  645. /// <summary>
  646. /// 2021-11-13 接收表格中的变量刷新显示Event
  647. /// </summary>
  648. /// <param name="event"></param>
  649. void GvlManager::customEvent(QEvent* event)
  650. {
  651. // 只处理数值同步消息
  652. if (event->type() == VALUE_EVENT_TYPEID)
  653. {
  654. qDebug() << "UiManager::event - VALUE_EVENT";
  655. SyncValueEvent* pValueEvent = dynamic_cast<SyncValueEvent*> (event);
  656. // 取出参数
  657. QList<VARIABLE*> syncValues = pValueEvent->getSyncValues();
  658. for (VARIABLE* syncVal : syncValues)
  659. {
  660. // 2022-3-23处理,如果是Port类型的话,这里的strFullName是错误的
  661. // this->syncValueToTable(syncVal->strFullName, syncVal->getValueString());
  662. if (syncVal->isBinded())
  663. {
  664. this->syncValueToTable(syncVal->pBindInterface->strFullName, syncVal->getValueString());
  665. }
  666. else
  667. {
  668. this->syncValueToTable(syncVal->strFullName, syncVal->getValueString());
  669. }
  670. }
  671. }
  672. }
  673. /// <summary>
  674. /// 将变量同步更新到Table中
  675. /// </summary>
  676. /// <param name="strFullName"></param>
  677. void GvlManager::syncValueToTable(const QString& strFullName, const QString& strValueString)
  678. {
  679. WindowAppVariableTable* pTableUI =
  680. qobject_cast<WindowAppVariableTable*>(this->m_GvlTables.value( strFullName));
  681. if (pTableUI != nullptr)
  682. {
  683. // pTableUI->updateTableValue(pDownLinks[i]->strFullName, pDownLinks[i]->getValueString());
  684. pTableUI->updateTableValue(strFullName, strValueString);
  685. }
  686. else
  687. {
  688. // 2022-2-17
  689. qDebug() << "[DEBUG] VariablesManager::syncValueToTable - updateTableValue failed, reason: pTableUI is nullptr.";
  690. }
  691. }
  692. /// <summary>
  693. /// 数据结构重置
  694. /// </summary>
  695. void GvlManager::reset()
  696. {
  697. // m_Variables.clear();
  698. // 2022-2-22修改,重置时需要跳过SYSTEM分组和硬件组态分组
  699. for (GVLS::iterator it = m_Gvls.begin(); it != m_Gvls.end();)
  700. {
  701. if (it.key() != GROUP_NAME_SYSTEM
  702. && it.key() != GROUP_NAME_HARDWARE
  703. && it.key() != GROUP_NAME_DEFAULVALUE
  704. )
  705. {
  706. // 删除分组之前,需要清理DB 组的绑定状态
  707. if (it.value()->gvlMode == GVL_MODE::GVL_DB)
  708. {
  709. QString strGvlName = it.value()->strName;
  710. TOOL* pTool = getHdwToolByDbName(strGvlName);
  711. g_pGvlManager->unbindHdwToolAndDB(pTool, strGvlName);
  712. }
  713. it = m_Gvls.erase(it);
  714. }
  715. else
  716. {
  717. it++;
  718. }
  719. }
  720. // TODO: 因为没有SYSTEM分组的变量表格显示,所以可以全部清除,如果后面有了SYSTEM变量表格也就需要细分一下了
  721. m_GvlTables.clear();
  722. // 重置SYSTEM分组变量的值
  723. thePrefs.m_nRunningCount = 0;
  724. thePrefs.m_strProjectPath = DEFAULT_PROJECT_PATH;
  725. thePrefs.m_strProjectName = DEFAULT_PROJECT_NAME;
  726. }
  727. /// <summary>
  728. /// 2022-2-15 创建内置的全局变量组(System)
  729. /// </summary>
  730. void GvlManager::initSystemGvl()
  731. {
  732. // int nIndex = getVariablesCountByGroup(GROUP_NAME_SYSTEM);
  733. // 2022-3-2, 首先创建对应的系统变量组
  734. this->addNewGroup(GROUP_NAME_SYSTEM, TOOL_TYPE::TOOL_TYPE_GLOBAL_VARIABLE, GVL_MODE::GVL_BASIC);
  735. int nIndex = 0;
  736. // 系统运行计数
  737. VARIABLE* pNewVariable = new VARIABLE(
  738. GROUP_NAME_SYSTEM,
  739. false,
  740. SYSTEMVAR_NAME_EXECCOUNT,
  741. "int",
  742. "0",
  743. SYSTEMVAR_CHNAME_EXECCOUNT,
  744. nIndex,
  745. true
  746. );
  747. this->addNewVariable(GROUP_NAME_SYSTEM, pNewVariable);
  748. // 系统项目名称
  749. pNewVariable = new VARIABLE(
  750. GROUP_NAME_SYSTEM,
  751. false,
  752. SYSTEMVAR_NAME_PROJECTNAME,
  753. "QString",
  754. "",
  755. SYSTEMVAR_CHNAME_PROJECTNAME,
  756. nIndex ++,
  757. true
  758. );
  759. this->addNewVariable(GROUP_NAME_SYSTEM, pNewVariable);
  760. // 系统项目路径
  761. pNewVariable = new VARIABLE(
  762. GROUP_NAME_SYSTEM,
  763. false,
  764. SYSTEMVAR_NAME_PROJECTPATH,
  765. "QString",
  766. "",
  767. SYSTEMVAR_CHNAME_PROJECTPATH,
  768. nIndex ++,
  769. true
  770. );
  771. this->addNewVariable(GROUP_NAME_SYSTEM, pNewVariable);
  772. // 系统时间
  773. pNewVariable = new VARIABLE(
  774. GROUP_NAME_SYSTEM,
  775. false,
  776. SYSTEMVAR_NAME_TIME,
  777. "QString",
  778. "00:00:00",
  779. SYSTEMVAR_CHNAME_TIME,
  780. nIndex ++,
  781. true
  782. );
  783. this->addNewVariable(GROUP_NAME_SYSTEM, pNewVariable);
  784. // 开机时长
  785. pNewVariable = new VARIABLE(
  786. GROUP_NAME_SYSTEM,
  787. false,
  788. SYSTEMVAR_NAME_RUNTIME,
  789. "QString",
  790. "00:00:00",
  791. SYSTEMVAR_CHNAME_RUNTIME,
  792. nIndex ++,
  793. true
  794. );
  795. this->addNewVariable(GROUP_NAME_SYSTEM, pNewVariable);
  796. // 2022-2-20,将必要的变量绑定至全局变量SYSTEM组中
  797. this->bindSystemGvl();
  798. }
  799. /// <summary>
  800. /// 2022-2-20 绑定SYSTEM全局变量和类中的关键变量
  801. /// </summary>
  802. void GvlManager::bindSystemGvl()
  803. {
  804. VARIABLE* pVar = getVariableByName(GROUP_NAME_SYSTEM, SYSTEMVAR_NAME_EXECCOUNT);
  805. pVar->value.setValueByAddress((void**)&thePrefs.m_nRunningCount);
  806. pVar = getVariableByName(GROUP_NAME_SYSTEM, SYSTEMVAR_NAME_PROJECTNAME);
  807. pVar->value.setValueByAddress((void**)&thePrefs.m_strProjectName);
  808. pVar = getVariableByName(GROUP_NAME_SYSTEM, SYSTEMVAR_NAME_PROJECTPATH);
  809. pVar->value.setValueByAddress((void**)& thePrefs.m_strProjectPath);
  810. pVar = getVariableByName(GROUP_NAME_SYSTEM, SYSTEMVAR_NAME_TIME);
  811. pVar->value.setValueByAddress((void**)&thePrefs.m_strSystemTime);
  812. pVar = getVariableByName(GROUP_NAME_SYSTEM, SYSTEMVAR_NAME_RUNTIME);
  813. pVar->value.setValueByAddress((void**)&thePrefs.m_strLiveTime);
  814. }
  815. /// <summary>
  816. /// 2022-3-7 创建默认值的变量组,例如 0,"" 等等(DefaultValue)
  817. /// (目前只有复杂控件的DataLink在使用,本组变量是只读的,不允许修改)
  818. /// </summary>
  819. void GvlManager::initDefaultValues()
  820. {
  821. // 2022-3-2, 首先创建对应的默认值变量组
  822. m_defaultValueGvl = new GVL(GROUP_NAME_DEFAULVALUE, TOOL_TYPE::TOOL_TYPE_GLOBAL_VARIABLE, GVL_MODE::GVL_STANDARD);
  823. int nIndex = 0;
  824. // int型的默认值
  825. VARIABLE* pNewVariable = new VARIABLE(
  826. GROUP_NAME_DEFAULVALUE,
  827. false,
  828. DEFAULT_VALUE_0,
  829. "int",
  830. "0",
  831. "",
  832. nIndex,
  833. false
  834. );
  835. this->addNewDefaultVariable(pNewVariable);
  836. // QString的默认值
  837. pNewVariable = new VARIABLE(
  838. GROUP_NAME_DEFAULVALUE,
  839. false,
  840. DEFAULT_VALUE_NULLSTRING,
  841. "QString",
  842. "",
  843. "",
  844. nIndex++,
  845. false
  846. );
  847. this->addNewDefaultVariable(pNewVariable);
  848. }
  849. ///// <summary>
  850. ///// 数据结构序列化
  851. ///// </summary>
  852. ///// <param name="output"></param>
  853. ///// <param name="w"></param>
  854. ///// <returns></returns>
  855. //QDataStream& operator<<(QDataStream& out, const GvlManager& w)
  856. //{
  857. // Q_UNUSED(w);
  858. //
  859. // return out;
  860. //}
  861. ///// <summary>
  862. ///// 数据结构反序列化
  863. ///// </summary>
  864. ///// <param name="input"></param>
  865. ///// <param name="w"></param>
  866. ///// <returns></returns>
  867. //QDataStream& operator>>(QDataStream& in, GvlManager& w)
  868. //{
  869. // Q_UNUSED(w);
  870. //
  871. // return in;
  872. //}