#pragma once #include #include #include #include #include // 宏定义 #define MDLN_MAXLEN 20 #define SOFTREV_MAXLEN 20 // 控制状态模型 enum CONTROL_MODE { eCONTROL_MODE_OFFLINE = 0, /* 离线 */ eCONTROL_MODE_ONLINE_LOCAL, /* 本地在线*/ eCONTROL_MODE_ONLINE_REMOTE, /* 远程在线*/ }; // 控制状态 enum CONTROL_STATE { eCONTROL_OFFLINE_EQUIPMENT = 1, /* 离线:设备 */ eCONTROL_OFFLINE_ATTEMPT_ONLINE, /* 离线:积极等待在线 */ eCONTROL_OFFLINE_HOST, /* 离线:主机 */ eCONTROL_ONLINE_LOCAL, /* 在线:本地 */ eCONTROL_ONLINE_REMOTE, /* 在线:远程 */ }; // 连接状态 enum CONNECT_STATE { eCONNECT_DISCONNECT = 0, /* 断开连接 */ eCONNECT_LISTEN, /* 倾听,回调不能阻塞调用 */ eCONNECT_CONNECT, /* 连接上,回调不能阻塞调用 */ eCONNECT_SELECT, /* 选择成功 */ eCONNECT_COMMUNICATING, /* 通讯上 */ }; // 通讯状态 enum COMM_STATE { eCOMM_DISABLED = 0, /* 没有启用通讯 */ eCOMM_ENABLED_NOT_COMMUNICATING, /* 启用,没有通讯 */ eCOMM_COMMUNICATING, /* 通讯着 */ }; // 远程控制反馈 enum REMOTE_REPLY { eCOMMAND_PERFORMED = 0, /* 执行 */ eCOMMAND_NOT_EXIST, /* 命令不存在 */ eCOMMAND_CANNOT_PERFORM_NOW, /* 命令现在不能执行 */ eCOMMAND_PARAMETER_IS_INVALID, /* 至少一个参数无效 */ eCOMMAND_ACK_AND_WITH_SIGNAL, /* 确认,命令将在事件完成后通过信号通知完成 */ eCOMMAND_REJECTED, /* 拒绝,虽然已经满足命令所需状态 */ eCOMMAND_NO_SUCH_OBJECT_EXIST, /* 不存在此类对象 */ eCOMMAND_OTHER, /* 其他 */ eCOMMAND_THIS_IS_YOUR_DEFINE, /* 你可以自定义,非上边的正整数即可 */ }; // 终端消息反馈 enum TERMINAL_REPLY { eDISPLAY_IN_WINDOW = 0, /* 显示在窗口 */ eMESSAGE_WILL_NOT_BE_DISPLAY, /* 消息不会显示 */ eTERMINAL_NOT_AVAILABLE, /* 终端不可用,没有该功能 */ }; // pp 格式化处理 // 扩展功能 enum PP_FORMAT_CMD { eLOAD_TMP_PPID, /* 加载PPID,存在PPID则返回字符0 */ eGET_PPID_VALUE, /* 获取的PPID的值,返回值的字符串 */ eGET_PPID_VALUE_FINSH, /* 获取的PPID的值,完成 */ eSET_PPID_VALUE_BEGIN, /* 设置的PPID的值开始,附带PPID参数 */ eSET_PPID_VALUE, /* 设置的PPID的值,附带Code和值 */ eSET_PPID_VALUE_FINSH, /* 设置的PPID的值完成*/ }; // PP处理模式 // 扩展功能 enum PP_HANDLE_MODE { eSystemBuiltIn = 0, // SECS系统内置方法 eCostomizeHandle, // 自定义处理 // eCostomizeHandlePpidList, // 自定义处理:PPID列表问题. }; // PP自定义功能:PP处理事件枚举 enum PP_HANDLE_EVENT { ePPEventDelete = 0, // 删除单个ppid ePPEventDeleteAll, // 删除全部ppid ePPEventLoadData, // 获取数据 ePPEventDownData, // 下载数据 ePPEventLoadInquire, // 下载允许确认 }; // PP自定义功能:处理结果返回值 enum PP_HANDLE_REPLY { ePPSuccess = 0, // 处理成功 ePPPermissionNotGranted, // 权限不够 ePPLengthError, // 长度错误 ePPMatrixOverflow, // 数据错误 ePPRecipeNameNotFound, // 程式名称没有找到 ePPModeUnsupported, // 不支持 ePPOtherError, // 其他错误 }; // PP发生改变通知事件 enum PP_CHANGE_NOTIFY { ePPDeleteChangeNotify = 0, // PP发生事件:已经删除了recipe ePPDownChangeNotify, // PP发生事件:已经下载了recipe ePPLoadChangeNotify, // PP发生事件:已经上传了recipe }; // 警报事件通知模式 enum ALARM_NOTIFY_EVENT_MODE { eAlarmNotEvent = 0, // 警报发生后,没有事件通知 eAlarmUnifyEvent, // 警报发生后,统一一个事件通知 eAlarmEveryEvent, // 警报发生后,每个警报一个事件通知 eAlarmEveryAndUnifyEvent, // 警报发生后,每个警报一个事件通知,同时也统一事件通知 }; // PP Format处理模式 enum PP_FORMAT_MODE { ePPFormatFixedCode = 0, // 固定CCode ePPFormatDynamicCode, // 动态CCode }; // 警报类别 enum ALARM_CATEGORY { eCategoryNoUser = 0, // 不使用类别划分 eCategoryPersonalSafety = 1, // 会对人造成危险 eCategoryEquipmentSafety = 2, // 会对设备造成损坏 eCategoryParameterControlWarning = 3, // 超出参数预设限制,可能损坏产品 eCategoryParameterControlError = 4, // 超出合理的控制值的参数变化,可能造成设备故障 eCategoryIrrecoverableError = 5, // 不可恢复故障,需要人为干预 eCategoryEquipmentStatusWarning = 6, // 设备发生意外情况,但操作可以继续 eCategoryAttentionFlags = 7, // 注意标志,设备作业指示已经到达特定步骤 eCategoryDataIntegrity = 8, // 可能发生数据丢失 }; // 物料ID类型 namespace MATERIAL_ID_TYPE { enum ENUM { Wafer = 0, WaferCassette = 1, FilmFrame = 2, // wafer放在薄膜铁框上 }; } // 晶圆的平边、凹角相对底部的顺时针角度 namespace WAFER_FLAT_NOTCH_ANGLE { enum ENUM { ANGLE0 = 0, // 朝下 ANGLE90, // 朝左 ANGLE180, // 朝上 ANGLE270, // 朝右 }; } // 晶圆的平边、凹角相对"铁框的缺角"的顺时针角度 namespace WAFER_FILM_FRAME_ANGLE { enum ENUM { ANGLE0 = 0, // 朝下 ANGLE90, // 朝左 ANGLE180, // 朝上 ANGLE270, // 朝右 }; } namespace WAFER_MAP_FT { enum ENUM { Row = 0, Array = 1, Coordinate = 2 }; } // map坐标系原点位置 namespace ORIGIN_LOCATION { enum ENUM { Center = 0, UpperRight = 1, UpperLeft = 2, LowerLeft = 3, LowerRight = 4, }; } // 处理轴 namespace PROCESS_AXIS { enum ENUM { XAxisTopIncreasing = 0, XAxisTopDecreasing = 1, XAxisBottomIncreasing = 2, XAxisBottomDecreasing = 3, YAxisLeftIncreasing = 4, YAxisLeftDecreasing = 5, YAxisRightIncreasing = 6, YAxisRightDecreasing = 7, }; } // 错误枚举 namespace S9_ERROR { enum ENUM { UnrecognizedStreamType = 2, // 不支持Stream UnrecognizedFunctionType = 3, // 不支持Function IllegalData = 4, TransactionTimerTimeout = 5, // 会话超时 DataTooLong = 6, // 数据太大 ConversationTimeout = 7, // 会话超时 }; } ////////////////////////////////////////////////////////////////////////// // 存放数据结构的头文件 struct EVENT_DATA { int nCEID; std::string pName; std::string pDescription; EVENT_DATA(); }; // 变量内容 // DVVAL, SV, ECV struct VARIABLE_DATA { std::string VID; std::string VarName; // 名称 std::string Description; // 描述 std::string Value; // 数值 std::string Type; // 数值类型 std::string VarClass; // 变量类型 std::string Units; // 单位 std::string MinValue; // 最小值 std::string MaxValue; // 最大值 std::string DefValue; // 默认值 bool bInside; // 内置的数据 VARIABLE_DATA(); }; // Alarm内容 struct ALARM_DATA { std::string ALID; std::string ALTX; // 名称 std::string SetCEID; // 设置事件 std::string ClearCEID; // 清除事件 int nCategory; // 警报类别 bool bEnable; // 启用 bool bSet; // 使能 ALARM_DATA(); ALARM_DATA(const ALARM_DATA& des); void operator = (const ALARM_DATA& des); void copy(const ALARM_DATA& des); }; // 错误代码和描述 struct ERROR_CODE_DESCRIPTION { int nCode; std::string pDescription; ERROR_CODE_DESCRIPTION(); ERROR_CODE_DESCRIPTION(int nCode, std::string pDescription); }; // 远程控制信息, 新方法 // 可用 string recipe = svParam["recipe"] 提取方法对应变名的值 struct REMOTE_DATA { std::string pRCMD; std::map mapParam; std::list listErrorCode; // 获取参数值,返回空代表没有该参数 const char* GetValue(std::string pName); void AddErrorCode(int nCode, std::string pDescription); }; // 远程控制参数信息 struct REMOTE_PARAM_DATA { std::string pName; std::string pValue; }; // 远程控制信息,旧模式 // 修改只需如下: // 有一个 REMOTE_DATA 的变量rd到来 // REMOTE_DATA_OLD rdo = rd; 即可转换回原来的模式 struct REMOTE_DATA_OLD { std::string pRCMD; std::vector svParam; REMOTE_DATA_OLD(){} REMOTE_DATA_OLD(REMOTE_DATA_OLD& rdo); REMOTE_DATA_OLD(REMOTE_DATA& rd); }; // 终端消息数据 struct TERMINAL_DATA { int nTid; // 指定显示设备,基本不用。 int nSize; // 消息长度 const char* pText; // 消息文本,兼容多字节中文和ASCII // 中文其他编码时候需要跟Host协商 // ASCII字符可以直接用 string text = pText; 提取,忽略nSize }; // 自定义的pp处理的数据 struct PP_HANDLE_DATA { PP_HANDLE_EVENT nEvent; // 处理类型 const char* pPPID; // PP数据 const char* pPPData; // PP数据 int nLength; // 长度 PP_HANDLE_REPLY nAck; // 答复 PP_HANDLE_DATA(); }; // pp 格式化处理的数据 struct PP_FORMAT_HANDLE { PP_FORMAT_CMD nEvent; // 处理类型 std::string pPPID; // PP名称(recipe名称) std::string pCCode; // PP的CCODE代码 std::vector vecParamValue; // PP参数数据值 PP_HANDLE_REPLY nAck; // 答复, Host发送设置PP值时候才需要答复 PP_FORMAT_HANDLE(); }; // pp 格式化处理的数据 struct PP_FORMAT_PARAMENT { std::string pType; // 值的类型 std::string pValue; // PP参数数据值 PP_FORMAT_PARAMENT(); PP_FORMAT_PARAMENT(std::string pType, std::string pValue); }; // pp 格式化处理的数据 struct PP_FORMAT_DYNAMIC_HANDLE { std::string pCCode; // PP的CCODE代码 std::vector vecParam; // PP参数数据值 }; // pp 格式化处理的数据,扩展版 struct PP_FORMAT_HANDLE_EX { std::string pPPID; // PP名称(recipe名称) std::map> mapParamValue; // PP的CCODE代码,PP参数数据值 PP_HANDLE_REPLY nAck; // 答复, Host发送设置PP值时候才需要答复 PP_FORMAT_HANDLE_EX(); }; struct WAFER_MAP_REFERENCE_POINT { int nX; int nY; }; struct WAFER_MAP { std::string pMID; // 物料ID,如条码、二维码 MATERIAL_ID_TYPE::ENUM nIDTYP; // 物料的类型 WAFER_FLAT_NOTCH_ANGLE::ENUM nFNLOC; // Wafer平边/缺口的角度 WAFER_FILM_FRAME_ANGLE::ENUM nFFROT; // 铁框旋转角度,如果没有铁框则为0 ORIGIN_LOCATION::ENUM nORLOC; // 原点位置 int nRPSEL; // 参考位置,一般0 std::vector listReferPoint; // wafer map 的2D物料数据 std::string pDUTMS; // 测量的晶粒单位(um、mm、nm等) double dbXDies; // 晶粒X轴长度 double dbYDies; // 晶粒Y轴长度 int nROWCT; // 晶粒行个数 int nCOLCT; // 晶粒列个数 std::string pNULBC; // map空值 std::string pMapBin; // 晶圆等级,1~X为等级。X由客户定义优差级别。S12F3、S12F4的BCEQU值、S12F9的BINLT std::string pBINLT; int nPRDCT; // 已经处理的芯片计数 PROCESS_AXIS::ENUM nPRAXI; // 处理轴 int nMLCL; WAFER_MAP(); }; struct STRIP_MAP { std::string pMID; std::string pMapDataByXml; // 数据,XML格式 }; ////////////////////////////////////////////////////////////////////////// // 回调函数 class CSecsEquip; // 定义回调类型在高层SECS事件 // 基础必要功能 typedef void (SecsStateChangeProc)(CSecsEquip*, const char* pStateType, int nState); // 状态改变:通讯状态、控制状态、连接状态 typedef TERMINAL_REPLY (SecsTerminalProc)(CSecsEquip*, TERMINAL_DATA td); // 终端通知 typedef REMOTE_REPLY (SecsRemoteProc)(CSecsEquip*, REMOTE_DATA* pRD); // 远程控制,改为指针:需要回传listErrorCode错误信息 // 更多功能 typedef const char* (SecsVarValueProc)(CSecsEquip*, int nVarID); // 变量值获取 typedef const char* (SecsConstantValueProc)(CSecsEquip*, int nECID); // 常量值获取 typedef void (SecsConstantsChangeProc)(CSecsEquip*, int nID, const char* pValue); // 常量改变,host修改了值 typedef void (SecsPPChangeNotifyProc)(CSecsEquip*, PP_CHANGE_NOTIFY nEvent, const char* ppid); // 处理程序改变通知 typedef void (SecsPPFormatValueProc)(CSecsEquip*, PP_FORMAT_HANDLE* pPpFormat); // PP格式化数据:主机获取值 typedef void (SecsPPFormatChangeProc)(CSecsEquip*, PP_FORMAT_HANDLE* pPpFormat); // PP格式化数据:主机修改PP的值 typedef void (SecsClockProc)(CSecsEquip*, const char* second_offset, SYSTEMTIME time); // 时间改变 // 特殊情形使用 typedef void (SecsRemoteProcEx)(CSecsEquip*, std::string pReplyMailbox, REMOTE_DATA rd); // 远程控制扩展型,自行答复结果,二选一 typedef std::list (SecsPPNameListProc)(CSecsEquip*); // PP列表获取,初期添加 typedef void (SecsPPEventProc)(CSecsEquip*, PP_HANDLE_DATA* pPpHandle); // 自定义的PP处理 typedef PP_HANDLE_REPLY (SecsPPFormatValueDynamicProc)(CSecsEquip*, const char* pPPID, std::list& listParam); // PP格式化数据:主机获取值,动态的 typedef PP_HANDLE_REPLY (SecsPPFormatChangeDynamicProc)(CSecsEquip*, const char* pPPID, std::list& listParam); // PP格式化数据:主机更新值,动态的 // S9出错,SDK内部处理完成后,通知用户 typedef void (SecsS9ErrorNotifyProc)(CSecsEquip*, S9_ERROR::ENUM nType); // 自定义的PP处理 // WaferMap typedef STRIP_MAP (SecsWaferMapSubstrateProc)(CSecsEquip*, const char* pID); // StripMap