使用C# Channel实现工位流水线调度系统

news/2025/11/22 16:00:28/文章来源:https://www.cnblogs.com/guchen33/p/19256993

在现代制造业中,流水线生产需要精确的工位协作。本文将介绍如何使用C#的Channel实现一个高效的工位流水线调度系统。

1、首先我们准备一个工位接口

 public interface IWorkstation{string WorkName { get; }Task StartAsync(CancellationToken cancellationToken);Task StopAsync();WorkstationStatus Status { get; }}public enum WorkstationStatus{Idle,Running,Paused,Faulted}

接着我们实现基类
基类封装了通用的启动、停止和状态管理逻辑:

  public abstract class WorkstationBase : IWorkstation, INotifyPropertyChanged{public virtual string WorkName { get; }private WorkstationStatus _status;private CancellationTokenSource _cts;private static readonly ITangdaoLogger Logger = TangdaoLogger.Get(typeof(WorkstationBase));public WorkstationStatus Status{get => _status;protected set{_status = value;OnPropertyChanged();}}public event PropertyChangedEventHandler PropertyChanged;public async Task StartAsync(CancellationToken parentToken){if (Status == WorkstationStatus.Running)return;Status = WorkstationStatus.Running;_cts = CancellationTokenSource.CreateLinkedTokenSource(parentToken);try{await ExecuteWorkAsync(_cts.Token);}catch (OperationCanceledException){Status = WorkstationStatus.Idle;}catch (Exception ex){Status = WorkstationStatus.Faulted;// 记录错误}}public async Task StopAsync(){_cts?.Cancel();await CleanupAsync();Status = WorkstationStatus.Idle;}protected abstract Task ExecuteWorkAsync(CancellationToken token);protected virtual Task CleanupAsync() => Task.CompletedTask;protected virtual void OnPropertyChanged([CallerMemberName] string name = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));}}

我们现在可以实现流水线步骤了,假设我们的流水线只有4个工位,上料,预校,切割、下料
我们可以实现

 public class LoadWorkstation : WorkstationBase{private static long waferId = 0;public new string WorkName => "上料工位";private static readonly ITangdaoLogger Logger = TangdaoLogger.Get(typeof(LoadWorkstation));protected override async Task ExecuteWorkAsync(CancellationToken token){while (!token.IsCancellationRequested){Logger.WriteLocal($"生成产品: {wafer.CellId}");await Task.Delay(500, token);}}}

类似的其他工位也可以这样写
接着我们启动开始按钮前需要一个Task[]来全部启动

 public class WorkstationManager{private readonly List<IWorkstation> _workstations;private CancellationTokenSource _globalCts;public IReadOnlyCollection<IWorkstation> Workstations => _workstations.AsReadOnly();public WorkstationManager(){_workstations = new List<IWorkstation>{new LoadWorkstation(),new PreWorkstation(),new CutWorkstation(),new UnLoadWorkstation(),// 其他工位...};}public async Task StartAllAsync(){await StopAllAsync();_globalCts = new CancellationTokenSource();var startTasks = _workstations.Select(ws => ws.StartAsync(_globalCts.Token));await Task.WhenAll(startTasks);}public async Task StopAllAsync(){_globalCts?.Cancel();var stopTasks = _workstations.Select(ws => ws.StopAsync());await Task.WhenAll(stopTasks);}}

我们的ViewModel对应的开始按钮可以写

 public async void ExecuteStart(){CurrentStatus = RunStatus.Running;WorkstationManager workstationManager = new WorkstationManager();await workstationManager.StartAllAsync();}

各工位独立运行,缺乏协调
产品处理顺序无法保证
无法形成真正的"流水线"
资源竞争可能导致死锁
所有的产片都是并行的,不能保证切割顺序,此时我们需要用到Channel
我们新建一个传输器的实体类,用来演示传输的数据

 public class WaferMessage{public string CellId { get; }public DateTime EnterTime { get; }public WaferMessage(string cellId){CellId = cellId;EnterTime = DateTime.Now;}}

接着使用Channel新建一个状态机

 public static class ProductionLine{// 创建工位间的通道public static readonly Channel<WaferMessage> LoadToPre = Channel.CreateUnbounded<WaferMessage>();public static readonly Channel<WaferMessage> PreToCut = Channel.CreateUnbounded<WaferMessage>();public static readonly Channel<WaferMessage> CutToUnload = Channel.CreateUnbounded<WaferMessage>();}

我们修改刚才上料的代码

 public class LoadWorkstation : WorkstationBase{private static long waferId = 0;public new string WorkName => "上料工位";private static readonly ITangdaoLogger Logger = TangdaoLogger.Get(typeof(LoadWorkstation));protected override async Task ExecuteWorkAsync(CancellationToken token){while (!token.IsCancellationRequested){// 生成新产品,确保ID递增var id = Interlocked.Increment(ref waferId);var wafer = new WaferMessage($"Wafer-{id:D4}");Logger.WriteLocal($"生成产品: {wafer.CellId}");await Task.Delay(500, token);// 传递给预校工位await ProductionLine.LoadToPre.Writer.WriteAsync(wafer, token);Logger.WriteLocal($"{wafer.CellId} 完成上料 准备 预校");}}}

接着预校工位代码

 public class PreWorkstation : WorkstationBase{public new string WorkName => "预校工位";private static readonly ITangdaoLogger Logger = TangdaoLogger.Get(typeof(PreWorkstation));protected override async Task ExecuteWorkAsync(CancellationToken token){while (!token.IsCancellationRequested){// 从上料工位获取产品var wafer = await ProductionLine.LoadToPre.Reader.ReadAsync(token);Logger.WriteLocal($"{wafer.CellId} 开始预校");await Task.Delay(800, token);// 传递给切割工位await ProductionLine.PreToCut.Writer.WriteAsync(wafer, token);Logger.WriteLocal($"{wafer.CellId} 完成预校 准备 切割");}}}

切割工位代码

 public class CutWorkstation : WorkstationBase{public new string WorkName => "切割工位";private static readonly ITangdaoLogger Logger = TangdaoLogger.Get(typeof(CutWorkstation));protected override async Task ExecuteWorkAsync(CancellationToken token){while (!token.IsCancellationRequested){var wafer = await ProductionLine.PreToCut.Reader.ReadAsync(token);Logger.WriteLocal($"{wafer.CellId} 开始切割");await Task.Delay(800, token);// 传递给切割工位await ProductionLine.CutToUnload.Writer.WriteAsync(wafer, token);Logger.WriteLocal($"{wafer.CellId} 完成切割 → 下料");}}}

下料工位代码

 public class UnLoadWorkstation : WorkstationBase{private static readonly ITangdaoLogger Logger = TangdaoLogger.Get(typeof(UnLoadWorkstation));public new string WorkName => "下料工位";protected override async Task ExecuteWorkAsync(CancellationToken token){while (!token.IsCancellationRequested){var wafer = await ProductionLine.CutToUnload.Reader.ReadAsync(token);Logger.WriteLocal($"[下料] 开始: {wafer.CellId}");await Task.Delay(800, token); // 下料时间var totalTime = DateTime.Now - wafer.EnterTime;Logger.WriteLocal($"[下料] {wafer.CellId} ✓ 完成! 总耗时: {totalTime.TotalSeconds:F1}秒");}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/973193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

福星福袋助手,抖音福袋扭蛋机,抖音抢福袋工具

抖音福星福袋助手,抖音福袋扭蛋机,抖音抢福袋工具 DY福袋工具 抖音福袋福星福袋助手 最新版本群里下载 [2025-11-20] 抖音福星福袋助手,抖音抢福袋工具,抖音无水印视频下载器,抖音直播间录制下载器,抖音批量取消…

2025年发电机制造厂权威推荐榜单:康姆勒原装发电机组/康姆勒发电机组/全自动柴油发电机组源头厂家精选

在能源安全与应急供电需求日益重要的今天,发电机组作为各行业关键电力保障设备,其性能优劣直接关系到企业运营的连续性与稳定性。 发电机组作为重要的电力供应设备,在工业备用电源、基础设施建设、应急救援等领域发…

2025百元白酒精选推荐指南:十大香型佳酿与纯粮酒挑选策略

在白酒消费市场中,百元价位带凭借 “品质与性价比平衡” 的核心优势,成为日常口粮酒、家庭聚会及轻商务宴请的主流选择。据行业统计数据显示,百元档白酒占整体白酒消费市场份额超 35%,且年均增速保持在 12% 以上,…

BLOG1-NCHU-单部电梯调度程序

题目集 1-3 单部电梯调度程序 一.前言历经三周的时间,也是完成了每周一次Java课程的大作业。在我们每次完成的大作业当中均包含着NCHU-单部电梯调度程序的相关题目,并且每周题目呈现迭代递进的特点。从题目集1的NCHU…

Hadoop生态系统怎样优化存储性能

Hadoop生态系统优化存储性能是一个复杂的过程,涉及多个方面。以下是一些关键的策略和步骤,可以帮助您提高Hadoop的存储性能: 硬件优化主节点和从节点的配置:确保主节点(运行NameNode)的内存配置足够高,因为Name…

【matlab】机器学习入门之旅

T = readtable(filename) 通过从文本文件、电子表格(包括 Microsoft Excel)文件、XML 文件、HTML 文件或 Microsoft Word 文档中读取列向数据来创建表。readtable 检测数据元素,如分隔符和数据类型,以确定如何导入…

web漏洞、waf繞過和前端加密繞過

1、安装并使用burp越权检测插件auth_analyzer测试pichachu垂直越权漏洞A.先使用普通帐号登入:B.登入管理员帐号:2、搭建ftp服务器并分别使用hydra和超级弱口令检查工具检查ftp弱口令3、安装captcha-killer-modified插件…

部署tendis 集群

部署tendis 集群1.概述 我们在部署 tendis 集群的时候,我们需要准备 6台机器,3主三从,当然 我们可以将他们部署同一台机器上,只要端口不一样就可以。 我们准备 6个文件夹 端口分别从 7001到 7006 构建过程 2.1.准备…

P4555 [国家集训队] 最长双回文串 踢姐

P4555 [国家集训队] 最长双回文串 踢姐 简要题意: 给定一个字符串 \(S\) ,我们定义字符串 \(T\) 的双回文子串为:存在两个字符串 \(X\) 与 \(Y\) 是 \(T\) 的非空子串,满足 \(X\) 与 \(Y\) 无重叠部分并且两个字符…

2025年水肥一体机制造厂权威推荐榜单:便携式水肥一体机/全自动喷淋系统/简易水肥一体源头厂家精选

随着智慧农业的快速推进,水肥一体化技术正成为现代农业生产的关键支撑。据行业数据显示,水肥一体化设备可有效提高水肥利用率30%以上,成为推动农业现代化转型的核心装备。 水肥一体化技术通过集成灌溉与施肥系统,实…

Java—抽象类 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

23207225-华辉-第一次blog作业

一. 前言 在完成三次大作业的题集后,我兴高采烈地写下写下这片博客,思考人生的意义,也想和大家分享我在这三次大作业中碰见的问题和个人所得。代码为什么错了?错在哪?该如何才能通过题目的测试点?相信很多同学和…

英语_阅读_AI models_待读

When an artificial intelligence model is created, it doesnt have any knowledge. 当一个人工智能模型被创造出来时,它本身并不具备任何知识。 AI companies like OpenAI teach it different things so that it wo…

11.22组会

11.22组会亚克隆文献讲解 使用好ai是第一重要的 gemini最新版 结合ai搭建工具链 使用可以跨平台共享数据的工具,否则已经落后

2025年食品厂生产用水紫外线消毒设备优质厂家权威推荐榜单:牛奶厂紫外线消毒设备/饮料杀菌紫外线消毒设备/啤酒生产紫外线消毒设备源头厂家精选

在食品安全标准日益严格的今天,紫外线消毒技术凭借其高效灭菌、无化学残留的独特优势,正成为食品生产用水处理的核心环节。 根据全球水处理研究报告显示,紫外线消毒设备在食品饮料行业的应用正快速增长。2025年食品…

2025年福建钨钢棒回收公司权威推荐榜单:福州钨钢合金回收/福建钨钢模具回收/福建钨钢块回收服务商精选

在资源循环利用与绿色制造理念深入人心的背景下,钨钢棒回收作为硬质合金资源再利用的关键环节,其专业化水平直接关系到资源利用效率与企业环保合规。 钨钢棒作为一种高价值硬质合金材料,因其高硬度、耐磨性和耐高温…

扩展RTCM消息 - 教程

扩展RTCM消息 - 教程2025-11-22 15:42 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

java.nio.charset.MalformedInputException: Input length = 1

一 背景 启动nacos微服务报如下错误,检查xml文件,未发现问题,经确定是格式问题 二 解决 java -Dfile.encoding=utf-8 启动项,设置编码格式

线段树问题-从熟练到精通

前言 不是每一个文章都要有前言 但是我的有

完整教程:Flowable工作流引擎:核心表结构概述

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …