305 lines
7.6 KiB
Markdown
305 lines
7.6 KiB
Markdown
|
|
# WorkpieceHole工件孔检测系统 - TCP通信协议
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 版本历史
|
|||
|
|
|
|||
|
|
| 版本 | 日期 | 修改内容 |
|
|||
|
|
|------|------|----------|
|
|||
|
|
| 1.0 | 2026-01-27 | 初始版本,定义基本通信协议 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 协议概述
|
|||
|
|
|
|||
|
|
本文档定义了上位机与WorkpieceHole工件孔检测系统之间的TCP/IP通信协议。协议采用JSON格式进行数据交换,支持扫描请求、结果返回和错误通知。
|
|||
|
|
|
|||
|
|
### 1.1 通信方式
|
|||
|
|
- **传输协议**: TCP/IP
|
|||
|
|
- **数据格式**: JSON
|
|||
|
|
- **端口**: 7800(默认)
|
|||
|
|
- **编码**: UTF-8
|
|||
|
|
|
|||
|
|
### 1.2 通信模式
|
|||
|
|
- 服务端:WorkpieceHole工件孔检测系统
|
|||
|
|
- 客户端:上位机控制系统
|
|||
|
|
|
|||
|
|
## 2. 协议格式
|
|||
|
|
|
|||
|
|
所有消息均采用统一的JSON格式:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"MessageType": "消息类型标识",
|
|||
|
|
"Timestamp": "时间戳",
|
|||
|
|
"Data": {
|
|||
|
|
// 数据内容
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.1 字段说明
|
|||
|
|
|
|||
|
|
| 字段名 | 类型 | 必填 | 说明 |
|
|||
|
|
|--------|------|------|------|
|
|||
|
|
| MessageType | String | 是 | 消息类型标识,见下表 |
|
|||
|
|
| Timestamp | String | 是 | 时间戳,格式:yyyy-MM-dd HH:mm:ss |
|
|||
|
|
| Data | Object | 是 | 消息数据内容,根据MessageType不同而不同 |
|
|||
|
|
|
|||
|
|
### 2.2 消息类型(MessageType)
|
|||
|
|
|
|||
|
|
| 类型值 | 方向 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| ScanRequest | 上位机→相机 | 上位机请求开始扫描 |
|
|||
|
|
| ScanResponse | 相机→上位机 | 相机响应扫描请求(确认收到) |
|
|||
|
|
| ScanResult | 相机→上位机 | 相机发送扫描结果数据 |
|
|||
|
|
| Error | 相机→上位机 | 错误信息通知 |
|
|||
|
|
|
|||
|
|
## 3. 消息定义
|
|||
|
|
|
|||
|
|
### 3.1 扫描请求(ScanRequest)
|
|||
|
|
|
|||
|
|
上位机发送扫描指令时,发送此消息到工件孔检测系统。
|
|||
|
|
|
|||
|
|
**消息格式:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"MessageType": "ScanRequest",
|
|||
|
|
"Timestamp": "2026-01-27 10:30:00",
|
|||
|
|
"Data": {
|
|||
|
|
"ScanMode": ""
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Data字段说明:**
|
|||
|
|
| 字段名 | 类型 | 必填 | 说明 |
|
|||
|
|
|--------|------|------|------|
|
|||
|
|
| ScanMode | String | 否 | 扫描模式(预留字段) |
|
|||
|
|
|
|||
|
|
### 3.2 扫描响应(ScanResponse)
|
|||
|
|
|
|||
|
|
工件孔检测系统收到扫描请求后,立即发送此消息确认收到请求。
|
|||
|
|
|
|||
|
|
**消息格式:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"MessageType": "ScanResponse",
|
|||
|
|
"Timestamp": "2026-01-27 10:30:00",
|
|||
|
|
"Data": {
|
|||
|
|
"Status": "Accepted"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Data字段说明:**
|
|||
|
|
| 字段名 | 类型 | 必填 | 说明 |
|
|||
|
|
|--------|------|------|------|
|
|||
|
|
| Status | String | 是 | 请求状态:Accepted-已接受 |
|
|||
|
|
|
|||
|
|
### 3.3 扫描结果(ScanResult)
|
|||
|
|
|
|||
|
|
工件孔检测系统完成检测后,发送此消息返回检测结果。
|
|||
|
|
|
|||
|
|
**消息格式:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"MessageType": "ScanResult",
|
|||
|
|
"Timestamp": "2026-01-27 10:30:01",
|
|||
|
|
"Data": {
|
|||
|
|
"WorkpieceType": 1,
|
|||
|
|
"Holes": [
|
|||
|
|
{"x": 100.50, "y": 200.30, "z": 50.20},
|
|||
|
|
{"x": 150.60, "y": 250.40, "z": 50.25},
|
|||
|
|
{"x": 200.70, "y": 300.50, "z": 50.30},
|
|||
|
|
{"x": 250.80, "y": 350.60, "z": 50.35}
|
|||
|
|
],
|
|||
|
|
"HolesDir": [
|
|||
|
|
{"x": 0.00, "y": 0.00, "z": 1.00},
|
|||
|
|
{"x": 0.00, "y": 0.00, "z": 1.00},
|
|||
|
|
{"x": 0.00, "y": 0.00, "z": 1.00},
|
|||
|
|
{"x": 0.00, "y": 0.00, "z": 1.00}
|
|||
|
|
],
|
|||
|
|
"Center": {"x": 175.50, "y": 275.45, "z": 50.28},
|
|||
|
|
"Y_Dir": {"x": 0.00, "y": 1.00, "z": 0.00},
|
|||
|
|
"Z_Dir": {"x": 0.00, "y": 0.00, "z": 1.00}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Data字段说明:**
|
|||
|
|
|
|||
|
|
| 字段名 | 类型 | 必填 | 说明 |
|
|||
|
|
|--------|------|------|------|
|
|||
|
|
| WorkpieceType | Integer | 是 | 工件类型标识 |
|
|||
|
|
| Holes | Array | 是 | 孔位置列表,每个元素包含 x, y, z 坐标 |
|
|||
|
|
| HolesDir | Array | 是 | 孔方向列表,每个元素包含 x, y, z 方向向量 |
|
|||
|
|
| Center | Object | 是 | 工件中心点坐标 |
|
|||
|
|
| Y_Dir | Object | 是 | 工件Y方向向量 |
|
|||
|
|
| Z_Dir | Object | 是 | 工件Z方向向量 |
|
|||
|
|
|
|||
|
|
**孔位置格式(Holes数组元素):**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"x": 100.50, // X坐标(毫米)
|
|||
|
|
"y": 200.30, // Y坐标(毫米)
|
|||
|
|
"z": 50.20 // Z坐标(毫米)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**孔方向格式(HolesDir数组元素):**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"x": 0.00, // X方向分量
|
|||
|
|
"y": 0.00, // Y方向分量
|
|||
|
|
"z": 1.00 // Z方向分量(单位向量)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**中心点格式(Center):**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"x": 175.50, // 中心点X坐标(毫米)
|
|||
|
|
"y": 275.45, // 中心点Y坐标(毫米)
|
|||
|
|
"z": 50.28 // 中心点Z坐标(毫米)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**方向向量格式(Y_Dir / Z_Dir):**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"x": 0.00, // X方向分量
|
|||
|
|
"y": 1.00, // Y方向分量
|
|||
|
|
"z": 0.00 // Z方向分量(单位向量)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**坐标说明:**
|
|||
|
|
- 所有坐标均为机械臂坐标系下的3D坐标
|
|||
|
|
- 单位:毫米(mm)
|
|||
|
|
- 方向向量为单位向量
|
|||
|
|
|
|||
|
|
### 3.4 错误响应(Error)
|
|||
|
|
|
|||
|
|
当系统发生错误时,发送此消息通知上位机。
|
|||
|
|
|
|||
|
|
**消息格式:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"MessageType": "Error",
|
|||
|
|
"Timestamp": "2026-01-27 10:30:00",
|
|||
|
|
"Data": {
|
|||
|
|
"ErrorCode": -3,
|
|||
|
|
"ErrorMessage": "未知消息类型: InvalidType"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Data字段说明:**
|
|||
|
|
| 字段名 | 类型 | 必填 | 说明 |
|
|||
|
|
|--------|------|------|------|
|
|||
|
|
| ErrorCode | Integer | 是 | 错误码 |
|
|||
|
|
| ErrorMessage | String | 是 | 错误描述信息 |
|
|||
|
|
|
|||
|
|
## 4. 通信流程
|
|||
|
|
|
|||
|
|
### 4.1 正常检测流程
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
上位机 工件孔检测系统
|
|||
|
|
| |
|
|||
|
|
|-------- ScanRequest ------------>|
|
|||
|
|
| |
|
|||
|
|
|<------ ScanResponse -------------|
|
|||
|
|
| |
|
|||
|
|
| | (执行检测)
|
|||
|
|
| |
|
|||
|
|
|<------- ScanResult --------------|
|
|||
|
|
| |
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.2 错误处理流程
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
上位机 工件孔检测系统
|
|||
|
|
| |
|
|||
|
|
|-------- ScanRequest ------------>|
|
|||
|
|
| |
|
|||
|
|
| | (检测失败)
|
|||
|
|
| |
|
|||
|
|
|<--------- Error -----------------|
|
|||
|
|
| |
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 5. 示例
|
|||
|
|
|
|||
|
|
### 5.1 完整交互示例
|
|||
|
|
|
|||
|
|
**步骤1:上位机发送扫描请求**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"MessageType": "ScanRequest",
|
|||
|
|
"Timestamp": "2026-01-27 10:30:00",
|
|||
|
|
"Data": {}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**步骤2:系统返回确认响应**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"MessageType": "ScanResponse",
|
|||
|
|
"Timestamp": "2026-01-27 10:30:00",
|
|||
|
|
"Data": {
|
|||
|
|
"Status": "Accepted"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**步骤3:系统返回检测结果**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"MessageType": "ScanResult",
|
|||
|
|
"Timestamp": "2026-01-27 10:30:02",
|
|||
|
|
"Data": {
|
|||
|
|
"WorkpieceType": 1,
|
|||
|
|
"Holes": [
|
|||
|
|
{"x": 120.50, "y": 180.30, "z": 45.20},
|
|||
|
|
{"x": 180.60, "y": 180.40, "z": 45.25},
|
|||
|
|
{"x": 180.70, "y": 240.50, "z": 45.30},
|
|||
|
|
{"x": 120.80, "y": 240.60, "z": 45.35}
|
|||
|
|
],
|
|||
|
|
"HolesDir": [
|
|||
|
|
{"x": 0.00, "y": 0.00, "z": 1.00},
|
|||
|
|
{"x": 0.00, "y": 0.00, "z": 1.00},
|
|||
|
|
{"x": 0.00, "y": 0.00, "z": 1.00},
|
|||
|
|
{"x": 0.00, "y": 0.00, "z": 1.00}
|
|||
|
|
],
|
|||
|
|
"Center": {"x": 150.65, "y": 210.45, "z": 45.28},
|
|||
|
|
"Y_Dir": {"x": 0.00, "y": 1.00, "z": 0.00},
|
|||
|
|
"Z_Dir": {"x": 0.00, "y": 0.00, "z": 1.00}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 6. 注意事项
|
|||
|
|
|
|||
|
|
1. **连接管理**
|
|||
|
|
- 客户端应实现断线重连机制
|
|||
|
|
- 建议使用心跳机制保持连接活跃
|
|||
|
|
|
|||
|
|
2. **数据解析**
|
|||
|
|
- 所有JSON数据必须使用UTF-8编码
|
|||
|
|
- 接收数据时应处理粘包和分包情况
|
|||
|
|
|
|||
|
|
3. **错误处理**
|
|||
|
|
- 客户端应正确处理所有错误码
|
|||
|
|
- 网络异常时应有重试机制
|
|||
|
|
|
|||
|
|
4. **性能考虑**
|
|||
|
|
- 单次检测时间约为500ms-2s
|
|||
|
|
- 建议客户端设置合理的超时时间(建议10秒)
|
|||
|
|
|
|||
|
|
5. **数据精度**
|
|||
|
|
- 坐标精度:小数点后2位(毫米)
|
|||
|
|
- 方向向量为单位向量
|
|||
|
|
|