From 3c33ce0779e18782d148f9314313041c14cca5a5 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期四, 11 十二月 2025 10:22:58 +0800
Subject: [PATCH] 1.新增变量和编辑变量;
---
SourceCode/Bond/Servo/CVariableEditDlg2.cpp | 89 ++++++++++++
SourceCode/Bond/Servo/Servo.vcxproj | 2
SourceCode/Bond/Servo/CPageVarialbles.cpp | 44 ++++++
SourceCode/Bond/Servo/HsmsPassive.h | 4
SourceCode/Bond/Servo/Servo.vcxproj.filters | 2
SourceCode/Bond/Servo/CVariable.h | 5
SourceCode/Bond/Servo/resource.h | 0
SourceCode/Bond/Servo/HsmsPassive.cpp | 125 ++++++++++++++---
SourceCode/Bond/Servo/CVariableEditDlg2.h | 34 ++++
SourceCode/Bond/Servo/Servo.rc | 0
SourceCode/Bond/x64/Debug/VariableList.txt | 63 ++++----
11 files changed, 309 insertions(+), 59 deletions(-)
diff --git a/SourceCode/Bond/Servo/CPageVarialbles.cpp b/SourceCode/Bond/Servo/CPageVarialbles.cpp
index 4f854d8..07f8123 100644
--- a/SourceCode/Bond/Servo/CPageVarialbles.cpp
+++ b/SourceCode/Bond/Servo/CPageVarialbles.cpp
@@ -5,6 +5,7 @@
#include "Servo.h"
#include "CPageVarialbles.h"
#include "afxdialogex.h"
+#include "CVariableEditDlg2.h"
// CPageVarialbles 瀵硅瘽妗�
@@ -161,7 +162,22 @@
{
ASSERT(btnName);
if (_strcmpi(btnName, "鏂板") == 0) {
- // TODO: 鏂板閫昏緫
+ 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) {
+ m_listCtrl.DeleteAllItems();
+ loadVariables();
+ }
+ else {
+ AfxMessageBox(_T("鏂板鍙橀噺澶辫触锛屾牸寮忔槸鍚︽纭紵(U1/U2/I2/A20/A50/L)"));
+ }
}
else if (_strcmpi(btnName, "鍒犻櫎") == 0) {
POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
@@ -186,6 +202,30 @@
}
}
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;
+
+ 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) {
+ m_listCtrl.DeleteAllItems();
+ loadVariables();
+ }
+ else {
+ AfxMessageBox(_T("缂栬緫鍙橀噺澶辫触锛屾牸寮忔槸鍚︽纭紵(U1/U2/I2/A20/A50/L)"));
+ }
}
}
diff --git a/SourceCode/Bond/Servo/CVariable.h b/SourceCode/Bond/Servo/CVariable.h
index 597b84d..aa16b34 100644
--- a/SourceCode/Bond/Servo/CVariable.h
+++ b/SourceCode/Bond/Servo/CVariable.h
@@ -3,7 +3,7 @@
namespace SERVO {
- // 变量格式
+ // 鍙橀噺绫诲瀷
enum class SVFromat {
U1 = 0,
U2,
@@ -33,6 +33,9 @@
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;
diff --git a/SourceCode/Bond/Servo/CVariableEditDlg2.cpp b/SourceCode/Bond/Servo/CVariableEditDlg2.cpp
new file mode 100644
index 0000000..657ec41
--- /dev/null
+++ b/SourceCode/Bond/Servo/CVariableEditDlg2.cpp
@@ -0,0 +1,89 @@
+锘�#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();
+}
\ No newline at end of file
diff --git a/SourceCode/Bond/Servo/CVariableEditDlg2.h b/SourceCode/Bond/Servo/CVariableEditDlg2.h
new file mode 100644
index 0000000..4d09c05
--- /dev/null
+++ b/SourceCode/Bond/Servo/CVariableEditDlg2.h
@@ -0,0 +1,34 @@
+锘�#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;
+};
diff --git a/SourceCode/Bond/Servo/HsmsPassive.cpp b/SourceCode/Bond/Servo/HsmsPassive.cpp
index 3315b32..d6f97cb 100644
--- a/SourceCode/Bond/Servo/HsmsPassive.cpp
+++ b/SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -8,6 +8,8 @@
#include <time.h>
#include <stdlib.h>
#include <string.h>
+#include <algorithm>
+#include <set>
#include <regex>
@@ -373,6 +375,17 @@
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) {
@@ -453,7 +466,93 @@
if (filepath.empty()) return -2;
- // 鍐欏洖鏂囦欢锛屼繚鎸佸師缂栫爜锛圲TF-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;
@@ -497,30 +596,6 @@
file.Close();
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)
diff --git a/SourceCode/Bond/Servo/HsmsPassive.h b/SourceCode/Bond/Servo/HsmsPassive.h
index 737f6c4..95622d2 100644
--- a/SourceCode/Bond/Servo/HsmsPassive.h
+++ b/SourceCode/Bond/Servo/HsmsPassive.h
@@ -142,11 +142,14 @@
// 鍙栧緱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);
@@ -235,6 +238,7 @@
int onRecvMsg(IMessage* pMessage);
void clearAllVariabel();
std::vector<unsigned int> parseVidList(CString& strNums);
+ int writeVariablesToFile(const std::string& filepath);
private:
CModel* m_pModel;
diff --git a/SourceCode/Bond/Servo/Servo.rc b/SourceCode/Bond/Servo/Servo.rc
index 04a9f8f..9d021e9 100644
--- a/SourceCode/Bond/Servo/Servo.rc
+++ b/SourceCode/Bond/Servo/Servo.rc
Binary files differ
diff --git a/SourceCode/Bond/Servo/Servo.vcxproj b/SourceCode/Bond/Servo/Servo.vcxproj
index 363766f..617b69d 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj
+++ b/SourceCode/Bond/Servo/Servo.vcxproj
@@ -260,6 +260,7 @@
<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" />
@@ -478,6 +479,7 @@
<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" />
diff --git a/SourceCode/Bond/Servo/Servo.vcxproj.filters b/SourceCode/Bond/Servo/Servo.vcxproj.filters
index 50f4087..27e614c 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj.filters
+++ b/SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -233,6 +233,7 @@
<ClCompile Include="CUserManager2Dlg.cpp" />
<ClCompile Include="CUserEdit2Dlg.cpp" />
<ClCompile Include="CUserXLogDlg.cpp" />
+ <ClCompile Include="CVariableEditDlg2.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="AlarmManager.h" />
@@ -509,6 +510,7 @@
<ClInclude Include="CUserManager2Dlg.h" />
<ClInclude Include="CUserEdit2Dlg.h" />
<ClInclude Include="CUserXLogDlg.h" />
+ <ClInclude Include="CVariableEditDlg2.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Servo.rc" />
diff --git a/SourceCode/Bond/Servo/resource.h b/SourceCode/Bond/Servo/resource.h
index 05addab..f545c6f 100644
--- a/SourceCode/Bond/Servo/resource.h
+++ b/SourceCode/Bond/Servo/resource.h
Binary files differ
diff --git a/SourceCode/Bond/x64/Debug/VariableList.txt b/SourceCode/Bond/x64/Debug/VariableList.txt
index 659b40e..4b080e6 100644
--- a/SourceCode/Bond/x64/Debug/VariableList.txt
+++ b/SourceCode/Bond/x64/Debug/VariableList.txt
@@ -1,39 +1,39 @@
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,鏈哄櫒浜篟杞存壄鐭�
-2001,RbLAxisTorque,l2,鏈哄櫒浜篖杞存壄鐭�
-2002,RbZAxisTorque,l2,鏈哄櫒浜篫杞存壄鐭�
-2003,RbTHAxisTorque,l2,鏈哄櫒浜篢H杞存壄鐭�
-2004,RbXAxisTorque,l2,鏈哄櫒浜篨杞存壄鐭�
-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,鏈哄櫒浜篖杞存壄鐭�
+2002,RbZAxisTorque,U1,鏈哄櫒浜篫杞存壄鐭�
+2003,RbTHAxisTorque,U1,鏈哄櫒浜篢H杞存壄鐭�
+2004,RbXAxisTorque,U1,鏈哄櫒浜篨杞存壄鐭�
+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浣胯兘锛歄:寮�鍚� 1锛氬睆钄�"
-2024,CCDEnable,U2,"CCD浣胯兘锛歄:寮�鍚� 1锛氬睆钄�"
-2025,FFUParameter,U2,FFU璁惧畾鍊�
+2023,OCREnable,U1,"OCR浣胯兘锛歄:寮�鍚� 1锛氬睆钄�"
+2024,CCDEnable,U1,"CCD浣胯兘锛歄:寮�鍚� 1锛氬睆钄�"
+2025,FFUParameter,U1,FFU璁惧畾鍊�
5000,CarrierID,A20,鍗″專ID
5001,CJobSpace,U1,CJ Space
5002,PJobSpace,U1,PJ Space
@@ -44,6 +44,7 @@
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"
\ No newline at end of file
+5010,UnloadReadyPortId,U1,"Port ID"
+5011,LoadReadyPortId,U1,"Port ID"
+5012,BlockedPortId,U1,"Port ID"
+5013,TestVID,U1,娴嬭瘯娣诲姞鍙橀噺44
--
Gitblit v1.9.3