本文章讲的是C#如何实现“上升沿”功能,上升沿:也就是从0到1的一瞬间,这个功能做工控是必不可少,大家应该用的都很多,也就不多做介绍,下面开始说如何实现功能,文末会附上源码链接。.

/// <summary>/// 上升沿触发/// </summary>public class UpTrigger{/// <summary>/// 这个属性存储上一次的bool状态/// </summary>public bool Last { get; private set; }/// <summary>/// 这个属性填被检测的bool量,set;相当于PLC的Input接口/// </summary>public bool Now{set{//我们知道上升沿是从0变1的一瞬间,所以本次扫描为真,上次为假时就产生了上升沿,//value&&!Last的意思就是 当前值与上次值不相等时,就为True,也就产生了上升沿OutPut = value && !Last;//每次给NOW刷新状态后,Last就刷新状态Last = value;}}/// <summary>/// 这个就是检测的状态,外部获取这个变量就知道上升沿有没有产生/// </summary>public bool OutPut { get; private set; }
在实际测试中看效果,界面做了两个按钮模拟false和true的状态,再做了一个lable来显示上升沿的状态,这个状态开了个线程依据OutPut属性来刷新。


public partial class Form1 : Form{public Form1(){InitializeComponent();}UpTrigger UpTrigger = new UpTrigger();private void button1_Click(object sender, EventArgs e){//模拟读取plc点位为falseUpTrigger.Now = false;}private void button2_Click(object sender, EventArgs e){//模拟读取plc点位为trueUpTrigger.Now = true;}void Rush(){while (true){if (UpTrigger.OutPut){label2.Invoke(new Action(() => { label2.Text = "上升沿触发中"; }));}else{label2.Invoke(new Action(() => { label2.Text = "上升沿未触发"; }));}Thread.Sleep(10);}}private void Form1_Load(object sender, EventArgs e){Task.Factory.StartNew(Rush);}}
运行效果:

点击解析:按下第一次按钮1,则是从0-1所以状态为true上升沿触发;再点击了一次1则是从1-1,已经不是上升沿所以为false。具体可以仔细看gif。
源码链接:https://pan.baidu.com/s/1wu_XiInY8zgMB0eeJdR4Ag
提取码:ut3l