You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

496 lines
12 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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