综合平台编程器项目的远程存储
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

60 строки
1.7 KiB

  1. #pragma once
  2. #include "register_address.h"
  3. #include "register_value_type.h"
  4. #include <cstddef>
  5. #include <cstdint>
  6. #include <vector>
  7. // 监控读数的可用状态
  8. enum class MonitorValueState
  9. {
  10. Valid,
  11. Unavailable,
  12. CommunicationFault
  13. };
  14. // 一个监控行的地址、可用性和当前值
  15. struct MonitorValue
  16. {
  17. RegisterAddress address{RegisterArea::M, 0};
  18. RegisterDataType dataType = RegisterDataType::Int16;
  19. int endAddress = 0;
  20. MonitorValueState state = MonitorValueState::Unavailable;
  21. bool bitValue = false;
  22. std::int16_t wordValue = 0;
  23. float floatValue = 0.0f;
  24. };
  25. struct MonitorPoint
  26. {
  27. RegisterAddress address{RegisterArea::M, 0};
  28. RegisterDataType dataType = RegisterDataType::Int16;
  29. };
  30. // 运行期间由用户临时维护的监控地址列表,不写入工程文件
  31. class RegisterMonitorModel
  32. {
  33. public:
  34. static constexpr std::size_t kMaximumItemCount = 64U;
  35. // 返回当前按添加顺序保存的地址
  36. const std::vector<RegisterAddress> &addresses() const;
  37. const std::vector<MonitorPoint> &points() const;
  38. // 判断地址是否已经在监控列表中
  39. bool contains(const MonitorPoint &point) const;
  40. // 添加一个地址;重复或超过上限时返回 false
  41. bool add(const MonitorPoint &point);
  42. // 删除一个地址;地址不存在时返回 false
  43. bool remove(const RegisterAddress &address);
  44. // 删除一个精确的监控点;地址相同但类型不同的点互不影响
  45. bool remove(const MonitorPoint &point);
  46. // 清空当前会话的监控列表
  47. void clear();
  48. private:
  49. mutable std::vector<RegisterAddress> addresses_;
  50. std::vector<MonitorPoint> points_;
  51. };