#pragma once #include "register_address.h" #include "register_value_type.h" #include #include #include // 监控读数的可用状态 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 &addresses() const; const std::vector &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 addresses_; std::vector points_; };