VisionPlus.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359
  1. #pragma once
  2. #include <QString>
  3. #include <QVector>
  4. #include <QDebug>
  5. #include <QEvent>
  6. #include <QMutex>
  7. #include <QWaitCondition>
  8. #include <QColor>
  9. #include <QDateTime>
  10. #include <QMetaEnum>
  11. #include <HalconCpp.h>
  12. using namespace HalconCpp;
  13. #include "opencv2/opencv.hpp"
  14. using namespace cv;
  15. class TOOL;
  16. class DllTool;
  17. // 硬件组态的工具分类名字
  18. #define CATEGORY_TOOL_HARDWARE ("硬件工具")
  19. ////========================================================
  20. ////
  21. //// ENUM
  22. ////
  23. ////========================================================
  24. /// <summary>
  25. /// 管理系统中所有的枚举类型(逐步添加中,方便使用Q_ENUM管理)
  26. /// </summary>
  27. class VPEnum : public QObject
  28. {
  29. public:
  30. /// <summary>
  31. /// 线程的优先级
  32. /// </summary>
  33. enum class PRIORITY : short
  34. {
  35. IdlePriority,
  36. LowestPriority,
  37. LowPriority,
  38. NormalPriority,
  39. HighPriority,
  40. HighestPriority,
  41. TimeCriticalPriority,
  42. InheritPriority
  43. };
  44. Q_ENUM(PRIORITY);
  45. /// <summary>
  46. /// Tool工作状态
  47. /// </summary>
  48. enum class EXEC_STATUS : short
  49. {
  50. Wait, // 等待事件中
  51. Busy, // 执行中
  52. Done, // 执行完毕
  53. StandBy // 就绪状态,表示工具尚未执行
  54. };
  55. Q_ENUM(EXEC_STATUS)
  56. /// <summary>
  57. /// Tool执行的返回值
  58. /// </summary>
  59. enum class RETURN_VALUE : short
  60. {
  61. Success = 0, // 工具执行成功
  62. Error, // 工具执行错误
  63. Invalid, // 工具无效 或被禁用
  64. Timeout, // 工具执行超时
  65. Goto, // 返回跳转信号
  66. Abort, // 2022-9-5 因为各种原因,放弃执行此工具
  67. None // 无状态,表示工具尚未执行
  68. };
  69. Q_ENUM(RETURN_VALUE)
  70. /// <summary>
  71. /// 全局变量的读写模式(仅DB模式使用)
  72. /// </summary>
  73. enum class GVL_ACCESS_MODE : short
  74. {
  75. All,
  76. ReadOnly,
  77. WriteOnly
  78. };
  79. Q_ENUM(GVL_ACCESS_MODE)
  80. };
  81. // 基础模式中包括的类型数量
  82. #define GVL_BASIC_TYPE_COUNT 5
  83. // 标准模式中包括的类型数量
  84. #define GVL_STANDARD_TYPE_COUNT 28
  85. /// <summary>
  86. /// 数据类型定义
  87. /// </summary>
  88. enum class VALUE_TYPE : short
  89. {
  90. Type_Bool = 0, //bool
  91. Type_Int, //int
  92. Type_Float, //float
  93. Type_Double, //double
  94. Type_String, //QString
  95. Type_StdString, //std::string
  96. Type_QImage, //QImage
  97. Type_Mat, //Mat
  98. Type_HTuple, //HTuple
  99. Type_HObject, //HObject
  100. Type_HImage, //HImage
  101. Type_ST_Pos, //HTuple_Pos
  102. Type_ST_HomMat2D, //HTuple_HomMat2D
  103. Type_ST_Point, //HTuple_Point
  104. Type_ST_Line, //HTuple_Line
  105. Type_ST_Circle, //HTuple_Circle
  106. Type_ST_Disp, //HTuple_Disp
  107. Type_ST_Window, //HTuple_Window
  108. Type_ST_Ncc_Modle, //HTuple_Ncc_Modle
  109. Type_ST_Shape_Modle, //HTuple_Shape_Modle
  110. Type_ST_Calibration, //HTuple_Calibration
  111. Type_ST_CamParam_PoseCalib, //HTuple_CamParam_PoseCalib
  112. Type_pIBaseCamera, //IBaseCamera*
  113. Type_pIpImage, //lpImage*
  114. Type_pISocket, //ISocket*
  115. Type_pArrayIn, //ArrayIn*
  116. Type_pArrayOut, //ArrayOut*
  117. Type_pArrayRobotPos, //ArrayRobotPos*
  118. Control_Base = 100,
  119. Control_Label,
  120. Control_Button,
  121. Control_CheckBox,
  122. Control_RadioBox,
  123. Control_Groupbox,
  124. Control_Image,
  125. Control_LineEdit,
  126. Control_Listbox,
  127. Control_ComboBox,
  128. Control_Value,
  129. Control_PieChart,
  130. Control_CustomPlot,
  131. Control_Table,
  132. Control_Result,
  133. Control_Widget,
  134. // Type_Event, // 2022-9-3 废弃,统一到接口的 INF_EVENT 类型中
  135. Type_Tool,
  136. Type_Unknown
  137. };
  138. /// <summary>
  139. /// 数据类型定义
  140. /// 此处对应DataStructure.h中的 VALUE_TYPE 顺序,要确保双方顺序同步
  141. /// </summary>
  142. const static QStringList valueString =
  143. {
  144. "bool", // 0
  145. "int", // 1
  146. "float", // 2
  147. "double", // 3
  148. "QString", // 4
  149. "std::string", // 5
  150. "QImage", // 6
  151. "Mat", // 7
  152. "HTuple", // 8
  153. "HObject", // 9
  154. "HImage", // 10
  155. "HPos", // 11
  156. "HTuple_HomMat2D", // 12
  157. "HTuple_Point", // 13
  158. "HTuple_Line", // 14
  159. "HTuple_Circle", // 15
  160. "HTuple_Disp", // 16
  161. "HTuple_Window", // 17
  162. "HTuple_Ncc_Modle", // 18
  163. "HTuple_Shape_Modle", // 19
  164. "HTuple_Calibration", // 20
  165. "HTuple_CamParam_PoseCalib", // 21
  166. "IBaseCamera*", // 22
  167. "lpImage*", // 23
  168. "ISocket*", // 24
  169. "ArrayIn*", // 25
  170. "ArrayOut*", // 26
  171. "ArrayRobotPos*", // 27
  172. // 28
  173. "ControlBase", // 100
  174. "QLabel", // 101
  175. "QPushButton", // 102
  176. "QCheckBox", // 103
  177. "QRadioButton", // 104
  178. "QGroupBox", // 105
  179. "QImage", // 106
  180. "QLineEdit", // 107
  181. "QListWidget", // 108
  182. "QComboBox", // 109
  183. "ValueControl", // 110
  184. "PieChart", // 111
  185. "WaveChart", // 112
  186. "TableControl", // 113
  187. "Result", // 114
  188. "QWidget", // 115
  189. "QEvent",
  190. "Tool",
  191. "Unknown"
  192. };
  193. /// <summary>
  194. /// 输入输出类型
  195. /// </summary>
  196. enum class INF_DIRECTION : short
  197. {
  198. INF_DIR_IN = 1, // 输入接口
  199. INF_DIR_OUT = 2, // 输出接口
  200. INF_DIR_BOTH = 3, // 双向接口(全局变量)
  201. INF_DIR_UNKNOWN,
  202. };
  203. /// <summary>
  204. /// 端口废弃类型
  205. /// </summary>
  206. enum class INF_DISCARD : short
  207. {
  208. INF_DEFAULT = 0, // 默认值(未废弃,正常使用的端口)
  209. INF_MARK_DELETE = 1, // 接口被删除
  210. INF_MARK_DISCARD = 2, // 接口被标记为废弃
  211. INF_MARK_CHANGE = 3 // 接口被修改(常因为端口的类型被修改)
  212. };
  213. /// <summary>
  214. /// 工具总体类型(工具、控件或者变量)
  215. /// </summary>
  216. enum class TOOL_TYPE : short
  217. {
  218. TOOL_TYPE_STANDARD, // 标准工具
  219. TOOL_TYPE_PORT_INPUT, // 输入端口工具
  220. TOOL_TYPE_PORT_OUTPUT, // 输出端口工具
  221. TOOL_TYPE_GLOBAL_VARIABLE, // 全局变量
  222. TOOL_TYPE_LOCAL_VARIABLE, // 局部变量
  223. TOOL_TYPE_GOTO, // 跳转工具
  224. TOOL_TYPE_COMMENT, // 2022-3-13,注释工具
  225. TOOL_TYPE_PARALLEL, // 2022-4-18,并行计算工具
  226. TOOL_TYPE_FORLOOP, // 2022-8-21,For循环工具
  227. TOOL_TYPE_WAIT, // 2022-9-2,Wait工具
  228. TOOL_TYPE_UNKNOWN
  229. };
  230. /// <summary>
  231. /// 接口总体类型
  232. /// </summary>
  233. enum class INF_TYPE : short
  234. {
  235. INF_TYPE_STANDARD, // 标准接口
  236. INF_TYPE_VALUE, // 数值接口(全局变量,局部变量)
  237. INF_TYPE_CONTROL, // 控件接口
  238. INF_TYPE_TOOL, // 2022-8-21 Tool接口,包括输入和输出两种
  239. INF_TYPE_EVENT, // 2021-7-27 增加,Event类型接口
  240. INF_TYPE_UNKNOWN
  241. };
  242. /// <summary>
  243. /// 值的传递方式
  244. /// </summary>
  245. enum class VALUE_PASS_MODE : short
  246. {
  247. PASS_BY_VALUE,
  248. PASS_BY_ADDRESS,
  249. PASS_BY_UNKNOWN
  250. };
  251. /// <summary>
  252. /// Tool的运行模式
  253. /// </summary>
  254. enum class TOOL_RUN_MODE : short
  255. {
  256. SINGLE_STEP, // 单步执行
  257. STANDALONE, // 独立运行(仅运行本工具)
  258. SEQUENTIAL, // 顺序执行(任务中,或者ExecuteAll执行)
  259. IN_PARALLEL, // 在并行工具中执行
  260. IN_FORLOOP // 在For工具中执行
  261. };
  262. /// <summary>
  263. /// Task的运行模式
  264. /// </summary>
  265. enum class TASK_RUN_MODE : short
  266. {
  267. RUN_LOOP, // 循环执行
  268. RUN_ONCE, // 单次执行
  269. RUN_STOP // 退出执行
  270. };
  271. // 更新值的工作模式
  272. enum class UPDATE_VALUE_MODE : short
  273. {
  274. MODE_FROM_TOOL, // 从Tool接口中更新
  275. MODE_FROM_VARIABLE, // 从变量中读取
  276. MODE_TO_VARIABLE // 写入到变量中
  277. };
  278. /// <summary>
  279. /// 2022-2-15增加,变量模式(局部变量统一为BASIC模式,全局变量分三种模式)
  280. /// </summary>
  281. enum class GVL_MODE : short
  282. {
  283. GVL_BASIC, // 基础模式(基础类型)
  284. GVL_STANDARD, // 标准模式(全类型)
  285. GVL_SYSTEM, // 系统类型(内置类型,不可编辑)
  286. GVL_DB, // 共享内存模式
  287. GVL_UNKNOWN // 无效的模式
  288. };
  289. ////========================================================
  290. ////
  291. //// STRUCT
  292. ////
  293. ////========================================================
  294. /// <summary>
  295. /// Pou、Tool的运行参数
  296. /// </summary>
  297. typedef struct _tagExecutionParameters
  298. {
  299. int nExecTime; // 执行总时长(ms)
  300. int nExecCount; // 执行次数
  301. int nErrorCount; // 错误次数
  302. int nPreDelay; // 前延时(ms,仅Tool使用)
  303. int nPostDelay; // 后延时(ms)
  304. VPEnum::EXEC_STATUS nStatus; // 工具执行状态
  305. VPEnum::RETURN_VALUE nRetValue; // 工具的执行返回值(默认为未执行状态)
  306. _tagExecutionParameters()
  307. {
  308. this->reset();
  309. }
  310. void reset()
  311. {
  312. nExecTime = 0;
  313. nExecCount = 0;
  314. nErrorCount = 0;
  315. nPreDelay = 0;
  316. nPostDelay = 0;
  317. nRetValue = VPEnum::RETURN_VALUE::None;
  318. nStatus = VPEnum::EXEC_STATUS::StandBy;
  319. }
  320. } EXEC_PARAMS;
  321. /// <summary>
  322. /// Task 的运行参数
  323. /// </summary>
  324. typedef struct _tagTaskParameters : public EXEC_PARAMS
  325. {
  326. bool bWatchDog; // 是否启用看门狗(仅Task使用)
  327. int nWatchDog; // 看门狗的设置数值(ms, 仅Task使用)
  328. VPEnum::PRIORITY nPriority; // 优先级
  329. int nTriggerFailedCount; // 触发失败次数
  330. TASK_RUN_MODE runMode; // 运行模式
  331. _tagTaskParameters()
  332. {
  333. bWatchDog = true;
  334. nWatchDog = 200;
  335. nPriority = VPEnum::PRIORITY::NormalPriority;
  336. runMode = TASK_RUN_MODE::RUN_LOOP;
  337. nPostDelay = 200;
  338. nTriggerFailedCount = 0;
  339. }
  340. } TASK_PARAMS;
  341. //============================================================
  342. //
  343. // Value
  344. //
  345. //============================================================
  346. /// <summary>
  347. /// 接口的值信息
  348. /// </summary>
  349. class VALUE
  350. {
  351. public:
  352. VALUE()
  353. {
  354. type = VALUE_TYPE::Type_Unknown;
  355. passMode = VALUE_PASS_MODE::PASS_BY_VALUE;
  356. Ptr = nullptr;
  357. }
  358. /// <summary>
  359. /// 重载 =
  360. /// </summary>
  361. /// <param name="v"></param>
  362. /// <returns></returns>
  363. VALUE& operator = (const VALUE& v)
  364. {
  365. if (this != &v)
  366. {
  367. this->type = v.type;
  368. this->passMode = v.passMode;
  369. this->Ptr = v.Ptr;
  370. // this->strValueString = v.strValueString;
  371. }
  372. return *this;
  373. }
  374. // 2022-3-25 清空Value
  375. void clear()
  376. {
  377. this->passMode = VALUE_PASS_MODE::PASS_BY_VALUE;
  378. this->type = VALUE_TYPE::Type_Unknown;
  379. this->Ptr = nullptr;
  380. }
  381. public:
  382. VALUE_TYPE type; // 值类型
  383. VALUE_PASS_MODE passMode; // 值的传递方式
  384. void** Ptr; // 接口的值指针
  385. };
  386. //============================================================
  387. //
  388. // Interface
  389. //
  390. //============================================================
  391. /// <summary>
  392. /// // 用于存储工具库中的工具接口静态信息
  393. // (设计思路变更:让初始化加载的静态工具信息和加入POU执行的运行时工具信息分开)
  394. /// </summary>
  395. class STATIC_INTERFACE
  396. {
  397. public:
  398. STATIC_INTERFACE()
  399. {
  400. reset();
  401. }
  402. void reset()
  403. {
  404. strName.clear();
  405. Direction = INF_DIRECTION::INF_DIR_UNKNOWN;
  406. Discard = INF_DISCARD::INF_DEFAULT;
  407. Type = INF_TYPE::INF_TYPE_STANDARD;
  408. nIndex = -1;
  409. bEnable = true;
  410. bDynamic = false;
  411. bShowName = true;
  412. // eventTrigger = nullptr;
  413. value.clear();
  414. }
  415. public:
  416. QString strName; // 接口名称
  417. INF_TYPE Type; // 接口的类别
  418. INF_DIRECTION Direction; // 接口的输入输出类型
  419. INF_DISCARD Discard; // 该端口已经废弃的标志
  420. // (备注:指在dll已经删除的端口,但是为了向下兼容,旧版本依然会加载。功能上会用黑色的端口显示)
  421. VALUE value; // 接口的值信息
  422. int nIndex; // 接口的序号
  423. bool bEnable; // 是否启用此接口
  424. bool bDynamic; // 是否是动态接口
  425. bool bShowName; // 是否在界面中显示接口名称(Goto的输入接口,以及Start接口等,在界面中是不显示名称的)
  426. };
  427. using DLL_INF = class STATIC_INTERFACE;
  428. /// <summary>
  429. /// 用于存储接口的运行时信息
  430. // 2021-5-20调整,将TOOL和全局变量组整合到一起
  431. // 每一个变量数据就相当于是一个接口
  432. /// </summary>
  433. using GVL = class TOOL;
  434. class ToolEvent;
  435. class _INTERFACE : public STATIC_INTERFACE
  436. {
  437. public:
  438. _INTERFACE* pUpLinkInterface; // 上联的Interface
  439. QVector<_INTERFACE*> pDownLinkInterfaces; // 下联的Interface(下联接口会有多个)
  440. _INTERFACE* pBindInterface; // 绑定的Interface(仅用于Port类型工具)
  441. QString strFullName; // 接口的全名(toolname.interfacename)
  442. QString strPropertyName; // 2022-1-18增加,变量在属性表中的属性名字(仅用于属性表)
  443. QString strNameWithType; // 2021-10-14增加,为了方便在界面中直接显示接口类型,加了一个以<type>为结尾的名字
  444. bool bWatch; // 是否启用变量监控,默认不启用,可在工具中配置默认状态
  445. QString strComment; // 2021-5-20增加,接口的注释信息(仅变量)
  446. bool bSerialized; // 2021-5-20增加,是否进行值序列化(仅变量)
  447. bool bShow; // 2022-2-15增加,是否显示数值(仅变量)
  448. int nRefCount; // 引用计数(接口/变量)
  449. bool bDataLink; // 2021-11-9,是否与Runtime做了数据链接
  450. QString valueString; // 2021-11-9,尝试性增加了本接口的数值字符串为了提高代码效率
  451. bool bComplexLinkIndex; // 2021-12-14,是否被作为复杂控件的索引数值
  452. // (备注:当索引数值变动时,需要向Runtime推送当前索引所有数据的变动通知)
  453. VPEnum::GVL_ACCESS_MODE accessMode; // 2022-2-26,变量存取权限(仅DB模式全局变量会用到)
  454. QString strCommAddress; // 2022-2-26,通信地址(仅DB模式全局变量会用到)
  455. ToolEvent* eventTrigger; // 2022-9-1,增加变量数值的变动通知(因为增加了变量变动触发Task的动作)
  456. protected:
  457. // 2022-3-23,防止此指针的错误使用,设置为私有
  458. // 正确的用法应该是用 realParent() 获取真实的父工具(因为存在接口或者变量绑定到别的Tool中的情况)
  459. TOOL* pParentTool; // 从属的工具
  460. };
  461. // 增加一些同名名称
  462. using VARIABLE = class _INTERFACE;
  463. using VARIABLES = QVector<_INTERFACE*>;
  464. //============================================================
  465. //
  466. // Tool
  467. //
  468. //============================================================
  469. ///////////////////////////////////////////////////////////
  470. // 工具基础信息
  471. class TOOL_BASE_INFO
  472. {
  473. public:
  474. TOOL_TYPE Type; // 工具的类型
  475. QString strPouName; // 2021.7.4 增加,工具所属的Pou名字(Tool的分组,变量是所在的Gvl的名字)
  476. QString strName; // 工具名称
  477. QString strAliasName; // 曾用名或者别名
  478. QString strInstanceName; // 工具的实例名字
  479. QString strCategory; // 工具所在的集合
  480. QString strVersion; // 工具的版本
  481. QString strInfo; // 工具的Info
  482. QString strComment; // 工具的注释信息
  483. };
  484. ///////////////////////////////////////////////////////////
  485. // 用于存储工具库中的工具的静态信息
  486. class TOOL;
  487. class STATIC_TOOL : public TOOL_BASE_INFO
  488. {
  489. public:
  490. STATIC_TOOL()
  491. {
  492. Type = TOOL_TYPE::TOOL_TYPE_UNKNOWN;
  493. }
  494. // 2022-10-14,从TOOL中提取基础信息生成STATIC_TOOL(目前用于Undo体系中记录工具原始信息)
  495. STATIC_TOOL(const TOOL* tool);
  496. //// 2022-10-1,编写拷贝构造函数,完成工具原始信息的深度拷贝(目前用于Undo结构中)
  497. //STATIC_TOOL(const STATIC_TOOL& toolInfo);
  498. //// 2022-10-1,重载 = 运算符,完成工具原始信息的深度拷贝(目前用于Undo结构中)
  499. //STATIC_TOOL& operator = (const STATIC_TOOL& toolInfo);
  500. public:
  501. QString strDllPath; // 实现本工具的dll
  502. QVector<STATIC_INTERFACE> staticInterfaces; // 接口的静态信息
  503. };
  504. using ToolActivator = QWaitCondition;
  505. ///////////////////////////////////////////////////////////
  506. // 用于存储Tool的运行时信息
  507. class TOOL : public TOOL_BASE_INFO
  508. {
  509. public:
  510. DllTool* pDllPtr; // 工具Dll运行的实例指针
  511. TOOL* parentTool; // 2022-4-18,本工具所属的工具组(目前只有并行工具组)
  512. QVector<_INTERFACE*> Interfaces; // Tool的标准接口
  513. QVector<_INTERFACE*> ToolInterfaces; // 2022-8-21 改动,将Tool接口定义为了数组,方便扩展
  514. // 目前总共有两个Tool级别接口
  515. #define INF_START 0
  516. #define INF_END 1
  517. #define TOOL_INTERFACE_COUNT 2
  518. #define startInterface ToolInterfaces[INF_START]
  519. #define endInterface ToolInterfaces[INF_END]
  520. // _INTERFACE* pBindInterface; // Port绑定的源接口的指针(仅Port类型)
  521. #define Variables Interfaces // (仅变量类型使用)
  522. // 工具执行的相关参数
  523. bool bEnable; // 是否启用本工具
  524. int nIndex; // 工具的执行序号
  525. bool bEnableBreakPoint; // 启用断点
  526. EXEC_PARAMS execParams; // 执行参数
  527. GVL_MODE gvlMode; // 全局变量的模式(仅用于变量)
  528. // DllTool* pHdwDllPtr; // 2022-3-2,本DB数据绑定的硬件工具(仅用于DB模式变量)
  529. QString strHdwInstName; // 本DB数据绑定的硬件工具实例名称(仅用于DB模式变量)
  530. // bool bParallelized; // 2022-5-4,是否加入了并行组(2022-8-28去掉,改为运行时实时判定)
  531. // ToolEvent* eventTrigger; // 2022-9-3,Tool也加入了Event触发机制(用于给Wait工具使用)
  532. QMutex mutex; // Tool与Event对应的互斥量,用于等待事件触发
  533. ToolActivator activator; // 2022-9-3,TaskManager中用于触发Tool的事件(目前用于Wait工具)
  534. };
  535. // 变量组
  536. using GVLS = QMap<QString, GVL*>;
  537. //============================================================
  538. //
  539. // Task、Event
  540. //
  541. //============================================================
  542. /// <summary>
  543. /// ToolEvent中的执行方式
  544. /// </summary>
  545. enum class TOOL_EVENT_TYPE : short
  546. {
  547. TOOL_TRIGGER, // 触发执行某个工具
  548. TASK_TRIGGER, // 触发执行Task
  549. //TOOL_TRIGGER_BY_VALUE, // 按照等于某个值时触发工具
  550. //TASK_TRIGGER_BY_VALUE // 按照等于某个值时触发Task(暂未实现)
  551. };
  552. /// <summary>
  553. /// 工具中的事件接口类型
  554. /// </summary>
  555. class ToolEvent : public QEvent
  556. {
  557. public:
  558. ToolEvent() :
  559. // QEvent((QEvent::Type)QEvent::registerEventType(QEvent::User + genRandNumber(0, 60000)));
  560. // 此处似乎不需要随机生成ID,系统会从MaxUser开始自动往下分配
  561. QEvent((QEvent::Type)QEvent::registerEventType())
  562. {
  563. m_exType = TOOL_EVENT_TYPE::TASK_TRIGGER;
  564. }
  565. // QEvent((QEvent::Type)QEvent::registerEventType(QEvent::User + genRandNumber(0, 60000)));
  566. // 此处似乎不需要随机生成ID,系统会从MaxUser开始自动往下分配
  567. // 这个ID号是
  568. ToolEvent(const QString& strGroupName, const QString& strName, TOOL_EVENT_TYPE type) :
  569. QEvent((QEvent::Type)QEvent::registerEventType())
  570. {
  571. setName(strGroupName, strName);
  572. m_exType = type;
  573. }
  574. ~ToolEvent() {};
  575. // 设定Event的名字(Tool.Interface的全名以及GroupName)
  576. void setName(const QString& strGroupName, const QString& strName)
  577. {
  578. this->m_strGroupName = strGroupName;
  579. this->m_strEventName = strName;
  580. }
  581. // 设定Event的GroupName(默认都是 HARDWARE_GROUP_NAME,以防万一需要扩展,还是保存一下 )
  582. // 获取Event的名字
  583. QString name() const
  584. {
  585. return m_strEventName;
  586. }
  587. // 获取GroupName
  588. QString groupName() const
  589. {
  590. return m_strGroupName;
  591. }
  592. void setExType(TOOL_EVENT_TYPE type)
  593. {
  594. m_exType = type;
  595. }
  596. TOOL_EVENT_TYPE getExType() const
  597. {
  598. return m_exType;
  599. }
  600. // 2022-9-25 为了实现等于某个值的事件触发增加
  601. VALUE m_triggerValue;
  602. protected:
  603. QString m_strEventName;
  604. QString m_strGroupName;
  605. TOOL_EVENT_TYPE m_exType = TOOL_EVENT_TYPE::TASK_TRIGGER;
  606. public:
  607. // 事件携带的返回值
  608. VPEnum::RETURN_VALUE ret = VPEnum::RETURN_VALUE::Success;
  609. };
  610. // 设置别名
  611. using TaskActivator = QWaitCondition;
  612. using EVENT_ID = QEvent::Type;
  613. /// <summary>
  614. /// 用于UI、Runtime和Dll同步的消息
  615. /// </summary>
  616. enum class UI_SYNC_MSG : short
  617. {
  618. EDIT_TEXT_CHANGED,
  619. COMBO_SEL_CHANGED,
  620. LIST_SEL_CHANGED,
  621. CHECKBOX_CHANGED,
  622. RADIOBOX_CHANGED,
  623. VALUE_CHANGED,
  624. UNKNOWN_MSG
  625. };
  626. /// <summary>
  627. /// 控件到Runtime的同步事件(每次仅一个控件同步)
  628. /// </summary>
  629. #define CONTROL_EVENT_TYPEID QEvent::Type::User + 10
  630. class SyncControlEvent : public QEvent
  631. {
  632. public:
  633. SyncControlEvent() :
  634. QEvent(eventType())
  635. {
  636. }
  637. ~SyncControlEvent() {};
  638. static Type eventType()
  639. {
  640. // 创建事件Type
  641. if (m_EventType == QEvent::None)
  642. {
  643. m_EventType = (QEvent::Type)QEvent::registerEventType(CONTROL_EVENT_TYPEID);
  644. }
  645. return m_EventType;
  646. }
  647. // 待同步的控件句柄
  648. QWidget* m_pSrcControl = nullptr;
  649. // 待同步的控件事件类型
  650. UI_SYNC_MSG m_SyncMsg = UI_SYNC_MSG::UNKNOWN_MSG;
  651. private:
  652. static Type m_EventType;
  653. };
  654. /// <summary>
  655. /// 数值到Runtime的同步事件(WindowRuntime用)
  656. /// 同时也作为动态接口到Pou的同步事件(UiManager用)
  657. /// 同时也作为全局变量在表格中的变动通知(GvlManager用)
  658. /// </summary>
  659. #define VALUE_EVENT_TYPEID QEvent::Type::User + 11
  660. class SyncValueEvent : public QEvent
  661. {
  662. public:
  663. SyncValueEvent() :
  664. QEvent(eventType())
  665. {
  666. }
  667. ~SyncValueEvent() {};
  668. static Type eventType()
  669. {
  670. // 创建事件Type
  671. if (m_EventType == QEvent::None)
  672. {
  673. m_EventType = (QEvent::Type)QEvent::registerEventType(VALUE_EVENT_TYPEID);
  674. }
  675. return m_EventType;
  676. }
  677. // 待同步数据项
  678. void addSyncValue(VARIABLE* val)
  679. {
  680. m_SyncValues.push_back(val);
  681. }
  682. QList<VARIABLE*> getSyncValues() const
  683. {
  684. return m_SyncValues;
  685. }
  686. void setSyncValues(const QList<VARIABLE*>& listInf)
  687. {
  688. m_SyncValues = listInf;
  689. }
  690. private:
  691. static Type m_EventType;
  692. // Value(一个或多个)
  693. QList<VARIABLE*> m_SyncValues;
  694. };
  695. /// <summary>
  696. /// 硬件数值接口到Runtime的同步事件
  697. /// </summary>
  698. #define HDVALUE_EVENT_TYPEID QEvent::Type::User + 12
  699. class SyncHdValueEvent : public QEvent
  700. {
  701. public:
  702. SyncHdValueEvent() :
  703. QEvent(eventType())
  704. {
  705. }
  706. ~SyncHdValueEvent() {};
  707. // 设定Event的 GroupName
  708. void setGroupName(const QString& strGroupName)
  709. {
  710. this->m_strGroupName = strGroupName;
  711. }
  712. // 获取GroupName
  713. QString groupName() const
  714. {
  715. return m_strGroupName;
  716. }
  717. static Type eventType()
  718. {
  719. // 创建事件Type
  720. if (m_EventType == QEvent::None)
  721. {
  722. m_EventType = (QEvent::Type)QEvent::registerEventType(HDVALUE_EVENT_TYPEID);
  723. }
  724. return m_EventType;
  725. }
  726. // 需要同步的硬件接口信息
  727. // 第一种同步方式,按实例名和接口名同步
  728. QString m_strInstanceName; // 实例名称
  729. QString m_strInfName; // 接口名称
  730. // 第二种同步方式:直接按数值指针同步
  731. void* m_pSrcValue = nullptr; // 接口数值指针
  732. protected:
  733. QString m_strGroupName;
  734. private:
  735. static Type m_EventType;
  736. };
  737. /// <summary>
  738. /// 动态接口到Pou的同步事件
  739. /// </summary>
  740. #define DLLINF_EVENT_TYPEID QEvent::Type::User + 13
  741. class SyncInterfaceEvent : public QEvent
  742. {
  743. public:
  744. SyncInterfaceEvent() :
  745. QEvent(eventType())
  746. {
  747. }
  748. ~SyncInterfaceEvent() {};
  749. static Type eventType()
  750. {
  751. // 创建事件Type
  752. if (m_EventType == QEvent::None)
  753. {
  754. m_EventType = (QEvent::Type)QEvent::registerEventType(DLLINF_EVENT_TYPEID);
  755. }
  756. return m_EventType;
  757. }
  758. // 待同步动态接口
  759. void addSyncInterface(const DLL_INF val)
  760. {
  761. m_SyncDllInfs.push_back(val);
  762. }
  763. QList<DLL_INF> getSyncInterfaces() const
  764. {
  765. return m_SyncDllInfs;
  766. }
  767. void setSyncValues(const QList<DLL_INF> listInf)
  768. {
  769. m_SyncDllInfs = listInf;
  770. }
  771. // 待同步接口的工具实例名称
  772. QString m_strInstanceName;
  773. // true 是增加, false 是删除
  774. bool m_bAdd = true;
  775. // 执行结果
  776. bool m_bSuccess = false;
  777. // 原因(如果出错)
  778. QString m_strReason;
  779. private:
  780. static Type m_EventType;
  781. // Interface(一个或多个)
  782. QList<DLL_INF> m_SyncDllInfs;
  783. };
  784. typedef struct _tagDisplay
  785. {
  786. public:
  787. HObject ho_Obj;
  788. QColor Color;
  789. double fTransparency;
  790. int nLinsWhite;
  791. public:
  792. _tagDisplay()
  793. {
  794. nLinsWhite = 0;
  795. fTransparency = 0;
  796. }
  797. _tagDisplay(HObject obj, QColor color = qRgb(255, 0, 0), double fTransparency = 0.0, int nLinsWhite = 1)
  798. {
  799. this->ho_Obj = obj;
  800. this->Color = color;
  801. this->fTransparency = fTransparency;
  802. this->nLinsWhite = nLinsWhite;
  803. }
  804. void setObject(HObject obj, QColor color = qRgb(255, 0, 0), double fTransparency = 0.0, int nLinsWhite = 1)
  805. {
  806. this->ho_Obj = obj;
  807. this->Color = color;
  808. this->fTransparency = fTransparency;
  809. this->nLinsWhite = nLinsWhite;
  810. }
  811. void Clear()
  812. {
  813. this->ho_Obj.Clear();
  814. this->Color = qRgb(255, 0, 0);
  815. this->fTransparency = 0.0;
  816. this->nLinsWhite = 1;
  817. }
  818. _tagDisplay& operator =(const _tagDisplay& disp)
  819. {
  820. if (this != &disp)
  821. {
  822. this->ho_Obj = disp.ho_Obj;
  823. this->Color = disp.Color;
  824. this->fTransparency = disp.fTransparency;
  825. this->nLinsWhite = disp.nLinsWhite;
  826. }
  827. return *this;
  828. }
  829. } ST_Display;
  830. typedef struct _tagMessage
  831. {
  832. public:
  833. HTuple hv_Msg;
  834. int nX;
  835. int nY;
  836. int nMsgSize;
  837. QColor Color;
  838. public:
  839. _tagMessage()
  840. {
  841. Clear();
  842. }
  843. _tagMessage(HTuple hvMsg, QColor color = qRgb(255, 0, 0), int nX = 10, int nY = 10, int nMsgSize = 10)
  844. {
  845. this->hv_Msg = hvMsg;
  846. this->Color = color;
  847. this->nX = nX;
  848. this->nY = nY;
  849. this->nMsgSize = nMsgSize;
  850. }
  851. void setMsg(HTuple hvMsg, QColor color = qRgb(255, 0, 0), int nX = 10, int nY = 10, int nMsgSize = 10)
  852. {
  853. this->hv_Msg = hvMsg;
  854. this->Color = color;
  855. this->nX = nX;
  856. this->nY = nY;
  857. this->nMsgSize = nMsgSize;
  858. }
  859. void Clear()
  860. {
  861. hv_Msg.Clear();
  862. this->Color = qRgb(255, 0, 0);
  863. this->nX = 10;
  864. this->nY = 10;
  865. this->nMsgSize = 10;
  866. }
  867. _tagMessage& operator =(const _tagMessage& msg)
  868. {
  869. if (this != &msg)
  870. {
  871. this->hv_Msg = msg.hv_Msg;
  872. this->Color = msg.Color;
  873. this->nX = msg.nX;
  874. this->nY = msg.nY;
  875. this->nMsgSize = msg.nMsgSize;
  876. }
  877. return *this;
  878. }
  879. }ST_Message;
  880. typedef struct _tagDebugLog
  881. {
  882. public:
  883. QString strName;
  884. QString strLog;
  885. public:
  886. _tagDebugLog()
  887. {
  888. Clear();
  889. }
  890. _tagDebugLog(QString strName, QString strLog)
  891. {
  892. this->strName = strName;
  893. this->strLog = strLog;
  894. }
  895. void Clear()
  896. {
  897. this->strName = "";
  898. this->strLog = "";
  899. }
  900. _tagDebugLog& operator =(const _tagDebugLog& log)
  901. {
  902. if (this != &log)
  903. {
  904. this->strName = log.strName;
  905. this->strLog = log.strLog;
  906. }
  907. return *this;
  908. }
  909. }ST_DebugLog;
  910. /// <summary>
  911. /// 用于Debug输出的结构体
  912. /// </summary>
  913. typedef struct _tagDebugData
  914. {
  915. public:
  916. _tagDebugData()
  917. {
  918. Clear();
  919. }
  920. void Clear()
  921. {
  922. listDisplay.clear();
  923. listMessage.clear();
  924. listDebugLog.clear();
  925. }
  926. void addImage(HImage img)
  927. {
  928. ho_Image = img;
  929. }
  930. void addObj(HObject obj, QColor color = qRgb(255, 0, 0), double fTransparency = 0.0, int nLinsWhite = 1)
  931. {
  932. ST_Display disp(obj, color, fTransparency, nLinsWhite);
  933. listDisplay.push_back(disp);
  934. }
  935. void addMsg(HTuple hvMsg, QColor color = qRgb(255, 0, 0), int nX = 10, int nY = 10, int nMsgSize = 10)
  936. {
  937. ST_Message msg(hvMsg, color, nX, nY, nMsgSize);
  938. listMessage.push_back(msg);
  939. }
  940. void addLog(QString strName = "NULL", QString strLog = "Log")
  941. {
  942. ST_DebugLog debuglog(strName, strLog);
  943. listDebugLog.push_back(debuglog);
  944. }
  945. _tagDebugData& operator =(const _tagDebugData& data)
  946. {
  947. if (this != &data)
  948. {
  949. this->ho_Image = data.ho_Image;
  950. this->listDisplay = data.listDisplay;
  951. this->listMessage = data.listMessage;
  952. this->listDebugLog = data.listDebugLog;
  953. }
  954. return *this;
  955. }
  956. HImage getImage()
  957. {
  958. return ho_Image;
  959. }
  960. ST_Display getDisplay(int index)
  961. {
  962. ST_Display disp;
  963. if ((index >= 0) && (index < listDisplay.size()))
  964. {
  965. disp = listDisplay[index];
  966. }
  967. return disp;
  968. }
  969. ST_Message getMessage(int index)
  970. {
  971. ST_Message msg;
  972. if ((index >= 0) && (index < listMessage.size()))
  973. {
  974. msg = listMessage[index];
  975. }
  976. return msg;
  977. }
  978. ST_DebugLog getDebugLog(int index)
  979. {
  980. ST_DebugLog log;
  981. if ((index >= 0) && (index < listDebugLog.size()))
  982. {
  983. log = listDebugLog[index];
  984. }
  985. return log;
  986. }
  987. int getDisplaySize()
  988. {
  989. return listDisplay.size();
  990. }
  991. int getMessageSize()
  992. {
  993. return listMessage.size();
  994. }
  995. int getDebugLogSize()
  996. {
  997. return listDebugLog.size();
  998. }
  999. protected:
  1000. HImage ho_Image;
  1001. QList<ST_Display> listDisplay;
  1002. QList<ST_Message> listMessage;
  1003. QList<ST_DebugLog> listDebugLog;
  1004. } DebugData;