网站首页 > 技术文章 正文
想必做过电工、电气工程师的工控人,都很熟悉起保停。对,就是你们熟悉的那个起保停。这个电路应用范围很广,比如电机的启动停止控制,如果我们把这个电路程序能移植到上位机那么已经事半功倍了。
1.我们先分析下什么叫起保停?
起:启动(启动条件)保:保持(自锁条件)停:停止(停止条件)
2.用C#上位机实现PLC起保停,创建项目这里命名为DEMO1
3.从控件工具库中拖拽Button按钮, 分别命名为btnStart和btnStop并把text属性改为启动和停止,并分别创建MouseDown、 MouseUp事件模拟启动按键和停止按键。(双击事件自动创建)
4.从控件工具库中拖拽Label标签 命名为lblState并把text属性改为 今日头条 模拟运行状态
5.从控件工具库中拖拽timer控件 并把Enabled属性改为 true,把触发 周期改为100ms,模拟PLC扫
描
6.界面效果图
7.按F7进入代码页,大家查看代码注释理解下,不清楚的可以在评论区问我
public FrmMain()
{
InitializeComponent();
stop = true;//这里停止按钮初始化为抬起状态
}
bool start, stop, run;
private void BtnStart_MouseDown(object sender, MouseEventArgs e)
{
//写启动按下
start = true;
}
private void BtnStart_MouseUp(object sender, MouseEventArgs e)
{
//启动按钮抬起
start = false;
}
private void BtnStop_MouseDown(object sender, MouseEventArgs e)
{
//停止按钮按下
stop = false;
}
private void BtnStop_MouseUp(object sender, MouseEventArgs e)
{
//停止按钮抬起
stop = true;
}
//模拟PLC扫描
private void Timer1_Tick(object sender, EventArgs e)
{
run = (start || run) && stop;//启动和运行或一下(并联)再和停止或一下(串联)
lblState.BackColor = run ? Color.Green : Color.Black;//三元表达式 run为真赋值为绿色为假赋值为黑色
}
7.运行效果图
8.这个只是抛砖引玉,这个timer事件是来自UI线程,实时性不靠谱,实际现场我们会创建独立的线程死循环来处理现场IO数据。可以参考下面的写法
public Form1()
{
InitializeComponent();
Thread t1 = new Thread(PLCRUN);//创建一个线程并把 PLC运行方法传入
t1.IsBackground = true;//设为背景线程
t1.Start();//线程开始运行
}
private void PLCRUN()
{
while (true)
{
try
{
#region 输入映像刷新
#endregion
#region PLC逻辑....
#endregion
#region 输出映像刷新
#endregion
Thread.Sleep(1);//CPU强悍实时性要求高可以不sleep
}
catch (Exception ex)
{
//异常捕捉
}
}
}
9.当然起保停还有直接通过if判断实现或者其他方法实现,我这里只是提供是思路,没必要杠。在起保停的逻辑上可以加各种现场控制逻辑,比如延时逻辑 ,计数逻辑,其他与或非逻辑等等。剩下的大家灵活应用。
10.如果用运动板块控制或者项目比较大,建议分层架构,两层三层都可以。
11.篇幅有限,起保停的相关电路我就不画了,PLC的起保停不写了。我相信大家这块非常熟悉了。
END
如果对您有帮助 欢迎关注、评论、点赞转发。定期出C#上位机 电气 PLC 运动板卡 STM32 自动化相关心得应用
猜你喜欢
- 2024-09-11 C# (Winform)实现USB HID自定义接口操作(控制下位机,如STM32)
- 2024-09-11 Tcp服务端一直sleep,客户端不断发送数据产生的问题
- 2024-09-11 C#中的进程与线程及其并发编程(c#多线程并发处理)
- 2024-09-11 在服务中默默地执行C#业务代码(在服务中默默地执行c#业务代码)
- 2024-09-11 C#中AutoResetEvent和ManualResetEvent使用场景
- 2024-09-11 C# AutoResetEvent 和 ManualResetEvent 在 WinForms 应用中的使用
- 2024-09-11 C#基础 DateTime详解(c# datetime.date)
- 2024-09-11 C# 面向对象 静态类和静态成员(c# 静态方法和实例方法)
- 2024-09-11 C#编程中如何使用线程(c#线程是什么)
- 2024-09-11 一篇文章搞懂C#中的接口(c#中接口怎么使用)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)