本文章讲的是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点位为false
UpTrigger.Now = false;
}
private void button2_Click(object sender, EventArgs e)
{
//模拟读取plc点位为true
UpTrigger.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