当前位置: 首页 > news >正文

C#工业上通用的顺序控制写法

工业软件里,顺序程序控制最常见、最稳妥的是:
👉「状态机(Step / State) + 周期扫描(Timer/Loop) + 条件推进」
👉 延时用 TON(或等效逻辑),而不是 Thread.Sleep / await Delay

这就是PLC 思想在上位机里的延续。

工业顺序控制常见写法排名(按“真实使用率”)
✅ 第一名(⭐⭐⭐⭐⭐):
状态机(Step)+ 周期扫描(Timer)【最常见】
写法特征
switch (Step)
{
case 10:
if (条件A)
Step = 20;
break;

case 20: if (ton.Q(3000)) { ton.Reset(); Step = 30; } break;

}

//----------------------------下面用一个简单的示例,说明此种写法的好处---------------------------------
第一步:先定义一个定时器类
public sealed class Ton
{
private bool _running = false;
private long _startTick = 0;

public void Reset() { _running = false; _startTick = 0; } // 返回 true 表示“到时了”(相当于 TON.Q) public bool Q(int presetMs) { if (!_running) { _running = true; _startTick = Environment.TickCount64; } long elapsed = Environment.TickCount64 - _startTick; return elapsed >= presetMs; }

}

第二步:定义步序枚举类型和定时器实例化、枚举实例化
// ===== 步序枚举 =====
private enum Step
{
step10 = 0,
step20 = 10,
step30 = 20,
step40 = 30,
step50 = 40,
step60 = 50,
step70 = 900
}

// ===== TON 定时器(PLC 的 TON)=====
private readonly Ton _ton = new Ton();
//枚举实例化
private Step stepNumber = Step.step10;

第三步:开始在定时器中编写顺序控制逻辑
private async void timer1_Tick(object sender, EventArgs e)
{
switch (stepNumber)
{
case Step.step10:
_ton.Reset();
if (stepNumber == Step.step10)
{
richTextBox1.AppendText(DateTime.Now + " step10" + “\r\n”);
}
stepNumber = Step.step20;
break;

case Step.step20: stepNumber = Step.step30; Step1 = 100; //标志位赋值 if (stepNumber == Step.step20) { richTextBox1.AppendText(DateTime.Now + " step20" + "\r\n"); } break; case Step.step30: if (Step1==100) { Step1= 0; //标志位清零 richTextBox1.AppendText(DateTime.Now + " step30" + "\r\n"); } if(_ton.Q(4000)) { stepNumber = Step.step40; } break; case Step.step40: if (stepNumber == Step.step40) { richTextBox1.AppendText(DateTime.Now + " step40" + "\r\n"); stepNumber = Step.step50; } break; case Step.step50: if (stepNumber == Step.step50) { richTextBox1.AppendText(DateTime.Now + " step50" + "\r\n"); stepNumber = Step.step60; } break; }

}

//-----------下面是输出的结果----------------

打印出来的结果如下:

http://www.jsqmd.com/news/271925/

相关文章:

  • 小红书下载终极指南:XHS-Downloader一键获取无水印高清素材
  • Windows Cleaner实战指南:5步解决C盘空间焦虑
  • Cowabunga Lite:终极iOS定制工具箱完全指南
  • SAM3性能评测:不同深度学习框架对比
  • WarcraftHelper高效优化指南:全面提升魔兽争霸III游戏体验
  • Android视频播放优化:5大关键技术重塑移动观影体验
  • WarcraftHelper超强性能优化:5个关键技巧彻底解决魔兽争霸III兼容性问题
  • BAAI/bge-m3如何集成?Python调用API避坑指南代码实例
  • BERT智能填空系统:文本理解能力测试报告
  • NeteaseCloudMusicFlac无损音乐下载工具:打造专属高品质音乐库
  • 微信网页版完全教程:浏览器端微信的终极解决方案
  • Zotero文献管理革命:用Ethereal Style打造智能阅读工作流
  • 无源蜂鸣器驱动电路在多节点报警网络中的部署实践
  • 告别复杂配置!SAM3镜像版实现开箱即用的图像分割体验
  • 如何快速掌握Balena Etcher:终极镜像烧录全攻略
  • Windows Cleaner高效清理指南:三步解决C盘爆满问题
  • 小红书素材收集革命:告别手动保存的智能下载方案
  • IndexTTS-2-LLM性能瓶颈分析:CPU利用率优化实战案例
  • IndexTTS-2-LLM优化案例:如何提升长文本合成质量
  • 免越狱iOS定制神器:从新手到高手的完整指南
  • Fiji图像处理:生命科学研究的终极工具指南
  • BGE-M3应用场景:智能客服中的问题相似度匹配
  • Hanime1观影神器完整教程:轻松打造极致Android观影环境
  • AI智能二维码工坊倾斜校正:旋转图像自动对齐实战
  • MTKClient完整使用指南:新手必看的3大关键技巧
  • 安卓位置模拟终极方案:如何实现精准独立定位?
  • Windows Cleaner终极解决方案:轻松告别C盘空间焦虑
  • iOS系统个性化革命:Cowabunga Lite深度体验与创新玩法
  • PUBG终极压枪指南:三步搞定罗技鼠标完美配置
  • 动物森友会游戏世界改造手册:从玩家到创造者的蜕变之旅