在半导体制造与化合物半导体(如SiC、GaN)外延生长环节中,晶圆(Wafer)与石墨岛(Graphite Island/Susceptor)的搬移是高频、高精度、高洁净度要求的核心工序。这类设备的控制系统通常由下位机(PLC/运动控制卡)执行实时动作,由上位机(HMI/SCADA)负责调度、监控、参数配置与数据追溯。
C# + WPF 凭借其强大的UI表现力、成熟的异步编程模型、良好的硬件通信生态,成为半导体设备上位机开发的主流技术选型之一。本文从专业工程视角,系统拆解一套晶圆与石墨岛搬移上位机的完整设计与实现路径。
在MOCVD、SiC外延等设备中,晶圆通常放置在石墨载盘(Susceptor)的"岛"(Pocket/Island)上。搬移流程涉及:
功能模块 | 具体需求 |
|---|---|
设备通信 | 与PLC、运动控制卡、机械手、视觉系统通信 |
流程调度 | 编排搬移顺序、互锁逻辑、异常处理 |
实时监控 | 位置、速度、真空度、温度、报警状态 |
参数配置 | 点位示教、速度曲线、真空阈值 |
数据追溯 | 每片晶圆的搬移记录、时间戳、结果 |
权限管理 | 操作员/工程师/管理员分级 |
日志与报警 | 全事件记录、报警分级、历史查询 |
方案 | 优势 | 局限 |
|---|---|---|
C# + WPF | UI灵活、生态成熟、开发效率高 | 非实时,依赖Windows |
C++ + Qt | 性能强、跨平台 | 开发周期长 |
C# + WinForms | 简单 | UI表现力弱 |
Web + Electron | 跨平台 | 硬件通信弱 |
text
UI层:WPF + MVVM(CommunityToolkit.Mvvm / Prism)
通信层:S7.Net(西门子)、HslCommunication、Modbus
运动控制:固高/雷赛/ACS 的 .NET SDK
视觉:Halcon/.NET、OpenCvSharp
数据:SQLite(本地)/ SQL Server(MES对接)
日志:Serilog / NLog
DI容器:Microsoft.Extensions.DependencyInjectiontext
┌─────────────────────────────────────┐
│ Presentation (WPF) │
│ Views / ViewModels / Converters │
├─────────────────────────────────────┤
│ Application Layer │
│ 流程编排 / 任务调度 / 状态机 │
├─────────────────────────────────────┤
│ Domain Layer │
│ 设备模型 / 搬移任务 / 报警规则 │
├─────────────────────────────────────┤
│ Infrastructure Layer │
│ PLC通信 / 运动控制 / 数据库 / 日志 │
└─────────────────────────────────────┘IPlcService、IMotionService、IVisionService搬移流程本质是一个状态机,推荐使用 Stateless 库:
csharp
var machine = new StateMachine<State, Trigger>(State.Idle);
machine.Configure(State.Idle)
.Permit(Trigger.StartTransfer, State.Picking);
machine.Configure(State.Picking)
.Permit(Trigger.PickDone, State.Placing)
.Permit(Trigger.Error, State.Fault);
machine.Configure(State.Placing)
.Permit(Trigger.PlaceDone, State.Idle)
.Permit(Trigger.Error, State.Fault);状态机的好处:流程可视化、异常可追溯、逻辑可测试。
以西门子S7为例:
csharp
public interface IPlcService
{
Task<bool> ConnectAsync(string ip, int rack, int slot);
Task<short> ReadIntAsync(string address);
Task WriteBoolAsync(string address, bool value);
Task<bool> WaitForSignalAsync(string address, bool expected, int timeoutMs);
}
public class S7PlcService : IPlcService
{
private Plc _plc;
public async Task<bool> ConnectAsync(string ip, int rack, int slot)
{
_plc = new Plc(CpuType.S71200, ip, rack, slot);
await _plc.OpenAsync();
return _plc.IsConnected;
}
public async Task<bool> WaitForSignalAsync(string address, bool expected, int timeoutMs)
{
var sw = Stopwatch.StartNew();
while (sw.ElapsedMilliseconds < timeoutMs)
{
var val = await _plc.ReadAsync(address);
if ((bool)val == expected) return true;
await Task.Delay(10);
}
return false;
}
}关键点:所有通信必须异步,避免阻塞UI;超时必须有明确处理。
csharp
public interface IMotionService
{
Task MoveAbsoluteAsync(int axis, double position, double speed);
Task MoveRelativeAsync(int axis, double distance, double speed);
Task HomeAsync(int axis);
double GetPosition(int axis);
bool IsInPosition(int axis, double target, double tolerance);
}示教流程:
json
{
"PickPosition": { "X": 120.5, "Y": 80.2, "Z": 10.0, "R": 0 },
"PlacePosition": { "X": 300.0, "Y": 150.0, "Z": 5.0, "R": 90 }
}若配备视觉系统,流程为:
csharp
public interface IVisionService
{
Task<VisionResult> LocateWaferAsync();
}
public record VisionResult(double OffsetX, double OffsetY, double OffsetTheta, bool Success);csharp
public async Task<bool> TransferWaferAsync(CancellationToken ct)
{
try
{
await _stateMachine.FireAsync(Trigger.StartTransfer);
// 1. 检查安全条件
if (!await _safetyService.CheckSafeAsync())
throw new SafetyException("安全条件不满足");
// 2. 移动到取片位
await _motionService.MoveAbsoluteAsync(Axis.Z, _points.SafeZ, 50);
await _motionService.MoveAbsoluteAsync(Axis.X, _points.PickX, 100);
await _motionService.MoveAbsoluteAsync(Axis.Y, _points.PickY, 100);
// 3. 真空吸取
await _ioService.SetVacuumAsync(true);
if (!await _ioService.WaitVacuumAsync(true, 2000))
throw new VacuumException("真空建立失败");
// 4. 视觉定位
var vision = await _visionService.LocateWaferAsync();
if (!vision.Success) throw new VisionException("视觉定位失败");
// 5. 移动到放片位(含补偿)
await _motionService.MoveAbsoluteAsync(Axis.X, _points.PlaceX + vision.OffsetX, 100);
await _motionService.MoveAbsoluteAsync(Axis.Y, _points.PlaceY + vision.OffsetY, 100);
await _motionService.MoveAbsoluteAsync(Axis.Z, _points.PlaceZ, 20);
// 6. 释放真空
await _ioService.SetVacuumAsync(false);
await _ioService.WaitVacuumAsync(false, 2000);
// 7. 复位
await _motionService.MoveAbsoluteAsync(Axis.Z, _points.SafeZ, 50);
await _stateMachine.FireAsync(Trigger.PlaceDone);
await _traceService.RecordAsync(new TransferRecord { /* ... */ });
return true;
}
catch (Exception ex)
{
await _stateMachine.FireAsync(Trigger.Error);
_logger.Error(ex, "搬移失败");
await _alarmService.RaiseAsync(ex);
return false;
}
}csharp
public class TransferRecord
{
public long Id { get; set; }
public string WaferId { get; set; }
public string CassetteId { get; set; }
public int SlotIndex { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public bool Success { get; set; }
public double OffsetX { get; set; }
public double OffsetY { get; set; }
public string Operator { get; set; }
}使用SQLite本地存储,支持导出CSV,并可对接MES系统。
csharp
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day)
.WriteTo.SQLite("logs/logs.db")
.CreateLogger();关键事件:连接、断开、命令下发、状态变化、报警、参数修改。
用WPF的Canvas + Path绘制设备示意图,用绑定控制机械手位置:
xml
<Canvas>
<Rectangle Width="40" Height="40" Fill="Gray"
Canvas.Left="{Binding RobotX}"
Canvas.Top="{Binding RobotY}"/>
<Ellipse Width="200" Height="200" Stroke="Blue"
Canvas.Left="{Binding WaferX}"
Canvas.Top="{Binding WaferY}"/>
</Canvas>配合Storyboard实现平滑动画。
xml
<ResourceDictionary>
<SolidColorBrush x:Key="BackgroundBrush" Color="#1E1E1E"/>
<SolidColorBrush x:Key="PanelBrush" Color="#252526"/>
<SolidColorBrush x:Key="AccentBrush" Color="#007ACC"/>
<SolidColorBrush x:Key="AlarmBrush" Color="#F44747"/>
</ResourceDictionary>用PLC仿真软件(如PLCSIM)或自建Mock服务,在上位机开发阶段即可验证逻辑,无需真实设备。
csharp
public class MockPlcService : IPlcService
{
private readonly Dictionary<string, object> _memory = new();
public Task<short> ReadIntAsync(string address)
=> Task.FromResult((short)(_memory.GetValueOrDefault(address) ?? (short)0));
public Task WriteBoolAsync(string address, bool value)
{
_memory[address] = value;
return Task.CompletedTask;
}
}半导体晶圆与石墨岛搬移上位机,表面上是"控制机械手搬东西",实质上是工艺稳定性、数据可追溯性、操作安全性的综合载体。C# + WPF 提供了高效的开发范式,但真正决定系统质量的,是:
从架构设计到工程落地,从通信协议到UI交互,从状态机到数据追溯——一套专业的上位机,是软件工程与半导体工艺的深度结合。这才是"专业"二字的真正含义。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。