【应用】博图SCL语言之抢答器应用

使用博图的SCL语言来完成多人抢答器的应用案例。


前言

在上一篇我们将常用的指令梳理了一遍,有一些没有说到的,在应用中如果用到了,咱们再详细说一下!那下面,简单的一些应用实例我们就可以动手试一试了!本文就从之前的抢答器开始(在之前我们使用梯形图做过这个应用),使用SCL语言来完成编写!


一、控制要求和I/O分配

1.控制要求

设有 4 组抢答器,有 4 位选手,一位主持人,主持人有一个开始答题按钮 SD ,一个系
统复位按钮 SR 。如果主持人按下开始答题按钮,则 4 位选手开始抢答,与此同时,开始抢
答指示灯 L5 亮进行抢答提示。抢先按下按钮的选手的正常抢答指示灯亮,其他选手按钮不
起作用。如果主持人未按下开始答题按钮,就有选手抢答,则认为犯规,指示灯 L6 闪亮。
当主持人按下开始答题按钮,时间开始倒计时,在 10 秒内仍无人抢答,则指示灯 L6 常亮,
此后不能再有选手抢答。所有情况,只要主持人按下系统复位按钮后,系统回到初始状态。

 2.I/O分配

I/O分配
输入输出
名称作用地址名称作用地址
SD开始抢答按钮I0.0L1抢答提示指示灯Q0.0
SR系统复位按钮I0.1L6指示灯L6Q0.1
SB11号抢答按钮I0.2L21号指示灯Q0.2
SB22号抢答按钮I0.3L32号指示灯Q0.3
SB33号抢答按钮I0.4L43号指示灯Q0.4
SB44号抢答按钮I0.5L54号指示灯Q0.5

3.具体场景

具体场景就类似那种,一些节目设置的抢答题目,然后让多个选手进行抢答,抢答成功就亮灯可以回答问题了就,大致就像这样:


二、编写

根据控制要求我们来看,4组抢答器,1个主持人,大体上就是4个抢答器,然后根据要求往上加内容,所以一开始我们可以先写四组抢答器,其他的慢慢加。

这里进行调试时可以直接用仿真监视看状态就可以,也可以用虚拟工厂看的更直观一些,当然直接用PLC最好!(这里优先使用仿真和虚拟工厂,哈哈) 

1.建立变量

新建一个项目大家都很熟悉了,下面就建立一个数据块和函数块FB/FC选择SCL语言,然后把变量写里面,都是bool量,下面的中继和上升沿备用! 

 然后找到这里就可以编写了!

2.编写

1.四路抢答器互锁 

按照我们想的先写出四路抢答器

先用if语句接通一个中继1 

//启动
IF "数据块_1".开始抢答按钮 THEN
    "数据块_1".中继1 := 1;
END_IF; 

当中继1为1的时候,我们将4个抢答器写进去,然后再利用指示灯来完成互锁; 

//4个抢答器和指示灯互锁
IF "数据块_1".中继1 THEN
    
    
    
END_IF; 

 这里当1号抢答按钮接通为1时,就点亮1号指示灯;同时在条件这里要加上另外3个指示灯来完成互锁这一功能(其中一个抢答成功后,另外3个无法再抢答)。

IF "数据块_1".1号抢答按钮 & NOT "数据块_1"."2号指示灯" & NOT "数据块_1"."3号指示灯" & NOT "数据块_1"."4号指示灯" THEN
        "数据块_1"."1号指示灯" := 1;
    END_IF; 

 另外3个和上面一样,形成互锁,然后放进大的if语句中;

//4个抢答器和指示灯互锁
IF "数据块_1".中继1 THEN
    
    IF "数据块_1"."1号抢答按钮" & NOT "数据块_1"."2号指示灯" & NOT "数据块_1"."3号指示灯" & NOT "数据块_1"."4号指示灯" THEN
        "数据块_1"."1号指示灯" := 1;
    END_IF;


    IF "数据块_1"."2号抢答按钮" & NOT "数据块_1"."1号指示灯" & NOT "数据块_1"."3号指示灯" & NOT "数据块_1"."4号指示灯" THEN
        "数据块_1"."2号指示灯" := 1;
    END_IF;


    IF "数据块_1"."3号抢答按钮" & NOT "数据块_1"."1号指示灯" & NOT "数据块_1"."2号指示灯" & NOT "数据块_1"."4号指示灯" THEN
        "数据块_1"."3号指示灯" := 1;
    END_IF;


    IF "数据块_1"."4号抢答按钮" & NOT "数据块_1"."1号指示灯" & NOT "数据块_1"."2号指示灯" & NOT "数据块_1"."3号指示灯" THEN
        "数据块_1"."4号指示灯" := 1;

    END_IF;


    END_IF;

 2.抢答提示指示灯

这一小部分也是放在大的if语句中的,当中继1为1,抢答指示灯就亮,当4为选手中有一位抢答成功,灯就灭了。 

  "数据块_1".抢答提示指示灯 := NOT "数据块_1"."1号指示灯" & NOT "数据块_1"."2号指示灯" & NOT "数据块_1"."3号指示灯" & NOT "数据块_1"."4号指示灯";

和下图类似: 

3.提前抢答和超时不抢答

 根据要求,在没有按下抢答按钮时,就提前抢答是要闪烁指示灯来提示;如果超过10s没人抢答L6指示灯常亮。

当这4个其中一个违规按下,就接通中继2,然后中继2接一个1s脉冲给指示灯进行闪烁; 

//在没按开始抢答时,提前抢答,L6指示灯闪烁。
IF "数据块_1"."1号抢答按钮" OR "数据块_1"."2号抢答按钮" OR "数据块_1"."3号抢答按钮" OR "数据块_1"."4号抢答按钮" THEN
    "数据块_1".中继2 := 1;
END_IF; 

超时不抢答:接通中继3连接指示灯6,然后将中继1断开。

//计时部分,超过时间没人答题就亮L6指示灯,并且此时选手不能抢答。
"IEC_Timer_0_DB".TON(IN := "数据块_1".中继1 & NOT "数据块_1"."1号指示灯" & NOT "数据块_1"."2号指示灯" & NOT "数据块_1"."3号指示灯" & NOT "数据块_1"."4号指示灯",
                     PT := T#5s,
                     Q => "数据块_1".定时器输出);
IF "数据块_1".定时器输出 THEN
    "数据块_1".中继3 := 1;
    "数据块_1".中继1 := 0;
END_IF; 
//指示灯L6
"数据块_1".指示灯L6 := NOT "数据块_1".中继1 & "数据块_1".中继2 & "Clock_1Hz" OR "数据块_1".中继3;
IF "数据块_1".指示灯L6 THEN
    "数据块_1".抢答提示指示灯 := 0;
END_IF;  

 4.完善

 关于抢答部分,为了保险起见最好用上升沿来触发指示灯:

具体的使用:在输入端放入按钮或开关,输出点Q输出一个扫描周期的上升沿。

 最后还有复位停止,就将输出点赋值为0就OK!


 三、效果

 1.仿真效果

 打开仿真,进行下载,然后调到监视状态。如图:

 然后先按下抢答按钮,再让1号抢答:如果再让2号抢答系统不会相应;

 然后再测试,如果超过10s没人抢答,L6会不会亮:这里可以看到当到达10s后,指示灯L6亮了。

 最后是提前抢答,看L6会不会闪烁:如图L6是会闪烁的。

2.虚拟工厂效果 

下图是和factoryio连接使用的程序。 

 如果是和factoryio一起仿真的话,就在里面提前布置一下场景和变量,然后和博图连接来看效果。

如图:上面是选手抢答部分,下面是主持人部分,旁边是指示灯。 

 这个也可以看一下完成后的效果:

 3.FB块程序代码

1.形参 

 

 

2.代码 

(*
设有 4 组抢答器,有 4 位选手,一位主持人,主持人有一个开始答题按钮 SD,一个系
统复位按钮 SR。如果主持人按下开始答题按钮,则 4 位选手开始抢答,与此同时,开始抢
答指示灯 L5 亮进行抢答提示。抢先按下按钮的选手的正常抢答指示灯亮,其他选手按钮不
起作用。如果主持人未按下开始答题按钮,就有选手抢答,则认为犯规,指示灯 L6 闪亮。
当主持人按下开始答题按钮,时间开始倒计时,在 10 秒内仍无人抢答,则指示灯 L6 常亮,
此后不能再有选手抢答。所有情况,只要主持人按下系统复位按钮后,系统回到初始状态。
*)

//停止部分,将输出点清零
IF #SR THEN
    #L1 := 0;
    #L2 := 0;
    #L3 := 0;
    #L4 := 0;
    #L5 := 0;
    #L6 := 0;
    #开始抢答标志 := 0;
    #抢答完成标志 := 0;
    #中继1 := 0;
    #中继2 := 0;
    RESET_TIMER(#T[0]);
END_IF;

//启动部分
IF #SD THEN
    #开始抢答标志 := 1;
END_IF;
//启动延时10s部分
#T[0].TON(IN := #开始抢答标志 & NOT #抢答完成标志 ,
          PT := T#10s,
          ET => #当前时间);

IF #开始抢答标志 & NOT #中继2 THEN
    #L5 := 1;
END_IF;
//第1路抢答器
IF #开始抢答标志 & #S1 & NOT #抢答完成标志 & NOT #中继1 & NOT #中继2 THEN
    #抢答完成标志 := 1;
    #L1 := 1;
END_IF;
//第1路抢答器
IF #开始抢答标志 & #S2 & NOT #抢答完成标志 & NOT #中继1 & NOT #中继2 THEN
    #抢答完成标志 := 1;
    #L2 := 1;
END_IF;
//第3路抢答器
IF #开始抢答标志 & #S3 & NOT #抢答完成标志 & NOT #中继1 & NOT #中继2 THEN
    #抢答完成标志 := 1;
    #L3 := 1;
END_IF;
//第4路抢答器
IF #开始抢答标志 & #S4 & NOT #抢答完成标志 & NOT #中继1 & NOT #中继2 THEN
    #抢答完成标志 := 1;
    #L4 := 1;
END_IF;

//如果抢答完成标志为1,亮L6
IF #T[0].Q & NOT #抢答完成标志 THEN
   
    #中继1 := 1;
    #L6 := 1;
END_IF;

//提前抢答,L6闪亮
IF  NOT #开始抢答标志 & #S1 OR NOT #开始抢答标志 & #S2 OR NOT #开始抢答标志 & #S3 OR NOT #开始抢答标志 & #S4 THEN
    #中继1 := 0;
    #L6 := 0;
    
    #中继2 := 1;
    
END_IF;
IF #中继2 THEN
    #L6 := "Clock_1Hz";
END_IF;

 3.在主程序调用然后写上实际参数

 ​​​​​​​

 

  


四、练习题 (音乐喷泉)

最后呢,下面这题大家可先自己试一试,看能否完成控制要求!加油! 

控制要求:
按下启动按钮, L1 灯亮, 0.5S 后灭→ L2 灯亮, 0.5S 后灭→ L3 灯亮, 0.5S 后灭→ L4
亮, 0.5S 后灭→ L5 灯亮, 0.5S 后灭→ L6 灯亮, 0.5S 后灭→ L7 灯亮, 0.5S 后灭→ L8 灯亮,
0.5S 后灭,以此循环下去 .......
按下停止按钮,停止循环全部灯灭。

总结

以上就是本篇文章的内容啦!边写边说将抢答器这个写出来了,大部分都是用的if语句和逻辑运算符那个,程序可以参考,最好还是看一遍根据要求写出来,主要还是自己的思路,之后有些题的要求会很复杂,有思路就会好很多的!

今天就到这里啦!拜拜!!

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值