1. SG精度检添加产品ID写入PLC功能
2. SG精度检产品ID显示乱码问题
3. 更新bond报警解析文件
已修改7个文件
97 ■■■■ 文件已修改
SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/PLCSignalListener.h 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/SGMeasurement.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/AlarmList.csv 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp
@@ -255,7 +255,7 @@
                        std::string strProductID;
                        if (ReadProductID(strProductID)) {
                            CString msg;
                            msg.Format(_T("读取到产品ID:%s"), strProductID);
                            msg.Format(_T("读取到产品ID:%s"), CString(strProductID.c_str()));
                            LOG_MSG(msg, LOG_TYPE_SUCCESS);
                        }
                    }
@@ -309,15 +309,22 @@
    }
    for (int i = 0; i < PLC_RESULT_ADDR_COUNT; ++i) {
        // 放大1000倍并四舍五入,转为PLC整数
        int32_t  nScaled = static_cast<int32_t>(std::round(values[i] * 1000.0));
        DWordContainer vec = { static_cast<uint32_t>(nScaled) };
        double dVal = values[i];
        int32_t nScaled = 0;
        if (dVal == DBL_MAX || dVal == DBL_MIN || std::isnan(dVal)) {
            nScaled = static_cast<int32_t>(dVal);
        }
        else {
            nScaled = static_cast<int32_t>(std::round(dVal * 1000.0));
        }
        short nTargetAddr = PLC_RESULT_ADDR_START + i * 2;
        DWordContainer vec = { static_cast<uint32_t>(nScaled) };
        int ret = m_pPlc->WriteDWordDataEx(m_station, PLC_WORD_DEVICE_TYPE, nTargetAddr, vec);
        if (ret != 0) {
            CString msg;
            msg.Format(_T("写入OUT%d到地址%d失败,值=%.2f"), i + 1, nTargetAddr, values[i]);
            msg.Format(_T("写入OUT%d到地址%d失败,值=%.2f"), i + 1, nTargetAddr, dVal);
            LOG_MSG(msg, LOG_TYPE_ERROR);
            return false;
        }
@@ -361,3 +368,42 @@
    return true;
}
bool CPLCSignalListener::WriteProductID(const std::string& strProductID)
{
    if (!m_pPlc || !m_bConnected) {
        LOG_MSG(_T("PLC未连接或未初始化,无法写入产品ID。"), LOG_TYPE_ERROR);
        return false;
    }
    WordContainer vec;
    vec.reserve(PLC_PRODUCT_ID_WORDS);
    for (size_t i = 0; i < strProductID.size();) {
        unsigned char c1 = static_cast<unsigned char>(strProductID[i]);
        unsigned char c2 = 0;
        if (i + 1 < strProductID.size()) {
            c2 = static_cast<unsigned char>(strProductID[i + 1]);
        }
        uint16_t w = static_cast<uint16_t>(c2 << 8 | c1);
        vec.push_back(w);
        i += 2;
    }
    while (vec.size() < PLC_PRODUCT_ID_WORDS) {
        vec.push_back(0);
    }
    int ret = m_pPlc->WriteWordDataEx(m_station, PLC_WORD_DEVICE_TYPE, PLC_PRODUCT_ID_ADDR, vec);
    if (ret != 0) {
        CString msg;
        msg.Format(_T("写入产品ID失败,错误码=%d"), ret);
        LOG_MSG(msg, LOG_TYPE_ERROR);
        return false;
    }
    return true;
}
SourceCode/Bond/SGMeasurement/PLCSignalListener.h
@@ -87,6 +87,17 @@
     */
    bool ReadProductID(std::string& strProductID);
    /**
     * @brief 将产品 ID(字符串形式)写入 PLC 内部。
     *
     * @param strProductID  输入参数,要写入的产品 ID。
     *                      字符串会按字节对齐,每两个字节组成一个 Word,
     *                      写入 PLC 的指定寄存器区域,不足时自动补零。
     * @return true         写入成功。
     * @return false        写入失败。
     */
    bool WriteProductID(const std::string& strProductID);
private:
    /**
     * @brief 输出日志信息(封装日志回调)。
SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
@@ -103,7 +103,7 @@
    CWinApp::InitInstance();
    // 唯一实例运行检测
    m_hMutex = ::CreateMutex(NULL, FALSE, _T("MutexEdgeInspector_App"));
    m_hMutex = ::CreateMutex(NULL, FALSE, _T("MutexSGMeasurementApp"));
    if (m_hMutex != NULL) {
        if (::GetLastError() == ERROR_ALREADY_EXISTS) {
            AfxMessageBox(_T("The Program is already running. Exit this Program."), MB_OK | MB_ICONERROR);
SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user
@@ -4,7 +4,7 @@
    <RESOURCE_FILE>SGMeasurement.rc</RESOURCE_FILE>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
    <DebuggerFlavor>WindowsRemoteDebugger</DebuggerFlavor>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <RemoteDebuggerCommand>\\DESKTOP-IODBVIQ\SGMeasurement\$(ProjectName).exe</RemoteDebuggerCommand>
SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
@@ -715,7 +715,7 @@
    return false;
}
float CSGMeasurementDlg::AnalyzeStoredData(int nOutNo)
double CSGMeasurementDlg::AnalyzeStoredData(int nOutNo)
{
    MEASURE_FUNC_START();
@@ -724,27 +724,27 @@
    if (m_nUseTrigger) {
        UpdateControlStatus(m_bConnected, m_bSaving);
        AfxMessageBox(_T("当前是硬触发模式,请检查触发器状态。"), MB_ICONINFORMATION);
        return 0xFF;
        return DBL_MAX;
    }
    if (!m_bConnected) {
        AppendLogLineRichStyled(_T("设备未连接,请先连接设备。"), LOG_COLOR_WARNING);
        return 0xFF;
        return DBL_MAX;
    }
    if (m_bSaving) {
        AppendLogLineRichStyled(_T("数据存储正在进行中,请先停止存储。"), LOG_COLOR_WARNING);
        return 0xFF;
        return DBL_MAX;
    }
    if (nOutNo < 1 || nOutNo > 4) {
        AppendLogLineRichStyled(_T("输出端口编号无效,必须在 1 到 4 之间。"), LOG_COLOR_ERROR);
        return 0xFF;
        return DBL_MAX;
    }
    if (m_nSavePointCount < 0) {
        AppendLogLineRichStyled(_T("数据点数必须大于 0。"), LOG_COLOR_ERROR);
        return 0xFF;
        return DBL_MAX;
    }
    std::vector<float> vecBuffer(m_nSavePointCount, 0.0f);
@@ -755,7 +755,7 @@
        CString strError;
        strError.Format(_T("读取 OUT%d 数据失败,错误码:%#X"), nOutNo, nRet);
        AppendLogLineRichStyled(strError, LOG_COLOR_ERROR);
        return 0xFF;
        return DBL_MAX;
    }
    vecBuffer.resize(nReceived);
@@ -764,7 +764,7 @@
    std::vector<float> vecGlass1, vecGlass2;
    if (!SplitGlassSegments(nOutNo, vecBuffer, vecGlass1, vecGlass2, m_fJumpThreshold, m_nJumpWindow, m_nValleyMargin, m_nMinGlass1Count)) {
        AppendLogLineRichStyled(_T("未能识别出两片玻璃的数据。"), LOG_COLOR_WARNING);
        return 0xFF;
        return DBL_MAX;
    }
    std::vector<float> vecGlass1Filtered, vecGlass2Filtered;
@@ -924,7 +924,7 @@
    m_plcListener.SetAnalyzeCallback([this]() {
        if (!m_bConnected) {
            AppendLogLineRichStyled(_T("设备未连接,请先连接设备。"), LOG_COLOR_WARNING);
            return std::array<double, 4>{ 0xFF, 0xFF, 0xFF, 0xFF };
            return std::array<double, 4>{ DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX };
        }
        std::array<double, 4> result;
SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
@@ -234,9 +234,9 @@
     * @brief 分析指定端口的存储数据,并提取两段玻璃数据与稳定区,计算偏移。
     *
     * @param nOutNo     输出端口编号(1~4)
     * @return float     成功返回计算出的偏移量,失败返回 -1.0f
     * @return double     成功返回计算出的偏移量,失败返回 -1.0f
     */
    float AnalyzeStoredData(int nOutNo);
    double AnalyzeStoredData(int nOutNo);
    // === 系统状态与运行数据 ===
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,任务重试失败,当前重试任务条件不满足