首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C# + WPF 打造半导体晶圆与石墨岛搬移:从 HMI 到运动控制的工程实践

C# + WPF 打造半导体晶圆与石墨岛搬移:从 HMI 到运动控制的工程实践

原创
作者头像
用户12339161
发布于 2026-10-09 11:36:36
发布于 2026-10-09 11:36:36
390
举报

在半导体外延、MOCVD 或高温炉管工艺中,晶圆(Wafer)通常放置在石墨岛(Graphite Island)或石墨舟上。搬移过程要求高洁净度、高定位精度与零碎片率。一套专业的搬移系统需要:WPF 作为操作界面(HMI),C# 实现业务编排与设备通信,底层通过串口、TCP 或 EtherCAT 驱动机械手、对齐台与升降机构。本文从架构、状态机、通信与 UI 四个层面给出可落地的代码骨架。

一、系统架构

采用 MVVM 分层:View 负责可视化晶圆图与操作按钮;ViewModel 暴露命令与状态;Model 包含 Wafer、GraphiteIsland、TransferTask。服务层拆分为:

  • IRobotService:机械手运动、取放片、真空吸笔控制。
  • IAlignerService:晶圆寻边与中心对齐。
  • ITransferSequencer:搬移流程状态机。
  • ISafetyInterlock:门锁、急停、真空度、温度联锁。

所有设备调用异步化,支持 CancellationToken,保证 UI 不卡顿且可安全中止。

二、数据模型与晶圆图

代码语言:javascript
复制
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 直接调用设备。

代码语言:javascript
复制
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 通信。以下为串口封装,带超时与重试。

代码语言:javascript
复制
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);
}

五、WPF 界面与命令绑定

ViewModel 暴露 StartTransferCommand,绑定到按钮,并实时显示当前步骤。

代码语言:javascript
复制
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 侧只需绑定:

代码语言:javascript
复制
<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>

六、工程要点

  1. 安全联锁:任何运动前检查急停、门锁、真空度,失败立即中止。
  2. 幂等与审计:每次取放片记录晶圆 ID、槽位、时间戳,便于追溯。
  3. 异常回退:放片失败时机械手必须缩回,避免碰撞。
  4. 线程模型:设备 IO 全部异步,UI 线程只更新绑定属性。
  5. 可测试性:IRobotService 可替换为模拟实现,方便离线验证状态机。

总结:C# + WPF 打造晶圆与石墨岛搬移系统,核心在于“UI 轻、状态机重、通信稳”。用 MVVM 解耦界面与设备,用异步与取消保证响应性,用联锁与回退保证安全。代码骨架可直接扩展至 EtherCAT 或 SECS/GEM 协议,满足半导体量产环境要求。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、系统架构
  • 二、数据模型与晶圆图
  • 三、搬移状态机
  • 四、设备通信:串口示例
  • 五、WPF 界面与命令绑定
  • 六、工程要点
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档