|
- #pragma once
-
- #include "register_address.h"
- #include "register_value_type.h"
-
- #include <cstddef>
- #include <cstdint>
- #include <vector>
-
- // 监控读数的可用状态
- enum class MonitorValueState
- {
- Valid,
- Unavailable,
- CommunicationFault
- };
-
- // 一个监控行的地址、可用性和当前值
- struct MonitorValue
- {
- RegisterAddress address{RegisterArea::M, 0};
- RegisterDataType dataType = RegisterDataType::Int16;
- int endAddress = 0;
- MonitorValueState state = MonitorValueState::Unavailable;
- bool bitValue = false;
- std::int16_t wordValue = 0;
- float floatValue = 0.0f;
- };
-
- struct MonitorPoint
- {
- RegisterAddress address{RegisterArea::M, 0};
- RegisterDataType dataType = RegisterDataType::Int16;
- };
-
- // 运行期间由用户临时维护的监控地址列表,不写入工程文件
- class RegisterMonitorModel
- {
- public:
- static constexpr std::size_t kMaximumItemCount = 64U;
-
- // 返回当前按添加顺序保存的地址
- const std::vector<RegisterAddress> &addresses() const;
- const std::vector<MonitorPoint> &points() const;
- // 判断地址是否已经在监控列表中
- bool contains(const MonitorPoint &point) const;
- // 添加一个地址;重复或超过上限时返回 false
- bool add(const MonitorPoint &point);
- // 删除一个地址;地址不存在时返回 false
- bool remove(const RegisterAddress &address);
- // 删除一个精确的监控点;地址相同但类型不同的点互不影响
- bool remove(const MonitorPoint &point);
- // 清空当前会话的监控列表
- void clear();
-
- private:
- mutable std::vector<RegisterAddress> addresses_;
- std::vector<MonitorPoint> points_;
- };
|