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


前言

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


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

1.控制要求

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

 2.I/O分配

I/O分配
输入 输出
名称 作用 地址 名称 作用 地址
SD 开始抢答按钮 I0.0 L1 抢答提示指示灯 Q0.0
SR 系统复位按钮 I0.1 L6 指示灯L6 Q0.1
SB1 1号抢答按钮 I0.2 L2 1号指示灯 Q0.2
SB2 2号抢答按钮 I0.3 L3 2号指示灯 Q0.3
SB3 3号抢答按钮 I0.4 L4 3号指示灯 Q0.4
SB4 4号抢答按钮 I0.5 L5 4号指示灯 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语句和逻辑运算符那个,程序可以参考,最好还是看一遍根据要求写出来,主要还是自己的思路,之后有些题的要求会很复杂,有思路就会好很多的!

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐