HSMS + SECS-II 通信

概述
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-FunctionW-bit说明
Are You ThereS1F1 → S1F2W检查设备是否在线
上位机请求状态S1F13 → S1F14W获取设备状态码
主动报警上报S5F1 → S5F2W设备发生报警,Host回应
事件报告(上料完成)S6F11 → S6F12W上报事件,Host回应
Recipe下发S7F3 → S7F4W上位机下发配方数据
执行命令S2F41 → S2F42W比如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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值