/** * @file GlobalResource.cpp * @author * @brief 全局轴资源管理 — 持有并管理所有轴实例 * @version 0.1 * @date 2026-07-03 * * @copyright Copyright (c) 2026 * */ #include "GlobalResource.h" #include #include #include namespace { // 轴实例存储 — 拥有所有轴的内存 std::vector g_axes; // 快速查找表:id → AXIS_REF& (指向 g_axes 中的元素) std::unordered_map g_indexMap; // 线程安全 std::mutex g_mutex; // id 不存在时返回的哨兵 plcopen::AXIS_REF g_invalidRef{0, "", nullptr}; } // namespace plcopen::AXIS_REF& CreateAxis(plcopen::UINT id, const std::string& name) { std::lock_guard lock(g_mutex); // id 已存在 → 返回已有轴的引用 auto it = g_indexMap.find(id); if (it != g_indexMap.end()) { return g_axes[it->second].ref(); } // 新建轴 g_axes.emplace_back(id, name); std::size_t idx = g_axes.size() - 1; g_indexMap[id] = idx; return g_axes[idx].ref(); } plcopen::AXIS_REF& GetAxisRefById(plcopen::UINT id) { std::lock_guard lock(g_mutex); auto it = g_indexMap.find(id); if (it != g_indexMap.end()) { return g_axes[it->second].ref(); } g_invalidRef.axisNo = id; g_invalidRef.axis = nullptr; return g_invalidRef; }