GvlManager.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #pragma once
  2. #include "Common.h"
  3. // 各个列的编号
  4. // 标准模式
  5. #define GVL_COL_INDEX 0
  6. #define GVL_COL_NAME 1
  7. #define GVL_COL_TYPE 2
  8. #define GVL_COL_VALUE 3
  9. #define GVL_COL_SERIALIZED 4
  10. #define GVL_COL_COMMENT 5
  11. // DB模式
  12. #define DB_COL_INDEX 0
  13. #define DB_COL_NAME 1
  14. #define DB_COL_TYPE 2
  15. #define DB_COL_VALUE 3
  16. #define DB_COL_ADDRESS 4
  17. #define DB_COL_ACCESS 5
  18. #define DB_COL_COMMENT 6
  19. // 默认值名字
  20. #define DEFAULT_VALUE_0 "DEFAULT_VALUE_0"
  21. #define DEFAULT_VALUE_NULLSTRING "DEFAULT_VALUE_NULLSTRING"
  22. /// <summary>
  23. /// 用于管理变量的类(包括全局变量和局部变量)
  24. /// 每一个组都类似于一个命名空间,不同命名空间的是可以重名的
  25. /// 局部变量也可以和全局变量重名,只要不在一个命名空间即可
  26. /// </summary>
  27. class Document;
  28. class GvlManager : public QObject
  29. {
  30. Q_OBJECT;
  31. // 单例模式
  32. private:
  33. GvlManager();
  34. public:
  35. // 获取实例
  36. static GvlManager* getInstance()
  37. {
  38. if (m_pGvlManager == nullptr)
  39. {
  40. m_pGvlManager = new GvlManager();
  41. }
  42. return m_pGvlManager;
  43. }
  44. public:
  45. // 添加新的变量组
  46. GVL* addNewGroup(const QString& strGroup,
  47. TOOL_TYPE varType,
  48. GVL_MODE gvlMode
  49. );
  50. // 添加新的变量
  51. bool addNewVariable(
  52. const QString& strGroup,
  53. VARIABLE* pNewVar
  54. );
  55. // 2022-3-8添加新的默认变量(和正常变量分开存储)
  56. bool addNewDefaultVariable(VARIABLE* pNewVar);
  57. // 绑定UI和变量
  58. void bindUIAndVariable(QTableWidget* pTable, QString& strVarFullName);
  59. // 获取全部的变量
  60. GVLS* getAllGvls()
  61. {
  62. return &m_Gvls;
  63. }
  64. // 2022-9-1 获取全部带有Event触发特性的变量
  65. QHash<QString, VARIABLE*> getAllEventVariables();
  66. // 获取需要序列化的分组(跳过系统内置变量)
  67. QList<GVL*> getAllSerializedGvls();
  68. // 获取指定的变量分组(含全局和局部变量)
  69. GVL* getGvl(const QString& strGroupName)
  70. {
  71. return m_Gvls.value(strGroupName);
  72. }
  73. //// 获取指定分组中的序列化变量(含全局和局部变量)
  74. //QVector<VARIABLE*> getSerializedVariablesByGroup(const QString& strGroupName);
  75. // 根据名字获取指定变量
  76. VARIABLE* getVariableByName(const QString& strGroupName, const QString& strVarName);
  77. // 根据名字获取指定的默认值
  78. const VARIABLE* getDefaultValueByName(const QString& strValueName) const;
  79. // 获取本分组的变量数
  80. int getVariablesCountByGroup(const QString& strGroupName);
  81. // 删除指定变量分组
  82. void removeGvl(const QString& strGroupName);
  83. // 数据结构重置
  84. void reset();
  85. // 删除一个变量(并释放内存)
  86. void delVariable(const QString& strGroup, const int& nIndex);
  87. // 移除一个变量(无需释放内存)
  88. void removeVariable(const QString& strGroup, const int& nIndex);
  89. // 移除一个变量(无需释放内存)
  90. void removeVariable(const QString& strGroup, const QString& strName);
  91. // 变量交换顺序
  92. void exchangeVariable(const QString& strGroup, const int& nIndex1, const int& nIndex2);
  93. // 2022-3-2 绑定硬件组态指针和DB数据表
  94. void bindHdwToolAndDB(TOOL* pTool, const QString& strDBGroup);
  95. // 2022-3-8 解绑硬件组态和指针
  96. // (此处只是添加了函数,但是尚未调用,需要额外加一下,在删除硬件工具和删除DB数据表的时候都需要调用)
  97. void unbindHdwToolAndDB(TOOL* pTool, const QString& strDBGroup);
  98. // 根据DB的名字找到对应的Dll指针
  99. TOOL* getHdwToolByDbName(const QString& strDbGroup)
  100. {
  101. return m_DBToTool.value(strDbGroup);
  102. }
  103. //// 更新序号
  104. //void updateIndex(const QString& strGroup, const int& nIndex, const QString& newValue);
  105. //// 更新变量名字
  106. //void updateName(const QString& strGroup, const int& nIndex, const QString& newName);
  107. // 更新持久化状态
  108. void updatePersit(const QString& strGroup, const int& nIndex, bool newValue);
  109. // 更新Value
  110. bool updateValue(const QString& strGroup, const int& nIndex, const QString& newValue);
  111. // 更新Comment
  112. bool updateComment(const QString& strGroup, const int& nIndex, const QString& newComment);
  113. // 更新通讯地址(仅DB模式)
  114. bool updateDbCommAddress(const QString& strGroup, const int& nIndex, const QString& newAddress);
  115. // 检查是否与本组变量重名
  116. bool isDuplicated(const QString& strGroup, const QString& newName);
  117. // 检查用户输入的变量类型和数值是否匹配
  118. bool isValueValid(const QString& newType, const QString& newValue);
  119. bool isValueValid(const VALUE_TYPE newType, const QString& newValue);
  120. // 获取指定变量的引用计数
  121. int getRefCount(const QString& strGroup, const int& nIndex)
  122. {
  123. return m_Gvls[strGroup]->Variables[nIndex]->nRefCount;
  124. }
  125. // 本分组是否是全局变量分组
  126. bool isGlobalGvl(const QString& strGroup);
  127. // 本分组是否是硬件变量分组
  128. bool isHardwareGvl(const QString& strGroup);
  129. // 本分组是否是Pou局部变量分组
  130. bool isLocalGvl(const QString& strGroup);
  131. // 输出一个全局变量的详细信息
  132. void debugVariable(const VARIABLE* var);
  133. // 输出目前所有的全局变量信息
  134. void debugAllVariables();
  135. // 数据结构序列化
  136. // friend QDataStream& operator<<(QDataStream& out, const GvlManager& w);
  137. // 数据结构反序列化
  138. // friend QDataStream& operator>>(QDataStream& in, GvlManager& w);
  139. protected slots:
  140. // 2021-11-13 接收表格中的变量刷新显示Event
  141. virtual void customEvent(QEvent* event) override;
  142. private:
  143. // 将变量同步更新到Table中
  144. void syncValueToTable(const QString& strFullName, const QString& strValueString);
  145. // 2022-2-15 创建内置的全局变量组(System)
  146. void initSystemGvl();
  147. // 2022-2-20 绑定SYSTEM全局变量和类中的关键变量
  148. void bindSystemGvl();
  149. // 2022-3-7 创建默认值的变量组(DefaultValue)
  150. // (目前只有复杂控件的DataLink在使用,本组变量是只读的,不允许修改)
  151. void initDefaultValues();
  152. //// 设置变量数值的模板函数
  153. //template<class T>
  154. //void setValue(T value, VARIABLE_VALUE& varValue);
  155. //// 检查变量是否已经Valid
  156. //void updateValueValid(
  157. // const QString& strGroup,
  158. // const int& nIndex,
  159. // const QString& newType,
  160. // const QString& newValue
  161. //);
  162. //// 输出一个全局变量的详细信息(For Debug)
  163. //void debugVariable(const VARIABLE* var);
  164. //// 输出目前所有的全局变量信息
  165. //void debugAllVariables();
  166. private:
  167. // 变量集合(Key为分组的名字,Value为本分组所有的变量信息,按照序号排列)
  168. GVLS m_Gvls;
  169. // 默认值的变量集合(为了和正常的变量区分开,单独分组)
  170. GVL* m_defaultValueGvl;
  171. // 变量名称与界面指针对应关系(用于变量数据同步在表格中的更新)
  172. QMap<QString, QTableWidget*> m_GvlTables;
  173. static GvlManager* m_pGvlManager;
  174. // 2022-3-8 增加,保存DB和Dll指针的对应关系,用于DB数据变动后及时通知Dll工具
  175. QMap<QString, TOOL*> m_DBToTool;
  176. };