|
|
#pragma once
|
|
|
#include <vector>
|
|
|
#include <iostream>
|
|
|
#include <map>
|
|
|
#include <string>
|
|
|
#include <list>
|
|
|
|
|
|
|
|
|
|
|
|
// 宏定义
|
|
|
#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<std::string, std::string> mapParam;
|
|
|
std::list<ERROR_CODE_DESCRIPTION> 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<REMOTE_PARAM_DATA> 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<std::string> 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<PP_FORMAT_PARAMENT> vecParam; // PP参数数据值
|
|
|
};
|
|
|
|
|
|
// pp 格式化处理的数据,扩展版
|
|
|
struct PP_FORMAT_HANDLE_EX
|
|
|
{
|
|
|
std::string pPPID; // PP名称(recipe名称)
|
|
|
std::map<std::string, std::vector<std::string>> 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<WAFER_MAP_REFERENCE_POINT> 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<std::string> (SecsPPNameListProc)(CSecsEquip*); // PP列表获取,初期添加
|
|
|
typedef void (SecsPPEventProc)(CSecsEquip*, PP_HANDLE_DATA* pPpHandle); // 自定义的PP处理
|
|
|
typedef PP_HANDLE_REPLY (SecsPPFormatValueDynamicProc)(CSecsEquip*, const char* pPPID, std::list<PP_FORMAT_DYNAMIC_HANDLE>& listParam); // PP格式化数据:主机获取值,动态的
|
|
|
typedef PP_HANDLE_REPLY (SecsPPFormatChangeDynamicProc)(CSecsEquip*, const char* pPPID, std::list<PP_FORMAT_DYNAMIC_HANDLE>& listParam); // PP格式化数据:主机更新值,动态的
|
|
|
|
|
|
// S9出错,SDK内部处理完成后,通知用户
|
|
|
typedef void (SecsS9ErrorNotifyProc)(CSecsEquip*, S9_ERROR::ENUM nType); // 自定义的PP处理
|
|
|
|
|
|
// WaferMap
|
|
|
typedef STRIP_MAP (SecsWaferMapSubstrateProc)(CSecsEquip*, const char* pID); // StripMap
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|