基于HSMS通信标准的SECS通讯程序
HSMS(High-Speed SECS Message Services)通信标准的SECS通讯程序开发 结合SEMI E37标准核心规范
一、HSMS协议核心机制
1. 连接模式与状态机
| 模式 | 角色 | 关键流程 |
|---|---|---|
| 被动模式 | 设备端(服务端) | 监听端口(默认5000)→ 接收TCP连接 → 处理Select.req → 回复Select.rsp → 进入SELECTED状态 |
| 主动模式 | 主机端(客户端) | 发起TCP连接 → 发送Select.req → 接收Select.rsp → 进入SELECTED状态 |
状态迁移:
NOT CONNECTED→ CONNECTED→ SELECTED(数据可传输)。
2. 消息结构解析
-
消息头(10字节):
public class HsmsHeader { public ushort SessionId { get; set; } // 设备标识(如0x0001) public byte Stream { get; set; } // 数据消息:高1位=W-bit,低7位=Stream号 public byte Function { get; set; } // Function编号 public byte PType { get; } = 0; // 固定0(SECS-II编码) public byte SType { get; set; } // 消息类型(0=数据,1=Select.req,2=Select.rsp等) public uint SystemBytes { get; set; } // 事务唯一标识 } -
消息体:SECS-II编码的嵌套结构(List/Item),支持数据类型(ASCII、U4、Binary等)。
二、核心功能实现
1. 连接管理(C#示例)
// 被动模式服务端
TcpListener listener = new TcpListener(IPAddress.Any, 5000);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
// 主动模式客户端
TcpClient client = new TcpClient();
client.Connect("192.168.1.100", 5000);
2. Select协议握手
// 主机端发送Select.req
byte[] selectReq = new byte[] {
0x00, 0x00, 0x00, 0x0A, // 长度=10
0x00, 0x01, // SessionId=1
0x00, 0x00, // HeaderByte2/3(控制消息为0)
0x00, // PType=0
0x01, // SType=1(Select.req)
0x00, 0x00, 0x00, 0x01 // SystemBytes=1
};
client.GetStream().Write(selectReq, 0, selectReq.Length);
// 设备端回复Select.rsp(成功)
byte[] selectRsp = new byte[] {
0x00, 0x00, 0x00, 0x0A,
0x00, 0x01, // 与req的SessionId一致
0x00, 0x00, // HeaderByte2/3
0x00,
0x02, // SType=2(Select.rsp)
0x00, 0x00, 0x00, 0x01 // SystemBytes与req一致
};
3. 心跳维持(Linktest)
// 定时发送Linktest.req(每30秒)
Timer linktestTimer = new Timer(_ =>
{
byte[] linktestReq = CreateHsmsMessage(SType: 5, sessionId: 0xFFFF); // SType=5
client.GetStream().Write(linktestReq);
}, null, 0, 30000);
// 接收端回复Linktest.rsp(SType=6)
if (receivedMsg.SType == 5)
{
byte[] linktestRsp = CreateHsmsMessage(SType: 6, sessionId: 0xFFFF);
SendMessage(linktestRsp);
}
4. SECS-II消息封装(S1F1示例)
// 设备状态查询(S1F1)
public byte[] CreateS1F1()
{
// HSMS头部
var header = new HsmsHeader {
Stream = 0x81, // Stream=1, W-bit=1(需回复)
Function = 0x01, // Function=1
SType = 0 // 数据消息
};
// SECS-II消息体(空List)
byte[] body = new byte[] { 0x01 }; // List项数量=0(0x01表示1个空List)
return CombineHeaderAndBody(header, body);
}
// 设备回复S1F2(含设备状态)
public byte[] CreateS1F2(string equipmentStatus)
{
// ASCII编码状态字符串
byte[] statusBytes = Encoding.ASCII.GetBytes(equipmentStatus);
byte[] itemHeader = new byte[] { 0x41, (byte)statusBytes.Length }; // 0x41=ASCII类型
byte[] body = itemHeader.Concat(statusBytes).ToArray();
return CombineHeaderAndBody(new HsmsHeader { Stream=0x01, Function=0x02 }, body);
}
三、优化
1. 异步消息处理
// 异步接收消息
async Task ReceiveLoopAsync(TcpClient client)
{
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[4096];
while (true)
{
int read = await stream.ReadAsync(buffer, 0, buffer.Length);
var message = ParseHsmsMessage(buffer, read);
ProcessMessage(message); // 根据SType/Stream分发处理
}
}
2. 状态机管理
public enum ConnectionState { NotConnected, ConnectedNotSelected, Selected }
private ConnectionState _state = ConnectionState.NotConnected;
// 状态迁移逻辑
void UpdateState(HsmsMessage msg)
{
if (msg.SType == 1 && _state == ConnectionState.ConnectedNotSelected)
{
SendSelectRsp(msg); // 回复Select.rsp
_state = ConnectionState.Selected;
}
else if (msg.SType == 3) // Deselect.req
{
SendDeselectRsp(msg);
_state = ConnectionState.ConnectedNotSelected;
}
}
3. 超时与重试
// T3回复超时(默认15秒)
public async Task<T> SendWithTimeout<T>(byte[] request, int timeout = 15000)
{
var cts = new CancellationTokenSource(timeout);
SendMessage(request);
return await WaitForResponseAsync(requestId, cts.Token);
}
四、应用场景示例
1. 设备状态监控
sequenceDiagram
participant Host
participant Equipment
Host->>Equipment: S1F1(状态查询)
Equipment->>Host: S1F2(返回"RUNNING")
Equipment->>Host: S5F1(主动上报报警)
Host->>Equipment: S5F2(确认报警)
2. 配方下发流程
// 主机下发配方(S7F3)
byte[] recipeData = LoadRecipe("recipe123");
SendMessage(CreateS7F3(recipeData));
// 设备接收并回复(S7F4)
if (receivedMsg.Stream == 7 && receivedMsg.Function == 3)
{
SaveRecipe(receivedMsg.Data);
SendMessage(CreateS7F4(0)); // 0=成功
}
五、总结
开发HSMS/SECS通讯程序需聚焦:
- 协议分层实现:
- TCP连接 → HSMS会话管理(Select/Linktest) → SECS-II消息编解码
- 健壮性设计:
- 状态机严格匹配SEMI E37规范
- 异步IO+超时重试应对网络波动
- 工具链支持:
- 调试工具:Wireshark(过滤
tcp.port==5000) - 测试工具:SEComSimulator模拟设备端逻辑
- 调试工具:Wireshark(过滤
参考:
基于HSMS通信标准的SECS通讯程序 www.youwenfan.com/contentcnl/112172.html
SECS-II编码器 github.com/SECS-II-Encoder
扩展方向:
集成GEM(SEMI E30)实现设备控制标准化
添加TLS加密提升工业网络安全

浙公网安备 33010602011771号