//#include "stdafx.h" // QT删掉stdafx头文件引用 #include "SecsEquip.h" // 获取通讯状态文字 std::string GetCommunicationText(COMM_STATE e) { std::string text; switch (e) { case eCOMM_DISABLED: text = "DISNABLE"; break; case eCOMM_ENABLED_NOT_COMMUNICATING: text = "ENABLE{NOT COMMUNICATION}"; break; case eCOMM_COMMUNICATING: text = "COMMUNICATION"; break; default: text = "ERROR"; break; } return text; } // 获取控制状态文字 std::string GetControlText(CONTROL_STATE e) { std::string text; switch (e) { case eCONTROL_OFFLINE_ATTEMPT_ONLINE: text = "OFF-LINE Attempt Online"; break; case eCONTROL_OFFLINE_HOST: text = "OFF-LINE Host"; break; case eCONTROL_OFFLINE_EQUIPMENT: text = "OFF-LINE Equip"; break; case eCONTROL_ONLINE_LOCAL: text = "ON-LINE Local"; break; case eCONTROL_ONLINE_REMOTE: text = "ON-LINE Remote"; break; default: text = "ERROR"; break; } return text; } // UNICODE字符串转换ANSI std::string UnicodeToAscii(std::wstring pUnicode) { std::string pTextMulti; // 先取得转换后的ANSI字符串所需的长度 int nLen = WideCharToMultiByte(CP_ACP, 0, pUnicode.c_str(), -1, NULL, 0, NULL, NULL); // 缓冲区 nLen += 20; char* pMultiByte = (char*)malloc(nLen * sizeof(char)); if(pMultiByte != NULL) { // 转换 memset(pMultiByte, 0, nLen); int nNewSize = WideCharToMultiByte(CP_ACP, 0, pUnicode.c_str(), -1, pMultiByte, nLen, NULL, NULL); pTextMulti = pMultiByte; free(pMultiByte); } return pTextMulti; } // ANSI字符串转换UNICODE std::wstring AsciiToUnicode(std::string pAscii) { std::wstring pTextpWide; // 先取得转换后的ANSI字符串所需的长度 int nLen = MultiByteToWideChar(CP_ACP, 0, pAscii.c_str(), -1, NULL, 0); // 缓冲区 nLen += 20; wchar_t* pWideChar = (wchar_t*)malloc(nLen * sizeof(wchar_t)); if(pWideChar != NULL) { // 转换 memset(pWideChar, 0, nLen); int nNewSize = MultiByteToWideChar(CP_ACP, 0, pAscii.c_str(), -1, pWideChar, nLen); pTextpWide = pWideChar; free(pWideChar); } return pTextpWide; } // 状态改变处理 static void OnStateChangeHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnStateChangeHandler(pData); } } // 终端 TERMINAL static void OnTerminalHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnTerminalHandler(ReplyMailbox, pData); } } // 远程 static void OnRemoteHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnRemoteHandler(ReplyMailbox, pData); } } // 常量 static void OnConstantsChangeHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnConstantsChangeHandler(pData); } } // 处理程序 static void OnPPChangeNotifyHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnPPChangeNotifyHandler(pData); } } // 时间处理 static void OnClockHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnClockHandler(pData); } } // 变量 static void OnVarValueHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnVarValueHandler(ReplyMailbox, pData); } } // 常量 static void OnConstantValueHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnConstantValueHandler(ReplyMailbox, pData); } } // PP Format static void OnPPFormatValueHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnPPFormatValueHandler(ReplyMailbox, pData); } } // PP Format 动态模式 static void OnPPFormatDynamicValueHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnPPFormatValueDynamicHandler(ReplyMailbox, pData); } } // PP Format发生改变 static void OnPPFormatChangeHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnPPFormatChangeHandler(ReplyMailbox, pData); } } // PP Format发生改变 static void OnPPFormatChangeDynamicHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnPPFormatChangeDynamicHandler(ReplyMailbox, pData); } } // PP Callback Handle static void OnPPCallbackHandle (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnPPFormatValueHandler(ReplyMailbox, pData); } } // PP自定义处理 static void OnPPChangeCostomizeHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnPPChangeCostomizeHandler(ReplyMailbox, pData); } } // 响应S9处理后通知 static void OnS9ErrorNotifyHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnS9ErrorNotifyHandler(ReplyMailbox, pData); } } // 响应Wafer信息处理 static void OnWaferMapSubstrateHandler (IMCHandle dmh, const char *DestinationMailbox, const char* ReplyMailbox, const char* pData, void* pClientData) { if ( pClientData != NULL) { CSecsEquip *obj = (CSecsEquip *)pClientData; obj->OnWaferMapSubstrateHandler(ReplyMailbox, pData); } } CSecsEquip::CSecsEquip() { m_nT1 = 500; m_nT2 = 10000; m_nT3 = 45000; m_nT4 = 45000; m_nT5 = 10000; m_nT6 = 5000; m_nT7 = 10000; m_bPassive = true; m_nPort = 5555; m_pIP = "127.0.0.1"; m_pMDLN = "JNG_DMS"; m_pSOFTREV = "4.2024.5.14"; m_nControlState = ::eCONTROL_MODE_OFFLINE; m_bAutoResponseTimeSync = true; m_pClientData = NULL; m_pStateChangeCallback = NULL; m_pTerminalCallback = NULL; m_pRemoteCallback = NULL; m_pRemoteExCallback = NULL; m_pConstantsChangeCallback = NULL; m_pPPChangeNotifyProc = NULL; m_pClockProc = NULL; m_pVarValueProc = NULL; m_pConstantValueProc = NULL; m_pPPFormatValueProc = NULL; m_pPPFormatChangeProc = NULL; m_pPPNameListProc = NULL; m_pPPEventProc = NULL; m_pWaferMapSubstrateProc = NULL; m_pS9ErrorNotifyProc = NULL; m_pPPFormatValueDynamicProc = NULL; m_pPPFormatChangeDynamicProc = NULL; } /// 初始化SECS参数 RcResult CSecsEquip::InitSecsParament() { int i = 0; int n = 0; const char* argv[64] = {0}; const char* argD[64] = {0}; std::string pTimeout[8]; std::string pPort; argv[i++] = "T1"; pTimeout[0] = IntToString(m_nT1); argD[n++] = pTimeout[0].c_str(); argv[i++] = "T2"; pTimeout[1] = IntToString(m_nT2); argD[n++] = pTimeout[1].c_str(); argv[i++] = "T3"; pTimeout[2] = IntToString(m_nT3); argD[n++] = pTimeout[2].c_str(); argv[i++] = "T4"; pTimeout[3] = IntToString(m_nT4); argD[n++] = pTimeout[3].c_str(); argv[i++] = "T5"; pTimeout[4] = IntToString(m_nT5); argD[n++] = pTimeout[4].c_str(); argv[i++] = "T6"; pTimeout[5] = IntToString(m_nT6); argD[n++] = pTimeout[5].c_str(); argv[i++] = "T7"; pTimeout[6] = IntToString(m_nT7); argD[n++] = pTimeout[6].c_str(); argv[i++] = "MDLN"; argD[n++] = m_pMDLN.c_str(); argv[i++] = "SOFTREV"; argD[n++] = m_pSOFTREV.c_str(); // address argv[i++] = "IP"; argD[n++] = m_pIP.c_str(); argv[i++] = "PASSIVE"; argD[n++] = m_bPassive?"1":"0"; argv[i++] = "PORT"; pPort = IntToString(m_nPort); argD[n++] = pPort.c_str(); // set to imc return m_impl.SetParament(argv, argD, i); } // 初始化回调 void CSecsEquip::InitCallback() { m_impl.WheneverAdd("STATE", ::OnStateChangeHandler, this); m_impl.WheneverAdd("TERMINAL", ::OnTerminalHandler, this); m_impl.WheneverAdd("REMOTE", ::OnRemoteHandler, this); m_impl.WheneverAdd("CONSTANTS", ::OnConstantsChangeHandler, this); m_impl.WheneverAdd("PP_CHANGE", ::OnPPChangeNotifyHandler, this); m_impl.WheneverAdd("CLOCK", ::OnClockHandler, this); m_impl.WheneverAdd("VARIABLE", ::OnVarValueHandler, this); m_impl.WheneverAdd("CONSTANT", ::OnConstantValueHandler, this); m_impl.WheneverAdd("PP_FORMAT_VALUE", ::OnPPFormatValueHandler, this); m_impl.WheneverAdd("PP_FORMAT_DYNAMIC_VALUE", ::OnPPFormatDynamicValueHandler, this); m_impl.WheneverAdd("PP_FORMAT_CHANGE", ::OnPPFormatChangeHandler, this); m_impl.WheneverAdd("PP_FORMAT_DYNAMIC_CHANGE", ::OnPPFormatChangeDynamicHandler, this); m_impl.WheneverAdd("PP_CUSTOMIZE_HANDLE", ::OnPPChangeCostomizeHandler, this); m_impl.WheneverAdd("S9_ERROR_NOTIFY", ::OnS9ErrorNotifyHandler, this); m_impl.WheneverAdd("WAFER_MAP_SUBSTRATE", ::OnWaferMapSubstrateHandler, this); } // 开始连接 // 失败后或没连接,不能操作其他功能 RcResult CSecsEquip::Start(std::string pServerAddr, int nPort) { // 测试 // pServerAddr = "127.0.0.1"; // 连接 RcResult rc = m_impl.Start(pServerAddr, nPort); if(rc.rc == 0) { rc = InitSecsParament(); // 初始化自己的 InitCallback(); // 初始化回调 } return rc; } // 启用/禁用 SECS功能 void CSecsEquip::SecsEnable(bool bEnable) { m_impl.SecsEnable(bEnable); } // 终止连接 void CSecsEquip::Abort() { // 关闭SECS回调 // 设为空,避免调用窗口消息函数导致死锁 m_pTerminalCallback = NULL; m_pStateChangeCallback = NULL; m_pRemoteCallback = NULL; m_pRemoteExCallback = NULL; m_pConstantsChangeCallback = NULL; m_pClockProc = NULL; m_pVarValueProc = NULL; m_impl.Abort(); } // 启用通信 RcResult CSecsEquip::CommEnable() { return m_impl.CommEnable(); } // 关闭通信 RcResult CSecsEquip::CommDisable() { return m_impl.CommDisable(); } // 通讯是否开启 RcResult CSecsEquip::CommIsEnable(bool& bEnable) { return m_impl.CommIsEnable(bEnable); } // 获取通讯状态 /* 没有启用通讯 */ /* 启用,没有通讯 */ /* 通讯着 */ RcResult CSecsEquip::GetCommState(COMM_STATE& nState) { int tmp; RcResult rc = m_impl.GetCommState(tmp); // 获取通信状态 nState = (COMM_STATE)tmp; return rc; } // 设置控制状态,符合semi标准 RcResult CSecsEquip::SetControlMode(CONTROL_MODE nState) { m_nControlState = nState; return m_impl.SetControlMode((int)m_nControlState); } // 强制设置控制状态,不经过Host允许 RcResult CSecsEquip::SetControlModeForce(CONTROL_MODE nState) { m_nControlState = nState; return m_impl.SetControlModeForce((int)m_nControlState); } // 获取设置的状态 CONTROL_MODE CSecsEquip::GetControlMode() { return m_nControlState; } // 获取控制状态 RcResult CSecsEquip::GetControlState(CONTROL_STATE& nState) { int nTmpState; RcResult rc = m_impl.GetControlState(nTmpState); nState = (CONTROL_STATE)nTmpState; return rc; } // 主动请求在线,在线状态通过SetControlState设置 RcResult CSecsEquip::ActiveRequestOnline() { return m_impl.ActiveRequestOnline(); } // 授权 // 获取许可授权级别 RcResult CSecsEquip::GetLicenseLevel(__int32& nLevel) { return m_impl.GetMaxRunDataPoint(nLevel); } // 获取允许运行个数 RcResult CSecsEquip::GetMaxRunCount(__int32& nCount) { return m_impl.GetMaxRunDataPoint(nCount); } // 获取允许运行数据点(变量、事件、警报分别计算) RcResult CSecsEquip::GetMaxRunDataPoint(__int32& nCount) { return m_impl.GetMaxRunDataPoint(nCount); } // 设置客户数据 void CSecsEquip::SetClientData(void* pClientData) { m_pClientData = pClientData; } // 获取客户数据 void* CSecsEquip::GetClientData() { return m_pClientData; } // 设置参数 RcResult CSecsEquip::SetDeviceID(int nDeviceID) { if(nDeviceID < 0 || nDeviceID > 32767) { return RcResult(1, "device ID超出范围"); } m_nDeviceID = nDeviceID; std::string pDeviceID = IntToString(m_nDeviceID); return m_impl.SetParament("DEVICE_ID", pDeviceID); } RcResult CSecsEquip::GetDeviceID(int& nDeviceID) { nDeviceID = m_nDeviceID; return RcResult(0); } // 设置连接IP, 被动不需要设置 RcResult CSecsEquip::SetIP(std::string ip) { m_pIP = ip; return m_impl.SetParament("IP", m_pIP); } std::string CSecsEquip::GetIP() { return m_pIP; } // 通过加载Csv文件加载数据, 内置功能 // 目录为空,则使用配置目录 // pDir为配置路径,空着为默认 ./Jng_Server/SecsCongfig/ RcResult CSecsEquip::LoadDataByCsvFile(std::string pDir) { return m_impl.LoadDataByCsvFile(pDir); } // 加载SECS配置 RcResult CSecsEquip::LoadProtocolConfig(std::string pDir) { return m_impl.LoadSecsConfig(pDir); } // 设置被动/主动模式 RcResult CSecsEquip::SetPassive(bool bPassive) { m_bPassive = bPassive; std::string buff = m_bPassive?"1":"0"; return m_impl.SetParament("PASSIVE", buff); } bool CSecsEquip::GetPassive() { return m_bPassive; } // 设置连接端口 RcResult CSecsEquip::SetPort(int port) { m_nPort = port; return m_impl.SetParament("PORT", IntToString(m_nPort)); } int CSecsEquip::GetPort() { return m_nPort; } // 设置T1超时 RcResult CSecsEquip::SetT1(int nTimeout) { return m_impl.SetTn("T1", nTimeout); } // 设置T2超时 RcResult CSecsEquip::SetT2(int nTimeout) { return m_impl.SetTn("T2", nTimeout); } // 设置T3超时 RcResult CSecsEquip::SetT3(int nTimeout) { return m_impl.SetTn("T3", nTimeout); } // 设置T4超时 RcResult CSecsEquip::SetT4(int nTimeout) { return m_impl.SetTn("T4", nTimeout); } // 设置T5超时 RcResult CSecsEquip::SetT5(int nTimeout) { return m_impl.SetTn("T5", nTimeout); } // 设置T6超时 RcResult CSecsEquip::SetT6(int nTimeout) { return m_impl.SetTn("T6", nTimeout); } // 设置T7超时 RcResult CSecsEquip::SetT7(int nTimeout) { return m_impl.SetTn("T7", nTimeout); } // 设置T8超时 RcResult CSecsEquip::SetT8(int nTimeout) { return m_impl.SetTn("T8", nTimeout); } // 设备型号 RcResult CSecsEquip::SetMDLN(std::string pMDLN) { return m_impl.SetParament("MDLN", pMDLN); } // 软件版本 RcResult CSecsEquip::SetSOFTREV(std::string pSOFTREV) { return m_impl.SetParament("SOFTREV", pSOFTREV); } // 启用Log记录 RcResult CSecsEquip::SetEnableLog(bool bEnable) { return m_impl.SetParament("ENABLE_LOG", bEnable ? "1" : "0"); } // 设置Log日志目录 RcResult CSecsEquip::SetLogDir(std::string pDir) { return m_impl.SetParament("LOG_DIR", pDir); } // 设置自动删除Log日志目录,nDay小于等于0,代表不删除log RcResult CSecsEquip::SetAutoDeleteLog(int nDay) { return m_impl.SetParament("AUTO_DELETE_LOG_DAY", IntToString(nDay)); } // 启用运行过程中的LogTrace,追查BUG等 void CSecsEquip::EnableRuntimeTrace(bool bEnable) { return m_impl.EnableRuntimeTrace(bEnable); } // 报警列表获取 RcResult CSecsEquip::AlarmListGet(std::vector& ved) { std::string pList; RcResult rc = m_impl.AlarmGetList(pList); if(rc.rc == 0) { std::vector sv; rc = listSplit(pList, sv); if(rc == 0) { ALARM_DATA ad; std::vector value; ved.reserve(sv.size()); for (std::vector::size_type i = 0; i < sv.size(); i++) { rc = listSplit(sv[i], value); if(rc != 0) { break; } if(value.size() != 5) { continue; } //提取 ad.ALID = value[0]; ad.ALTX = value[1]; ad.bEnable = (value[2] == "1" ? true : false); ad.bSet = (value[3] == "1" ? true : false); ad.nCategory = ::atoi(value[4].c_str()); ved.push_back(ad); } } } return rc; } // 增加报警 RcResult CSecsEquip::AlarmAdd(int nALID, std::string pALTX) { return m_impl.AlarmAdd(nALID, pALTX); } // 添加报警 RcResult CSecsEquip::AlarmAdd(int nALID, std::string pALTX, int nAlarmSetCEID, int nAlarmClearCEID, int nCategory) { return m_impl.AlarmAdd(nALID, pALTX, nAlarmSetCEID, nAlarmClearCEID, true, nCategory, true); } // 添加报警 RcResult CSecsEquip::AlarmAdd(int nALID, std::string pALTX, int nAlarmSetCEID, int nAlarmClearCEID, bool bEnable, int nCategory, bool bAddEvent) { return m_impl.AlarmAdd(nALID, pALTX, nAlarmSetCEID, nAlarmClearCEID, bEnable, nCategory, bAddEvent); } // 启用报警 RcResult CSecsEquip::AlarmEnable(int nALID, bool bEnable) { return m_impl.AlarmEnable(nALID, bEnable); } // 设置报警 RcResult CSecsEquip::AlarmSet(int nALID, bool bSet) { return m_impl.AlarmSet(nALID, bSet); } // 设置触发所有的报警 RcResult CSecsEquip::AlarmSetAll(bool bSet) { return m_impl.AlarmSetAll(bSet); } // 报警发生后的通知模式,默认都通知 RcResult CSecsEquip::AlarmNotifyEventMode(ALARM_NOTIFY_EVENT_MODE nMode) { return m_impl.AlarmNotifyEventMode(nMode); } // 事件列表获取 RcResult CSecsEquip::EventListGet(std::vector& ved) { std::string pList; RcResult rc = m_impl.EventGetList(pList); if(rc.rc == 0) { std::vector sv; rc = listSplit(pList, sv); if(rc == 0) { EVENT_DATA ed; std::vector value; ved.reserve(sv.size()); for (std::vector::size_type i = 0; i < sv.size(); i++) { // 每一行: CEID, NAME, DES rc = listSplit(sv[i], value); if(rc != 0) { break; } if(value.size() != 3) { continue; } //提取 ed.nCEID = ::atoi(value[0].c_str()); ed.pName = value[1]; ed.pDescription = value[2]; ved.push_back(ed); } } } return rc; } RcResult CSecsEquip::EventAdd(int nCEID, std::string pDescription, std::string pEventName, bool bEnable) { return m_impl.EventAdd(nCEID, pDescription, pEventName, bEnable); } // 事件启用/禁用 RcResult CSecsEquip::EventEnable(int nCEID, bool bEnable) { return m_impl.EventEnable(nCEID, bEnable); } // 事件是否启用/禁用 RcResult CSecsEquip::EventIsEnable(int nECID, bool& bEnable) { return m_impl.EventIsEnable(nECID, bEnable); } // 事件DVVAL绑定 RcResult CSecsEquip::EventDvvals(std::string pEventName, std::vector &dvvalName) { std::string dvvalList = listJoin(dvvalName); return m_impl.EventDvvals(pEventName, dvvalList); } // 事件S6,F3发送: CEID RcResult CSecsEquip::EventDiscreteVarPos(int nCEID) { return m_impl.EventDiscreteVarPos(nCEID); } // 事件DVVAL绑定 RcResult CSecsEquip::EventDvvals(int nECID, std::vector &dvval) { std::vector dvvalString; for (std::vector::size_type i = 0; i < dvval.size(); i++) { dvvalString.push_back(IntToString(dvval[i])); } std::string dvvalList = listJoin(dvvalString); return m_impl.EventDvvals(nECID, dvvalList); } // 事件发送: CEID RcResult CSecsEquip::EventPos(int nECID, bool bWaitReply) { return m_impl.EventPos(nECID, bWaitReply); } // 事件发送: 事件名称 RcResult CSecsEquip::EventPos(std::string EventName, bool bWaitReply) { return m_impl.EventPos(EventName, bWaitReply); } // 事件-报表关联 RcResult CSecsEquip::EventReportLink(int nECID, int report) { std::vector listReport; listReport.push_back(report); return EventReportLink(nECID, listReport); } // 事件-报表取消关联 RcResult CSecsEquip::EventReportLink(int nECID, std::vector& report) { std::vector reportString; for (std::vector::size_type i = 0; i < report.size(); i++) { reportString.push_back(IntToString(report[i])); } std::string reportList = listJoin(reportString); return m_impl.EventReportLink(nECID, reportList); } // 事件-报表取消关联 RcResult CSecsEquip::EventReportUnlink(int nECID) { return m_impl.EventReportUnlink(nECID); } // 报表定义 RcResult CSecsEquip::ReportDefine(int nReport, std::vector& listVarID) { std::vector varString; for (std::vector::size_type i = 0; i < listVarID.size(); i++) { varString.push_back(IntToString(listVarID[i])); } std::string varList = listJoin(varString); return m_impl.ReportDefine(nReport, varList); } // 获取报表定义 RcResult CSecsEquip::ReportDefineGet(int nReport, std::vector& listVarID) { std::string varList; RcResult rc = m_impl.ReportDefineGet(nReport, varList); if(rc.rc == 0) { varList = listElement(varList, 0, 0); int nID; std::vector svID; if(listSplit(varList, svID) == 0) { for (std::vector::size_type i = 0; i < svID.size(); i++) { nID = ::atoi(svID[i].c_str()); listVarID.push_back(nID); } } } return rc; } // 删除报表 RcResult CSecsEquip::ReportDelete(int nReport) { return m_impl.ReportDelete(nReport); } // 清除报表所有与之相关的事件 RcResult CSecsEquip::ReportUnlink(int nReport) { return m_impl.ReportUnlink(nReport); } // 清除所有报告定义,并且清除所有事件与报告之间的并联 RcResult CSecsEquip::ReportClear() { return m_impl.ReportClear(); } // 报告严格按照标准规范处理:E5标准的处理及返回值 RcResult CSecsEquip::ReportStrictlyFollowStandard(bool bFollow) { return m_impl.ReportStrictlyFollowStandard(bFollow); } // 报告保存服务器配置到本地 RcResult CSecsEquip::ReportAutoSaveHostLinkConfig(bool bEnable) { return m_impl.ReportAutoSaveHostLinkConfig(bEnable); } // 变量增加 RcResult CSecsEquip::VariableAdd(int varID, std::string varName, std::string description, std::string valueType, std::string initValue, std::string units, std::string varClass) { return m_impl.VariableAdd(varID, varName, description, valueType, initValue, units, varClass); } // 设置变量新值 RcResult CSecsEquip::VariableSet(int varID, std::string newValue) { return m_impl.VariableSet(varID, newValue); } // 获取变量的值 RcResult CSecsEquip::VariableGet(int varID, std::string& pValue) { std::string pTypeAndValue; RcResult rcr = m_impl.VariableGet(varID, pTypeAndValue); if(rcr.rc != 0) { return rcr; // 错误,空值 } std::vector vargv; rcr = listSplit(pTypeAndValue, vargv); if ( vargv.size() == 2 ) { pValue = vargv[1]; } return rcr; } // 变量列表获取 RcResult CSecsEquip::VariableListGet(std::vector& vvd) { std::string pList; RcResult rc = m_impl.VariableGetList(pList); if(rc.rc == 0) { std::vector sv; rc = listSplit(pList, sv); if(rc == 0) { VARIABLE_DATA vd; std::vector value; vvd.reserve(sv.size()); for (std::vector::size_type i = 0; i < sv.size(); i++) { rc = listSplit(sv[i], value); if(rc != 0) { break; } if(value.size() != 8) { continue; } //提取 vd.VID = value[0]; vd.VarName = value[1]; vd.Description = value[2]; vd.VarClass = value[3]; vd.Type = value[4]; vd.Value = value[5]; vd.Units = value[6]; vd.bInside = (::atoi(value[7].c_str()) != 0); vvd.push_back(vd); } } } return rc; } // 设置处理方法,统一方法 RcResult CSecsEquip::VariableSetMethod(int varID, bool bCallback) { return m_impl.VariableSetMethod(varID, bCallback); } // 设置处理方法 RcResult CSecsEquip::VariableSetMethod(int varID, SecsVarValueProc *pCallback) { bool bEnable = false; std::map::iterator pos; { vLocker lock(&m_lockVarMethod); // allow update pos = m_mapVarValueCallback.find(varID); if(pos != m_mapVarValueCallback.end()) { m_mapVarValueCallback.erase(pos); } if (pCallback != NULL) { bEnable = true; m_mapVarValueCallback.insert(std::make_pair(varID, pCallback)); } } return m_impl.VariableSetMethod(varID, bEnable); } void CSecsEquip::VarValueRequest (const char *varList, std::vector &values) { int nID; const char* pVID = ""; const char* pTmpData = NULL; SecsVarValueProc* pCallback; std::map::iterator ite; std::vector listVarID; listSplit(varList, listVarID); if(listVarID.size() <= 1) { // 第一位是控制符 return; } vLocker lock(&m_lockVarMethod); try { for(unsigned i=1; i < listVarID.size(); i++) { pTmpData = NULL; pVID = listVarID[i].c_str(); nID = ::atoi(pVID); ite = m_mapVarValueCallback.find(nID); if(ite != m_mapVarValueCallback.end()) { // 指定的回调 pCallback = ite->second; if(pCallback != NULL) { pTmpData = pCallback(this, nID); } } else if(m_pVarValueProc != NULL) { // 通用回调 pTmpData = m_pVarValueProc(this, nID); } // 添加值 if (pTmpData != NULL) { values.push_back(pTmpData); } else { values.push_back(""); } } } catch (...) { std::string msg("更新变量错误, varID="); if (pVID != NULL) { msg += pVID; } ::OutputDebugStringA(msg.c_str()); } } void CSecsEquip::ConstantValueRequest(std::string ConstantList, std::vector &values) { int nID; const char* pECID = ""; SecsConstantValueProc* pCallback; std::map::iterator ite; std::vector listConstantID; listSplit(ConstantList, listConstantID); if(listConstantID.size() <= 1) { // 第一位是控制符 return; } vLocker lock(&m_lockConstantMethod); try { const char* pTmpData = NULL; for(unsigned i=1; i < listConstantID.size(); i++) { pTmpData = NULL; pECID = listConstantID[i].c_str(); nID = ::atoi(pECID); ite = m_mapConstantValueCallback.find(nID); if(ite != m_mapConstantValueCallback.end()) { // 指定的回调 pCallback = ite->second; if(pCallback != NULL) { pTmpData = pCallback(this, nID); } } else if(m_pConstantValueProc != NULL) { // 通用 pTmpData = m_pConstantValueProc(this, nID); } // 添加值 if (pTmpData != NULL) { values.push_back(pTmpData); } else { values.push_back(""); } } } catch (...) { std::string msg("更新常量错误, varID="); if (pECID != NULL) { msg += pECID; } ::OutputDebugStringA(msg.c_str()); } } // 常量 // 添加常量 RcResult CSecsEquip::ConstantsAdd(int varID, std::string name, std::string description, std::string Type, std::string Units, std::string MinValue, std::string MaxValue, std::string DefValue) { return m_impl.ConstantsAdd(varID, name, description, Type, Units, MinValue, MaxValue, DefValue); } // 常量获取 RcResult CSecsEquip::ConstantsGet(int nECID, std::string& pValue) { std::string pTypeAndValue; RcResult rcr = m_impl.ConstantsGet(nECID, pTypeAndValue); if(rcr.rc != 0) { return rcr; // 错误,空值 } std::vector vargv; rcr = listSplit(pTypeAndValue, vargv); if ( vargv.size() == 2 ) { pValue = vargv[1]; } return rcr; } // 设置变量新值 RcResult CSecsEquip::ConstantsSet(int varID, std::string newValue) { return m_impl.ConstantsSet(varID, newValue); } // 获取常量信息 RcResult CSecsEquip::ConstantsInfoGet(std::vector& info) { std::string pList; RcResult rc = m_impl.ConstantsInfoGet(pList); if(rc.rc == 0) { std::vector sv; rc = listSplit(pList, sv); if(rc == 0) { VARIABLE_DATA vd; std::vector value; info.reserve(sv.size()); for (std::vector::size_type i = 0; i < sv.size(); i++) { rc = listSplit(sv[i], value); if(rc != 0) { break; } if(value.size() != 9) { continue; } //提取 vd.VID = value[0]; vd.VarName = value[1]; vd.Description = value[2]; vd.Type = value[3]; vd.Value = value[4]; vd.Units = value[5]; vd.MaxValue = value[6]; vd.MinValue = value[7]; vd.DefValue = value[8]; info.push_back(vd); } } } return rc; } // 设置处理方法,统一方法 RcResult CSecsEquip::ConstantsSetMethod(int nECID, bool bCallback) { return m_impl.ConstantsSetMethod(nECID, bCallback); } // 设置处理方法 RcResult CSecsEquip::ConstantsSetMethod(int nECID, SecsConstantValueProc *pCallback) { bool bEnable = false; std::map::iterator pos; { vLocker lock(&m_lockConstantMethod); // allow update pos = m_mapConstantValueCallback.find(nECID); if(pos != m_mapConstantValueCallback.end()) { m_mapConstantValueCallback.erase(pos); } if (pCallback != NULL) { bEnable = true; m_mapConstantValueCallback.insert(std::make_pair(nECID, pCallback)); } } return m_impl.ConstantsSetMethod(nECID, bEnable); } // 启用/禁用常量改变发送事件 RcResult CSecsEquip::ConstantChangeSendEventEnable(bool bEnable) { return m_impl.ConstantChangeSendEventEnable(bEnable); } // 响应状态改变处理 void CSecsEquip::OnStateChangeHandler(const char *data) { std::vector sv; if(listSplit(data, sv) == 0 && sv.size() >= 1) { std::string pType = sv[0]; if( pType == "comm_state" || pType == "control_state") { if(sv.size() == 2) { // 状态 int nState = ::atoi(sv[1].c_str()); if(m_pStateChangeCallback != NULL) { m_pStateChangeCallback(this, pType.c_str(), nState); } } } } } // 发送终端服务 RcResult CSecsEquip::SendSingleTerminal(std::string pContent) { return m_impl.SendSingleTerminal(pContent); } RcResult CSecsEquip::SendMultipleTerminal(std::vector svContent) { return m_impl.SendMultipleTerminal(svContent); } // 响应终端服务处理 void CSecsEquip::OnTerminalHandler(std::string pReplyMailbox, std::string Data) { std::string pShow = "2"; std::vector sv; if(listSplit(Data, sv) == 0 && sv.size() >= 1) { if(sv.size() == 3) { std::string pTID = sv[1]; std::string pText = sv[2]; TERMINAL_DATA td; td.nTid = ::atoi(pTID.c_str()); td.nSize = (int)pText.size() / 2; // 提取数据 char* pTmp = (char*)malloc(td.nSize+5); memset(pTmp, 0, td.nSize+5); for (int i = 0; i < td.nSize; i++) { pTmp[i] = HexToDec(pText[i*2], pText[i*2+1]); } td.pText = pTmp; // 回调 if(m_pTerminalCallback != NULL) { int nAck = m_pTerminalCallback(this, td); pShow = IntToString(nAck); } free(pTmp); } } m_impl.Reply(pReplyMailbox, pShow); } // 响应远程命令处理 void CSecsEquip::OnRemoteHandler(std::string pReplyMailbox, const char *data) { REMOTE_REPLY nHCACK = ::eCOMMAND_NOT_EXIST; REMOTE_DATA rd; std::vector sv; if(listSplit(data, sv) == 0 && sv.size() >= 1) { if(sv.size() == 3) { rd.pRCMD = sv[1]; // 参数 std::vector svParam; if(listSplit(sv[2], svParam) == 0) { for (std::vector::size_type i = 1; i < svParam.size(); i += 2) { std::string pName = svParam[i-1]; std::string pValue = svParam[i]; rd.mapParam.insert(std::make_pair(pName, pValue)); } // 回调 if(m_pRemoteCallback != NULL) { nHCACK = m_pRemoteCallback(this, &rd); } else if (m_pRemoteExCallback != NULL) { // 远程控制,扩展型。由用户主动反馈结果 m_pRemoteExCallback(this, pReplyMailbox, rd); return; } } } } else { rd.AddErrorCode(3, "listSplit(data, sv) and sv.size() error "); } RemoteCmdReply(pReplyMailbox, nHCACK, rd.listErrorCode); } // 响应常量改变处理 void CSecsEquip::OnConstantsChangeHandler(const char *data) { std::vector argv; RcResult rc = listSplit(data, argv); if( rc == 0 && argv.size() >= 3 && (argv.size()%2 == 1) ) { int nID = 0; for (std::vector::size_type i = 1; i < argv.size(); i += 2) { nID = ::atoi(argv[i].c_str()); // 每个常量通知一次 if (m_pConstantsChangeCallback != NULL) { m_pConstantsChangeCallback(this, nID, argv[i+1].c_str()); } } } } // 响应处理程序改变处理 void CSecsEquip::OnPPChangeNotifyHandler(const char *data) { std::vector argv; RcResult rc = listSplit(data, argv); if( rc == 0 && argv.size() == 2 ) { std::string varname = argv[0]; std::string varvalue = argv[1]; bool bNotify = false; PP_CHANGE_NOTIFY nEvent; if (varname == "pp_download") { bNotify = true; nEvent = ePPDownChangeNotify; } else if (varname == "pp_delete") { bNotify = true; nEvent = ePPDeleteChangeNotify; } else if (varname == "pp_load") { bNotify = true; nEvent = ePPLoadChangeNotify; } if (m_pPPChangeNotifyProc != NULL && bNotify) { m_pPPChangeNotifyProc(this, nEvent, varvalue.c_str()); } } } // 响应时间改变处理 void CSecsEquip::OnClockHandler(const char *data) { RcResult rc; std::vector argv; rc = listSplit(data, argv); if( rc == 0 && argv.size() == 3 ) { std::string pClockOffset = argv[1]; std::string pTime = argv[2]; // host time SYSTEMTIME host_time; GetLocalTime(&host_time); if(pTime.size() == 16) { std::string pYear = pTime.substr(0, 4); std::string pMonth = pTime.substr(4, 2); std::string pDay = pTime.substr(6, 2); std::string pHour = pTime.substr(8, 2); std::string pMinute = pTime.substr(10, 2); std::string pSecond = pTime.substr(12, 2); std::string pMilliseconds = pTime.substr(14, 2); host_time.wYear = ::atoi(pYear.c_str()); host_time.wMonth = ::atoi(pMonth.c_str()); host_time.wDay = ::atoi(pDay.c_str()); host_time.wHour = ::atoi(pHour.c_str()); host_time.wMinute = ::atoi(pMinute.c_str()); host_time.wSecond = ::atoi(pSecond.c_str()); host_time.wMilliseconds = ::atoi(pMilliseconds.c_str()) * 10; } if (m_pClockProc != NULL) { m_pClockProc(this, pClockOffset.c_str(), host_time); } else if(m_bAutoResponseTimeSync) { SetLocalTime(&host_time); } } } // 响应变量值请求处理 void CSecsEquip::OnVarValueHandler(std::string pReplyMailbox, std::string Data) { std::vector listValue; VarValueRequest(Data.c_str(), listValue); std::string pValue = listJoin(listValue); m_impl.Reply(pReplyMailbox, pValue); } // 响应常量值请求处理 void CSecsEquip::OnConstantValueHandler(std::string pReplyMailbox, std::string pData) { std::vector listValue; ConstantValueRequest(pData, listValue); std::string pValue = listJoin(listValue); m_impl.Reply(pReplyMailbox, pValue); } // 响应主机获取Recipe变量值 void CSecsEquip::OnPPFormatValueHandler(std::string pReplyMailbox, std::string pData) { std::vector listValue; PPFormatValueRequest(pData, listValue); std::string pValue = listJoin(listValue); m_impl.Reply(pReplyMailbox, pValue); } // 响应主机获取Recipe变量值 void CSecsEquip::OnPPFormatValueDynamicHandler(std::string pReplyMailbox, std::string pData) { const char* pCmdCode = ""; std::vector listPPID; listSplit(pData, listPPID); std::vector listValue; if(listPPID.size() == 2) { std::string ppid = listPPID[1]; vLocker lock(&m_lockPPFormat); try { // 获取值 std::list listParam; SecsPPFormatValueDynamicProc* pPPFormatValueDynamicProc = m_pPPFormatValueDynamicProc; if(pPPFormatValueDynamicProc != NULL) { pPPFormatValueDynamicProc(this, ppid.c_str(), listParam); // 序列化 std::list::iterator ite; std::vector::iterator iteParam; for (ite = listParam.begin(); ite != listParam.end(); ite++) { std::list listOneFormat; std::list listParamnet; // 参数 for (iteParam = ite->vecParam.begin(); iteParam != ite->vecParam.end(); iteParam++) { listParamnet.push_back(listJoin(iteParam->pType.c_str(), iteParam->pValue.c_str())); } listOneFormat.push_back(ite->pCCode); listOneFormat.push_back(listJoin(listParamnet)); listValue.push_back(listJoin(listOneFormat)); } } } catch (...) { std::string msg("更新PP错误, cmd_code"); ::OutputDebugStringA(msg.c_str()); } } std::string pValue = listJoin(listValue); m_impl.Reply(pReplyMailbox, pValue); } void CSecsEquip::PPFormatValueRequest(std::string varList, std::vector &values) { const char* pCmdCode = ""; std::vector listPPID; listSplit(varList, listPPID); if(listPPID.size() < 2) { // 第一位是控制符 return; } std::string ppid = listPPID[1]; vLocker lock(&m_lockPPFormat); try { SecsPPFormatValueProc* pPPFormatValueProc = m_pPPFormatValueProc; if(pPPFormatValueProc != NULL) { // 加载recipe PP_FORMAT_HANDLE pPpFormat; pPpFormat.nEvent = ::eLOAD_TMP_PPID; pPpFormat.pPPID = ppid; pPPFormatValueProc(this, &pPpFormat); if (pPpFormat.nAck != ePPSuccess) { // 出错情况 return; } // get value for(unsigned i=2; i < listPPID.size(); i++) { // 通用 pPpFormat.pPPID = ppid; pPpFormat.nEvent = ::eGET_PPID_VALUE; pPpFormat.pCCode = listPPID[i]; pPpFormat.vecParamValue.clear(); pPPFormatValueProc(this, &pPpFormat); std::string pTmp = listJoin(pPpFormat.vecParamValue); values.push_back(pTmp); } // 结束通知 pPpFormat.nEvent = ::eGET_PPID_VALUE_FINSH; pPPFormatValueProc(this, &pPpFormat); } } catch (...) { std::string msg("更新PP错误, cmd_code"); ::OutputDebugStringA(msg.c_str()); } } // 响应主机修改Recipe变量值 void CSecsEquip::OnPPFormatChangeHandler(std::string pReplyMailbox, std::string pData) { std::vector listValue; int nAck = PPFormatValueChange(pData.c_str(), listValue); std::string pValue = listJoin(IntToString(nAck).c_str()); m_impl.Reply(pReplyMailbox, pValue); } // 数据发生改变 PP_HANDLE_REPLY CSecsEquip::PPFormatValueChange(const char *varList, std::vector values) { const char* pCmdCode = ""; std::vector listPPID; listSplit(varList, listPPID); if(listPPID.size() < 2) { // 第一位是控制符 return ::ePPOtherError; } // 参数 std::string ppid = listPPID[1]; PP_FORMAT_HANDLE pPpFormat; pPpFormat.nAck = ::ePPSuccess; vLocker lock(&m_lockPPFormat); try { if(m_pPPFormatChangeProc != NULL) { // 加载recipe pPpFormat.nEvent = ::eSET_PPID_VALUE_BEGIN; pPpFormat.pPPID = ppid; m_pPPFormatChangeProc(this, &pPpFormat); if (pPpFormat.nAck != ePPSuccess) { // 出错情况 return pPpFormat.nAck; } // 设置PP的值 for(unsigned i=2; i < listPPID.size(); i++) { std::vector vecOneData; if(listSplit(listPPID[i], vecOneData) == 0 && vecOneData.size() == 2) { pPpFormat.nEvent = eSET_PPID_VALUE; pPpFormat.pCCode = vecOneData[0]; listSplit(vecOneData[1], pPpFormat.vecParamValue); m_pPPFormatChangeProc(this, &pPpFormat); if (pPpFormat.nAck != ePPSuccess) { // 出错情况 return pPpFormat.nAck; } } else { pPpFormat.nAck = ::ePPOtherError; break; } } // 更新recipe完成 pPpFormat.nEvent = ::eSET_PPID_VALUE_FINSH; pPpFormat.pPPID = ppid; m_pPPFormatChangeProc(this, &pPpFormat); if (pPpFormat.nAck != ePPSuccess) { // 出错情况 return pPpFormat.nAck; } } } catch (...) { } return pPpFormat.nAck; } // 响应主机修改Recipe变量值 void CSecsEquip::OnPPFormatChangeDynamicHandler(std::string pReplyMailbox, std::string pData) { const char* pCmdCode = ""; std::vector listPPID; listSplit(pData, listPPID); int nAck = ePPOtherError; if(listPPID.size() < 3) { // 第一位是控制符 return ; } // 参数 std::string ppid = listPPID[1]; PP_FORMAT_DYNAMIC_HANDLE pPpFormat; vLocker lock(&m_lockPPFormat); try { if(m_pPPFormatChangeDynamicProc != NULL) { std::list listParam; // 解析数据 std::list listParamentAll; std::list::iterator ite; std::list::iterator iteParament; listSplit(listPPID[2], listParamentAll); for (ite = listParamentAll.begin(); ite != listParamentAll.end(); ite ++) { // 单个CCODE数据 std::vector listCCodeOne; listSplit(*ite, listCCodeOne); if (listCCodeOne.size() == 2) { PP_FORMAT_DYNAMIC_HANDLE pOneData; pOneData.pCCode = listCCodeOne[0]; // 单个Parament数据 std::list listParament; listSplit(listCCodeOne[1], listParament); for (iteParament = listParament.begin(); iteParament != listParament.end(); iteParament++) { PP_FORMAT_PARAMENT pOneParament; pOneParament.pType = listElement(*iteParament, 0); pOneParament.pValue = listElement(*iteParament, 1); pOneData.vecParam.push_back(pOneParament); } listParam.push_back(pOneData); } } nAck = m_pPPFormatChangeDynamicProc(this, ppid.c_str(), listParam); } } catch (...) { } std::string pValue = listJoin(IntToString(nAck).c_str()); m_impl.Reply(pReplyMailbox, pValue); } // 响应PP自定义改变处理 void CSecsEquip::OnPPChangeCostomizeHandler(std::string pReplyMailbox, std::string Data) { std::string pValue; std::vector argv; RcResult rc = listSplit(Data, argv); if( rc == 0 && argv.size() > 0) { // get list if(argv[0] == "pp_recipe_list_request") { vLocker lock(&m_lockPPChange); try { if (m_pPPNameListProc != NULL) { std::list pList = m_pPPNameListProc(this); pValue = listJoin(pList); } } catch (...) { } } // get ppid else if(argv[0] == "pp_process_program_data_request") { vLocker lock(&m_lockPPChange); if(argv.size() == 2) { std::string ppid = argv[1]; if (m_pPPEventProc != NULL) { try { // data PP_HANDLE_DATA pHandleData; pHandleData.nEvent = ::ePPEventLoadData; pHandleData.pPPID = ppid.c_str(); pHandleData.pPPData = NULL; pHandleData.nLength = 0; m_pPPEventProc(this, &pHandleData); if(pHandleData.pPPData != NULL) { char cHightHex; char cLowHex; pValue.reserve(pHandleData.nLength * 2); for (int i = 0; i < pHandleData.nLength; i++) { DecToHex(pHandleData.pPPData[i], cHightHex, cLowHex); pValue += cHightHex; pValue += cLowHex; } // PP数据存在 pValue = listJoin("1", pValue.c_str()); } else { // PP数据不存在 pValue = listJoin("0", ""); } } catch (...) { } } } } // update ppid else if(argv[0] == "pp_process_program_data_update") { vLocker lock(&m_lockPPChange); pValue = "65"; if(argv.size() == 3) { std::string ppid = argv[1]; std::string pHex = argv[2]; if (m_pPPEventProc != NULL) { int nSize = (int)(pHex.size() / 2); char* pPPData = (char*)malloc(nSize+5); if (pPPData != NULL) { memset(pPPData, 0, nSize+5); for (int i = 0; i < nSize; i++) { pPPData[i] = HexToDec(pHex[i*2], pHex[i*2+1]); } // data PP_HANDLE_DATA pHandleData; pHandleData.nEvent = ::ePPEventDownData; pHandleData.pPPID = ppid.c_str(); pHandleData.pPPData = pPPData; pHandleData.nLength = nSize; // callback try { m_pPPEventProc(this, &pHandleData); pValue = IntToString(pHandleData.nAck & 0xFF); } catch (...) { } free(pPPData); } } } } // delete ppid if(argv[0] == "pp_process_program_delete") { pValue = "65"; if(argv.size() == 3) { std::list listPPID; std::list::iterator ite; PP_HANDLE_DATA pHandleData; bool bDeleteAll = (argv[1] == "1"); listSplit(argv[2], listPPID); vLocker lock(&m_lockPPChange); try { if (m_pPPEventProc != NULL) { if (bDeleteAll) { pHandleData.nEvent = ::ePPEventDeleteAll; m_pPPEventProc(this, &pHandleData); } else { for (ite = listPPID.begin(); ite != listPPID.end(); ite++) { pHandleData.nEvent = ::ePPEventDelete; pHandleData.pPPID = ite->c_str(); m_pPPEventProc(this, &pHandleData); if (pHandleData.nAck != ::ePPSuccess) { break; } } } pValue = IntToString(pHandleData.nAck & 0xFF); } } catch (...) { } } } // load ppid if(argv[0] == "pp_load_inquire") { pValue = "5"; if(argv.size() == 3) { PP_HANDLE_DATA pHandleData; pHandleData.pPPID = argv[1].c_str(); pHandleData.nLength = ::atoi(argv[2].c_str()); pHandleData.nEvent = ::ePPEventLoadInquire; vLocker lock(&m_lockPPChange); try { if (m_pPPEventProc != NULL) { m_pPPEventProc(this, &pHandleData); pValue = IntToString(pHandleData.nAck & 0xFF); } } catch (...) { } } } } m_impl.Reply(pReplyMailbox, pValue); } // 获取程式目录 std::string CSecsEquip::GetRecipeDirectory() { return m_pRecipeDir; } // 设置程式目录 void CSecsEquip::SetRecipeDirectory(std::string dir) { m_pRecipeDir = dir; m_impl.SetRecipeDirectory(m_pRecipeDir); } // 设置程式目录 // ppid: recipe名 RcResult CSecsEquip::ProcessProgramUpload(std::string ppid) { if (ppid == "") { return RcResult("ppid 为空"); } return m_impl.ProcessProgramUpload(ppid); } // 设置程式目录 // ppid: recipe名 RcResult CSecsEquip::ProcessProgramDownload(std::string ppid) { if (ppid == "") { return RcResult("ppid 为空"); } return m_impl.ProcessProgramDownload(ppid); } // 允许主机下载 RcResult CSecsEquip::PPAllowHostDowmload(bool bAllow) { return m_impl.PPAllowHostDowmload(bAllow); } // PP处理模式 RcResult CSecsEquip::PPHandleMode(PP_HANDLE_MODE nMode) { return m_impl.PPHandleMode(nMode); } // 设置PP是文件夹目录 RcResult CSecsEquip::PPIsFolderDir(bool bAllow) { return m_impl.PPIsFolderDir(bAllow); } // 设置winrar目录 RcResult CSecsEquip::SetWinrarPath(std::string dir) { return m_impl.SetWinrarPath(dir); } // 设置扩展名 RcResult CSecsEquip::PPSetFilenameExtension(std::string pFileExten) { return m_impl.PPSetFilenameExtension(pFileExten); } // PP序列化参数对象添加 RcResult CSecsEquip::PPFormatAdd(std::string pCmdCode, std::string pName, std::string pValueType) { return m_impl.PPFormatAdd(pCmdCode, pName, pValueType); } // PP序列化上传 RcResult CSecsEquip::PPFormatSend(std::string ppid) { return m_impl.PPFormatSend(ppid); } // PP序列化下载 RcResult CSecsEquip::PPFormatRequest(std::string ppid) { return m_impl.PPFormatRequest(ppid); } // PP序列化设置模式 RcResult CSecsEquip::PPFormatSetCodeMode(PP_FORMAT_MODE nMode) { return m_impl.PPFormatSetCodeMode(nMode); } // 自动响应时间同步 void CSecsEquip::AutoResponseTimeSync(bool bAuto) { m_bAutoResponseTimeSync = bAuto; } // 主动请求主机时间进行同步 RcResult CSecsEquip::ActiveTimeSynchronizeRequest() { return m_impl.ActiveTimeSynchronizeRequest(); } // 当设置远程控制响应扩展型时候,需要用户主动答复结果 void CSecsEquip::RemoteCmdReply(std::string pReplyMailbox, REMOTE_REPLY nHCACK, std::list listErrorCode) { std::vector param; std::list::iterator ite; param.push_back(IntToString(nHCACK)); for (ite = listErrorCode.begin(); ite != listErrorCode.end(); ite++) { param.push_back(ite->pDescription); param.push_back(IntToString(ite->nCode)); } std::string pReplyParam = listJoin(param); m_impl.Reply(pReplyMailbox, pReplyParam); } // 扩展操作 RcResult CSecsEquip::SendSecsMsgAsync(int nStream, int nFunction, bool bReply, std::string pData, int64& nMsgID) { return m_impl.SendSecsMsgAsync(nStream, nFunction, bReply, pData, nMsgID); } RcResult CSecsEquip::SendSecsMsgSync(int nStream, int nFunction, bool bReply, std::string pData, std::string& pReplyData) { return m_impl.SendSecsMsgSync(nStream, nFunction, bReply, pData, pReplyData); } RcResult CSecsEquip::SendReply(int nStream, int nFunction, int nTransactionID, std::string pData) { return m_impl.SendReply(nStream, nFunction, nTransactionID, pData); } RcResult CSecsEquip::MessageTypeAdd(int nStream, int nFunction, SecsMessageReceiveProc pCallback, void* pClientData) { return m_impl.MessageTypeAdd(nStream, nFunction, pCallback, pClientData); } RcResult CSecsEquip::MessageTypeRemove(int nStream, int nFunction) { return m_impl.MessageTypeRemove(nStream, nFunction); } // wafer map // 晶圆图上传 RcResult CSecsEquip::WaferMapUpload(WAFER_MAP pWaferMap) { // map data std::list listMapData; for (std::vector::size_type i = 0; i < pWaferMap.listReferPoint.size(); i++) { std::list listArrar; listArrar.push_back(IntToString(pWaferMap.listReferPoint[i].nX)); listArrar.push_back(IntToString(pWaferMap.listReferPoint[i].nY)); listMapData.push_back(listJoin(listArrar)); } std::string pMapData = listJoin(listMapData); // 全部数据 std::list listWaferMap; listWaferMap.push_back(pWaferMap.pMID); listWaferMap.push_back(IntToString(pWaferMap.nIDTYP)); listWaferMap.push_back(IntToString(pWaferMap.nFNLOC)); listWaferMap.push_back(IntToString(pWaferMap.nFFROT)); listWaferMap.push_back(IntToString(pWaferMap.nCOLCT)); listWaferMap.push_back(IntToString(pWaferMap.nRPSEL)); listWaferMap.push_back(pMapData); listWaferMap.push_back(pWaferMap.pDUTMS); listWaferMap.push_back(ToString(pWaferMap.dbXDies)); listWaferMap.push_back(ToString(pWaferMap.dbYDies)); listWaferMap.push_back(ToString(pWaferMap.nROWCT)); listWaferMap.push_back(ToString(pWaferMap.nCOLCT)); listWaferMap.push_back(pWaferMap.pMapBin); listWaferMap.push_back(ToString(pWaferMap.nPRDCT)); listWaferMap.push_back(ToString(pWaferMap.nPRAXI)); std::string pTmpData = listJoin(listWaferMap); return m_impl.WaferMapUpload(pTmpData); } // 晶圆图下传请求 RcResult CSecsEquip::WaferMapDownload(WAFER_MAP& pRequstInfo, WAFER_MAP& pWaferMap) { // map data std::list listMapData; for (std::vector::size_type i = 0; i < pRequstInfo.listReferPoint.size(); i++) { std::list listArrar; listArrar.push_back(IntToString(pRequstInfo.listReferPoint[i].nX)); listArrar.push_back(IntToString(pRequstInfo.listReferPoint[i].nY)); listMapData.push_back(listJoin(listArrar)); } std::string pMapData = listJoin(listMapData); // 全部数据 std::list listWaferMap; listWaferMap.push_back(pRequstInfo.pMID); listWaferMap.push_back(IntToString(pRequstInfo.nIDTYP)); listWaferMap.push_back(IntToString(pRequstInfo.nFNLOC)); listWaferMap.push_back(IntToString(pRequstInfo.nFFROT)); listWaferMap.push_back(IntToString(pRequstInfo.nORLOC)); listWaferMap.push_back(ToString(pRequstInfo.nPRAXI)); listWaferMap.push_back(pRequstInfo.pNULBC); listWaferMap.push_back(pRequstInfo.pMapBin); std::string pTmpData = listJoin(listWaferMap); std::string pReplyWaferMap; RcResult rc = m_impl.WaferMapDownload(pTmpData, pReplyWaferMap); if (rc.rc == 0) { GetWaferMap(pReplyWaferMap, pWaferMap); } return rc; } // 条带图下传请求 RcResult CSecsEquip::StripMapDownload(std::string pStripID, STRIP_MAP& pStripMap) { // map data std::string pTmpData = listJoin(pStripID.c_str()); std::string pReplyWaferMap; RcResult rc = m_impl.StripMapDownload(pTmpData, pReplyWaferMap); if (rc.rc == 0) { pStripMap.pMapDataByXml = listElement(pReplyWaferMap, 0); } return rc; } long CSecsEquip::GetWaferMap(std::string pData, WAFER_MAP& pWaferMap) { std::vector listMapData; RcResult rc = listSplit(pData, listMapData); if (rc.rc != 0) { return rc.rc; } // 个数跟请求不一致 if (listMapData.size() != 18) { return 1000; } // 提取数据 pWaferMap.pMID = listMapData[0]; pWaferMap.nIDTYP = (MATERIAL_ID_TYPE::ENUM )::atoi(listMapData[1].c_str()); pWaferMap.nFNLOC = (WAFER_FLAT_NOTCH_ANGLE::ENUM )::atoi(listMapData[2].c_str()); pWaferMap.nFFROT = (WAFER_FILM_FRAME_ANGLE::ENUM )::atoi(listMapData[3].c_str()); pWaferMap.nORLOC = (ORIGIN_LOCATION::ENUM )::atoi(listMapData[4].c_str()); pWaferMap.nRPSEL = ::atoi(listMapData[5].c_str()); // // map data // list listMapData2D; // list::iterator ite; // list::iterator iteArrar; // listSplit(pMapData, listMapData2D); // for (ite = listMapData2D.begin(); ite != listMapData2D.end(); ite++) // { // // 一维的 // vector listNum; // list listArrar; // listSplit(*ite, listArrar); // for (iteArrar = listArrar.begin(); iteArrar != listArrar.end(); iteArrar++) // { // listNum.push_back(::atoi(iteArrar->c_str())); // } // pWaferMap.pMapData.push_back(listNum); // } pWaferMap.pDUTMS = listMapData[7]; pWaferMap.dbXDies = ::atof(listMapData[8].c_str()); pWaferMap.dbYDies = ::atof(listMapData[9].c_str()); pWaferMap.nROWCT = ::atoi(listMapData[10].c_str()); pWaferMap.nCOLCT = ::atoi(listMapData[11].c_str()); pWaferMap.pMapBin = listMapData[12]; pWaferMap.nPRDCT = ::atoi(listMapData[13].c_str()); pWaferMap.nPRAXI = (PROCESS_AXIS::ENUM)::atoi(listMapData[14].c_str()); pWaferMap.pNULBC = listMapData[15]; pWaferMap.pBINLT = listMapData[16]; pWaferMap.nMLCL = ::atoi(listMapData[17].c_str()); return 0; } // 响应S9错误处理后通知 void CSecsEquip::OnS9ErrorNotifyHandler(std::string pReplyMailbox, std::string Data) { std::vector sv; if(listSplit(Data, sv) == 0 && sv.size() == 2) { std::string pType = sv[1]; S9_ERROR::ENUM nType = (S9_ERROR::ENUM)::atoi(pType.c_str()); // 回调 if(m_pS9ErrorNotifyProc != NULL) { m_pS9ErrorNotifyProc(this, nType); } } } // 响应Wafer信息处理 void CSecsEquip::OnWaferMapSubstrateHandler(std::string pReplyMailbox, std::string Data) { STRIP_MAP pStripMap; std::vector sv; if(listSplit(Data, sv) == 0 && sv.size() == 2) { std::string pObjectID = sv[1]; // 回调 if(m_pWaferMapSubstrateProc != NULL) { pStripMap = m_pWaferMapSubstrateProc(this, pObjectID.c_str()); } } m_impl.Reply(pReplyMailbox, pStripMap.pMapDataByXml); }