概述
HSMS 和 SECS-II 是半导体和电子制造设备通信中广泛使用的标准协议。HSMS (High-Speed SECS Message Services) 是 SEMI E37 标准定义的通信协议,用于通过 TCP/IP 网络传输 SECS 消息。SECS-II (SEMI E5) 定义了消息内容和数据结构,是设备与主机(Host)之间通信的消息标准。
HSMS + SECS-II 通信流程图
- 建连:Select.req / Select.rsp
- Keepalive:LinkTest.req / .rsp
- 正常消息:Data Message(如S1F1、S5F1)
┌─────────────┐
│ 上位机Host │
└────┬────────┘
│ TCP连接请求
┌────▼───────┐
│ 设备 Equip│
└────┬───────┘
│ 建立HSMS连接
│
┌────▼──────────────┐
│ 上位机发送S1F13请求 │
└────────┬──────────┘
│
┌────────▼────────┐
│ 设备返回S1F14设备状态 │
└────────┬────────┘
│
┌────────▼────┐
│ 主动上传S6F11事件 │
└────────┬────┘
│
┌────────▼─────┐
│ 上位机解析确认 │
└──────────────┘
SECS-II 通信交互案例表
场景 | Stream-Function | W-bit | 说明 |
---|---|---|---|
Are You There | S1F1 → S1F2 | W | 检查设备是否在线 |
上位机请求状态 | S1F13 → S1F14 | W | 获取设备状态码 |
主动报警上报 | S5F1 → S5F2 | W | 设备发生报警,Host回应 |
事件报告(上料完成) | S6F11 → S6F12 | W | 上报事件,Host回应 |
Recipe下发 | S7F3 → S7F4 | W | 上位机下发配方数据 |
执行命令 | S2F41 → S2F42 | W | 比如Start、Stop之类 |
基于 TCP 的 HSMS 简化版 收发 demo
- 公共头文件:common.h
#ifndef COMMON_H
#define COMMON_H
#include <iostream>
#include <vector>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
const int PORT = 5000;
// 模拟 SECS-II 消息,简单固定长度
struct SECSMessage {
uint8_t stream;
uint8_t function;
bool wbit;
uint32_t systemBytes;
std::vector<uint8_t> data;
};
void sendMessage(int sock, const SECSMessage& msg) {
uint8_t buffer[1024] = {0};
buffer[0] = msg.stream;
buffer[1] = msg.function;
buffer[2] = msg.wbit ? 1 : 0;
uint32_t sysBytesNet = htonl(msg.systemBytes);
memcpy(buffer + 3, &sysBytesNet, 4);
memcpy(buffer + 7, msg.data.data(), msg.data.size());
send(sock, buffer, 7 + msg.data.size(), 0);
}
SECSMessage recvMessage(int sock) {
uint8_t buffer[1024] = {0};
ssize_t len = recv(sock, buffer, sizeof(buffer), 0);
if (len <= 0) {
std::cerr << "Connection closed or error.\n";
exit(1);
}
SECSMessage msg;
msg.stream = buffer[0];
msg.function = buffer[1];
msg.wbit = buffer[2];
uint32_t sysBytesNet = 0;
memcpy(&sysBytesNet, buffer + 3, 4);
msg.systemBytes = ntohl(sysBytesNet);
msg.data.assign(buffer + 7, buffer + len);
return msg;
}
void printMessage(const SECSMessage& msg) {
std::cout << "Stream: " << (int)msg.stream
<< ", Function: " << (int)msg.function
<< ", Wbit: " << msg.wbit
<< ", SystemBytes: " << msg.systemBytes
<< ", Data: ";
for (auto b : msg.data) std::cout << std::hex << (int)b << " ";
std::cout << std::dec << "\n";
}
#endif
- 服务端:hsms_server.cpp
#include "common.h"
int main() {
int serverFd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(PORT);
bind(serverFd, (struct sockaddr*)&addr, sizeof(addr));
listen(serverFd, 1);
std::cout << "Server listening on port " << PORT << "...\n";
int clientSock = accept(serverFd, nullptr, nullptr);
std::cout << "Client connected.\n";
while (true) {
SECSMessage msg = recvMessage(clientSock);
std::cout << "[Server] Received message:\n";
printMessage(msg);
// 回个ACK消息
SECSMessage reply;
reply.stream = msg.stream;
reply.function = msg.function + 1;
reply.wbit = 0;
reply.systemBytes = msg.systemBytes;
reply.data = {0xAA};
sendMessage(clientSock, reply);
}
close(clientSock);
close(serverFd);
return 0;
}
- 客户端:hsms_client.cpp
#include "common.h"
int main() {
int sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr);
connect(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
std::cout << "Connected to server.\n";
// 发送一条消息
SECSMessage msg;
msg.stream = 1;
msg.function = 13;
msg.wbit = true;
msg.systemBytes = 5678;
msg.data = {0x01, 0x02, 0x03};
sendMessage(sock, msg);
std::cout << "[Client] Sent message.\n";
// 等回复
SECSMessage reply = recvMessage(sock);
std::cout << "[Client] Received reply:\n";
printMessage(reply);
close(sock);
return 0;
}
- 编译&运行
g++ hsms_server.cpp -o server
g++ hsms_client.cpp -o client
# 开两个终端
./server
./client
- Server窗口:
Server listening on port 5000...
Client connected.
[Server] Received message:
Stream: 1, Function: 13, Wbit: 1, SystemBytes: 5678, Data: 1 2 3
- Client窗口:
Connected to server.
[Client] Sent message.
[Client] Received reply:
Stream: 1, Function: 14, Wbit: 0, SystemBytes: 5678, Data: aa