树莓派工控机作PLC使用结构化文本控制交通灯
引言:使用一段简单的结构化文本PLC程序便可在RevPi Core 3上运行以控制交通信号灯。将RevPi Core 3和DIO安装在DIN导轨上并使其启动运行,我们需要使它们做些有用的事情。作为“概念验证”,我们将实验模拟简单的交通信号灯设置。

Revpi core 3是KUNBUS基于树莓派开发的小型工控机产品,除做数据采集外,作为PLC也是其主要的应用之一,主要依赖于软PLC软件,在中国,虹科与KUNBUS一道推行树莓派在工业上的应用,本文所讲的是树莓派工控机与logi.CAD 3工业编程软件的结合。
结构化文字(ST)语言
有3种主要的标准语言用于创建PLC的控制程序—结构化文本语言(ST),梯形图逻辑和功能块图(FBD)。后两者顾名思义,它们具有更多的图形界面,但不如结构化文本灵活,RevPi附带的免费版本logi.CAD 3仅支持ST,因此我们需要使用它。
尽管结构化文本是受行业标准IEC 61131-3管辖的标准语言,并且该语言的核心都保持一致,但是每个PLC供应商都有自己的独特特点和添加项。我在网上找到了有用的入门教程,这使我入门。对于那些熟悉计算机语言的人来说,ST源自PASCAL,他们会更加熟悉一些。
logi.CAD 3软件
除了处理新语言外,还需要使用新的编程软件。对于logi.CAD 3软件,以下一些术语对于我们在理解并在必要时进行参考还是是很有用的:
对象—logi.CAD 3的项目浏览器中对象位于文件夹中,它是此文件夹的子级。该对象相当于文件系统上的文件。
项目—项目是logi.CAD 3的项目浏览器中文件夹的一种特殊类型。默认情况下,项目是项目浏览器中的根目录。
应用程序项目作为一个完整的内容,不仅包括包含您编写的代码的STL文件,还包括了一些配置文件,以及全局变量和所使用的特定PLC库。
在使用logi.CAD 3的过程中,有时候会发现logi.CAD 3无法构建应用程序,即使其语法和一切都正常的情况下。在这些情况下,我发现通过单击“项目”菜单下的“清理”选项来“清理”项目很有用,让logi.CAD 3执行其操作,然后构建并加载好应用程序。

实际测试下来,设备维持温度于设定值80℃,稳定时间为5分钟,稳定后的精度为±0.1℃:
简单的LED灯闪烁程序
首先我们可以先设计出一个简单的应用程序,该应用程序可以实现闪烁一个LED灯的功能。
PROGRAM RevolutionPiCounterProgram
VAR
value : BOOL;
END_VAR
VAR_EXTERNAL
Red_1 : BOOL;
Yellow_2 : BOOL;
Green_3 : BOOL;
END_VAR
IF value THEN
Red_1 := False;
value := False;
ELSE
Red_1 := True;
value := True;
END_IF;
END_PROGRAM
在此示例中,LED灯会持续闪烁。这是因为PLC应用程序会自动重复此逻辑语句。“End_Program”实际上是指回到开头并重新开始,也就是说当PLC到达END_PROGRAM语句时,PLC扫描周期将再次开始,并且程序将循环自身。
完整的红绿灯程序
现在,需要弄清楚如何使LED指示灯按照标准的交通灯顺序闪烁—红色,红色和黄色,绿色,黄色并返回红色。
首先可以想到的是通过简单地在配置文件中编辑一个值来更改指示灯闪烁的速度,但这会改变整个扫描周期的速度,只会降低应用程序中所有的速度。另外如果能够独立更改不同灯光的速度这也是我们想做的。事实证明,这比预期要困难很多。
TON函数(计时器延迟)提供了需要的延迟操作,但在实际过程中却很难使代码产生预期的效果。即使可以让LED发光一段给定的时间,然后熄灭,然后再也不亮,或者闪烁,但无法指定关闭时间。这里我们寻找到CASE语句。在学习和了解有关CASE语句的信息,最终用CASE编写了示例代码。

最终得到的代码如下:
PROGRAM RevolutionPiProgram
VAR
wait : TON;
count : INT;
END_VAR
VAR_EXTERNAL
Red_1 : BOOL;
Yellow_2 : BOOL;
Green_3 : BOOL;
END_VAR
CASE count OF
0: //init
count := count + 1;
1: // Red
Red_1 := True;
Yellow_2 := False;
Green_3 := False;
wait(IN:=TRUE, PT:=T#5s);
IF wait.Q THEN
wait(IN:=FALSE);
count := count + 1;
END_IF;
2: // Red and Yellow
Red_1 := True;
Yellow_2 := True;
Green_3 := False;
wait(IN:=TRUE, PT:=T#5s);
IF wait.Q THEN
wait(IN:=FALSE);
count := count + 1;
END_IF;
3: // Green
Red_1 := False;
Yellow_2 := False;
Green_3 := True;
wait(IN:=TRUE, PT:=T#5s);
IF wait.Q THEN
wait(IN:=FALSE);
count := count + 1;
END_IF;
4: // Yellow
Red_1 := False;
Yellow_2 := True;
Green_3 := False;
wait(IN:=TRUE, PT:=T#5s);
IF wait.Q THEN
wait(IN:=FALSE);
count := count + 1;
END_IF;
ELSE
count := 0;
END_CASE;
END_PROGRAM
如果出现特定的整数值,则使用CASE执行语句。在此示例中,创建了一个名称为“count”的整数变量,该整数变量将在每次PLC扫描时增加1,直到运行到最后以及ELSE将其设置回零为止。TON用于运行每个语句5秒钟。可以通过编辑以下行中的5s值轻松更改此值:
wait(IN:=TRUE, PT:=T#5s);
如果需要,也可以为每个序列的灯光分配不同的时间(如将它们全部更改为2秒)。该代码也可以轻松扩展以添加更多的灯光。
另外值得一提的是,我们也可以用Codesys来做这项工作,Codesys是软PLC的代表,也是logi.CAD3的替代产品,需要注意的是Codesys所使用的ST语法与logi.CAD 3还是存在一些小小的差异,需要根据需求去调整。
总结
掌握一种新的计算机语言和一个陌生的软件始终是一个挑战,但是我们对最终找到解决方案感到兴奋和满意。尽管最终使用起来的灯可能不完全符合实际的交通状况,但我们可以从这次示例中看到如何通过一些实践将它们开发出来,以在诸如表演等其他行业或类似场合的一次性活动中进行简单的交通控制。同时我们也可以看到树莓派用作工业控制上面的广阔前景。