已添加6个文件
已修改45个文件
740 ■■■■ 文件已修改
Document/AlarmList.csv 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Document/ParamInfo.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/Logger.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/Logger.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/PLCSignalListener.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/ProductResultStorage.cpp 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/ProductResultStorage.h 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/SGMeasurement.cpp 86 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/SGMeasurement.h 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.filters 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/framework.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/pch.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/pch.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/resource.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/targetver.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/AlarmManager.cpp 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipmentPage2.cpp 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipmentPage2.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.h 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMeasurement.cpp 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageGlassList.cpp 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageGlassList.h 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CProcessDataListDlg.cpp 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CProcessDataListDlg.h 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ListCtrlEx.cpp 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageAlarm.cpp 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageAlarm.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageLog.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageLog.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageRecipe.cpp 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageRecipe.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageTransferLog.cpp 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageTransferLog.h 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.filters 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/resource.h 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/AlarmList.csv 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Document/AlarmList.csv
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
No,UNIT ID,UNIT NO,Alarm Level,Alarm Code,AlarmID,Alarm Text,Description 1,EFEM,100,0,0,1000,机器人CCLink链接异常,"请检查接线,断电重启" 2,EFEM,101,0,0,1001,相机CCLink链接异常,"请检查接线,断电重启" 3,EFEM,102,0,0,1002,静电测试CCLink链接异常,"请检查接线,断电重启" 4,EFEM,103,0,0,1003,, 5,EFEM,104,0,0,1004,, 6,EFEM,105,0,0,1005,, 7,EFEM,106,0,0,1006,, 8,EFEM,107,0,0,1007,, 9,EFEM,108,0,0,1008,, 10,EFEM,109,0,0,1009,, 11,EFEM,110,0,0,1010,总进气气压异常,请检测进气 12,EFEM,111,0,0,1011,总真空气压异常,请检测真空 13,EFEM,112,0,0,1012,LP真空异常,检测真空 14,EFEM,113,0,0,1013,离子风棒压空异常,请检测进气 15,EFEM,114,0,0,1014,机器人真空异常,请检测真空 16,EFEM,115,0,0,1015,急停被按下,请检查急停按钮 17,EFEM,116,0,0,1016,, 18,EFEM,117,0,0,1017,, 19,EFEM,118,0,0,1018,, 20,EFEM,119,0,0,1019,, 21,EFEM,120,0,0,1020,安全门打开,请检查安全门 22,EFEM,121,0,0,1021,正面左门打开中,请检查安全门 23,EFEM,122,0,0,1022,正面右门打开中,请检查安全门 24,EFEM,123,0,0,1023,侧面左门打开中,请检查安全门 25,EFEM,124,0,0,1024,侧面右门打开中,请检查安全门 26,EFEM,125,0,0,1025,背面左门打开中,请检查安全门 27,EFEM,126,0,0,1026,背面右门打开中,请检查安全门 28,EFEM,127,0,0,1027,, 29,EFEM,128,0,0,1028,, 30,EFEM,129,0,0,1029,, 31,EFEM,130,0,0,1030,, 32,EFEM,131,0,0,1031,"Port1_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆 33,EFEM,132,0,0,1032,"Port1_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆 34,EFEM,133,0,0,1033,"Port1_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆 35,EFEM,134,0,0,1034,, 36,EFEM,135,0,0,1035,, 37,EFEM,136,0,0,1036,, 38,EFEM,137,0,0,1037,, 39,EFEM,138,0,0,1038,, 40,EFEM,139,0,0,1039,, 41,EFEM,140,1,0,1040,"Port1_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆 42,EFEM,141,1,0,1041,"Port1_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停 43,EFEM,142,1,0,1042,"Port1_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态" 44,EFEM,143,1,0,1043,"Port1_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆 45,EFEM,144,0,0,1044,, 46,EFEM,145,0,0,1045,, 47,EFEM,146,0,0,1046,, 48,EFEM,147,0,0,1047,, 49,EFEM,148,0,0,1048,, 50,EFEM,149,0,0,1049,, 51,EFEM,150,0,0,1050,"Port2_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆 52,EFEM,151,0,0,1051,"Port2_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆 53,EFEM,152,0,0,1052,"Port2_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆 54,EFEM,153,0,0,1053,, 55,EFEM,154,0,0,1054,, 56,EFEM,155,0,0,1055,, 57,EFEM,156,0,0,1056,, 58,EFEM,157,0,0,1057,, 59,EFEM,158,0,0,1058,, 60,EFEM,159,0,0,1059,, 61,EFEM,160,0,0,1060,"Port2_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆 62,EFEM,161,0,0,1061,"Port2_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停 63,EFEM,162,0,0,1062,"Port2_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态" 64,EFEM,163,0,0,1063,"Port2_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆 65,EFEM,164,0,0,1064,, 66,EFEM,165,0,0,1065,, 67,EFEM,166,0,0,1066,, 68,EFEM,167,0,0,1067,, 69,EFEM,168,0,0,1068,, 70,EFEM,169,0,0,1069,, 71,EFEM,170,1,0,1070,, 72,EFEM,171,1,0,1071,"Port3_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆 73,EFEM,172,1,0,1072,"Port3_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停 74,EFEM,173,1,0,1073,"Port3_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态" 75,EFEM,174,1,0,1074,"Port3_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆 76,EFEM,175,1,0,1075,, 77,EFEM,176,1,0,1076,, 78,EFEM,177,1,0,1077,, 79,EFEM,178,1,0,1078,, 80,EFEM,179,1,0,1079,, 81,EFEM,180,1,0,1080,"Port3_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆 82,EFEM,181,1,0,1081,"Port3_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆 83,EFEM,182,1,0,1082,"Port3_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆 84,EFEM,183,1,0,1083,, 85,EFEM,184,1,0,1084,, 86,EFEM,185,1,0,1085,, 87,EFEM,186,1,0,1086,, 88,EFEM,187,1,0,1087,, 89,EFEM,188,1,0,1088,, 90,EFEM,189,1,0,1089,, 91,EFEM,190,1,0,1090,, 92,EFEM,191,1,0,1091,"Port4_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆 93,EFEM,192,1,0,1092,"Port4_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停 94,EFEM,193,1,0,1093,"Port4_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态" 95,EFEM,194,1,0,1094,"Port4_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆 96,EFEM,195,1,0,1095,, 97,EFEM,196,1,0,1096,, 98,EFEM,197,1,0,1097,, 99,EFEM,198,1,0,1098,, 100,EFEM,199,1,0,1099,, 101,EFEM,200,1,0,1100,"Port4_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆 102,EFEM,201,1,0,1101,"Port4_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆 103,EFEM,202,1,0,1102,"Port4_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆 104,EFEM,203,1,0,1103,, 105,EFEM,204,1,0,1104,, 106,EFEM,205,1,0,1105,, 107,EFEM,206,1,0,1106,, 108,EFEM,207,1,0,1107,, 109,EFEM,208,1,0,1108,, 110,EFEM,209,1,0,1109,, 111,EFEM,210,0,0,1110,回原点失败/超时,请检查设备状态以及轴位置是否有干涉,请重新执行回原操作 112,EFEM,211,0,0,1111,Flip工位,真空打开时在荷异常,请检查玻璃位置 113,EFEM,212,1,0,1112,, 114,EFEM,213,1,0,1113,, 115,EFEM,214,1,0,1114,, 116,EFEM,215,1,0,1115,, 117,EFEM,216,1,0,1116,, 118,EFEM,217,1,0,1117,, 119,EFEM,218,1,0,1118,, 120,EFEM,219,1,0,1119,, 121,EFEM,220,1,0,1120,任务取消失败,当前取消任务条件不满足 122,EFEM,221,1,0,1121,任务重试失败,当前重试任务条件不满足
Document/ParamInfo.xlsx
Binary files differ
SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp
@@ -1,4 +1,4 @@
#include "pch.h"
#include "pch.h"
#include "CCLinkIEControl.h"
CCCLinkIEControl::CCCLinkIEControl() : CPerformanceMelsec(BoardType::CC_LINK_IE_CONTROL) {}
SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h
@@ -1,4 +1,4 @@
#ifndef CCLINKIECONTROL_H
#ifndef CCLINKIECONTROL_H
#define CCLINKIECONTROL_H
#include "PerformanceMelsec.h"
SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp
@@ -1,4 +1,4 @@
// PerformanceMelsec.cpp: implementation of the CPerformanceMelsec class.
// PerformanceMelsec.cpp: implementation of the CPerformanceMelsec class.
//
//////////////////////////////////////////////////////////////////////
#include "pch.h"
SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h
@@ -1,4 +1,4 @@
#ifndef PERFORMANCE_MELSEC_H
#ifndef PERFORMANCE_MELSEC_H
#define PERFORMANCE_MELSEC_H
#include "Mdfunc.h"
SourceCode/Bond/SGMeasurement/Logger.cpp
@@ -1,4 +1,4 @@
#include "pch.h"
#include "pch.h"
#include "Logger.h"
CLogger& CLogger::Instance()
SourceCode/Bond/SGMeasurement/Logger.h
@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include <afx.h>
class CLogger
SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp
@@ -1,4 +1,4 @@
#include "pch.h"
#include "pch.h"
#include "PLCSignalListener.h"
// === æ—¥å¿—打印类型 ===
@@ -247,13 +247,10 @@
                // ä¸Šå‡æ²¿è§¦å‘
                switch (i) {
                case 0:
                    // Start å‘½ä»¤
                    if (m_cbStart) {
                        m_cbStart();
                        WriteOutValues(OutValuesArray{ 0.0, 0.0, 0.0, 0.0 });
                        if (m_pPlc->SetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_ACK_BASE_BIT + i) == 0) {
                            m_vecAckSent[i] = true;
                            m_vecAckCounter[i] = 0;
                        }
                        std::string strProductID;
                        if (ReadProductID(strProductID)) {
@@ -262,21 +259,31 @@
                            LOG_MSG(msg, LOG_TYPE_SUCCESS);
                        }
                    }
                    // å‘送应答信号
                    if (m_pPlc->SetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_ACK_BASE_BIT + i) == 0) {
                        m_vecAckSent[i] = true;
                        m_vecAckCounter[i] = 0;
                    }
                    break;
                case 1:
                    // Stop å‘½ä»¤
                    if (m_cbStop) {
                        m_cbStop();
                        if (m_pPlc->SetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_ACK_BASE_BIT + i) == 0) {
                            m_vecAckSent[i] = true;
                            m_vecAckCounter[i] = 0;
                        }
                    }
                    // Analyze å‘½ä»¤
                    if (m_cbAnalyze) {
                        auto results = m_cbAnalyze();
                        WriteOutValues(results);
                    }
                    // å‘送应答信号
                    if (m_pPlc->SetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_ACK_BASE_BIT + i) == 0) {
                        m_vecAckSent[i] = true;
                        m_vecAckCounter[i] = 0;
                    }
                    break;
                }
            }
SourceCode/Bond/SGMeasurement/PLCSignalListener.h
@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "CCLinkIEControl.h"
SourceCode/Bond/SGMeasurement/ProductResultStorage.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
#include "pch.h"
#include "ProductResultStorage.h"
CProductResultStorage::CProductResultStorage()
{
    TCHAR szPath[MAX_PATH] = { 0 };
    GetModuleFileName(NULL, szPath, MAX_PATH);
    CString strExePath(szPath);
    int pos = strExePath.ReverseFind(_T('\\'));
    if (pos != -1) {
        m_strBaseResultDir = strExePath.Left(pos) + _T("\\Data");
    }
    else {
        m_strBaseResultDir = _T(".\\Data");
    }
}
void CProductResultStorage::SaveAnalyzeResult(const CString& strProductID, const std::array<double, 4>& result)
{
    CString strFilePath = MakeResultCsvPath(_T("MeasurementResults"));
    CString strHeader = _T("Timestamp,ProductID,OUT1,OUT2,OUT3,OUT4\r\n");
    // æ—¶é—´æˆ³
    CTime now = CTime::GetCurrentTime();
    CString strTimestamp;
    strTimestamp.Format(_T("%02d:%02d:%02d"), now.GetHour(), now.GetMinute(), now.GetSecond());
    // ç»“果行
    CString strBody;
    strBody.Format(_T("%s,%s,%.3f,%.3f,%.3f,%.3f\r\n"), strTimestamp, strProductID, result[0], result[1], result[2], result[3]);
    AppendCsvWithHeader(strFilePath, strHeader, strBody);
}
CString CProductResultStorage::MakeResultCsvPath(const CString& strFileName)
{
    SYSTEMTIME st;
    GetLocalTime(&st);
    CString strDate;
    strDate.Format(_T("%04d%02d%02d"), st.wYear, st.wMonth, st.wDay);
    if (GetFileAttributes(m_strBaseResultDir) == INVALID_FILE_ATTRIBUTES) {
        CreateDirectory(m_strBaseResultDir, NULL);
    }
    CString strFilePath;
    strFilePath.Format(_T("%s\\%s_%s.csv"), m_strBaseResultDir, strFileName, strDate);
    return strFilePath;
}
BOOL CProductResultStorage::AppendCsvWithHeader(const CString& strFilePath, const CString& strHeader, const CString& strBody)
{
    if (strBody.IsEmpty()) {
        return FALSE;
    }
    CFile f;
    CFileException ex;
    if (!f.Open(strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate | CFile::shareDenyWrite | CFile::shareDenyRead, &ex)) {
        return FALSE;
    }
    if (f.SeekToEnd() == 0L) {
        f.Write(strHeader, strHeader.GetLength() * sizeof(TCHAR));
    }
    f.Write(strBody, strBody.GetLength() * sizeof(TCHAR));
    f.Close();
    return TRUE;
}
SourceCode/Bond/SGMeasurement/ProductResultStorage.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
#pragma once
#include <array>
class CProductResultStorage
{
public:
    CProductResultStorage();
    ~CProductResultStorage() = default;
    void SaveAnalyzeResult(const CString& strProductID, const std::array<double, 4>& result);
private:
    CString MakeResultCsvPath(const CString& strFileName);
    BOOL AppendCsvWithHeader(const CString& strFilePath, const CString& strHeader, const CString& strBody);
    CString m_strBaseResultDir;
};
SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
@@ -1,4 +1,4 @@

// SGMeasurement.cpp: å®šä¹‰åº”用程序的类行为。
//
@@ -7,10 +7,61 @@
#include "SGMeasurement.h"
#include "SGMeasurementDlg.h"
#include <DbgHelp.h>
#pragma comment(lib, "DbgHelp.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
LONG WINAPI MyUnhandledExceptionFilter(EXCEPTION_POINTERS* pExceptionInfo)
{
    // èŽ·å–å½“å‰ç¨‹åºç›®å½•
    TCHAR szAppPath[MAX_PATH] = { 0 };
    ::GetModuleFileName(NULL, szAppPath, MAX_PATH);
    PathRemoveFileSpec(szAppPath);
    // æž„造 Temp æ–‡ä»¶å¤¹è·¯å¾„
    CString strTempPath;
    strTempPath.Format(_T("%s\\Temp"), szAppPath);
    CreateDirectory(strTempPath, NULL);
    // ç”Ÿæˆå¸¦æ—¶é—´æˆ³çš„ Dump æ–‡ä»¶å
    SYSTEMTIME st;
    GetLocalTime(&st);
    CString strDumpFile;
    strDumpFile.Format(
        _T("%s\\SG_%04d%02d%02d_%02d%02d%02d.dmp"),
        strTempPath,
        st.wYear, st.wMonth, st.wDay,
        st.wHour, st.wMinute, st.wSecond
    );
    // æ‰“å¼€ dump æ–‡ä»¶
    HANDLE hFile = CreateFile(strDumpFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile != INVALID_HANDLE_VALUE) {
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pExceptionInfo;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;
        // å†™å®Œæ•´å†…å­˜ dump
        BOOL success = MiniDumpWriteDump(
            GetCurrentProcess(),
            GetCurrentProcessId(),
            hFile,
            MiniDumpWithFullMemory,
            &dumpInfo,
            NULL,
            NULL
        );
        CloseHandle(hFile);
    }
    return EXCEPTION_EXECUTE_HANDLER;
}
// CSGMeasurementApp
@@ -51,6 +102,18 @@
    CWinApp::InitInstance();
    // å”¯ä¸€å®žä¾‹è¿è¡Œæ£€æµ‹
    m_hMutex = ::CreateMutex(NULL, FALSE, _T("MutexEdgeInspector_App"));
    if (m_hMutex != NULL) {
        if (::GetLastError() == ERROR_ALREADY_EXISTS) {
            AfxMessageBox(_T("The Program is already running. Exit this Program."), MB_OK | MB_ICONERROR);
            return FALSE;
        }
    }
    // è®¾ç½®æœªå¤„理异常过滤器,捕获崩溃并生成 Dump æ–‡ä»¶
    SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    // åˆå§‹åŒ– MFC RichEdit æŽ§ä»¶
    AfxInitRichEdit2();
@@ -75,23 +138,19 @@
    CSGMeasurementDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
    if (nResponse == IDOK) {
        // TODO:“确定”来关闭对话框的代码
    }
    else if (nResponse == IDCANCEL)
    {
    else if (nResponse == IDCANCEL) {
        // TODO:“取消”来关闭对话框的代码 
    }
    else if (nResponse == -1)
    {
    else if (nResponse == -1) {
        TRACE(traceAppMsg, 0, "警告: å¯¹è¯æ¡†åˆ›å»ºå¤±è´¥ï¼Œåº”用程序将意外终止。\n");
        TRACE(traceAppMsg, 0, "警告: å¦‚果您在对话框上使用 MFC æŽ§ä»¶ï¼Œåˆ™æ— æ³• #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
    }
    // åˆ é™¤ä¸Šé¢åˆ›å»ºçš„ shell ç®¡ç†å™¨ã€‚
    if (pShellManager != nullptr)
    {
    if (pShellManager != nullptr) {
        delete pShellManager;
    }
@@ -101,4 +160,13 @@
    // ç”±äºŽå¯¹è¯æ¡†å·²å…³é—­ï¼Œæ‰€ä»¥å°†è¿”回 FALSE ä»¥ä¾¿é€€å‡ºåº”用程序,而不是启动应用程序的消息泵。
    return FALSE;
}
int CSGMeasurementApp::ExitInstance()
{
    if (m_hMutex) {
        CloseHandle(m_hMutex);
        m_hMutex = nullptr;
    }
    return CWinApp::ExitInstance();
}
SourceCode/Bond/SGMeasurement/SGMeasurement.h
@@ -1,4 +1,4 @@

// SGMeasurement.h: PROJECT_NAME åº”用程序的主头文件
//
@@ -23,10 +23,13 @@
// é‡å†™
public:
    virtual BOOL InitInstance();
    virtual int ExitInstance();
// å®žçް
    DECLARE_MESSAGE_MAP()
private:
    HANDLE m_hMutex;
};
extern CSGMeasurementApp theApp;
SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj
@@ -209,6 +209,7 @@
    <ClInclude Include="Logger.h" />
    <ClInclude Include="pch.h" />
    <ClInclude Include="PLCSignalListener.h" />
    <ClInclude Include="ProductResultStorage.h" />
    <ClInclude Include="Resource.h" />
    <ClInclude Include="SGMeasurement.h" />
    <ClInclude Include="SGMeasurementDlg.h" />
@@ -225,6 +226,7 @@
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
    </ClCompile>
    <ClCompile Include="PLCSignalListener.cpp" />
    <ClCompile Include="ProductResultStorage.cpp" />
    <ClCompile Include="SGMeasurement.cpp" />
    <ClCompile Include="SGMeasurementDlg.cpp" />
  </ItemGroup>
SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.filters
@@ -48,6 +48,9 @@
    <ClInclude Include="PLCSignalListener.h">
      <Filter>头文件</Filter>
    </ClInclude>
    <ClInclude Include="ProductResultStorage.h">
      <Filter>头文件</Filter>
    </ClInclude>
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="SGMeasurement.cpp">
@@ -71,6 +74,9 @@
    <ClCompile Include="PLCSignalListener.cpp">
      <Filter>源文件</Filter>
    </ClCompile>
    <ClCompile Include="ProductResultStorage.cpp">
      <Filter>源文件</Filter>
    </ClCompile>
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="SGMeasurement.rc">
SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
@@ -1,4 +1,4 @@

// SGMeasurementDlg.cpp: å®žçŽ°æ–‡ä»¶
//
@@ -932,6 +932,10 @@
            result[i] = AnalyzeStoredData(i + 1); // OUT1 ~ OUT4
        }
        std::string strProductID;
        m_plcListener.ReadProductID(strProductID);
        m_resultStorage.SaveAnalyzeResult(CString(strProductID.c_str()), result);
        CString strLog;
        strLog.Format(_T("分析结果:OUT1: %.3f, OUT2: %.3f, OUT3: %.3f, OUT4: %.3f"), result[0], result[1], result[2], result[3]);
        return result;
SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
@@ -1,10 +1,11 @@

// SGMeasurementDlg.h: å¤´æ–‡ä»¶
//
#pragma once
#include "PLCSignalListener.h"
#include "ProductResultStorage.h"
#include <map>
#include <vector>
@@ -340,4 +341,11 @@
     * @brief PLC ä¿¡å·ç›‘听器实例,用于处理 PLC ä¿¡å·äº‹ä»¶
     */
    CPLCSignalListener m_plcListener;
    // === äº§å“ç»“果存储 ===
    /**
     * @brief äº§å“ç»“果存储实例,用于保存和管理测量结果
     */
    CProductResultStorage m_resultStorage;
};
SourceCode/Bond/SGMeasurement/framework.h
@@ -1,4 +1,4 @@
#pragma once
#pragma once
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // ä»Ž Windows å¤´ä¸­æŽ’除极少使用的资料
SourceCode/Bond/SGMeasurement/pch.cpp
@@ -1,4 +1,4 @@
// pch.cpp: ä¸Žé¢„编译标头对应的源文件
// pch.cpp: ä¸Žé¢„编译标头对应的源文件
#include "pch.h"
SourceCode/Bond/SGMeasurement/pch.h
@@ -1,4 +1,4 @@
// pch.h: è¿™æ˜¯é¢„编译标头文件。
// pch.h: è¿™æ˜¯é¢„编译标头文件。
// ä¸‹æ–¹åˆ—出的文件仅编译一次,提高了将来生成的生成性能。
// è¿™è¿˜å°†å½±å“ IntelliSense æ€§èƒ½ï¼ŒåŒ…括代码完成和许多代码浏览功能。
// ä½†æ˜¯ï¼Œå¦‚果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
SourceCode/Bond/SGMeasurement/resource.h
@@ -1,4 +1,4 @@
//{{NO_DEPENDENCIES}}
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ ç”Ÿæˆçš„包含文件。
// ä¾› SGMeasurement.rc ä½¿ç”¨
//
SourceCode/Bond/SGMeasurement/targetver.h
@@ -1,4 +1,4 @@
#pragma once
#pragma once
// åŒ…括 SDKDDKVer.h å°†å®šä¹‰å¯ç”¨çš„æœ€é«˜ç‰ˆæœ¬çš„ Windows å¹³å°ã€‚
SourceCode/Bond/Servo/AlarmManager.cpp
@@ -784,16 +784,33 @@
// è¯»å–报警文件
bool AlarmManager::readAlarmFile(const std::string& filename) {
    std::ifstream file(filename);
    std::string line;
    bool first_line = true;
    std::ifstream file(filename, std::ios::binary);
    if (!file.is_open()) {
        std::cerr << "Error opening file!" << std::endl;
        return false;
    }
    while (std::getline(file, line)) {
    auto getline_cross = [](std::ifstream& f, std::string& out) -> bool {
        out.clear();
        char ch;
        while (f.get(ch)) {
            if (ch == '\r') {
                // å¤„理 \r\n æˆ– å•独 \r
                if (f.peek() == '\n') f.get();
                break;
            }
            else if (ch == '\n') {
                break;
            }
            out.push_back(ch);
        }
        return !out.empty() || !f.eof();
    };
    std::string line;
    bool first_line = true;
    while (getline_cross(file, line)) {
        if (first_line) {
            first_line = false;
            continue;
@@ -804,7 +821,6 @@
        AlarmInfo alarm;
        try {
            // é€å­—段解析并验证
            if (!std::getline(ss, cell, ',')) throw std::runtime_error("Missing field: No");
            if (!std::getline(ss, alarm.strUnitID, ',')) throw std::runtime_error("Missing field: UnitID");
            if (!std::getline(ss, alarm.strUnitNo, ',')) throw std::runtime_error("Missing field: UnitNo");
@@ -817,7 +833,6 @@
            if (!std::getline(ss, alarm.strAlarmText, ',')) throw std::runtime_error("Missing field: AlarmText");
            if (!std::getline(ss, alarm.strDescription, ',')) throw std::runtime_error("Missing field: Description");
            // æ£€æŸ¥æ˜¯å¦é‡å¤
            if (m_mapAlarm.find(alarm.nAlarmID) == m_mapAlarm.end()) {
                m_mapAlarm[alarm.nAlarmID] = alarm;
            }
@@ -826,7 +841,6 @@
            }
        }
        catch (const std::exception& e) {
            // æ•获并记录解析错误
            std::cerr << "Error parsing line: " << line << " - " << e.what() << std::endl;
            continue;
        }
SourceCode/Bond/Servo/CEquipment.cpp
@@ -1497,6 +1497,19 @@
        return &m_slot[index];
    }
    CSlot* CEquipment::getSlotWithNo(int slotNo)
    {
        CSlot* pSlot = nullptr;
        for (int i = 0; i < SLOT_MAX; i++) {
            if (!m_slot[i].isEnable()) continue;
            if (m_slot[i].getNo() != slotNo) continue;
            pSlot = &m_slot[i];
            break;
        }
        return pSlot;
    }
    CGlass* CEquipment::getAnyGlass()
    {
        CSlot* pSlot = nullptr;
@@ -1581,8 +1594,10 @@
        }
        auto rawData = processData.getParamsRawData();
        std::vector<CParam> params;
        this->parsingParams((const char*)rawData.data(), rawData.size(), params);
        std::vector<CParam> tempParams;
        this->parsingParams((const char*)rawData.data(), rawData.size(), tempParams);
        int n = processData.getTotalParameter();
        std::vector<CParam> params(tempParams.begin(), tempParams.begin() + min(n, (int)tempParams.size()));
        pGlass->addParams(params);
        
        // å…³è”çš„Glass也要更新
SourceCode/Bond/Servo/CEquipment.h
@@ -181,6 +181,7 @@
        // èŽ·å–æŒ‡å®šçš„Slot
        CSlot* getSlot(int index);
        CSlot* getSlotWithNo(int slotNo);
        // èŽ·å–ä¸€ä¸ªå¯ç”¨çš„æ§½ä½
        CSlot* getAvailableSlot();
SourceCode/Bond/Servo/CEquipmentPage2.cpp
@@ -34,6 +34,7 @@
    ON_WM_SIZE()
    ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CEquipmentPage2::OnLvnItemchangedList1)
    ON_BN_CLICKED(IDC_BUTTON_REMOVE, &CEquipmentPage2::OnBnClickedButtonRemove)
    ON_BN_CLICKED(IDC_BUTTON_PUT, &CEquipmentPage2::OnBnClickedButtonPut)
END_MESSAGE_MAP()
@@ -125,10 +126,17 @@
    GetClientRect(&rcClient);
    int x = 12;
    int x1 = x;
    int y2 = rcClient.bottom - 12;
    pItem = GetDlgItem(IDC_BUTTON_REMOVE);
    pItem->GetWindowRect(&rcItem);
    pItem->MoveWindow(x, y2 - rcItem.Height(), rcItem.Width(), rcItem.Height());
    x1 += rcItem.Width();
    x1 += 12;
    pItem = GetDlgItem(IDC_BUTTON_PUT);
    pItem->GetWindowRect(&rcItem);
    pItem->MoveWindow(x1, y2 - rcItem.Height(), rcItem.Width(), rcItem.Height());
    y2 -= rcItem.Height();
    y2 -= 8;
@@ -160,9 +168,24 @@
    if (index >= 0) {
        SERVO::CSlot* pSlot = (SERVO::CSlot*)m_listCtrl.GetItemData(index);
        ASSERT(pSlot);
        int bRet = m_pEquipment->removeGlass(pSlot->getNo());
        if (bRet == 0) {
        if (theApp.m_model.getMaster().moveGlassToBuf(m_pEquipment->getID(),
            pSlot->getNo())) {
            UpdateSlots();
            AfxMessageBox("物料已取出到Buffer中!");
        }
    }
}
void CEquipmentPage2::OnBnClickedButtonPut()
{
    int index = GetSelectedItemIndex();
    if (index >= 0) {
        SERVO::CSlot* pSlot = (SERVO::CSlot*)m_listCtrl.GetItemData(index);
        ASSERT(pSlot);
        if (theApp.m_model.getMaster().moveGlassToSlot(m_pEquipment->getID(),
            pSlot->getNo())) {
            UpdateSlots();
            AfxMessageBox("物料已放入指定位置!");
        }
    }
}
@@ -199,4 +222,3 @@
        }
    }
}
SourceCode/Bond/Servo/CEquipmentPage2.h
@@ -41,4 +41,5 @@
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnBnClickedButtonRemove();
    afx_msg void OnBnClickedButtonPut();
};
SourceCode/Bond/Servo/CMaster.cpp
@@ -2076,7 +2076,7 @@
        pTarSlot = pTarEq->getAvailableSlotForGlass(primaryType);
        pSrcSlot = pSrcEq->getProcessedSlot(primaryType, bJobMode);
        if (m_nTestFlag == 1) LOGD("createTransferTask 003 %x, %x", pTarSlot, pSrcSlot);
        if (pSrcSlot == nullptr || nullptr == pTarSlot && secondaryType != SERVO::MaterialsType::G0) {
        if ((pSrcSlot == nullptr || nullptr == pTarSlot) && secondaryType != SERVO::MaterialsType::G0) {
            pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType);
            pSrcSlot = pSrcEq->getProcessedSlot(secondaryType, bJobMode);
        }
@@ -2782,4 +2782,48 @@
            m_strLastError = "AOI检测未通过.";
        }
    }
    bool CMaster::moveGlassToBuf(int eqid, int slotNo)
    {
        CEquipment* pEquipment = getEquipment(eqid);
        if (pEquipment == nullptr) return false;
        CSlot* pSlot = pEquipment->getSlotWithNo(slotNo);
        if (pSlot == nullptr) return false;
        CGlass* pGlass = (CGlass*)pSlot->getContext();
        m_bufGlass.push_back(pGlass);
        pGlass->addRef();
        pSlot->setContext(nullptr);
        m_bDataModify = TRUE;
        if (m_listener.onEqDataChanged != nullptr) {
            m_listener.onEqDataChanged(this, pEquipment, 0);
        }
        return true;
    }
    bool CMaster::moveGlassToSlot(int eqid, int slotNo)
    {
        CEquipment* pEquipment = getEquipment(eqid);
        if (pEquipment == nullptr) return false;
        CSlot* pSlot = pEquipment->getSlotWithNo(slotNo);
        if (pSlot == nullptr) return false;
        if (m_bufGlass.empty()) return false;
        CGlass* pGlass = m_bufGlass.front();
        m_bufGlass.pop_front();
        if (pGlass == nullptr) return false;
        pSlot->setContext(pGlass);
        pGlass->release();
        m_bDataModify = TRUE;
        if (m_listener.onEqDataChanged != nullptr) {
            m_listener.onEqDataChanged(this, pEquipment, 0);
        }
        return true;
    }
}
SourceCode/Bond/Servo/CMaster.h
@@ -131,6 +131,8 @@
        bool loadState(const std::string& path);
        int getWipGlasses(std::vector<CGlass*>& glasses);
        void test();
        bool moveGlassToBuf(int eqid, int slotNo);
        bool moveGlassToSlot(int eqid, int slotNo);
        int getPortCassetteSnSeed(int port);
        void setPortCassetteSnSeed(int port, int seed);
@@ -249,6 +251,7 @@
        std::string m_strStatePath;
        int m_nTestFlag;
        std::list<CGlass*> m_bufGlass;
    };
}
SourceCode/Bond/Servo/CMeasurement.cpp
@@ -455,14 +455,14 @@
        params.push_back(CParam("检测速度", "", this->getName().c_str(), v * 0.001));
        i += 4;
        // 3.检测速度
        // 3.检测1数据
        v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
        params.push_back(CParam("检测速度", "", this->getName().c_str(), v * 0.001));
        params.push_back(CParam("检测1数据", "", this->getName().c_str(), v * 0.001));
        i += 4;
        // 4.检测2数据
        v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24;
        params.push_back(CParam("检测速度", "", this->getName().c_str(), v * 0.001));
        params.push_back(CParam("检测2数据", "", this->getName().c_str(), v * 0.001));
        i += 4;
        return (int)params.size();
SourceCode/Bond/Servo/CPageGlassList.cpp
@@ -8,12 +8,12 @@
#include "GlassJson.h"
#include "CServoUtilsTool.h"
#include "ToolUnits.h"
#include <optional>
#include <unordered_set>
#include <unordered_map>
#include <vector>
#include <string>
#include "CProcessDataListDlg.h"
#define PAGE_SIZE                       50
#define PAGE_BACKGROUND_COLOR           RGB(252, 252, 255)
@@ -436,7 +436,7 @@
}
// ===== CPageGlassList æ¶ˆæ¯å¤„理程序 =====
void CPageGlassList::InitRxWindow()
void CPageGlassList::InitRxWindows()
{
    // è®¢é˜…数据
    IRxWindows* pRxWindows = RX_GetRxWindows();
@@ -946,7 +946,7 @@
{
    if (nIDEvent == 1) {
        KillTimer(1);
        InitRxWindow();
        InitRxWindows();
    }
    else if (nIDEvent == 2) {
        UpdateWipData();  // åªåšå¢žé‡ï¼Œä¸é‡å»º
@@ -1065,10 +1065,11 @@
{
    auto* p = reinterpret_cast<NMC_ELC_SHOWFULLTEXT*>(pNMHDR);
    // è¿™é‡Œæš‚时用消息框显示;后续可换成你的详情页
    CString strNewMsg = p->text;
    strNewMsg.Replace(_T(","), _T("\n"));
    MessageBox(strNewMsg, _T("详细信息"), MB_OK | MB_ICONINFORMATION);
    // å¯¹è¯æ¡†æ˜¾ç¤ºå·¥è‰ºå‚æ•°
    CProcessDataListDlg dlg;
    dlg.setRawText(p->text);
    dlg.DoModal();
    *pResult = 0;
}
@@ -1395,3 +1396,12 @@
    return true;
}
BOOL CPageGlassList::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) {
        return TRUE;
    }
    return CDialogEx::PreTranslateMessage(pMsg);
}
SourceCode/Bond/Servo/CPageGlassList.h
@@ -40,7 +40,7 @@
    bool m_rebuilding = false;
private:
    void InitRxWindow();
    void InitRxWindows();
    void Resize();
    void InitStatusCombo();
    void InitTimeRangeCombo();
@@ -75,5 +75,6 @@
    afx_msg void OnBnClickedButtonPrevPage();
    afx_msg void OnBnClickedButtonNextPage();
    afx_msg void OnShowFullText(NMHDR* pNMHDR, LRESULT* pResult);
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    DECLARE_MESSAGE_MAP()
};
SourceCode/Bond/Servo/CProcessDataListDlg.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,201 @@
// CProcessDataListDlg.cpp: å®žçŽ°æ–‡ä»¶
//
#include "stdafx.h"
#include "Servo.h"
#include "CProcessDataListDlg.h"
#include "afxdialogex.h"
// CProcessDataListDlg å¯¹è¯æ¡†
IMPLEMENT_DYNAMIC(CProcessDataListDlg, CDialogEx)
CProcessDataListDlg::CProcessDataListDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_DIALOG_PROCESS_DATA_LIST, pParent)
{
}
CProcessDataListDlg::~CProcessDataListDlg()
{
}
void CProcessDataListDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST_RECIPE_PARAM, m_listCtrl);
}
BEGIN_MESSAGE_MAP(CProcessDataListDlg, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON1, &CProcessDataListDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CProcessDataListDlg æ¶ˆæ¯å¤„理程序
BOOL CProcessDataListDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    DWORD dwStyle = m_listCtrl.GetExtendedStyle();
    dwStyle |= LVS_EX_FULLROWSELECT;
    dwStyle |= LVS_EX_GRIDLINES;
    dwStyle |= LVS_EX_DOUBLEBUFFER;
    m_listCtrl.SetExtendedStyle(dwStyle);
    HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1);
    ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL);
    m_listCtrl.InsertColumn(0, _T("名称"), LVCFMT_RIGHT, 188);
    m_listCtrl.InsertColumn(1, _T("值"), LVCFMT_LEFT, 128);
    InsertParamsToListCtrl(m_listCtrl, m_strRawText);
    return TRUE;  // return TRUE unless you set the focus to a control
                  // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
}
void CProcessDataListDlg::setRawText(CString& strRawText)
{
    m_strRawText = strRawText;
}
void CProcessDataListDlg::InsertParamsToListCtrl(CListCtrl& listCtrl, const CString& data)
{
    // æ¸…空现有内容
    listCtrl.DeleteAllItems();
    int row = 0;
    int start = 0;
    CString item;
    // æŒ‰é€—号分割
    while (AfxExtractSubString(item, data, row, ','))  // row ä»Ž 0 å¼€å§‹ï¼Œé€ä¸ªå–子串
    {
        int pos = item.Find(_T(':'));
        if (pos == -1) {
            row++;
            continue;
        }
        CString name = item.Left(pos);
        CString value = item.Mid(pos + 1);
        name.Trim();   // åŽ»æŽ‰å‰åŽç©ºæ ¼
        value.Trim();
        int nItem = listCtrl.InsertItem(row, name);   // ç¬¬ä¸€åˆ—:参数名
        listCtrl.SetItemText(nItem, 1, value);        // ç¬¬äºŒåˆ—:参数值
        row++;
    }
}
bool CProcessDataListDlg::CopyListCtrlToClipboard(CListCtrl& listCtrl, bool includeHeader/* = false*/)
{
    CString strCSV;
    int nCount = listCtrl.GetItemCount();
    int nColCount = listCtrl.GetHeaderCtrl()->GetItemCount();
    if (nCount == 0 || nColCount == 0)
        return false;
    // å¦‚果需要导出表头
    if (includeHeader)
    {
        CString headerLine;
        for (int j = 0; j < nColCount; j++)
        {
            CString text;
            LVCOLUMN col;
            TCHAR buf[256] = { 0 };
            col.mask = LVCF_TEXT;
            col.pszText = buf;
            col.cchTextMax = 255;
            if (listCtrl.GetColumn(j, &col))
                text = col.pszText;
            if (text.Find(_T(',')) != -1 || text.Find(_T('"')) != -1)
            {
                text.Replace(_T("\""), _T("\"\""));
                text = _T("\"") + text + _T("\"");
            }
            headerLine += text;
            if (j < nColCount - 1)
                headerLine += _T(",");
        }
        strCSV += headerLine + _T("\n");
    }
    // éåŽ†è¡Œ
    for (int i = 0; i < nCount; i++)
    {
        CString line;
        for (int j = 0; j < nColCount; j++)
        {
            CString text = listCtrl.GetItemText(i, j);
            // å¦‚果包含逗号或双引号,加上引号并转义
            if (text.Find(_T(',')) != -1 || text.Find(_T('"')) != -1)
            {
                text.Replace(_T("\""), _T("\"\""));
                text = _T("\"") + text + _T("\"");
            }
            line += text;
            if (j < nColCount - 1)
                line += _T(",");
        }
        strCSV += line + _T("\n");
    }
    if (!OpenClipboard())
        return false;
    EmptyClipboard();
    // è½¬ä¸ºå…¨å±€å†…å­˜
    HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (strCSV.GetLength() + 1) * sizeof(TCHAR));
    if (!hMem)
    {
        CloseClipboard();
        return false;
    }
    LPTSTR pMem = (LPTSTR)GlobalLock(hMem);
    if (!pMem)
    {
        GlobalFree(hMem);
        CloseClipboard();
        return false;
    }
    _tcscpy_s(pMem, strCSV.GetLength() + 1, strCSV);
    GlobalUnlock(hMem);
#ifdef UNICODE
    SetClipboardData(CF_UNICODETEXT, hMem);
#else
    SetClipboardData(CF_TEXT, hMem);
#endif
    CloseClipboard();
    return true;
}
void CProcessDataListDlg::OnBnClickedButton1()
{
    if (CopyListCtrlToClipboard(m_listCtrl, true))
    {
        AfxMessageBox(_T("复制成功!"));
    }
    else
    {
        AfxMessageBox(_T("复制失败!"));
    }
}
SourceCode/Bond/Servo/CProcessDataListDlg.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
#pragma once
#include "ListCtrlEx.h"
// CProcessDataListDlg å¯¹è¯æ¡†
class CProcessDataListDlg : public CDialogEx
{
    DECLARE_DYNAMIC(CProcessDataListDlg)
public:
    CProcessDataListDlg(CWnd* pParent = nullptr);   // æ ‡å‡†æž„造函数
    virtual ~CProcessDataListDlg();
public:
    void setRawText(CString& strRawText);
    void InsertParamsToListCtrl(CListCtrl& listCtrl, const CString& data);
    bool CopyListCtrlToClipboard(CListCtrl& listCtrl, bool includeHeader = false);
private:
    CString m_strRawText;
    CListCtrlEx m_listCtrl;
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_DIALOG_PROCESS_DATA_LIST };
#endif
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    DECLARE_MESSAGE_MAP()
public:
    virtual BOOL OnInitDialog();
    afx_msg void OnBnClickedButton1();
};
SourceCode/Bond/Servo/ListCtrlEx.cpp
@@ -34,12 +34,13 @@
    {
        // æ ¹æ®åœ¨ SetItemColor(DWORD iItem, COLORREF color) è®¾ç½®çš„   
        // ITEM号和COLORREF åœ¨æ‘¸æ¿ä¸­æŸ¥æ‰¾ï¼Œç„¶åŽè¿›è¡Œé¢œè‰²èµ‹å€¼ã€‚
        /*
        LISTITEMEX_9& itemex = m_listItemColor.GetAt(m_listItemColor.FindIndex(nmcd.dwItemSpec));
        lplvdr->clrText = itemex.colText;
        lplvdr->clrTextBk = itemex.colTextBk;
        *pResult = CDRF_DODEFAULT;
        /*
        */
        if (nmcd.dwItemSpec % 2 == 0) {
            lplvdr->clrText = RGB(0, 0, 0);
            lplvdr->clrTextBk = RGB(235, 235, 235);
@@ -50,7 +51,7 @@
            lplvdr->clrTextBk = RGB(255, 255, 255);
            *pResult = CDRF_DODEFAULT;
        }
        */
        break;
    }
SourceCode/Bond/Servo/Model.cpp
@@ -250,9 +250,18 @@
            alarmData.strUnitName = alarmManager.getUnitNameById(alarmData.nDeviceId, alarmData.nUnitId);
            alarmData.strStartTime = CToolUnits::timeToString2(CToolUnits::getTimestamp());
            alarmData.strEndTime = "";
            alarmData.strDescription = "";
            const AlarmInfo* alarmInfo = alarmManager.getAlarmInfoByID(alarmData.nId);
            alarmData.strDescription = alarmInfo != nullptr ? alarmInfo->strAlarmText : "";
            if (alarmInfo != nullptr) {
                if (alarmInfo->strDescription.empty()) {
                    alarmData.strDescription = alarmInfo->strAlarmText;
                }
                else {
                    alarmData.strDescription = alarmInfo->strAlarmText + "," + alarmInfo->strDescription + ".";
                }
            }
            int nAlarmEventId = 0;
            bool result = alarmManager.addAlarm(alarmData, nAlarmEventId);
@@ -482,6 +491,10 @@
int CModel::term()
{
    m_configuration.setPortCassetteSnSeed(1, m_master.getPortCassetteSnSeed(1));
    m_configuration.setPortCassetteSnSeed(2, m_master.getPortCassetteSnSeed(2));
    m_configuration.setPortCassetteSnSeed(3, m_master.getPortCassetteSnSeed(3));
    m_configuration.setPortCassetteSnSeed(4, m_master.getPortCassetteSnSeed(4));
    m_hsmsPassive.saveCache();
    m_hsmsPassive.term();
    CLog::GetLog()->SetOnLogCallback(nullptr);
SourceCode/Bond/Servo/PageAlarm.cpp
@@ -48,7 +48,7 @@
    }
}
void CPageAlarm::InitRxWindow()
void CPageAlarm::InitRxWindows()
{
    /* code */
    // è®¢é˜…数据
@@ -196,7 +196,7 @@
        pListCtrl->DeleteItem(nRowCount - 1);
    }
    int nNewItem = pListCtrl->InsertItem(0, _T(""));
    int nNewItem = pListCtrl->InsertItem(pListCtrl->GetItemCount(), _T(""));
    // è®¾ç½®æ¯ä¸€åˆ—的数据
    CString str;
@@ -249,6 +249,7 @@
BOOL CPageAlarm::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    InitRxWindows();
    SetTimer(1, 3000, nullptr);
    // ä¸‹æ‹‰æ¡†æŽ§ä»¶
@@ -506,3 +507,12 @@
    m_nCurPage++;
    UpdatePageData();  // è°ƒç”¨åˆ†é¡µæ›´æ–°å‡½æ•°
}
BOOL CPageAlarm::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) {
        return TRUE;
    }
    return CDialogEx::PreTranslateMessage(pMsg);
}
SourceCode/Bond/Servo/PageAlarm.h
@@ -17,7 +17,7 @@
    virtual ~CPageAlarm();
private:
    void InitRxWindow();
    void InitRxWindows();
    void Resize();
    void LoadAlarms();
    void UpdatePageData();
@@ -63,11 +63,11 @@
    afx_msg void OnDestroy();
    afx_msg void OnClose();
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    afx_msg void OnCbnSelchangeComboDatetime();
    afx_msg void OnBnClickedButtonSearch();
    afx_msg void OnBnClickedButtonExport();
    afx_msg void OnBnClickedButtonPrevPage();
    afx_msg void OnBnClickedButtonNextPage();
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    DECLARE_MESSAGE_MAP()
};
SourceCode/Bond/Servo/PageLog.cpp
@@ -53,7 +53,7 @@
// CLogDlg æ¶ˆæ¯å¤„理程序
void CPageLog::InitRxWindow()
void CPageLog::InitRxWindows()
{
    /* code */
    // è®¢é˜…数据
@@ -116,7 +116,7 @@
BOOL CPageLog::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    InitRxWindow();
    InitRxWindows();
    // ç¼“å­˜
SourceCode/Bond/Servo/PageLog.h
@@ -25,7 +25,7 @@
private:
    void InitRxWindow();
    void InitRxWindows();
    void AppendLog(int level, const char* pszText);
    void Resize();
SourceCode/Bond/Servo/PageRecipe.cpp
@@ -778,4 +778,13 @@
        }
    }
    return result;
}
BOOL CPageRecipe::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) {
        return TRUE;
    }
    return CDialogEx::PreTranslateMessage(pMsg);
}
SourceCode/Bond/Servo/PageRecipe.h
@@ -46,6 +46,7 @@
    afx_msg void OnClickListPPID(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnDblclkListPPID(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnCbnSelchangeComboEquipment();
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    DECLARE_MESSAGE_MAP()
private:
SourceCode/Bond/Servo/PageTransferLog.cpp
@@ -51,7 +51,7 @@
    CDialogEx::DoDataExchange(pDX);
}
void CPageTransferLog::InitRxWindow()
void CPageTransferLog::InitRxWindows()
{
    /* code */
    // è®¢é˜…数据
@@ -408,7 +408,7 @@
{
    if (nIDEvent == 1) {
        KillTimer(1);
        InitRxWindow();
        InitRxWindows();
    }
    CDialogEx::OnTimer(nIDEvent);
}
@@ -497,4 +497,13 @@
        m_nCurPage++;
        UpdatePageData();
    }
}
BOOL CPageTransferLog::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) {
        return TRUE;
    }
    return CDialogEx::PreTranslateMessage(pMsg);
}
SourceCode/Bond/Servo/PageTransferLog.h
@@ -36,7 +36,7 @@
    CDateTimeCtrl m_dateTimeEnd;
    CListCtrlEx m_listCtrl;
    void InitRxWindow();
    void InitRxWindows();
    void Resize();
    void InitStatusCombo();
    void InitTimeRangeCombo();
@@ -66,5 +66,6 @@
    afx_msg void OnBnClickedButtonExport();
    afx_msg void OnBnClickedButtonPrevPage();
    afx_msg void OnBnClickedButtonNextPage();
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    DECLARE_MESSAGE_MAP()
};
SourceCode/Bond/Servo/Servo.rc
Binary files differ
SourceCode/Bond/Servo/Servo.vcxproj
@@ -225,6 +225,7 @@
    <ClInclude Include="CPageReport.h" />
    <ClInclude Include="CPageVarialbles.h" />
    <ClInclude Include="CParam.h" />
    <ClInclude Include="CProcessDataListDlg.h" />
    <ClInclude Include="CReport.h" />
    <ClInclude Include="CRobotCmdContainerDlg.h" />
    <ClInclude Include="CRobotCmdTestDlg.h" />
@@ -400,6 +401,7 @@
    <ClCompile Include="CPageReport.cpp" />
    <ClCompile Include="CPageVarialbles.cpp" />
    <ClCompile Include="CParam.cpp" />
    <ClCompile Include="CProcessDataListDlg.cpp" />
    <ClCompile Include="CReport.cpp" />
    <ClCompile Include="CRobotCmdContainerDlg.cpp" />
    <ClCompile Include="CRobotCmdTestDlg.cpp" />
SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -197,6 +197,7 @@
    <ClCompile Include="CServoUtilsTool.cpp" />
    <ClCompile Include="GlassLogDb.cpp" />
    <ClCompile Include="sqlite3.c" />
    <ClCompile Include="CProcessDataListDlg.cpp" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="AlarmManager.h" />
@@ -419,6 +420,7 @@
    <ClInclude Include="GlassLogDb.h" />
    <ClInclude Include="sqlite3.h" />
    <ClInclude Include="sqlite3ext.h" />
    <ClInclude Include="CProcessDataListDlg.h" />
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="Servo.rc" />
SourceCode/Bond/Servo/ServoDlg.cpp
@@ -218,6 +218,7 @@
                    m_pMyStatusbar->setForegroundColor(RGB(0, 0, 0));
                    m_pMyStatusbar->setRunTimeText("启动失败.");
                    m_pTopToolbar->GetBtn(IDC_BUTTON_ALARM)->EnableWindow(TRUE);
                    KillTimer(TIMER_ID_UPDATE_RUMTIME);
                }
                else if (state == SERVO::MASTERSTATE::ATHERERROR) {
                    m_pTopToolbar->GetBtn(IDC_BUTTON_RUN)->EnableWindow(TRUE);
@@ -231,6 +232,7 @@
                        AfxMessageBox(_T("AOI检测失败,请操作员介入解决问题!"));
                    }
                    m_pTopToolbar->GetBtn(IDC_BUTTON_ALARM)->EnableWindow(TRUE);
                    KillTimer(TIMER_ID_UPDATE_RUMTIME);
                }
                else if (state == SERVO::MASTERSTATE::RUNNING || state == SERVO::MASTERSTATE::RUNNING_CONTINUOUS_TRANSFER
                    || state == SERVO::MASTERSTATE::RUNNING_BATCH) {
SourceCode/Bond/Servo/resource.h
Binary files differ
SourceCode/Bond/x64/Debug/AlarmList.csv
@@ -1,3 +1 @@
No,UNIT ID,UNIT NO,Alarm Level,Alarm Code,AlarmID,Alarm Text,Description
1,EFEM(ROBOT)-EFEM,,0,2,100,Fatal communication error in the ACLS receive loop. Please reboot MCC., Fatal communication error in the ACLS receive loop. Please reboot MCC.
2,Load Port 1-EFEM,,1,1,101,"Must check substrate location due to the failure of ACLS operation <%s> ; To protect glass, a dummy glass has been created"," Must check substrate location due to the failure of ACLS operation <%s> ; To protect glass, a dummy glass has been created"
No,UNIT ID,UNIT NO,Alarm Level,Alarm Code,AlarmID,Alarm Text,Description 1,EFEM,100,0,0,1000,机器人CCLink链接异常,"请检查接线,断电重启" 2,EFEM,101,0,0,1001,相机CCLink链接异常,"请检查接线,断电重启" 3,EFEM,102,0,0,1002,静电测试CCLink链接异常,"请检查接线,断电重启" 4,EFEM,103,0,0,1003,, 5,EFEM,104,0,0,1004,, 6,EFEM,105,0,0,1005,, 7,EFEM,106,0,0,1006,, 8,EFEM,107,0,0,1007,, 9,EFEM,108,0,0,1008,, 10,EFEM,109,0,0,1009,, 11,EFEM,110,0,0,1010,总进气气压异常,请检测进气 12,EFEM,111,0,0,1011,总真空气压异常,请检测真空 13,EFEM,112,0,0,1012,LP真空异常,检测真空 14,EFEM,113,0,0,1013,离子风棒压空异常,请检测进气 15,EFEM,114,0,0,1014,机器人真空异常,请检测真空 16,EFEM,115,0,0,1015,急停被按下,请检查急停按钮 17,EFEM,116,0,0,1016,, 18,EFEM,117,0,0,1017,, 19,EFEM,118,0,0,1018,, 20,EFEM,119,0,0,1019,, 21,EFEM,120,0,0,1020,安全门打开,请检查安全门 22,EFEM,121,0,0,1021,正面左门打开中,请检查安全门 23,EFEM,122,0,0,1022,正面右门打开中,请检查安全门 24,EFEM,123,0,0,1023,侧面左门打开中,请检查安全门 25,EFEM,124,0,0,1024,侧面右门打开中,请检查安全门 26,EFEM,125,0,0,1025,背面左门打开中,请检查安全门 27,EFEM,126,0,0,1026,背面右门打开中,请检查安全门 28,EFEM,127,0,0,1027,, 29,EFEM,128,0,0,1028,, 30,EFEM,129,0,0,1029,, 31,EFEM,130,0,0,1030,, 32,EFEM,131,0,0,1031,"Port1_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆 33,EFEM,132,0,0,1032,"Port1_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆 34,EFEM,133,0,0,1033,"Port1_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆 35,EFEM,134,0,0,1034,, 36,EFEM,135,0,0,1035,, 37,EFEM,136,0,0,1036,, 38,EFEM,137,0,0,1037,, 39,EFEM,138,0,0,1038,, 40,EFEM,139,0,0,1039,, 41,EFEM,140,1,0,1040,"Port1_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆 42,EFEM,141,1,0,1041,"Port1_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停 43,EFEM,142,1,0,1042,"Port1_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态" 44,EFEM,143,1,0,1043,"Port1_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆 45,EFEM,144,0,0,1044,, 46,EFEM,145,0,0,1045,, 47,EFEM,146,0,0,1046,, 48,EFEM,147,0,0,1047,, 49,EFEM,148,0,0,1048,, 50,EFEM,149,0,0,1049,, 51,EFEM,150,0,0,1050,"Port2_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆 52,EFEM,151,0,0,1051,"Port2_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆 53,EFEM,152,0,0,1052,"Port2_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆 54,EFEM,153,0,0,1053,, 55,EFEM,154,0,0,1054,, 56,EFEM,155,0,0,1055,, 57,EFEM,156,0,0,1056,, 58,EFEM,157,0,0,1057,, 59,EFEM,158,0,0,1058,, 60,EFEM,159,0,0,1059,, 61,EFEM,160,0,0,1060,"Port2_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆 62,EFEM,161,0,0,1061,"Port2_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停 63,EFEM,162,0,0,1062,"Port2_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态" 64,EFEM,163,0,0,1063,"Port2_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆 65,EFEM,164,0,0,1064,, 66,EFEM,165,0,0,1065,, 67,EFEM,166,0,0,1066,, 68,EFEM,167,0,0,1067,, 69,EFEM,168,0,0,1068,, 70,EFEM,169,0,0,1069,, 71,EFEM,170,1,0,1070,, 72,EFEM,171,1,0,1071,"Port3_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆 73,EFEM,172,1,0,1072,"Port3_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停 74,EFEM,173,1,0,1073,"Port3_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态" 75,EFEM,174,1,0,1074,"Port3_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆 76,EFEM,175,1,0,1075,, 77,EFEM,176,1,0,1076,, 78,EFEM,177,1,0,1077,, 79,EFEM,178,1,0,1078,, 80,EFEM,179,1,0,1079,, 81,EFEM,180,1,0,1080,"Port3_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆 82,EFEM,181,1,0,1081,"Port3_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆 83,EFEM,182,1,0,1082,"Port3_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆 84,EFEM,183,1,0,1083,, 85,EFEM,184,1,0,1084,, 86,EFEM,185,1,0,1085,, 87,EFEM,186,1,0,1086,, 88,EFEM,187,1,0,1087,, 89,EFEM,188,1,0,1088,, 90,EFEM,189,1,0,1089,, 91,EFEM,190,1,0,1090,, 92,EFEM,191,1,0,1091,"Port4_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆 93,EFEM,192,1,0,1092,"Port4_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停 94,EFEM,193,1,0,1093,"Port4_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态" 95,EFEM,194,1,0,1094,"Port4_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆 96,EFEM,195,1,0,1095,, 97,EFEM,196,1,0,1096,, 98,EFEM,197,1,0,1097,, 99,EFEM,198,1,0,1098,, 100,EFEM,199,1,0,1099,, 101,EFEM,200,1,0,1100,"Port4_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆 102,EFEM,201,1,0,1101,"Port4_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆 103,EFEM,202,1,0,1102,"Port4_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆 104,EFEM,203,1,0,1103,, 105,EFEM,204,1,0,1104,, 106,EFEM,205,1,0,1105,, 107,EFEM,206,1,0,1106,, 108,EFEM,207,1,0,1107,, 109,EFEM,208,1,0,1108,, 110,EFEM,209,1,0,1109,, 111,EFEM,210,0,0,1110,回原点失败/超时,请检查设备状态以及轴位置是否有干涉,请重新执行回原操作 112,EFEM,211,0,0,1111,Flip工位,真空打开时在荷异常,请检查玻璃位置 113,EFEM,212,1,0,1112,, 114,EFEM,213,1,0,1113,, 115,EFEM,214,1,0,1114,, 116,EFEM,215,1,0,1115,, 117,EFEM,216,1,0,1116,, 118,EFEM,217,1,0,1117,, 119,EFEM,218,1,0,1118,, 120,EFEM,219,1,0,1119,, 121,EFEM,220,1,0,1120,任务取消失败,当前取消任务条件不满足 122,EFEM,221,1,0,1121,任务重试失败,当前重试任务条件不满足