当前位置:网站首页>在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无法传递值
边栏推荐
- SAP ui5 objectpagelayout control usage sharing
- SAP UI5 ObjectPageLayout 控件使用方法分享
- Events and bubbles in the applet of "wechat applet - Basics"
- Flink CDC cannot monitor MySQL logs. Have you ever encountered this problem?
- 2022年危险化学品生产单位安全生产管理人员特种作业证考试题库模拟考试平台操作
- 非技术部门,如何参与 DevOps?
- 橫向滾動的RecycleView一屏顯示五個半,低於五個平均分布
- vscode的快捷键
- 报错:Module not found: Error: Can‘t resolve ‘XXX‘ in ‘XXXX‘
- QT implements JSON parsing
猜你喜欢
随机推荐
WorkManager學習一
数组、、、
[paper reading] ckan: collaborative knowledge aware autonomous network for adviser systems
LSTM应用于MNIST数据集分类(与CNN做对比)
How does redis implement multiple zones?
What are the top ten securities companies? Is it safe to open an account online?
Go项目实战—参数绑定,类型转换
SQL Server 监控统计阻塞脚本信息
【观察】跨境电商“独立站”模式崛起,如何抓住下一个红利爆发时代?
学习笔记4--高精度地图关键技术(下)
AtCoder Beginner Contest 258「ABCDEFG」
Who is the "conscience" domestic brand?
Activity jump encapsulation
C语言实现QQ聊天室小项目 [完整源码]
橫向滾動的RecycleView一屏顯示五個半,低於五個平均分布
The horizontally scrolling recycleview displays five and a half on one screen, lower than the average distribution of five
C#实现获取DevExpress中GridView表格进行过滤或排序后的数据
脚手架开发基础
【DNS】“Can‘t resolve host“ as non-root user, but works fine as root
Customize the left sliding button in the line in the applet, which is similar to the QQ and Wx message interface