当前位置:网站首页>在C# 中实现上升沿,并模仿PLC环境验证 If 语句使用上升沿和不使用上升沿的不同
在C# 中实现上升沿,并模仿PLC环境验证 If 语句使用上升沿和不使用上升沿的不同
2022-07-05 10:21:00 【罗迪尼亚的熔岩】
PLC可以是认为跑在while 死循环里的程序(Ob100除外),每一个OB块都是一个单独的线程。了解了这点,就可以更好的进行C# 上位机编程和 PLC的SCL(ST)编程。
在SCL中,如果If 语句的条件使用了长信号,If语句会反复执行,一些交换值,传递值,更新值的操作就无法完成,这时候If语句的条件必须要使用瞬态信号,If 的条件使用上升沿是一个好选择。
上升沿:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FPTest
{
public class R_TRIG
{
///
/// 这个属性存储上一次的bool状态,get;private set;这个写法相当于PLC的 Output接口
///
public bool Last {
get; private set; }
///
/// 这个属性填被检测的bool量,set;相当于PLC的Input接口
///
public bool CLK
{
set
{
Q = value && !Last;//我们知道上升沿是从0变1的一瞬间,所以本次扫描为真上次为假时就产生了上升沿
Last = value;//每个扫描周期刷新参考位
}
}
///
/// 这个就是检测的状态,外部获取这个变量就知道上升沿有没有产生
/// 相当于PLC的 Output接口
public bool Q {
get; private set; }
}
}
下降沿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FPTest
{
public class F_TRIG
{
public bool Last {
get; private set; }
public bool CLK
{
set
{
Q = !value && Last;//1变0 上次为真本次为假
Last = value;
}
}
public bool Q {
get; private set; }
}
}
主程序
namespace FPTest
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
rTrig = new R_TRIG();
fTrig = new F_TRIG();
this.label1.Text = a.ToString();
this.label2.Text = b.ToString();
}
private R_TRIG rTrig;
private F_TRIG fTrig;
private int a = 0;
private int b = 0;
CancellationTokenSource cts = new CancellationTokenSource();
private void btnUp_Click(object sender, EventArgs e)
{
Task.Run(async () =>
{
while (!cts.IsCancellationRequested)
{
await Task.Delay(200);
rTrig.CLK = true;
if (rTrig.Q)
{
a = b;
b = int.Parse(this.textBox1.Text.Trim()) ;
}
this.label1.Invoke(new Action(() => {
this.label1.Text = a.ToString(); }));
this.label2.Invoke(new Action(() => {
this.label2.Text = b.ToString(); }));
}
}, cts.Token);
}
private void NoRTrig_Click(object sender, EventArgs e)
{
Task.Run(async () =>
{
while (!cts.IsCancellationRequested)
{
await Task.Delay(200);
if (true)
{
a = b;
b = int.Parse(this.textBox1.Text.Trim());
}
this.label1.Invoke(new Action(() => {
this.label1.Text = a.ToString(); }));
this.label2.Invoke(new Action(() => {
this.label2.Text = b.ToString(); }));
}
}, cts.Token);
}
}
}

初始状态

使用上升沿,If中执行了一次

不使用上升沿,a,b无法传递值
边栏推荐
- 微信小程序中,从一个页面跳转到另一个页面后,在返回后发现页面同步滚动了
- 微信小程序触底加载与下拉刷新的实现
- Activity jump encapsulation
- Interview: how does the list duplicate according to the attributes of the object?
- Redis如何实现多可用区?
- Secteur non technique, comment participer à devops?
- 学习笔记4--高精度地图关键技术(下)
- Learning note 4 -- Key Technologies of high-precision map (Part 2)
- [paper reading] kgat: knowledge graph attention network for recommendation
- 请问postgresql cdc 怎么设置单独的增量模式呀,debezium.snapshot.mo
猜你喜欢

到底谁才是“良心”国产品牌?

2022年化工自动化控制仪表考试试题及在线模拟考试

SAP ui5 objectpagelayout control usage sharing

WorkManager學習一

Usage differences between isempty and isblank

5G NR系统架构
![[论文阅读] KGAT: Knowledge Graph Attention Network for Recommendation](/img/fa/d2061bc7bd437f062d46a009cf32cf.png)
[论文阅读] KGAT: Knowledge Graph Attention Network for Recommendation

2022年T电梯修理操作证考试题及答案

Learning note 4 -- Key Technologies of high-precision map (Part 2)

AtCoder Beginner Contest 258「ABCDEFG」
随机推荐
【JS】提取字符串中的分数,汇总后算出平均分,并与每个分数比较,输出
[paper reading] kgat: knowledge graph attention network for recommendation
【tcp】服务器上tcp连接状态json形式输出
运算符、、
[vite] 1371 - develop vite plug-ins by hand
beego跨域问题解决方案-亲试成功
Constrained layout flow
mongoDB副本集
报错:Module not found: Error: Can‘t resolve ‘XXX‘ in ‘XXXX‘
How can non-technical departments participate in Devops?
Write double click event
Flink CDC cannot monitor MySQL logs. Have you ever encountered this problem?
Coneroller执行时候的-26374及-26377错误
Who is the "conscience" domestic brand?
数据库中的范式:第一范式,第二范式,第三范式
flex4 和 flex3 combox 下拉框长度的解决办法
WorkManager學習一
Golang应用专题 - channel
Qt实现json解析
Apple 5g chip research and development failure? It's too early to get rid of Qualcomm