| | |
| | | #include "Servo.h" |
| | | #include "CPageReport.h" |
| | | #include "afxdialogex.h" |
| | | #include "CReportEditDlg.h" |
| | | #include <algorithm> |
| | | |
| | | |
| | | // CPageReport å¯¹è¯æ¡ |
| | |
| | | ON_WM_CTLCOLOR() |
| | | ON_WM_DESTROY() |
| | | ON_WM_SIZE() |
| | | ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CPageReport::OnLvnItemchangedList1) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | |
| | | m_listCtrl.SetItemText(index, 2, item->getVariablesIdsText().c_str()); |
| | | } |
| | | } |
| | | |
| | | void CPageReport::OnCreateBtns() |
| | | { |
| | | const int BTN_W = 80; |
| | | const int BTN_H = 28; |
| | | CreateBtn(_T("æ°å¢"), BTN_W, BTN_H, 2001); |
| | | CreateBtn(_T("å é¤"), BTN_W, BTN_H, 2002)->EnableWindow(FALSE); |
| | | CreateBtn(_T("ç¼è¾"), BTN_W, BTN_H, 2003)->EnableWindow(FALSE); |
| | | } |
| | | |
| | | void CPageReport::OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) |
| | | { |
| | | LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); |
| | | int nSelCount = m_listCtrl.GetSelectedCount(); |
| | | |
| | | if (CButton* pDel = GetBtnByName("å é¤")) { |
| | | pDel->EnableWindow(nSelCount > 0); |
| | | } |
| | | if (CButton* pEdit = GetBtnByName("ç¼è¾")) { |
| | | pEdit->EnableWindow(nSelCount > 0); |
| | | } |
| | | |
| | | *pResult = 0; |
| | | } |
| | | |
| | | void CPageReport::OnClickedBtn(const char* btnName) |
| | | { |
| | | ASSERT(btnName); |
| | | if (_strcmpi(btnName, "æ°å¢") == 0) { |
| | | int rc = UX_CanExecute(L"addReports"); |
| | | if (rc != 1) { |
| | | AfxMessageBox("æä½æéä¸è¶³ï¼è¯·è系管ç人åï¼"); |
| | | return; |
| | | } |
| | | |
| | | unsigned int newId = theApp.m_model.m_hsmsPassive.getMaxReportId() + 1; |
| | | std::vector<unsigned int> initVids; |
| | | CReportEditDlg dlg(_T("æ°å¢æ¥å"), static_cast<int>(newId), initVids, this); |
| | | if (dlg.DoModal() != IDOK) return; |
| | | const auto& vids = dlg.GetSelectedVids(); |
| | | |
| | | int ret = theApp.m_model.m_hsmsPassive.addReport(static_cast<int>(newId), vids); |
| | | if (ret == 0) { |
| | | UX_RecordAction(L"addReports"); |
| | | m_listCtrl.DeleteAllItems(); |
| | | loadReports(); |
| | | if (CButton* pDel = GetBtnByName("å é¤")) pDel->EnableWindow(FALSE); |
| | | if (CButton* pEdit = GetBtnByName("ç¼è¾")) pEdit->EnableWindow(FALSE); |
| | | } |
| | | else { |
| | | AfxMessageBox(_T("æ°å¢æ¥å失败ï¼å¯è½IDé夿æä»¶åå
¥å¤±è´¥ï¼")); |
| | | } |
| | | } |
| | | else if (_strcmpi(btnName, "å é¤") == 0) { |
| | | POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); |
| | | if (pos == nullptr) return; |
| | | int nItem = m_listCtrl.GetNextSelectedItem(pos); |
| | | auto pRpt = reinterpret_cast<SERVO::CReport*>(m_listCtrl.GetItemData(nItem)); |
| | | if (pRpt == nullptr) return; |
| | | |
| | | int rc = UX_CanExecute(L"delReports"); |
| | | if (rc != 1) { |
| | | AfxMessageBox("æä½æéä¸è¶³ï¼è¯·è系管ç人åï¼"); |
| | | return; |
| | | } |
| | | |
| | | int ret = theApp.m_model.m_hsmsPassive.deleteReport((int)pRpt->getReportId()); |
| | | if (ret == 0) { |
| | | UX_RecordAction(L"delReports"); |
| | | m_listCtrl.DeleteAllItems(); |
| | | loadReports(); |
| | | if (CButton* pDel = GetBtnByName("å é¤")) pDel->EnableWindow(FALSE); |
| | | if (CButton* pEdit = GetBtnByName("ç¼è¾")) pEdit->EnableWindow(FALSE); |
| | | } |
| | | else { |
| | | AfxMessageBox(_T("å 餿¥å失败")); |
| | | } |
| | | } |
| | | else if (_strcmpi(btnName, "ç¼è¾") == 0) { |
| | | POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); |
| | | if (pos == nullptr) return; |
| | | int nItem = m_listCtrl.GetNextSelectedItem(pos); |
| | | auto pRpt = reinterpret_cast<SERVO::CReport*>(m_listCtrl.GetItemData(nItem)); |
| | | if (pRpt == nullptr) return; |
| | | |
| | | int rc = UX_CanExecute(L"editReports"); |
| | | if (rc != 1) { |
| | | AfxMessageBox("æä½æéä¸è¶³ï¼è¯·è系管ç人åï¼"); |
| | | return; |
| | | } |
| | | |
| | | std::vector<unsigned int> vidsExisting = pRpt->getVids(); |
| | | CReportEditDlg dlg(_T("ç¼è¾æ¥å"), (int)pRpt->getReportId(), vidsExisting, this); |
| | | if (dlg.DoModal() != IDOK) return; |
| | | const auto& vids = dlg.GetSelectedVids(); |
| | | |
| | | int ret = theApp.m_model.m_hsmsPassive.updateReport((int)pRpt->getReportId(), vids); |
| | | if (ret == 0) { |
| | | UX_RecordAction(L"editReports"); |
| | | m_listCtrl.DeleteAllItems(); |
| | | loadReports(); |
| | | if (CButton* pDel = GetBtnByName("å é¤")) pDel->EnableWindow(FALSE); |
| | | if (CButton* pEdit = GetBtnByName("ç¼è¾")) pEdit->EnableWindow(FALSE); |
| | | } |
| | | else { |
| | | AfxMessageBox(_T("ç¼è¾æ¥å失败ï¼å¯è½æä»¶åå
¥å¤±è´¥ï¼")); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | private: |
| | | CListCtrlEx m_listCtrl; |
| | | void OnCreateBtns() override; |
| | | void OnClickedBtn(const char* btnName) override; |
| | | |
| | | // å¯¹è¯æ¡æ°æ® |
| | | #ifdef AFX_DESIGN_TIME |
| | |
| | | afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); |
| | | afx_msg void OnDestroy(); |
| | | afx_msg void OnSize(UINT nType, int cx, int cy); |
| | | afx_msg void OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult); |
| | | }; |
| | |
| | | #include "Servo.h" |
| | | #include "CPageVarialbles.h" |
| | | #include "afxdialogex.h" |
| | | #include "CVariableEditDlg2.h" |
| | | |
| | | |
| | | // CPageVarialbles å¯¹è¯æ¡ |
| | |
| | | { |
| | | ASSERT(btnName); |
| | | if (_strcmpi(btnName, "æ°å¢") == 0) { |
| | | // TODO: æ°å¢é»è¾ |
| | | int rc = UX_CanExecute(L"addVarialbles"); |
| | | if (rc != 1) { |
| | | AfxMessageBox("æä½æéä¸è¶³ï¼è¯·è系管ç人åï¼"); |
| | | return; |
| | | } |
| | | unsigned int newId = theApp.m_model.m_hsmsPassive.getMaxVariableId(); |
| | | int newIdInt = static_cast<int>(newId + 1); |
| | | CVariableEditDlg2 dlg(_T("æ°å¢åé"), newIdInt, _T("U1"), _T(""), _T(""), this); |
| | | if (dlg.DoModal() != IDOK) return; |
| | | CString name = dlg.GetNameText(); |
| | | CString fmt = dlg.GetTypeText(); |
| | | CString remark = dlg.GetRemark(); |
| | | |
| | | int ret = theApp.m_model.m_hsmsPassive.addVariable(CT2A(name), CT2A(fmt), CT2A(remark), newIdInt); |
| | | if (ret == 0) { |
| | | UX_RecordAction(L"addVarialbles"); |
| | | m_listCtrl.DeleteAllItems(); |
| | | loadVariables(); |
| | | } |
| | | else { |
| | | AfxMessageBox(_T("æ°å¢åéå¤±è´¥ï¼æ ¼å¼æ¯å¦æ£ç¡®ï¼(U1/U2/I2/A20/A50/L)")); |
| | | } |
| | | } |
| | | else if (_strcmpi(btnName, "å é¤") == 0) { |
| | | POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); |
| | |
| | | auto pVar = reinterpret_cast<SERVO::CVariable*>(m_listCtrl.GetItemData(nItem)); |
| | | if (pVar == nullptr) return; |
| | | |
| | | int rc = UX_CanExecute(L"delVarialbles"); |
| | | if (rc != 1) { |
| | | AfxMessageBox("æä½æéä¸è¶³ï¼è¯·è系管ç人åï¼"); |
| | | return; |
| | | } |
| | | int ret = theApp.m_model.m_hsmsPassive.deleteVariable(pVar->getVarialbleId()); |
| | | if (ret == 0) { |
| | | UX_RecordAction(L"delVarialbles"); |
| | | |
| | | m_listCtrl.DeleteAllItems(); |
| | | loadVariables(); |
| | | if (CButton* pDel = GetBtnByName("å é¤")) pDel->EnableWindow(FALSE); |
| | |
| | | } |
| | | } |
| | | else if (_strcmpi(btnName, "ç¼è¾") == 0) { |
| | | // TODO: ç¼è¾é»è¾ |
| | | POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); |
| | | if (pos == nullptr) return; |
| | | int nItem = m_listCtrl.GetNextSelectedItem(pos); |
| | | auto pVar = reinterpret_cast<SERVO::CVariable*>(m_listCtrl.GetItemData(nItem)); |
| | | if (pVar == nullptr) return; |
| | | |
| | | int rc = UX_CanExecute(L"editVarialbles"); |
| | | if (rc != 1) { |
| | | AfxMessageBox("æä½æéä¸è¶³ï¼è¯·è系管ç人åï¼"); |
| | | return; |
| | | } |
| | | CVariableEditDlg2 dlg(_T("ç¼è¾åé"), |
| | | pVar->getVarialbleId(), |
| | | CString(CA2T(SERVO::CVariable::formatToString(pVar->getFormat()).c_str())), |
| | | CString(CA2T(pVar->getName().c_str())), |
| | | CString(CA2T(pVar->getRemark().c_str())), |
| | | this); |
| | | if (dlg.DoModal() != IDOK) return; |
| | | CString name = dlg.GetNameText(); |
| | | CString fmt = dlg.GetTypeText(); |
| | | CString remark = dlg.GetRemark(); |
| | | |
| | | int ret = theApp.m_model.m_hsmsPassive.updateVariable(pVar->getVarialbleId(), CT2A(name), CT2A(fmt), CT2A(remark)); |
| | | if (ret == 0) { |
| | | UX_RecordAction(L"editVarialbles"); |
| | | m_listCtrl.DeleteAllItems(); |
| | | loadVariables(); |
| | | } |
| | | else { |
| | | AfxMessageBox(_T("ç¼è¾åéå¤±è´¥ï¼æ ¼å¼æ¯å¦æ£ç¡®ï¼(U1/U2/I2/A20/A50/L)")); |
| | | } |
| | | } |
| | | } |
| | |
| | | m_nReportId = 0; |
| | | } |
| | | |
| | | CReport::CReport(unsigned int reportId, std::vector<unsigned int>& vids) |
| | | CReport::CReport(unsigned int reportId, const std::vector<unsigned int>& vids) |
| | | { |
| | | m_nReportId = reportId; |
| | | for (auto vid : vids) { |
| | | m_vids.push_back(vid); |
| | | } |
| | | m_vids = vids; |
| | | } |
| | | |
| | | CReport::~CReport() |
| | |
| | | { |
| | | public: |
| | | CReport(); |
| | | CReport(unsigned int reportId, std::vector<unsigned int>& vids); |
| | | CReport(unsigned int reportId, const std::vector<unsigned int>& vids); |
| | | virtual ~CReport(); |
| | | |
| | | public: |
| | |
| | | std::vector<CVariable*>& getVariables(); |
| | | std::string getVariablesIdsText(); |
| | | bool getVariableName(unsigned int vid, std::string& strName); |
| | | const std::vector<unsigned int>& getVids() const { return m_vids; } |
| | | |
| | | private: |
| | | unsigned int m_nReportId; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "stdafx.h" |
| | | #include "CReportEditDlg.h" |
| | | #include "Servo.h" |
| | | #include "resource.h" |
| | | #include <algorithm> |
| | | |
| | | IMPLEMENT_DYNAMIC(CReportEditDlg, CDialogEx) |
| | | |
| | | CReportEditDlg::CReportEditDlg(const CString& title, int rptId, const std::vector<unsigned int>& vids, CWnd* pParent) |
| | | : CDialogEx(IDD_DIALOG_REPORT_EDIT, pParent) |
| | | , m_strTitle(title) |
| | | , m_rptId(rptId) |
| | | , m_vids(vids) |
| | | { |
| | | } |
| | | |
| | | CReportEditDlg::~CReportEditDlg() |
| | | { |
| | | } |
| | | |
| | | void CReportEditDlg::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | DDX_Control(pDX, IDC_EDIT_RPT_ID, m_editId); |
| | | DDX_Control(pDX, IDC_LIST_RPT_VARS, m_listVars); |
| | | } |
| | | |
| | | BEGIN_MESSAGE_MAP(CReportEditDlg, CDialogEx) |
| | | END_MESSAGE_MAP() |
| | | |
| | | BOOL CReportEditDlg::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | SetWindowText(m_strTitle); |
| | | |
| | | CString strId; |
| | | strId.Format(_T("%d"), m_rptId); |
| | | m_editId.SetWindowText(strId); |
| | | m_editId.SetReadOnly(TRUE); |
| | | |
| | | // åå§åå表 |
| | | m_listVars.SetExtendedStyle(m_listVars.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES); |
| | | m_listVars.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 60); |
| | | m_listVars.InsertColumn(1, _T("åç§°"), LVCFMT_LEFT, 140); |
| | | m_listVars.InsertColumn(2, _T("æ ¼å¼"), LVCFMT_LEFT, 80); |
| | | |
| | | auto& vars = theApp.m_model.m_hsmsPassive.getVariables(); |
| | | for (int i = 0; i < (int)vars.size(); ++i) { |
| | | auto v = vars[i]; |
| | | if (v == nullptr) continue; |
| | | int idx = m_listVars.InsertItem(m_listVars.GetItemCount(), std::to_string(v->getVarialbleId()).c_str()); |
| | | m_listVars.SetItemText(idx, 1, v->getName().c_str()); |
| | | m_listVars.SetItemText(idx, 2, SERVO::CVariable::formatToString(v->getFormat()).c_str()); |
| | | m_listVars.SetItemData(idx, (DWORD_PTR)v->getVarialbleId()); |
| | | if (std::find(m_vids.begin(), m_vids.end(), v->getVarialbleId()) != m_vids.end()) { |
| | | m_listVars.SetCheck(idx, TRUE); |
| | | } |
| | | } |
| | | |
| | | return TRUE; |
| | | } |
| | | |
| | | void CReportEditDlg::OnOK() |
| | | { |
| | | std::vector<unsigned int> selected; |
| | | int count = m_listVars.GetItemCount(); |
| | | for (int i = 0; i < count; ++i) { |
| | | if (m_listVars.GetCheck(i)) { |
| | | selected.push_back((unsigned int)m_listVars.GetItemData(i)); |
| | | } |
| | | } |
| | | if (selected.empty()) { |
| | | AfxMessageBox(_T("è³å°éæ©ä¸ä¸ªåé")); |
| | | return; |
| | | } |
| | | m_vids.swap(selected); |
| | | CDialogEx::OnOK(); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include "afxdialogex.h" |
| | | |
| | | // æ¥åç¼è¾å¯¹è¯æ¡ï¼æ°å¢/ç¼è¾å
±ç¨ï¼ |
| | | class CReportEditDlg : public CDialogEx |
| | | { |
| | | DECLARE_DYNAMIC(CReportEditDlg) |
| | | |
| | | public: |
| | | CReportEditDlg(const CString& title, int rptId, const std::vector<unsigned int>& vids, CWnd* pParent = nullptr); |
| | | virtual ~CReportEditDlg(); |
| | | |
| | | int GetReportId() const { return m_rptId; } |
| | | const std::vector<unsigned int>& GetSelectedVids() const { return m_vids; } |
| | | |
| | | protected: |
| | | virtual BOOL OnInitDialog() override; |
| | | virtual void DoDataExchange(CDataExchange* pDX) override; |
| | | afx_msg void OnOK(); |
| | | |
| | | DECLARE_MESSAGE_MAP() |
| | | |
| | | private: |
| | | CString m_strTitle; |
| | | int m_rptId; |
| | | std::vector<unsigned int> m_vids; |
| | | |
| | | CEdit m_editId; |
| | | CListCtrl m_listVars; |
| | | }; |
| | |
| | | |
| | | UX_DefineAction(L"start", L"å¯å¨æºå°", L"Operator"); |
| | | UX_DefineAction(L"stop", L"åæº", L"Operator"); |
| | | UX_DefineAction(L"recipe", L"ç¼è¾é
æ¹", L"Engineer"); |
| | | UX_DefineAction(L"recipe", L"ç¼è¾é
æ¹", L"PE"); |
| | | UX_DefineAction(L"delVarialbles", L"å é¤åé", L"PE"); |
| | | UX_DefineAction(L"addVarialbles", L"æ°å¢åé", L"PE"); |
| | | UX_DefineAction(L"editVarialbles", L"ç¼è¾åé", L"PE"); |
| | | UX_DefineAction(L"addReports", L"æ°å¢Report", L"PE"); |
| | | UX_DefineAction(L"editReports", L"ç¼è¾Report", L"PE"); |
| | | UX_DefineAction(L"delReports", L"å é¤Report", L"PE"); |
| | | } |
| | | // ç¡®ä¿æéå®ä¹åå¨ï¼å¹çï¼ |
| | | UX_DefineAction(L"addVarialbles", L"æ°å¢åé", L"PE"); |
| | | UX_DefineAction(L"editVarialbles", L"ç¼è¾åé", L"PE"); |
| | | UX_DefineAction(L"delVarialbles", L"å é¤åé", L"PE"); |
| | | UX_DefineAction(L"addReports", L"æ°å¢Report", L"PE"); |
| | | UX_DefineAction(L"editReports", L"ç¼è¾Report", L"PE"); |
| | | UX_DefineAction(L"delReports", L"å é¤Report", L"PE"); |
| | | } |
| | | |
| | | bool CUserManager2::login(const char* pszAccount, const char* pszPwd) |
| | |
| | | |
| | | |
| | | namespace SERVO { |
| | | // åéæ ¼å¼ |
| | | // åéç±»å |
| | | enum class SVFromat { |
| | | U1 = 0, |
| | | U2, |
| | |
| | | std::string getValue(); |
| | | __int64 getIntValue(); |
| | | std::vector<CVariable>& getVarsValue(); |
| | | void setName(const char* pszName) { m_strName = pszName; } |
| | | void setFormat(const char* pszFmt) { m_format = toFormat(pszFmt); } |
| | | void setRemark(const char* pszRemark) { m_strRemark = pszRemark; } |
| | | |
| | | private: |
| | | unsigned int m_nVarialbeId; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "stdafx.h" |
| | | #include "CVariableEditDlg2.h" |
| | | #include "resource.h" |
| | | |
| | | IMPLEMENT_DYNAMIC(CVariableEditDlg2, CDialogEx) |
| | | |
| | | CVariableEditDlg2::CVariableEditDlg2(const CString& title, int varId, const CString& type, const CString& name, const CString& remark, CWnd* pParent) |
| | | : CDialogEx(IDD_DIALOG_VARIABLE_EDIT2, pParent), |
| | | m_strTitle(title), |
| | | m_varId(varId), |
| | | m_strType(type), |
| | | m_strName(name), |
| | | m_strRemark(remark) |
| | | { |
| | | } |
| | | |
| | | CVariableEditDlg2::~CVariableEditDlg2() |
| | | { |
| | | } |
| | | |
| | | void CVariableEditDlg2::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | DDX_Control(pDX, IDC_EDIT_VAR_ID, m_editId); |
| | | DDX_Control(pDX, IDC_COMBO_VAR_TYPE, m_cbType); |
| | | DDX_Control(pDX, IDC_EDIT_VAR_NAME, m_editName); |
| | | DDX_Control(pDX, IDC_EDIT_VAR_REMARK, m_editRemark); |
| | | } |
| | | |
| | | BEGIN_MESSAGE_MAP(CVariableEditDlg2, CDialogEx) |
| | | END_MESSAGE_MAP() |
| | | |
| | | BOOL CVariableEditDlg2::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | SetWindowText(m_strTitle); |
| | | |
| | | CString strId; |
| | | strId.Format(_T("%d"), m_varId); |
| | | m_editId.SetWindowText(strId); |
| | | m_editId.SetReadOnly(TRUE); |
| | | |
| | | m_cbType.ResetContent(); |
| | | const TCHAR* fmts[] = { _T("U1"), _T("U2"), _T("I2"), _T("A20"), _T("A50"), _T("L") }; |
| | | for (auto f : fmts) { |
| | | m_cbType.AddString(f); |
| | | } |
| | | if (!m_strType.IsEmpty()) { |
| | | m_cbType.SelectString(-1, m_strType); |
| | | } |
| | | else { |
| | | m_cbType.SetCurSel(0); |
| | | } |
| | | |
| | | m_editName.SetWindowText(m_strName); |
| | | m_editRemark.SetWindowText(m_strRemark); |
| | | |
| | | return TRUE; |
| | | } |
| | | |
| | | void CVariableEditDlg2::OnOK() |
| | | { |
| | | CString name, fmt, remark; |
| | | m_editName.GetWindowText(name); |
| | | m_cbType.GetWindowText(fmt); |
| | | m_editRemark.GetWindowText(remark); |
| | | |
| | | fmt.MakeUpper(); |
| | | if (name.IsEmpty()) { |
| | | AfxMessageBox(_T("åç§°ä¸è½ä¸ºç©º")); |
| | | return; |
| | | } |
| | | if (fmt.IsEmpty()) { |
| | | AfxMessageBox(_T("ç±»åä¸è½ä¸ºç©º")); |
| | | return; |
| | | } |
| | | if (fmt != _T("U1") && fmt != _T("U2") && fmt != _T("I2") |
| | | && fmt != _T("A20") && fmt != _T("A50") && fmt != _T("L")) { |
| | | AfxMessageBox(_T("ç±»åå¿
é¡»æ¯ U1/U2/I2/A20/A50/L")); |
| | | return; |
| | | } |
| | | |
| | | m_strName = name; |
| | | m_strType = fmt; |
| | | m_strRemark = remark; |
| | | |
| | | CDialogEx::OnOK(); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include "afxdialogex.h" |
| | | |
| | | // åéç¼è¾å¯¹è¯æ¡ï¼æ°å¢/ç¼è¾å
±ç¨ï¼ä½¿ç¨èµæºæ¨¡æ¿ï¼ |
| | | class CVariableEditDlg2 : public CDialogEx |
| | | { |
| | | DECLARE_DYNAMIC(CVariableEditDlg2) |
| | | |
| | | public: |
| | | CVariableEditDlg2(const CString& title, int varId, const CString& type, const CString& name, const CString& remark, CWnd* pParent = nullptr); |
| | | virtual ~CVariableEditDlg2(); |
| | | |
| | | int GetVarId() const { return m_varId; } |
| | | CString GetTypeText() const { return m_strType; } |
| | | CString GetNameText() const { return m_strName; } |
| | | CString GetRemark() const { return m_strRemark; } |
| | | |
| | | protected: |
| | | virtual BOOL OnInitDialog() override; |
| | | virtual void DoDataExchange(CDataExchange* pDX) override; |
| | | afx_msg void OnOK(); |
| | | |
| | | DECLARE_MESSAGE_MAP() |
| | | |
| | | private: |
| | | CString m_strTitle; |
| | | int m_varId; |
| | | CString m_strType; |
| | | CString m_strName; |
| | | CString m_strRemark; |
| | | |
| | | CEdit m_editId, m_editName, m_editRemark; |
| | | CComboBox m_cbType; |
| | | }; |
| | |
| | | #include <time.h> |
| | | #include <stdlib.h> |
| | | #include <string.h> |
| | | #include <algorithm> |
| | | #include <set> |
| | | #include <regex> |
| | | |
| | | |
| | |
| | | return m_variabels; |
| | | } |
| | | |
| | | unsigned int CHsmsPassive::getMaxVariableId() const |
| | | { |
| | | unsigned int maxId = 0; |
| | | for (auto item : m_variabels) { |
| | | if (item && item->getVarialbleId() > maxId) { |
| | | maxId = item->getVarialbleId(); |
| | | } |
| | | } |
| | | return maxId; |
| | | } |
| | | |
| | | SERVO::CVariable* CHsmsPassive::getVariable(int variableId) |
| | | { |
| | | for (auto item : m_variabels) { |
| | |
| | | |
| | | if (filepath.empty()) return -2; |
| | | |
| | | // ååæä»¶ï¼ä¿æåç¼ç ï¼UTF-8 ææ¬å°ç¼ç ï¼ |
| | | return writeVariablesToFile(filepath); |
| | | } |
| | | |
| | | void CHsmsPassive::setVariableValue(const char* pszName, __int64 value) |
| | | { |
| | | auto v = getVariable(pszName); |
| | | if (v != nullptr) { |
| | | v->setValue(value); |
| | | } |
| | | } |
| | | |
| | | void CHsmsPassive::setVariableValue(const char* pszName, const char* value) |
| | | { |
| | | auto v = getVariable(pszName); |
| | | if (v != nullptr) { |
| | | v->setValue(value); |
| | | } |
| | | } |
| | | |
| | | void CHsmsPassive::setVariableValue(const char* pszName, std::vector<SERVO::CVariable>& vars) |
| | | { |
| | | auto v = getVariable(pszName); |
| | | if (v != nullptr) { |
| | | v->setValue(vars); |
| | | } |
| | | } |
| | | |
| | | static bool isValidFormat(const std::string& fmt) |
| | | { |
| | | static const std::set<std::string> allow = { "U1","U2","I2","A20","A50","L" }; |
| | | return allow.count(fmt) > 0; |
| | | } |
| | | |
| | | int CHsmsPassive::addVariable(const char* pszName, const char* pszFormat, const char* pszRemark, int& outId) |
| | | { |
| | | if (pszName == nullptr || pszFormat == nullptr) return -1; |
| | | std::string fmt = pszFormat; |
| | | std::transform(fmt.begin(), fmt.end(), fmt.begin(), ::toupper); |
| | | if (!isValidFormat(fmt)) return -2; |
| | | |
| | | Lock(); |
| | | int maxId = 0; |
| | | for (auto v : m_variabels) { |
| | | if (v != nullptr && v->getVarialbleId() > maxId) { |
| | | maxId = v->getVarialbleId(); |
| | | } |
| | | } |
| | | outId = maxId + 1; |
| | | |
| | | SERVO::CVariable* pNew = new SERVO::CVariable(std::to_string(outId).c_str(), pszName, fmt.c_str(), pszRemark ? pszRemark : ""); |
| | | m_variabels.push_back(pNew); |
| | | auto filepath = m_strVariableFilepath; |
| | | Unlock(); |
| | | |
| | | if (filepath.empty()) return -3; |
| | | return writeVariablesToFile(filepath); |
| | | } |
| | | |
| | | int CHsmsPassive::updateVariable(int variableId, const char* pszName, const char* pszFormat, const char* pszRemark) |
| | | { |
| | | if (pszName == nullptr || pszFormat == nullptr) return -1; |
| | | std::string fmt = pszFormat; |
| | | std::transform(fmt.begin(), fmt.end(), fmt.begin(), ::toupper); |
| | | if (!isValidFormat(fmt)) return -2; |
| | | |
| | | Lock(); |
| | | auto it = std::find_if(m_variabels.begin(), m_variabels.end(), [=](SERVO::CVariable* v) { |
| | | return v != nullptr && v->getVarialbleId() == variableId; |
| | | }); |
| | | if (it == m_variabels.end()) { |
| | | Unlock(); |
| | | return -4; |
| | | } |
| | | (*it)->setName(pszName); |
| | | (*it)->setFormat(fmt.c_str()); |
| | | (*it)->setRemark(pszRemark ? pszRemark : ""); |
| | | auto filepath = m_strVariableFilepath; |
| | | Unlock(); |
| | | |
| | | if (filepath.empty()) return -3; |
| | | return writeVariablesToFile(filepath); |
| | | } |
| | | |
| | | int CHsmsPassive::writeVariablesToFile(const std::string& filepath) |
| | | { |
| | | if (filepath.empty()) return -3; |
| | | |
| | | CFile file; |
| | | if (!file.Open(filepath.c_str(), CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone)) { |
| | | return -3; |
| | |
| | | return 0; |
| | | } |
| | | |
| | | void CHsmsPassive::setVariableValue(const char* pszName, __int64 value) |
| | | { |
| | | auto v = getVariable(pszName); |
| | | if (v != nullptr) { |
| | | v->setValue(value); |
| | | } |
| | | } |
| | | |
| | | void CHsmsPassive::setVariableValue(const char* pszName, const char* value) |
| | | { |
| | | auto v = getVariable(pszName); |
| | | if (v != nullptr) { |
| | | v->setValue(value); |
| | | } |
| | | } |
| | | |
| | | void CHsmsPassive::setVariableValue(const char* pszName, std::vector<SERVO::CVariable>& vars) |
| | | { |
| | | auto v = getVariable(pszName); |
| | | if (v != nullptr) { |
| | | v->setValue(vars); |
| | | } |
| | | } |
| | | |
| | | int CHsmsPassive::loadReports(const char* pszFilepath) |
| | | { |
| | | m_strReportFilepath = pszFilepath; |
| | | m_bReportUtf8 = false; |
| | | m_bReportUtf8Bom = false; |
| | | // å
¼å®¹ UTF-8/BOM 䏿¬å°ç¼ç 读å |
| | | CFile file; |
| | | if (!file.Open(pszFilepath, CFile::modeRead | CFile::shareDenyNone)) { |
| | |
| | | // UTF-8 BOM |
| | | if (nLen >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) { |
| | | offset = 3; |
| | | m_bReportUtf8 = true; |
| | | m_bReportUtf8Bom = true; |
| | | } |
| | | |
| | | // UTF-16 LE BOM |
| | |
| | | MultiByteToWideChar(CP_UTF8, 0, buffer.data() + off, |
| | | static_cast<int>(buffer.size() - off), temp.data(), need); |
| | | content = temp.c_str(); |
| | | m_bReportUtf8 = true; |
| | | return true; |
| | | }; |
| | | |
| | |
| | | return m_reports; |
| | | } |
| | | |
| | | unsigned int CHsmsPassive::getMaxReportId() const |
| | | { |
| | | unsigned int maxId = 0; |
| | | for (auto item : m_reports) { |
| | | if (item && item->getReportId() > maxId) { |
| | | maxId = item->getReportId(); |
| | | } |
| | | } |
| | | return maxId; |
| | | } |
| | | |
| | | SERVO::CReport* CHsmsPassive::getReport(int rptid) |
| | | { |
| | | for (auto item : m_reports) { |
| | |
| | | return false; |
| | | } |
| | | |
| | | int CHsmsPassive::deleteReport(int rptid) |
| | | { |
| | | if (!removeReport(rptid)) { |
| | | return -1; |
| | | } |
| | | return writeReportsToFile(m_strReportFilepath); |
| | | } |
| | | |
| | | int CHsmsPassive::addReport(int rptid, const std::vector<unsigned int>& vids) |
| | | { |
| | | if (getReport(rptid) != nullptr) { |
| | | return -1; |
| | | } |
| | | SERVO::CReport* pReport = new SERVO::CReport(rptid, vids); |
| | | for (auto vid : vids) { |
| | | SERVO::CVariable* pVariable = getVariable((int)vid); |
| | | if (pVariable != nullptr) { |
| | | pReport->addVariable(pVariable); |
| | | } |
| | | } |
| | | m_reports.push_back(pReport); |
| | | return writeReportsToFile(m_strReportFilepath); |
| | | } |
| | | |
| | | int CHsmsPassive::updateReport(int rptid, const std::vector<unsigned int>& vids) |
| | | { |
| | | for (auto iter = m_reports.begin(); iter != m_reports.end(); ++iter) { |
| | | if ((*iter)->getReportId() == rptid) { |
| | | delete (*iter); |
| | | SERVO::CReport* pReport = new SERVO::CReport(rptid, vids); |
| | | for (auto vid : vids) { |
| | | SERVO::CVariable* pVariable = getVariable((int)vid); |
| | | if (pVariable != nullptr) { |
| | | pReport->addVariable(pVariable); |
| | | } |
| | | } |
| | | *iter = pReport; |
| | | return writeReportsToFile(m_strReportFilepath); |
| | | } |
| | | } |
| | | return -1; |
| | | } |
| | | |
| | | void CHsmsPassive::clearAllReport() |
| | | { |
| | | for (auto item : m_reports) { |
| | |
| | | m_reports.clear(); |
| | | } |
| | | |
| | | int CHsmsPassive::writeReportsToFile(const std::string& filepath) |
| | | { |
| | | if (filepath.empty()) return -1; |
| | | |
| | | CFile file; |
| | | if (!file.Open(filepath.c_str(), CFile::modeCreate | CFile::modeWrite)) { |
| | | return -1; |
| | | } |
| | | |
| | | if (m_bReportUtf8 && m_bReportUtf8Bom) { |
| | | const BYTE bom[3] = { 0xEF, 0xBB, 0xBF }; |
| | | file.Write(bom, 3); |
| | | } |
| | | |
| | | // header |
| | | const std::string headerAnsi = "RPTID,(VID1,VID2,...)\r\n"; |
| | | if (m_bReportUtf8) { |
| | | CStringA header = AnsiToUtf8(headerAnsi); |
| | | file.Write(header.GetString(), header.GetLength()); |
| | | } |
| | | else { |
| | | file.Write(headerAnsi.data(), (UINT)headerAnsi.size()); |
| | | } |
| | | |
| | | for (auto rpt : m_reports) { |
| | | if (rpt == nullptr) continue; |
| | | std::string line; |
| | | line.reserve(64); |
| | | line += std::to_string(rpt->getReportId()); |
| | | line += ",("; |
| | | |
| | | const auto& vids = rpt->getVids(); |
| | | for (size_t i = 0; i < vids.size(); ++i) { |
| | | line += std::to_string(vids[i]); |
| | | if (i + 1 < vids.size()) { |
| | | line.push_back(','); |
| | | } |
| | | } |
| | | line += ")\r\n"; |
| | | |
| | | if (m_bReportUtf8) { |
| | | CStringA out = AnsiToUtf8(line); |
| | | file.Write(out.GetString(), out.GetLength()); |
| | | } |
| | | else { |
| | | file.Write(line.data(), (UINT)line.size()); |
| | | } |
| | | } |
| | | |
| | | file.Close(); |
| | | return 0; |
| | | } |
| | | |
| | | int CHsmsPassive::loadCollectionEvents(const char* pszFilepath) |
| | | { |
| | | CFile file; |
| | |
| | | |
| | | // åæ¶ define report |
| | | bool removeReport(int rptid); |
| | | int deleteReport(int rptid); |
| | | int addReport(int rptid, const std::vector<unsigned int>& vids); |
| | | int updateReport(int rptid, const std::vector<unsigned int>& vids); |
| | | void clearAllReport(); |
| | | |
| | | // 仿件ä¸å è½½CVariableå表 |
| | |
| | | |
| | | // åå¾CVariableå表 |
| | | std::vector<SERVO::CVariable*>& getVariables(); |
| | | unsigned int getMaxVariableId() const; |
| | | |
| | | // å徿å®Variable |
| | | SERVO::CVariable* getVariable(int variableId); |
| | | SERVO::CVariable* getVariable(const char* pszName); |
| | | int deleteVariable(int variableId); |
| | | int addVariable(const char* pszName, const char* pszFormat, const char* pszRemark, int& outId); |
| | | int updateVariable(int variableId, const char* pszName, const char* pszFormat, const char* pszRemark); |
| | | |
| | | // 设置åéå¼ |
| | | void setVariableValue(const char* pszName, __int64 value); |
| | |
| | | |
| | | // åå¾Reportå表 |
| | | std::vector<SERVO::CReport*>& getReports(); |
| | | unsigned int getMaxReportId() const; |
| | | |
| | | // 仿件ä¸å è½½CCollectionEventå表 |
| | | int loadCollectionEvents(const char* pszFilepath); |
| | |
| | | int onRecvMsg(IMessage* pMessage); |
| | | void clearAllVariabel(); |
| | | std::vector<unsigned int> parseVidList(CString& strNums); |
| | | int writeVariablesToFile(const std::string& filepath); |
| | | int writeReportsToFile(const std::string& filepath); |
| | | |
| | | private: |
| | | CModel* m_pModel; |
| | |
| | | std::string m_strVariableFilepath; |
| | | bool m_bVariableUtf8{ false }; |
| | | bool m_bVariableUtf8Bom{ false }; |
| | | std::string m_strReportFilepath; |
| | | bool m_bReportUtf8{ false }; |
| | | bool m_bReportUtf8Bom{ false }; |
| | | BOOL m_bCimWorking; |
| | | HANDLE m_hCimWorkEvent; |
| | | HANDLE m_hCimWorkThreadHandle; |
| | |
| | | <ClInclude Include="CCjPage1.h" /> |
| | | <ClInclude Include="CProcessDataListDlg.h" /> |
| | | <ClInclude Include="CReport.h" /> |
| | | <ClInclude Include="CReportEditDlg.h" /> |
| | | <ClInclude Include="CRobotCmdContainerDlg.h" /> |
| | | <ClInclude Include="CRobotCmdTestDlg.h" /> |
| | | <ClInclude Include="CPagePortStatus.h" /> |
| | |
| | | <ClInclude Include="CUserEdit2Dlg.h" /> |
| | | <ClInclude Include="CUserXLogDlg.h" /> |
| | | <ClInclude Include="CVariable.h" /> |
| | | <ClInclude Include="CVariableEditDlg2.h" /> |
| | | <ClInclude Include="DeviceRecipeParamDlg.h" /> |
| | | <ClInclude Include="GlassJson.h" /> |
| | | <ClInclude Include="GlassLogDb.h" /> |
| | |
| | | <ClCompile Include="CCjPage1.cpp" /> |
| | | <ClCompile Include="CProcessDataListDlg.cpp" /> |
| | | <ClCompile Include="CReport.cpp" /> |
| | | <ClCompile Include="CReportEditDlg.cpp" /> |
| | | <ClCompile Include="CRobotCmdContainerDlg.cpp" /> |
| | | <ClCompile Include="CRobotCmdTestDlg.cpp" /> |
| | | <ClCompile Include="CPagePortStatus.cpp" /> |
| | |
| | | <ClCompile Include="CUserEdit2Dlg.cpp" /> |
| | | <ClCompile Include="CUserXLogDlg.cpp" /> |
| | | <ClCompile Include="CVariable.cpp" /> |
| | | <ClCompile Include="CVariableEditDlg2.cpp" /> |
| | | <ClCompile Include="DeviceRecipeParamDlg.cpp" /> |
| | | <ClCompile Include="GlassJson.cpp" /> |
| | | <ClCompile Include="GlassLogDb.cpp" /> |
| | |
| | | <Error Condition="!Exists('..\packages\Microsoft.Web.WebView2.1.0.2903.40\build\native\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Web.WebView2.1.0.2903.40\build\native\Microsoft.Web.WebView2.targets'))" /> |
| | | <Error Condition="!Exists('..\packages\Microsoft.Windows.ImplementationLibrary.1.0.240803.1\build\native\Microsoft.Windows.ImplementationLibrary.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Windows.ImplementationLibrary.1.0.240803.1\build\native\Microsoft.Windows.ImplementationLibrary.targets'))" /> |
| | | </Target> |
| | | </Project> |
| | | </Project> |
| | |
| | | <ClCompile Include="CCustomCheckBox.cpp" /> |
| | | <ClCompile Include="CCollectionEvent.cpp" /> |
| | | <ClCompile Include="CReport.cpp" /> |
| | | <ClCompile Include="CReportEditDlg.cpp"> |
| | | <Filter>Source Files</Filter> |
| | | </ClCompile> |
| | | <ClCompile Include="CVariable.cpp" /> |
| | | <ClCompile Include="CPageVarialbles.cpp" /> |
| | | <ClCompile Include="CPageReport.cpp" /> |
| | |
| | | <ClCompile Include="CUserManager2Dlg.cpp" /> |
| | | <ClCompile Include="CUserEdit2Dlg.cpp" /> |
| | | <ClCompile Include="CUserXLogDlg.cpp" /> |
| | | <ClCompile Include="CVariableEditDlg2.cpp" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClInclude Include="AlarmManager.h" /> |
| | |
| | | <ClInclude Include="CCustomCheckBox.h" /> |
| | | <ClInclude Include="CCollectionEvent.h" /> |
| | | <ClInclude Include="CReport.h" /> |
| | | <ClInclude Include="CReportEditDlg.h"> |
| | | <Filter>Header Files</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="CVariable.h" /> |
| | | <ClInclude Include="CPageVarialbles.h" /> |
| | | <ClInclude Include="CPageReport.h" /> |
| | |
| | | <ClInclude Include="CUserManager2Dlg.h" /> |
| | | <ClInclude Include="CUserEdit2Dlg.h" /> |
| | | <ClInclude Include="CUserXLogDlg.h" /> |
| | | <ClInclude Include="CVariableEditDlg2.h" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ResourceCompile Include="Servo.rc" /> |
| | |
| | | <UniqueIdentifier>{885738f6-3122-4bb9-8308-46b7f692fb13}</UniqueIdentifier> |
| | | </Filter> |
| | | </ItemGroup> |
| | | </Project> |
| | | </Project> |
| | |
| | | 50008,(5010) |
| | | 50009,(5011) |
| | | 50010,(5012) |
| | | |
| | | |
| | | 50011,(5013) |
| | |
| | | SVID,SV Name,SV Format,SV Remark |
| | | 100,PortTransferState,U1,0=OutOfService\r\n1=TransferBlocked\r\n2=ReadyToLoad\r\n3=ReadyToUnload\r\n4=InService\r\n5=TransferReady |
| | | 300,AccessMode,U1,1=Manual\r\n2=Auto |
| | | 100,PortTransferState,U1,0=OutOfService |
| | | 300,AccessMode,U1,1=Manual |
| | | 500,Clock,A50, |
| | | 600,CurrentControlState,U1,0:Offline:equipment\r\n1:Offline-Attempt\r\n2:Online\r\n3:Offline:host\r\n4:Online:Local\r\n5:Online:Remote |
| | | 600,CurrentControlState,U1,0:Offline:equipment |
| | | 601,PreviousControlState,U1, |
| | | 700,CurrentProcessState,U1,0:DOWN\r\n1:IDLE\r\n2.SETUP\r\n3.EXCUTING\r\n4.MAINTAIN\r\n5.ALARM |
| | | 700,CurrentProcessState,U1,0:DOWN |
| | | 701,PreviousProcessState,U1, |
| | | 800,EFEMPPExecName,A20, |
| | | 801,EQPPExecName,A20, |
| | | 2000,RbRAxisTorque,I2,æºå¨äººRè½´æç© |
| | | 2001,RbLAxisTorque,l2,æºå¨äººLè½´æç© |
| | | 2002,RbZAxisTorque,l2,æºå¨äººZè½´æç© |
| | | 2003,RbTHAxisTorque,l2,æºå¨äººTHè½´æç© |
| | | 2004,RbXAxisTorque,l2,æºå¨äººXè½´æç© |
| | | 2005,AxisX111,l2,X111ç¸æºåç§»æ ½çµæºæç© |
| | | 2006,AxisX112,l2,X112ç¸æºåç§»æ ½çµæºæç© |
| | | 2007,AxisU113,l2,U113产åæè½¬çµæºæç© |
| | | 2008,AxisX114,l2,X114产åå·¦æ´åçµæºæç© |
| | | 2009,AxisY121,l2,Y121产å峿´åçµæºæç© |
| | | 2010,AxisY122,l2,Y122产ååæ´åçµæºæç© |
| | | 2011,AxisY123,l2,Y123产ååéµåçµæºæç© |
| | | 2012,MainAir,U2,æ»è¿æ°ååå¼ |
| | | 2013,MainVacuum,l2,æ»ç空ååå¼ |
| | | 2014,RbMainVacuum,l2,æºå¨äººçç©ºå¼ |
| | | 2015,LPMainVacuum,l2,LPç空å¼#D265 |
| | | 2016,LPMainAir,U2,LPåç©ºå¼ |
| | | 2017,ALVacuum,l2,Alignerçç©ºå¼ |
| | | 2018,FFU1RPM,U2,FFU1转é |
| | | 2019,FFU2RPM,U2,FFU2转é |
| | | 2020,FFU3RPM,U2,FFU3转é |
| | | 2021,FFU4RPM,U2,FFU4转é |
| | | 2001,RbLAxisTorque,U1,æºå¨äººLè½´æç© |
| | | 2002,RbZAxisTorque,U1,æºå¨äººZè½´æç© |
| | | 2003,RbTHAxisTorque,U1,æºå¨äººTHè½´æç© |
| | | 2004,RbXAxisTorque,U1,æºå¨äººXè½´æç© |
| | | 2005,AxisX111,U1,X111ç¸æºåç§»æ ½çµæºæç© |
| | | 2006,AxisX112,U1,X112ç¸æºåç§»æ ½çµæºæç© |
| | | 2007,AxisU113,U1,U113产åæè½¬çµæºæç© |
| | | 2008,AxisX114,U1,X114产åå·¦æ´åçµæºæç© |
| | | 2009,AxisY121,U1,Y121产å峿´åçµæºæç© |
| | | 2010,AxisY122,U1,Y122产ååæ´åçµæºæç© |
| | | 2011,AxisY123,U1,Y123产ååéµåçµæºæç© |
| | | 2012,MainAir,U1,æ»è¿æ°ååå¼ |
| | | 2013,MainVacuum,U1,æ»ç空ååå¼ |
| | | 2014,RbMainVacuum,U1,æºå¨äººçç©ºå¼ |
| | | 2015,LPMainVacuum,U1,LPç空å¼#D265 |
| | | 2016,LPMainAir,U1,LPåç©ºå¼ |
| | | 2017,ALVacuum,U1,Alignerçç©ºå¼ |
| | | 2018,FFU1RPM,U1,FFU1转é |
| | | 2019,FFU2RPM,U1,FFU2转é |
| | | 2020,FFU3RPM,U1,FFU3转é |
| | | 2021,FFU4RPM,U1,FFU4转é |
| | | 2022,ESDValue,I2,éçµæ£æµå¼ |
| | | 2023,OCREnable,U2,"OCR使è½ï¼O:å¼å¯ 1ï¼å±è½" |
| | | 2024,CCDEnable,U2,"CCD使è½ï¼O:å¼å¯ 1ï¼å±è½" |
| | | 2025,FFUParameter,U2,FFU设å®å¼ |
| | | 2023,OCREnable,U1,"OCR使è½ï¼O:å¼å¯ 1ï¼å±è½" |
| | | 2024,CCDEnable,U1,"CCD使è½ï¼O:å¼å¯ 1ï¼å±è½" |
| | | 2025,FFUParameter,U1,FFU设å®å¼ |
| | | 5000,CarrierID,A20,å¡å£ID |
| | | 5001,CJobSpace,U1,CJ Space |
| | | 5002,PJobSpace,U1,PJ Space |
| | |
| | | 5007,PanelEndID,A20,PanelEndID |
| | | 5008,CJStartID,A20,CJStartID |
| | | 5009,CJEndID,A20,CJEndID |
| | | 5010,UnloadReadyPortId,U2,"Port ID" |
| | | 5011,LoadReadyPortId,U2,"Port ID" |
| | | 5012,BlockedPortId,U2,"Port ID" |
| | | 5010,UnloadReadyPortId,U1,"Port ID" |
| | | 5011,LoadReadyPortId,U1,"Port ID" |
| | | 5012,BlockedPortId,U1,"Port ID" |
| | | 5013,TestVID,U1,æµè¯æ·»å åé55 |