| | |
| | | #include "CJobDataC.h" |
| | | #include "CJobDataS.h" |
| | | #include "ServoCommo.h" |
| | | #include "ProcessJob.h" |
| | | #include "CParam.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | /// 数据项:时间戳 + 数值 |
| | | struct SVDataItem { |
| | | std::chrono::system_clock::time_point timestamp; |
| | | double value; // 或者根据实际情况使用其他类型 |
| | | |
| | | SVDataItem(std::chrono::system_clock::time_point ts, double val) |
| | | : timestamp(ts), value(val) {} |
| | | }; |
| | | |
| | | /// PJ 生命周期(贴近 E40 常见状态) |
| | | enum class GlsState : uint8_t { |
| | | NoState = 0, |
| | | Queued, |
| | | InProcess, |
| | | Paused, |
| | | Completed, |
| | | Aborted, |
| | | Failed |
| | | }; |
| | | |
| | | class CGlass : public CContext |
| | | { |
| | | public: |
| | |
| | | public: |
| | | virtual std::string& getClassName(); |
| | | virtual std::string toString(); |
| | | MaterialsType getType(); |
| | | short getCassetteSequenceNo() const { return m_jobDataS.getCassetteSequenceNo(); } |
| | | short getJobSequenceNo() const { return m_jobDataS.getJobSequenceNo(); } |
| | | MaterialsType getType() const; |
| | | void setType(MaterialsType type); |
| | | void setID(const char* pszID); |
| | | std::string& getID(); |
| | | CPath* getPathWithEq(unsigned int nEqId, unsigned int nUnit); |
| | | const std::string& getID() const; |
| | | void setOriginPort(int port, int slot); |
| | | void getOrginPort(int& port, int& slot); |
| | | BOOL isScheduledForProcessing(); |
| | | void setScheduledForProcessing(BOOL bProcessing); |
| | | CProcessJob* getProcessJob(); |
| | | void setProcessJob(CProcessJob* pProcessJob); |
| | | CPath* getPathWithEq(unsigned int nEqId, unsigned int nUnit) const; |
| | | CPath* getPath(); |
| | | void addPath(unsigned int nEqId, unsigned int nUnit); |
| | | void addPath(unsigned int nEqId, unsigned int nUnit, unsigned int slot); |
| | | std::string getPathDescription() const; |
| | | std::string getParamsDescription() const; |
| | | void serialize(CArchive& ar); |
| | | void setJobDataS(CJobDataS* pJobDataS); |
| | | void updateJobDataS(CJobDataS* pJobDataS); |
| | | CJobDataS* getJobDataS(); |
| | | BOOL setBuddy(CGlass* pGlass); |
| | | BOOL forceSetBuddy(CGlass* pGlass); |
| | | CGlass* getBuddy(); |
| | | std::string& getBuddyId(); |
| | | void processEnd(unsigned int nEqId, unsigned int nUnit); |
| | | const std::string& getBuddyId() const; |
| | | void setBuddyId(std::string& strId); |
| | | int processEnd(unsigned int nEqId, unsigned int nUnit); |
| | | BOOL isProcessed(unsigned int nEqId, unsigned int nUnit); |
| | | int setInspResult(unsigned int nEqId, unsigned int nUnit, InspResult result); |
| | | InspResult getInspResult(unsigned int nEqId, unsigned int nUnit) const; |
| | | InspResult getAOIInspResult() const; |
| | | |
| | | public: |
| | | // 新增状态 |
| | | GlsState state() const noexcept { return m_state; } |
| | | std::string getStateText(); |
| | | GlsState m_state{ GlsState::NoState }; |
| | | static void clampString(std::string& s, size_t maxLen); |
| | | static std::string trimCopy(std::string s); |
| | | std::string m_failReason; |
| | | |
| | | // —— 状态机(带守卫)—— |
| | | bool queue(); // NoState -> Queued |
| | | bool start(); // Queued -> InProcess |
| | | bool pause(); // InProcess -> Paused |
| | | bool resume(); // Paused -> InProcess |
| | | bool complete(); // InProcess -> Completed |
| | | bool abort(); // Any (未终态) -> Aborted |
| | | bool fail(std::string reason); // 任意态 -> Failed(记录失败原因) |
| | | |
| | | // 时间戳 |
| | | std::optional<std::chrono::system_clock::time_point> m_tQueued; |
| | | std::optional<std::chrono::system_clock::time_point> m_tStart; |
| | | std::optional<std::chrono::system_clock::time_point> m_tEnd; |
| | | |
| | | // 时间戳(可用于报表/追溯) |
| | | std::optional<std::chrono::system_clock::time_point> tQueued() const { return m_tQueued; } |
| | | std::optional<std::chrono::system_clock::time_point> tStart() const { return m_tStart; } |
| | | std::optional<std::chrono::system_clock::time_point> tEnd() const { return m_tEnd; } |
| | | void markQueued(); |
| | | void markStart(); |
| | | void markEnd(); |
| | | |
| | | // 工艺参数 |
| | | void addParams(std::vector<CParam>& params); |
| | | std::vector<CParam>& getParams(); |
| | | |
| | | // ========== SV数据管理接口(新设计)========== |
| | | |
| | | // 添加数据到指定机器的指定数据类型 |
| | | void addSVData(int machineId, const std::string& dataType, const SVDataItem& dataItem); |
| | | void addSVData(int machineId, const std::string& dataType, double value); // 自动使用当前时间 |
| | | void addSVData(int machineId, const std::string& dataType, int64_t timestamp, double value); |
| | | |
| | | // 批量添加数据到指定机器的指定数据类型 |
| | | void addSVData(int machineId, const std::string& dataType, const std::vector<SVDataItem>& dataItems); |
| | | |
| | | // 获取指定机器的指定数据类型的所有数据 |
| | | std::vector<SVDataItem> getSVData(int machineId, const std::string& dataType) const; |
| | | |
| | | // 获取指定机器的所有数据类型 |
| | | std::vector<std::string> getSVDataTypes(int machineId) const; |
| | | |
| | | // 获取指定机器的所有数据(按数据类型组织) |
| | | std::unordered_map<std::string, std::vector<SVDataItem>> getMachineSVData(int machineId) const; |
| | | |
| | | // 获取所有机器的数据 |
| | | const std::unordered_map<int, std::unordered_map<std::string, std::vector<SVDataItem>>>& getAllSVData() const; |
| | | |
| | | // 检查指定机器是否有指定类型的数据 |
| | | bool hasSVData(int machineId, const std::string& dataType) const; |
| | | |
| | | // 检查指定机器是否有任何数据 |
| | | bool hasMachineSVData(int machineId) const; |
| | | |
| | | // 获取所有有SV数据的机器ID |
| | | std::vector<int> getMachineIdsWithSVData() const; |
| | | |
| | | // 清空指定机器的指定数据类型的数据 |
| | | void clearSVData(int machineId, const std::string& dataType); |
| | | |
| | | // 清空指定机器的所有数据 |
| | | void clearMachineSVData(int machineId); |
| | | |
| | | // 清空所有机器的所有数据 |
| | | void clearAllSVData(); |
| | | |
| | | // 获取指定机器的指定数据类型的数据数量 |
| | | size_t getSVDataCount(int machineId, const std::string& dataType) const; |
| | | |
| | | // 获取指定机器的总数据数量 |
| | | size_t getMachineSVDataCount(int machineId) const; |
| | | |
| | | // 获取所有机器的总数据数量 |
| | | size_t getTotalSVDataCount() const; |
| | | |
| | | // 获取指定数据类型在所有机器中的数据 |
| | | std::vector<std::pair<int, SVDataItem>> findSVDataByType(const std::string& dataType) const; |
| | | |
| | | private: |
| | | MaterialsType m_type; |
| | |
| | | CJobDataS m_jobDataS; |
| | | CGlass* m_pBuddy; |
| | | std::string m_strBuddyId; |
| | | int m_nOriginPort; |
| | | int m_nOriginSlot; |
| | | BOOL m_bScheduledForProcessing; /* 是否将加工处理 */ |
| | | CProcessJob* m_pProcessJob; |
| | | std::vector<CParam> m_params; // 工艺参数 |
| | | |
| | | // 新的三层数据结构:机器ID -> 数据类型 -> 数据列表 |
| | | std::unordered_map<int, std::unordered_map<std::string, std::vector<SVDataItem>>> m_svDatas; |
| | | }; |
| | | } |
| | | |