综合平台编程器项目的远程存储
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

126 lines
3.2 KiB

  1. #pragma once
  2. #include "register_address.h"
  3. #include <cstdint>
  4. #include <optional>
  5. #include <string>
  6. #include <variant>
  7. #include <vector>
  8. enum class ContactMode
  9. {
  10. NormallyOpen,
  11. NormallyClosed
  12. };
  13. enum class CoilMode
  14. {
  15. Normal,
  16. Set,
  17. Reset
  18. };
  19. enum class ComparisonOperator
  20. {
  21. Equal,
  22. NotEqual,
  23. LessThan,
  24. LessThanOrEqual,
  25. GreaterThan,
  26. GreaterThanOrEqual
  27. };
  28. struct ContactNodeConfig
  29. {
  30. RegisterAddress address{RegisterArea::M, 0};
  31. ContactMode mode = ContactMode::NormallyOpen;
  32. };
  33. struct CoilNodeConfig
  34. {
  35. RegisterAddress address{RegisterArea::M, 0};
  36. CoilMode mode = CoilMode::Normal;
  37. };
  38. struct CompareNodeConfig
  39. {
  40. RegisterAddress address{RegisterArea::D, 0};
  41. ComparisonOperator comparison = ComparisonOperator::Equal;
  42. std::int16_t value = 0;
  43. };
  44. using LogicNodeConfig = std::variant<ContactNodeConfig, CoilNodeConfig, CompareNodeConfig>;
  45. struct LogicNode
  46. {
  47. std::string id;
  48. LogicNodeConfig config;
  49. bool configured = true;
  50. bool validate(std::string *error = nullptr) const;
  51. bool isConfigured() const;
  52. bool isCondition() const;
  53. bool isOutput() const;
  54. };
  55. enum class ConditionExpressionKind
  56. {
  57. Node,
  58. Series,
  59. Parallel
  60. };
  61. // 结构化表达式只允许合法的串并联拓扑,不保存可产生悬空线或环路的像素连接
  62. struct ConditionExpression
  63. {
  64. std::string id;
  65. ConditionExpressionKind kind = ConditionExpressionKind::Node;
  66. std::optional<LogicNode> node;
  67. std::vector<ConditionExpression> children;
  68. static ConditionExpression fromNode(LogicNode node);
  69. bool validate(std::string *error = nullptr) const;
  70. bool validateForRunning(std::string *error = nullptr) const;
  71. };
  72. // 删除后折叠单子项容器并合并相邻同类容器,保持表达式的规范形态
  73. void normalizeConditionExpression(std::optional<ConditionExpression> *expression);
  74. const LogicNode *findConditionNode(
  75. const ConditionExpression &expression, const std::string &node_id);
  76. LogicNode *findConditionNode(
  77. ConditionExpression &expression, const std::string &node_id);
  78. const ConditionExpression *findConditionExpression(
  79. const ConditionExpression &expression, const std::string &expression_id);
  80. ConditionExpression *findConditionExpression(
  81. ConditionExpression &expression, const std::string &expression_id);
  82. void collectConditionNodes(
  83. const ConditionExpression &expression, std::vector<const LogicNode *> *nodes);
  84. void collectConditionExpressionIds(
  85. const ConditionExpression &expression, std::vector<std::string> *ids);
  86. // 一个网络包含一棵结构化条件表达式,输出线圈固定在最右侧
  87. struct LadderRung
  88. {
  89. std::string id;
  90. std::string name;
  91. std::optional<ConditionExpression> condition;
  92. std::optional<LogicNode> output;
  93. bool validate(std::string *error = nullptr) const;
  94. bool validateStructure(std::string *error = nullptr) const;
  95. bool validateForRunning(std::string *error = nullptr) const;
  96. };
  97. struct ControlLogic
  98. {
  99. std::string id;
  100. std::string name;
  101. std::vector<LadderRung> rungs;
  102. bool enabled = true;
  103. bool validate(std::string *error = nullptr) const;
  104. bool validateStructure(std::string *error = nullptr) const;
  105. bool validateForRunning(std::string *error = nullptr) const;
  106. };