mrDarker
2025-06-26 637cc6677dace087410079fd2ee434a4fbd45adb
1. 添加定时器获取当前EFEM位置,并且更新(包括手臂是否有片)
已修改3个文件
71 ■■■■■ 文件已修改
SourceCode/Bond/Servo/CPageGraph1.cpp 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageGraph1.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Common.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageGraph1.cpp
@@ -41,6 +41,10 @@
#define INDICATE_BAKE_COOLING    12
#define INDICATE_MEASUREMENT    13
// 定时器
#define TIMER_ID_DEVICE_STATUS      1   // 用于初始化设备状态
#define TIMER_ID_ROBOT_STATUS       2   // 用于周期刷新机器人位置/臂状态
// CPageGraph1 对话框
IMPLEMENT_DYNAMIC(CPageGraph1, CDialogEx)
@@ -148,8 +152,8 @@
{
    CDialogEx::OnInitDialog();
    InitRxWindows();
    SetTimer(1, 3000, nullptr);
    SetTimer(TIMER_ID_DEVICE_STATUS, 3000, nullptr);
    SetTimer(TIMER_ID_ROBOT_STATUS, 1000, nullptr); // 每 1000ms 更新一次状态
    // 图示
    m_pGraph = CServoGraph::Hook(GetDlgItem(IDC_SERVO_GRAPH1)->GetSafeHwnd());
@@ -251,7 +255,12 @@
        newFrameColor2 = EQ_BOX_FRAME2;
        break;
    case OFFLINE:
        newBackgroundColor = RGB(222, 222, 222);
        newBackgroundColor = EQ_BOX_OFFLINE;
        newFrameColor1 = EQ_BOX_FRAME1;
        newFrameColor2 = EQ_BOX_FRAME2;
        break;
    case OCCUPIED:
        newBackgroundColor = EQ_BOX_OCCUPIED;
        newFrameColor1 = EQ_BOX_FRAME1;
        newFrameColor2 = EQ_BOX_FRAME2;
        break;
@@ -299,6 +308,8 @@
void CPageGraph1::OnDestroy()
{
    CDialogEx::OnDestroy();
    KillTimer(TIMER_ID_ROBOT_STATUS);
    if (m_hbrBkgnd != nullptr) {
        ::DeleteObject(m_hbrBkgnd);
@@ -461,6 +472,8 @@
    // 旋转方向
    RotateRobot(mapping.angle);
    m_lastRobotPosition = position;
}
void CPageGraph1::OnGraphItemClicked(NMHDR* pNMHDR, LRESULT* pResult)
@@ -513,14 +526,20 @@
void CPageGraph1::OnTimer(UINT_PTR nIDEvent)
{
    if (1 == nIDEvent) {
        KillTimer(1);
    if (TIMER_ID_DEVICE_STATUS == nIDEvent) {
        KillTimer(TIMER_ID_DEVICE_STATUS);
        // 更新状态
        {
            SERVO::CEquipment* pEquipment = (SERVO::CEFEM*)theApp.m_model.m_master.getEquipment(EQ_ID_EFEM);
            ASSERT(pEquipment);
            DeviceStatus status = pEquipment->isAlive() ? DeviceStatus::ONLINE : DeviceStatus::OFFLINE;
            UpdateDeviceStatus(INDICATE_FLIPER, status);
            UpdateDeviceStatus(INDICATE_ALIGNER, status);
            UpdateDeviceStatus(INDICATE_LPORT1, status);
            UpdateDeviceStatus(INDICATE_LPORT2, status);
            UpdateDeviceStatus(INDICATE_LPORT3, status);
            UpdateDeviceStatus(INDICATE_LPORT4, status);
            UpdateDeviceStatus(INDICATE_ROBOT_ARM1, status);
            UpdateDeviceStatus(INDICATE_ROBOT_ARM2, status);
        }
@@ -538,6 +557,45 @@
            DeviceStatus status = pEquipment->isAlive() ? DeviceStatus::ONLINE : DeviceStatus::OFFLINE;
            UpdateDeviceStatus(INDICATE_BONDER2, status);
        }
        {
            SERVO::CEquipment* pEquipment = theApp.m_model.m_master.getEquipment(EQ_ID_VACUUMBAKE);
            ASSERT(pEquipment);
            DeviceStatus status = pEquipment->isAlive() ? DeviceStatus::ONLINE : DeviceStatus::OFFLINE;
            UpdateDeviceStatus(INDICATE_VACUUM_BAKE, status);
        }
        {
            SERVO::CEquipment* pEquipment = theApp.m_model.m_master.getEquipment(EQ_ID_BAKE_COOLING);
            ASSERT(pEquipment);
            DeviceStatus status = pEquipment->isAlive() ? DeviceStatus::ONLINE : DeviceStatus::OFFLINE;
            UpdateDeviceStatus(INDICATE_BAKE_COOLING, status);
        }
        {
            SERVO::CEquipment* pEquipment = theApp.m_model.m_master.getEquipment(EQ_ID_MEASUREMENT);
            ASSERT(pEquipment);
            DeviceStatus status = pEquipment->isAlive() ? DeviceStatus::ONLINE : DeviceStatus::OFFLINE;
            UpdateDeviceStatus(INDICATE_MEASUREMENT, status);
        }
    }
    else if (nIDEvent == TIMER_ID_ROBOT_STATUS) {
        SERVO::CEFEM* pEFEM = (SERVO::CEFEM*)theApp.m_model.m_master.getEquipment(EQ_ID_EFEM);
        if (!pEFEM || !pEFEM->isAlive()) {
            return;
        }
        // 如果设备在线,那么更新 ARM 状态
        SERVO::RMDATA& robotData = pEFEM->getRobotMonitoringData();
        DeviceStatus arm1Status = robotData.armState[0] ? DeviceStatus::OCCUPIED : DeviceStatus::ONLINE;
        DeviceStatus arm2Status = robotData.armState[1] ? DeviceStatus::OCCUPIED : DeviceStatus::ONLINE;
        UpdateDeviceStatus(INDICATE_ROBOT_ARM1, arm1Status);
        UpdateDeviceStatus(INDICATE_ROBOT_ARM2, arm2Status);
        // 位置信息状态显示
        if (robotData.position != m_lastRobotPosition) {
            MoveRobotToPosition(robotData.position);
        }
    }
    CDialogEx::OnTimer(nIDEvent);
SourceCode/Bond/Servo/CPageGraph1.h
@@ -5,6 +5,7 @@
enum DeviceStatus {
    ONLINE,       // 在线
    OFFLINE,      // 离线
    OCCUPIED      // 有片(占用)
};
struct RobotPositionMapping {
@@ -39,6 +40,7 @@
    BOOL m_bIsRobotMoving;
    COLORREF m_crBkgnd;
    HBRUSH m_hbrBkgnd;
    SERVO::ROBOT_POSITION m_lastRobotPosition;
// 对话框数据
#ifdef AFX_DESIGN_TIME
SourceCode/Bond/Servo/Common.h
@@ -34,6 +34,7 @@
#define PAGE_GRPAH2_BACKGROUND_COLOR        RGB(255, 255, 255)
#define EQ_BOX_OFFLINE                        RGB(222, 222, 222)
#define EQ_BOX_ONLINE                        RGB(0, 176, 80)
#define EQ_BOX_OCCUPIED                     RGB(0, 204, 102)
#define EQ_BOX_FRAME1                        RGB(22, 22, 22)
#define EQ_BOX_FRAME2                        RGB(255, 127, 39)
#define CR_MSGBOX_BKGND                        RGB(7, 71, 166)