C#生产流程控制(串行,并行混合执行)
开源框架CsGo
https://gitee.com/hamasm/CsGo?_from=gitee_search

文档资料:
https://blog.csdn.net/aa2528877987/article/details/132139337
实现效果

using Go;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Forms;
using TaskControl.gadget;
using Module = TaskControl.gadget.Module;
namespace TaskControl
{
public partial class MainForm : Form
{
//work_service work = new work_service();
//shared_strand strand;
control_strand _mainStrand;
generator _timeAction;
Dictionary<int, Module> DicModules = new Dictionary<int, Module>();
int maxWorkerIndex = 2;
bool continuous = false;
bool stop = false;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
//strand = new work_strand(work);
//generator.go(strand, WorkerFlow);
_mainStrand = new control_strand(this);
_timeAction = generator.make(_mainStrand, WorkerFlow);
//generator.tgo(_mainStrand, WorkerFlow);
}
private void btnClear_Click(object sender, EventArgs e)
{
ClearMessage();
}
private void btnControl_Click(object sender, EventArgs e)
{
AddMessage(btnControl.Text);
switch (btnControl.Text)
{
case "启动任务":
btnControl.Text = "暂停任务";
AddMessage("===== 开始生产 =====");
//
// 可配置执行顺序
DicModules.Clear();
DicModules.Add(1, module1);
DicModules.Add(2, module2);
stop = false;
//work.run();
_timeAction.run();
break;
case "暂停任务":
btnControl.Text = "恢复任务";
//work.stop();
_timeAction.suspend();
break;
case "恢复任务":
btnControl.Text = "暂停任务";
//work.reset();
_timeAction.resume();
break;
}
}
private void btnContinuous_Click(object sender, EventArgs e)
{
AddMessage(btnContinuous.Text);
switch (btnContinuous.Text)
{
case "循环生产":
btnContinuous.Text = "取消循环";
continuous = true;
break;
case "取消循环":
btnContinuous.Text = "循环生产";
continuous = false;
break;
}
}
private void btnStop_Click(object sender, EventArgs e)
{
AddMessage(btnStop.Text);
switch (btnStop.Text)
{
case "结束生产":
btnStop.Text = "继续生产";
stop = true;
break;
case "继续生产":
btnStop.Text = "结束生产";
stop = false;
break;
}
}
async Task WorkerFlow()
{
// 罐仓同时加料
generator.children children = new generator.children();
foreach (var item in DicModules)
{
children.go(() => AddPot(item.Key, item.Value));
}
await children.wait_all();
//
await Worker();
}
async Task Worker(int index = 1)
{
if (index > maxWorkerIndex)
{
if (continuous)
{
index = 1;// 循环生产
ClearMessage();
}
else
{
AddMessage("===== 生产结束 =====");
return;
}
}
AddMessage($"顺序生产:{index}");
var module = DicModules[index];
if (null == module) return;
// 加料(串行)
await AddPot(index, module);
// 卸料(串行)
await RemovePot(index, module);
generator.children children = new generator.children();
children.go(() => MoveBelt(index)); // 皮带传输(并行)
children.go(() => AddPot(index, module));// 罐仓加料(并行)
if (!stop) children.go(() => Worker(++index)); // 继续生产
await children.wait_all();
}
/// <summary>
/// 罐仓加料
/// </summary>
async Task AddPot(int index, Module module)
{
var currentPotVal = module.Pot.Value;
if (currentPotVal >= module.Pot.Maximum)
{
AddMessage($"罐仓已满,跳过加料:【{index}】");
return;
}
AddMessage($"开始加料:【{index}】");
for (int i = currentPotVal; i <= module.Pot.Maximum; i++)
{
module.Pot.Value = i;
await generator.sleep(50);
}
AddMessage($"结束加料:【{index}】");
}
/// <summary>
/// 罐仓卸料
/// </summary>
async Task RemovePot(int index, Module module)
{
AddMessage($"开始卸料:【{index}】");
for (int i = module.Pot.Maximum; i > 0; i--)
{
module.Pot.Value = i;
await generator.sleep(50);
}
AddMessage($"结束卸料:【{index}】");
}
/// <summary>
/// 皮带传输(工作几秒后停止-并行)
/// </summary>
/// <param name="index"></param>
async Task MoveBelt(int index)
{
AddMessage($"开始传输:【{index}】");
var module = DicModules[index];
if (null == module) return;
module.Belt.ConveyorDirection = ConveyorDirection.Forward;
await generator.sleep(5000);
module.Belt.ConveyorDirection = ConveyorDirection.None;
AddMessage($"结束传输:【{index}】");
}
public void AddMessage(string msg)
{
if (IsDisposed) return;
this.BeginInvoke((EventHandler)(delegate
{
if (rtbMsg.Lines.Length > 100)
{
rtbMsg.Clear();
}
rtbMsg.AppendText(DateTime.Now.ToString("yy-MM-dd HH:mm:ss") + " " + msg + "\r\n");
Application.DoEvents();
}));
}
public void ClearMessage()
{
this.BeginInvoke((EventHandler)(delegate
{
rtbMsg.Clear();
}));
}
}
}
qq:505645074

浙公网安备 33010602011771号