拆包更新伯朗特的协议

This commit is contained in:
yiyi 2026-01-27 23:35:48 +08:00
parent 5019a37916
commit b0108a4602
11 changed files with 337 additions and 67 deletions

View File

@ -4,6 +4,7 @@
| 版本 | 日期 | 修改内容 |
|------|------|----------|
| v1.3 | 2026-01-27 | 1.附加命令改为根据检测结果动态生成 <br/>2.PostCoordinateCommand配置项拆分为DsID、Address、SuccessValue、FailValue <br/>3.检测成功发送SuccessValue(默认10)失败发送FailValue(默认12) |
| v1.2 | 2026-01-24 | 1.架构改为视觉系统作为TCP服务端机械臂作为客户端 <br/>2.移除Enabled配置服务端始终启动 <br/>3.移除IpAddress配置只需配置监听端口 <br/>4.camID回复与请求匹配 |
| v1.1 | 2026-01-24 | 1.收到拍照命令不再回复结果 <br/>2.移除packID字段 <br/>3.旋转角度填到UAngel改为Angle <br/>4.发送坐标后100ms发送附加命令 <br/>5.只发送第一个检测结果,并自动生成第二个坐标(Z+偏移量) <br/>6.端口默认改为5000 |
| v1.0 | 2026-01-20 | 完善协议说明、添加字段详解、错误处理和使用示例 |
@ -144,22 +145,56 @@
**方向**:视觉系统 → 机械臂
**说明**发送坐标数据后100ms自动发送附加命令内容可配置。
**说明**发送坐标数据后100ms自动发送附加命令**根据检测结果动态生成**
- **检测成功**(有目标):发送 SuccessValue默认10
- **检测失败**(无目标):发送 FailValue默认12
**默认JSON格式**
**JSON格式**
```json
{ "dsID":"www.hc-system.com.RemoteMonitor", "reqType":"command", "cmdData":["rewriteData","800","10","0"] }
```
**配置方法**:在配置文件中设置 `PostCoordinateCommand` 字段,传入空字符串则不发送。
**字段说明**
| 字段 | 类型 | 说明 |
|------|------|------|
| dsID | String | 附加命令的数据源标识可配置PostCoordinateDsID |
| reqType | String | 固定为 "command" |
| cmdData | Array | 命令数据数组 |
**cmdData 数组说明**
| 索引 | 值 | 说明 |
|------|------|------|
| 0 | "rewriteData" | 固定命令类型 |
| 1 | "800" | 地址可配置PostCoordinateAddress默认800 |
| 2 | "10" 或 "12" | 检测结果值:成功=SuccessValue(默认10),失败=FailValue(默认12) |
| 3 | "0" | 固定值 |
**配置方法**:在配置文件中设置以下字段:
- `PostCoordinateDsID`附加命令的dsID为空则不发送附加命令
- `PostCoordinateAddress`地址默认800
- `PostCoordinateSuccessValue`检测成功时的值默认10
- `PostCoordinateFailValue`检测失败时的值默认12
## 5. 配置说明
视觉系统启动时自动启动TCP服务端默认监听端口5000。机械臂作为客户端连接到视觉系统即可。
主要配置项:
- **监听端口**默认5000可在配置文件中修改
- **数据源标识(dsID)**:默认 "www.hc-system.com.cam",需与机械臂配置一致
| 配置项 | 默认值 | 说明 |
|------|------|------|
| Port | 5000 | TCP服务端监听端口 |
| DsID | www.hc-system.com.cam | 数据源标识,需与机械臂配置一致 |
| ZOffset | 300.0 | 第二个坐标的Z轴偏移量 |
| ZMin | -1500.0 | Z轴最小值限制 |
| ZMax | 2500.0 | Z轴最大值限制 |
| AngleOffset | 0.0 | 旋转角度补偿 |
| PostCoordinateDsID | www.hc-system.com.RemoteMonitor | 附加命令的dsID为空则不发送 |
| PostCoordinateAddress | 800 | 附加命令的地址 |
| PostCoordinateSuccessValue | 10 | 检测成功时发送的值 |
| PostCoordinateFailValue | 12 | 检测失败时发送的值 |
## 6. 数据格式约束
@ -215,7 +250,7 @@
]
}
// 100ms后发送附加命令
// 100ms后发送附加命令检测成功发送SuccessValue=10
{ "dsID":"www.hc-system.com.RemoteMonitor", "reqType":"command", "cmdData":["rewriteData","800","10","0"] }
```
@ -233,6 +268,9 @@
}
]
}
// 100ms后发送附加命令检测失败发送FailValue=12
{ "dsID":"www.hc-system.com.RemoteMonitor", "reqType":"command", "cmdData":["rewriteData","800","12","0"] }
```
## 8. 注意事项
@ -245,7 +283,10 @@
- 视觉系统发送坐标使用 "AddPoints"(注意大小写)
5. **坐标系统**:所有坐标已通过手眼标定转换到机械臂坐标系,可直接使用
6. **旋转角度**旋转角度填入U字段Angle字段固定为0
7. **附加命令**发送坐标后100ms自动发送附加命令可通过配置文件设置
7. **附加命令**发送坐标后100ms自动发送附加命令根据检测结果动态生成
- 检测成功(有目标):发送 PostCoordinateSuccessValue默认10
- 检测失败(无目标):发送 PostCoordinateFailValue默认12
- PostCoordinateDsID 为空则不发送附加命令
8. **双坐标输出**:只取第一个检测结果,自动生成第二个坐标
- ModelID=0Z + ZOffset偏移后的Z
- ModelID=1原始Z

View File

@ -69,10 +69,13 @@ public:
void SetDsID(const std::string& dsID);
/**
* @brief
* @param command JSON字符串
* @brief
* @param dsID dsID
* @param address
* @param successValue
* @param failValue
*/
void SetPostCoordinateCommand(const std::string& command);
void SetPostCoordinateParams(const std::string& dsID, int address, int successValue, int failValue);
/**
* @brief Z轴偏移量
@ -132,7 +135,10 @@ private:
bool m_bConnected; // 连接状态
uint16_t m_nPort; // TCP端口
std::string m_strDsID; // 数据源标识
std::string m_strPostCoordCmd; // 坐标发送后的附加命令
std::string m_strPostCoordDsID; // 坐标发送后附加命令的dsID
int m_nPostCoordAddress; // 坐标发送后附加命令的地址
int m_nPostCoordSuccessValue; // 检测成功时的值
int m_nPostCoordFailValue; // 检测失败时的值
double m_dZOffset; // 第二个坐标Z轴偏移量
double m_dZMin; // Z轴最小值
double m_dZMax; // Z轴最大值

View File

@ -12,7 +12,10 @@ BolunteProtocol::BolunteProtocol()
, m_bConnected(false)
, m_nPort(5000)
, m_strDsID("www.hc-system.com.cam")
, m_strPostCoordCmd(R"({ "dsID":"www.hc-system.com.RemoteMonitor", "reqType":"command", "cmdData":["rewriteData","800","10","0"] })")
, m_strPostCoordDsID("www.hc-system.com.RemoteMonitor")
, m_nPostCoordAddress(800)
, m_nPostCoordSuccessValue(10)
, m_nPostCoordFailValue(12)
, m_dZOffset(300.0)
, m_dZMin(-1500.0)
, m_dZMax(2500.0)
@ -132,12 +135,32 @@ int BolunteProtocol::SendCoordinateData(const MultiTargetData& multiTargetData)
{
LOG_INFO("Sent coordinate data: count=%d\n", multiTargetData.count);
// 100ms后发送附加命令
if (!m_strPostCoordCmd.empty())
// 100ms后发送附加命令,根据检测结果拼接成功/失败值
if (!m_strPostCoordDsID.empty())
{
std::this_thread::sleep_for(std::chrono::milliseconds(100));
m_pTcpServer->SendAllData(m_strPostCoordCmd.c_str(), m_strPostCoordCmd.length());
LOG_INFO("Sent post coordinate command\n");
// 根据检测结果选择成功/失败值
bool detectionSuccess = !multiTargetData.targets.empty();
int resultValue = detectionSuccess ? m_nPostCoordSuccessValue : m_nPostCoordFailValue;
// 动态生成附加命令JSON
VA::Json::Value postCmd;
postCmd["dsID"] = m_strPostCoordDsID;
postCmd["reqType"] = "command";
VA::Json::Value cmdData(VA::Json::arrayValue);
cmdData.append("rewriteData");
cmdData.append(std::to_string(m_nPostCoordAddress));
cmdData.append(std::to_string(resultValue));
cmdData.append("0");
postCmd["cmdData"] = cmdData;
VA::Json::FastWriter writer;
std::string postCmdStr = writer.write(postCmd);
m_pTcpServer->SendAllData(postCmdStr.c_str(), postCmdStr.length());
LOG_INFO("Sent post coordinate command: success=%d, value=%d\n", detectionSuccess, resultValue);
}
return SUCCESS;
@ -169,9 +192,12 @@ void BolunteProtocol::SetDsID(const std::string& dsID)
m_strDsID = dsID;
}
void BolunteProtocol::SetPostCoordinateCommand(const std::string& command)
void BolunteProtocol::SetPostCoordinateParams(const std::string& dsID, int address, int successValue, int failValue)
{
m_strPostCoordCmd = command;
m_strPostCoordDsID = dsID;
m_nPostCoordAddress = address;
m_nPostCoordSuccessValue = successValue;
m_nPostCoordFailValue = failValue;
}
void BolunteProtocol::SetZOffset(double zOffset)

View File

@ -448,7 +448,11 @@ int GrabBagPresenter::InitBolunteProtocol()
m_pBolunteProtocol->SetZOffset(configResult.bolunteConfig.zOffset);
m_pBolunteProtocol->SetZRange(configResult.bolunteConfig.zMin, configResult.bolunteConfig.zMax);
m_pBolunteProtocol->SetAngleOffset(configResult.bolunteConfig.angleOffset);
m_pBolunteProtocol->SetPostCoordinateCommand(configResult.bolunteConfig.postCoordinateCommand);
m_pBolunteProtocol->SetPostCoordinateParams(
configResult.bolunteConfig.postCoordinateDsID,
configResult.bolunteConfig.postCoordinateAddress,
configResult.bolunteConfig.postCoordinateSuccessValue,
configResult.bolunteConfig.postCoordinateFailValue);
// 设置连接状态回调
m_pBolunteProtocol->SetConnectionCallback([this](bool connected) {

View File

@ -2,7 +2,7 @@
#define VERSION_H
#define GRABBAG_VERSION_STRING "1.3.5"
#define GRABBAG_BUILD_STRING "4"
#define GRABBAG_BUILD_STRING "5"
#define GRABBAG_FULL_VERSION_STRING "V" GRABBAG_VERSION_STRING "_" GRABBAG_BUILD_STRING
// 获取版本信息的便捷函数

View File

@ -1,4 +1,8 @@
# 1.3.5
## build_5 20260126
1. 修改协议附属命令结果
## build_4 20260124
1. 修复算法检测线程在析构时未退出的问题

View File

@ -389,7 +389,10 @@ void DialogCamera::LoadBolunteConfig()
ui->doubleSpinBox_bolunte_zmin->setValue(configResult->bolunteConfig.zMin);
ui->doubleSpinBox_bolunte_zmax->setValue(configResult->bolunteConfig.zMax);
ui->doubleSpinBox_bolunte_angleoffset->setValue(configResult->bolunteConfig.angleOffset);
ui->lineEdit_bolunte_postcmd->setText(QString::fromStdString(configResult->bolunteConfig.postCoordinateCommand));
ui->lineEdit_bolunte_postcmd->setText(QString::fromStdString(configResult->bolunteConfig.postCoordinateDsID));
ui->spinBox_bolunte_postaddr->setValue(configResult->bolunteConfig.postCoordinateAddress);
ui->spinBox_bolunte_postsuccess->setValue(configResult->bolunteConfig.postCoordinateSuccessValue);
ui->spinBox_bolunte_postfail->setValue(configResult->bolunteConfig.postCoordinateFailValue);
LOG_INFO("Loaded Bolunte config: port=%d, zOffset=%.1f\n",
configResult->bolunteConfig.port,
@ -418,7 +421,10 @@ bool DialogCamera::SaveBolunteConfig()
configResult->bolunteConfig.zMin = ui->doubleSpinBox_bolunte_zmin->value();
configResult->bolunteConfig.zMax = ui->doubleSpinBox_bolunte_zmax->value();
configResult->bolunteConfig.angleOffset = ui->doubleSpinBox_bolunte_angleoffset->value();
configResult->bolunteConfig.postCoordinateCommand = ui->lineEdit_bolunte_postcmd->text().toStdString();
configResult->bolunteConfig.postCoordinateDsID = ui->lineEdit_bolunte_postcmd->text().toStdString();
configResult->bolunteConfig.postCoordinateAddress = ui->spinBox_bolunte_postaddr->value();
configResult->bolunteConfig.postCoordinateSuccessValue = ui->spinBox_bolunte_postsuccess->value();
configResult->bolunteConfig.postCoordinateFailValue = ui->spinBox_bolunte_postfail->value();
LOG_INFO("Saving Bolunte config: port=%d, zOffset=%.1f\n",
configResult->bolunteConfig.port,

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>660</width>
<height>620</height>
<height>650</height>
</rect>
</property>
<property name="windowTitle">
@ -226,7 +226,7 @@ QPushButton:disabled {
<x>50</x>
<y>330</y>
<width>560</width>
<height>200</height>
<height>261</height>
</rect>
</property>
<property name="font">
@ -266,7 +266,7 @@ QPushButton:disabled {
<rect>
<x>110</x>
<y>35</y>
<width>120</width>
<width>100</width>
<height>30</height>
</rect>
</property>
@ -293,8 +293,8 @@ background-color: rgb(47, 48, 52);</string>
<property name="geometry">
<rect>
<x>20</x>
<y>75</y>
<width>120</width>
<y>70</y>
<width>100</width>
<height>30</height>
</rect>
</property>
@ -307,15 +307,15 @@ background-color: rgb(47, 48, 52);</string>
<string notr="true">color: rgb(221, 225, 233);</string>
</property>
<property name="text">
<string>数据标识:</string>
<string>数据标识:</string>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit_bolunte_dsid">
<property name="geometry">
<rect>
<x>140</x>
<y>75</y>
<width>380</width>
<x>110</x>
<y>70</y>
<width>411</width>
<height>30</height>
</rect>
</property>
@ -336,8 +336,8 @@ background-color: rgb(47, 48, 52);</string>
<property name="geometry">
<rect>
<x>20</x>
<y>115</y>
<width>100</width>
<y>105</y>
<width>80</width>
<height>30</height>
</rect>
</property>
@ -356,9 +356,9 @@ background-color: rgb(47, 48, 52);</string>
<widget class="QDoubleSpinBox" name="doubleSpinBox_bolunte_zoffset">
<property name="geometry">
<rect>
<x>120</x>
<y>115</y>
<width>100</width>
<x>110</x>
<y>105</y>
<width>91</width>
<height>30</height>
</rect>
</property>
@ -384,8 +384,8 @@ background-color: rgb(47, 48, 52);</string>
<widget class="QLabel" name="label_bolunte_zmin">
<property name="geometry">
<rect>
<x>240</x>
<y>115</y>
<x>200</x>
<y>105</y>
<width>60</width>
<height>30</height>
</rect>
@ -405,9 +405,9 @@ background-color: rgb(47, 48, 52);</string>
<widget class="QDoubleSpinBox" name="doubleSpinBox_bolunte_zmin">
<property name="geometry">
<rect>
<x>300</x>
<y>115</y>
<width>100</width>
<x>260</x>
<y>105</y>
<width>101</width>
<height>30</height>
</rect>
</property>
@ -433,8 +433,8 @@ background-color: rgb(47, 48, 52);</string>
<widget class="QLabel" name="label_bolunte_zmax">
<property name="geometry">
<rect>
<x>420</x>
<y>115</y>
<x>360</x>
<y>105</y>
<width>60</width>
<height>30</height>
</rect>
@ -454,8 +454,8 @@ background-color: rgb(47, 48, 52);</string>
<widget class="QDoubleSpinBox" name="doubleSpinBox_bolunte_zmax">
<property name="geometry">
<rect>
<x>480</x>
<y>115</y>
<x>420</x>
<y>105</y>
<width>100</width>
<height>30</height>
</rect>
@ -483,8 +483,8 @@ background-color: rgb(47, 48, 52);</string>
<property name="geometry">
<rect>
<x>20</x>
<y>155</y>
<width>100</width>
<y>140</y>
<width>80</width>
<height>30</height>
</rect>
</property>
@ -503,9 +503,9 @@ background-color: rgb(47, 48, 52);</string>
<widget class="QDoubleSpinBox" name="doubleSpinBox_bolunte_angleoffset">
<property name="geometry">
<rect>
<x>120</x>
<y>155</y>
<width>100</width>
<x>110</x>
<y>140</y>
<width>80</width>
<height>30</height>
</rect>
</property>
@ -531,9 +531,9 @@ background-color: rgb(47, 48, 52);</string>
<widget class="QLabel" name="label_bolunte_postcmd">
<property name="geometry">
<rect>
<x>240</x>
<y>155</y>
<width>100</width>
<x>20</x>
<y>180</y>
<width>80</width>
<height>30</height>
</rect>
</property>
@ -546,15 +546,15 @@ background-color: rgb(47, 48, 52);</string>
<string notr="true">color: rgb(221, 225, 233);</string>
</property>
<property name="text">
<string>附加命令:</string>
<string>附加标识:</string>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit_bolunte_postcmd">
<property name="geometry">
<rect>
<x>340</x>
<y>155</y>
<width>180</width>
<x>110</x>
<y>180</y>
<width>411</width>
<height>30</height>
</rect>
</property>
@ -571,12 +571,159 @@ background-color: rgb(47, 48, 52);</string>
<string>为空则不发送</string>
</property>
</widget>
<widget class="QLabel" name="label_bolunte_postaddr">
<property name="geometry">
<rect>
<x>20</x>
<y>220</y>
<width>81</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(221, 225, 233);</string>
</property>
<property name="text">
<string>附加地址:</string>
</property>
</widget>
<widget class="QSpinBox" name="spinBox_bolunte_postaddr">
<property name="geometry">
<rect>
<x>110</x>
<y>220</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(221, 225, 233);
background-color: rgb(47, 48, 52);</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>65535</number>
</property>
<property name="value">
<number>800</number>
</property>
</widget>
<widget class="QLabel" name="label_bolunte_postsuccess">
<property name="geometry">
<rect>
<x>210</x>
<y>220</y>
<width>60</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(221, 225, 233);</string>
</property>
<property name="text">
<string>成功值:</string>
</property>
</widget>
<widget class="QSpinBox" name="spinBox_bolunte_postsuccess">
<property name="geometry">
<rect>
<x>270</x>
<y>220</y>
<width>70</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(221, 225, 233);
background-color: rgb(47, 48, 52);</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>65535</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
<widget class="QLabel" name="label_bolunte_postfail">
<property name="geometry">
<rect>
<x>360</x>
<y>220</y>
<width>60</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(221, 225, 233);</string>
</property>
<property name="text">
<string>失败值:</string>
</property>
</widget>
<widget class="QSpinBox" name="spinBox_bolunte_postfail">
<property name="geometry">
<rect>
<x>420</x>
<y>220</y>
<width>70</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(221, 225, 233);
background-color: rgb(47, 48, 52);</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>65535</number>
</property>
<property name="value">
<number>12</number>
</property>
</widget>
</widget>
<widget class="QPushButton" name="btn_save">
<property name="geometry">
<rect>
<x>190</x>
<y>560</y>
<y>600</y>
<width>111</width>
<height>38</height>
</rect>
@ -597,7 +744,7 @@ background-color: rgb(47, 48, 52);</string>
<property name="geometry">
<rect>
<x>340</x>
<y>560</y>
<y>600</y>
<width>111</width>
<height>38</height>
</rect>

View File

@ -67,7 +67,10 @@ struct BolunteConfig
double zMin = -1500.0; // Z轴最小值
double zMax = 2500.0; // Z轴最大值
double angleOffset = 0.0; // 旋转角度补偿
std::string postCoordinateCommand = R"({ "dsID":"www.hc-system.com.RemoteMonitor", "reqType":"command", "cmdData":["rewriteData","800","10","0"] })"; // 坐标发送后的附加命令
std::string postCoordinateDsID = "www.hc-system.com.RemoteMonitor"; // 坐标发送后附加命令的dsID
int postCoordinateAddress = 800; // 坐标发送后附加命令的地址
int postCoordinateSuccessValue = 10; // 检测成功时的值
int postCoordinateFailValue = 12; // 检测失败时的值
};
/**

View File

@ -476,10 +476,28 @@ ConfigResult CVrConfig::LoadConfig(const std::string& filePath)
result.bolunteConfig.angleOffset = angleOffsetElement->DoubleText();
}
XMLElement* postCmdElement = bolunteConfigElement->FirstChildElement("PostCoordinateCommand");
if (postCmdElement && postCmdElement->GetText())
XMLElement* postDsIDElement = bolunteConfigElement->FirstChildElement("PostCoordinateDsID");
if (postDsIDElement && postDsIDElement->GetText())
{
result.bolunteConfig.postCoordinateCommand = postCmdElement->GetText();
result.bolunteConfig.postCoordinateDsID = postDsIDElement->GetText();
}
XMLElement* postAddressElement = bolunteConfigElement->FirstChildElement("PostCoordinateAddress");
if (postAddressElement)
{
result.bolunteConfig.postCoordinateAddress = postAddressElement->IntText();
}
XMLElement* postSuccessElement = bolunteConfigElement->FirstChildElement("PostCoordinateSuccessValue");
if (postSuccessElement)
{
result.bolunteConfig.postCoordinateSuccessValue = postSuccessElement->IntText();
}
XMLElement* postFailElement = bolunteConfigElement->FirstChildElement("PostCoordinateFailValue");
if (postFailElement)
{
result.bolunteConfig.postCoordinateFailValue = postFailElement->IntText();
}
}
@ -758,9 +776,21 @@ bool CVrConfig::SaveConfig(const std::string& filePath, ConfigResult& configResu
bolunteAngleOffsetElement->SetText(configResult.bolunteConfig.angleOffset);
bolunteConfigElement->InsertEndChild(bolunteAngleOffsetElement);
XMLElement* boluntePostCmdElement = doc.NewElement("PostCoordinateCommand");
boluntePostCmdElement->SetText(configResult.bolunteConfig.postCoordinateCommand.c_str());
bolunteConfigElement->InsertEndChild(boluntePostCmdElement);
XMLElement* boluntePostDsIDElement = doc.NewElement("PostCoordinateDsID");
boluntePostDsIDElement->SetText(configResult.bolunteConfig.postCoordinateDsID.c_str());
bolunteConfigElement->InsertEndChild(boluntePostDsIDElement);
XMLElement* boluntePostAddressElement = doc.NewElement("PostCoordinateAddress");
boluntePostAddressElement->SetText(configResult.bolunteConfig.postCoordinateAddress);
bolunteConfigElement->InsertEndChild(boluntePostAddressElement);
XMLElement* boluntePostSuccessElement = doc.NewElement("PostCoordinateSuccessValue");
boluntePostSuccessElement->SetText(configResult.bolunteConfig.postCoordinateSuccessValue);
bolunteConfigElement->InsertEndChild(boluntePostSuccessElement);
XMLElement* boluntePostFailElement = doc.NewElement("PostCoordinateFailValue");
boluntePostFailElement->SetText(configResult.bolunteConfig.postCoordinateFailValue);
bolunteConfigElement->InsertEndChild(boluntePostFailElement);
// 保存工作点配置(新增)
SaveWorkPositions(doc, root, configResult.workPositions);

View File

@ -276,6 +276,9 @@
<ZMin>-1500.0</ZMin>
<ZMax>2500.0</ZMax>
<AngleOffset>0.0</AngleOffset>
<PostCoordinateCommand>{ "dsID":"www.hc-system.com.RemoteMonitor", "reqType":"command", "cmdData":["rewriteData","800","10","0"] }</PostCoordinateCommand>
<PostCoordinateDsID>www.hc-system.com.RemoteMonitor</PostCoordinateDsID>
<PostCoordinateAddress>800</PostCoordinateAddress>
<PostCoordinateSuccessValue>10</PostCoordinateSuccessValue>
<PostCoordinateFailValue>12</PostCoordinateFailValue>
</BolunteConfig>
</GrabBagConfig>