
在半导体外延、MOCVD 或高温炉管工艺中,晶圆(Wafer)通常放置在石墨岛(Graphite Island)或石墨舟上。搬移过程要求高洁净度、高定位精度与零碎片率。一套专业的搬移系统需要:WPF 作为操作界面(HMI),C# 实现业务编排与设备通信,底层通过串口、TCP 或 EtherCAT 驱动机械手、对齐台与升降机构。本文从架构、状态机、通信与 UI 四个层面给出可落地的代码骨架。
采用 MVVM 分层:View 负责可视化晶圆图与操作按钮;ViewModel 暴露命令与状态;Model 包含 Wafer、GraphiteIsland、TransferTask。服务层拆分为:
IRobotService:机械手运动、取放片、真空吸笔控制。IAlignerService:晶圆寻边与中心对齐。ITransferSequencer:搬移流程状态机。ISafetyInterlock:门锁、急停、真空度、温度联锁。所有设备调用异步化,支持 CancellationToken,保证 UI 不卡顿且可安全中止。
public enum WaferState { Idle, Aligning, Transferring, Processing, Error }
public class Wafer
{
public string Id { get; set; }
public int Slot { get; set; } // 石墨岛上的槽位
public WaferState State { get; set; }
public bool IsPresent { get; set; }
}
public class GraphiteIsland
{
public string Id { get; set; }
public int Capacity { get; set; }
public List<Wafer> Wafers { get; set; } = new();
}搬移流程必须可重入、可中断、可审计。典型步骤:安全检查 → 取片 → 寻边 → 放片 → 校验。用状态机驱动,避免 UI 直接调用设备。
public enum TransferStep
{
Idle, SafetyCheck, PickFromCassette, Align,
PlaceToIsland, Verify, Done, Error
}
public class TransferSequencer
{
private readonly IRobotService _robot;
private readonly IAlignerService _aligner;
private readonly ISafetyInterlock _safety;
private readonly ILogger _log;
public TransferStep Current { get; private set; } = TransferStep.Idle;
public async Task RunAsync(Wafer wafer, GraphiteIsland island,
CancellationToken ct)
{
try
{
Current = TransferStep.SafetyCheck;
await _safety.EnsureSafeAsync(ct);
Current = TransferStep.PickFromCassette;
await _robot.PickAsync(wafer.Slot, ct);
_log.Info($"取片 {wafer.Id} 槽位 {wafer.Slot}");
Current = TransferStep.Align;
var offset = await _aligner.AlignAsync(ct);
if (Math.Abs(offset.X) > 0.1 || Math.Abs(offset.Y) > 0.1)
throw new InvalidOperationException("寻边偏差超限");
Current = TransferStep.PlaceToIsland;
await _robot.PlaceAsync(island.Id, wafer.Slot, ct);
Current = TransferStep.Verify;
if (!await _robot.CheckPresenceAsync(island.Id, wafer.Slot, ct))
throw new InvalidOperationException("放片校验失败");
wafer.State = WaferState.Processing;
Current = TransferStep.Done;
}
catch (OperationCanceledException)
{
_log.Warn("搬移被取消,执行回退");
await _robot.RetractAsync(CancellationToken.None);
Current = TransferStep.Idle;
throw;
}
catch (Exception ex)
{
_log.Error(ex, "搬移失败");
Current = TransferStep.Error;
throw;
}
}
}机械手常通过 RS-232 或 TCP 通信。以下为串口封装,带超时与重试。
public class SerialRobotService : IRobotService
{
private readonly SerialPort _port;
private readonly SemaphoreSlim _lock = new(1, 1);
public SerialRobotService(string portName)
{
_port = new SerialPort(portName, 115200)
{
ReadTimeout = 2000,
WriteTimeout = 2000
};
_port.Open();
}
private async Task<string> SendAsync(string cmd, CancellationToken ct)
{
await _lock.WaitAsync(ct);
try
{
_port.WriteLine(cmd);
await Task.Delay(50, ct);
return _port.ReadLine();
}
finally { _lock.Release(); }
}
public async Task PickAsync(int slot, CancellationToken ct)
{
var resp = await SendAsync($"PICK {slot}", ct);
if (!resp.StartsWith("OK")) throw new IOException(resp);
}
public async Task PlaceAsync(string island, int slot, CancellationToken ct)
{
var resp = await SendAsync($"PLACE {island} {slot}", ct);
if (!resp.StartsWith("OK")) throw new IOException(resp);
}
public async Task<bool> CheckPresenceAsync(string island, int slot, CancellationToken ct)
=> (await SendAsync($"SENSOR {island} {slot}", ct)).Trim() == "1";
public async Task RetractAsync(CancellationToken ct)
=> await SendAsync("RETRACT", ct);
}ViewModel 暴露 StartTransferCommand,绑定到按钮,并实时显示当前步骤。
public class MainViewModel : INotifyPropertyChanged
{
private readonly TransferSequencer _seq;
private CancellationTokenSource? _cts;
public ObservableCollection<Wafer> Wafers { get; } = new();
public string Status { get; private set; } = "就绪";
public ICommand StartTransferCommand { get; }
public ICommand AbortCommand { get; }
public MainViewModel(TransferSequencer seq)
{
_seq = seq;
StartTransferCommand = new RelayCommand(async _ => await StartAsync());
AbortCommand = new RelayCommand(_ => _cts?.Cancel());
}
private async Task StartAsync()
{
_cts = new CancellationTokenSource();
foreach (var wafer in Wafers.Where(w => w.IsPresent))
{
Status = $"搬移 {wafer.Id}:{_seq.Current}";
await _seq.RunAsync(wafer, new GraphiteIsland { Id = "G1" }, _cts.Token);
}
Status = "完成";
}
}XAML 侧只需绑定:
<StackPanel>
<TextBlock Text="{Binding Status}" FontSize="16"/>
<ItemsControl ItemsSource="{Binding Wafers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Id, StringFormat=晶圆 {0}}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Content="开始搬移" Command="{Binding StartTransferCommand}"/>
<Button Content="中止" Command="{Binding AbortCommand}"/>
</StackPanel>IRobotService 可替换为模拟实现,方便离线验证状态机。总结:C# + WPF 打造晶圆与石墨岛搬移系统,核心在于“UI 轻、状态机重、通信稳”。用 MVVM 解耦界面与设备,用异步与取消保证响应性,用联锁与回退保证安全。代码骨架可直接扩展至 EtherCAT 或 SECS/GEM 协议,满足半导体量产环境要求。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。