当前位置:网站首页>在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无法传递值
边栏推荐
- The most complete is an I2C summary
- How to write high-quality code?
- Secteur non technique, comment participer à devops?
- SLAM 01.人类识别环境&路径的模型建立
- WorkManager學習一
- 小程序框架Taro
- [observation] with the rise of the "independent station" model of cross-border e-commerce, how to seize the next dividend explosion era?
- 沟通的艺术III:看人之间 之倾听
- 请问大佬们 有遇到过flink cdc mongdb 执行flinksql 遇到这样的问题的么?
- 非技术部门,如何参与 DevOps?
猜你喜欢

微信核酸检测预约小程序系统毕业设计毕设(8)毕业设计论文模板

爬虫(9) - Scrapy框架(1) | Scrapy 异步网络爬虫框架
![C语言实现QQ聊天室小项目 [完整源码]](/img/4e/b3703ac864830d55c824e1b56c8f85.png)
C语言实现QQ聊天室小项目 [完整源码]

"Everyday Mathematics" serial 58: February 27

ByteDance Interviewer: how to calculate the memory size occupied by a picture

Events and bubbles in the applet of "wechat applet - Basics"

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

How do programmers live as they like?

Learning notes 5 - high precision map solution

AD20 制作 Logo
随机推荐
[paper reading] ckan: collaborative knowledge aware autonomous network for adviser systems
How does redis implement multiple zones?
脚手架开发进阶
How can non-technical departments participate in Devops?
Coneroller执行时候的-26374及-26377错误
小程序中自定义行内左滑按钮,类似于qq和wx消息界面那种
《天天数学》连载58:二月二十七日
C语言实现QQ聊天室小项目 [完整源码]
AD20 制作 Logo
flex4 和 flex3 combox 下拉框长度的解决办法
想请教一下,十大券商有哪些?在线开户是安全么?
php解决redis的缓存雪崩,缓存穿透,缓存击穿的问题
Glide conclusion
NAS与SAN
AtCoder Beginner Contest 258「ABCDEFG」
LDAP概述
Workmanager Learning one
5g NR system architecture
Who is the "conscience" domestic brand?
变量///