大伙儿晚上今天瞎忙活了一天,总算有点空闲时间,想着把我最近捣鼓ST这玩意儿的一些基础心得给大家唠唠。这东西,刚上手确实有点懵,不过啃下来之后发现,诶,还真挺有意思的。
一切的开始:为啥要碰ST?
事情是这样的,前阵子接了个小活儿,对方的设备用的是某品牌的PLC,然后要求程序得用ST语言写。我当时就头大了,咱以前在学校里摸过的,还有厂里大部分设备,不都是梯形图(LD)或者功能块图(FBD)嘛这ST是啥玩意儿?两眼一抹黑。没办法,硬着头皮得上,不然项目咋整。
摸索阶段:资料翻起来,虚拟机搭起来
我就在网上胡乱搜罗了一堆资料,什么官方手册,论坛帖子,看得我云里雾里。后来发现,光看理论不行,必须得实际上手操作。我就在自己电脑上装了个PLC的编程软件,它一般都带仿真功能。没有实际PLC硬件不要紧,先在仿真环境里跑起来再说。
第一步,我先琢磨的是这ST语言的基本结构。它长得有点像咱们以前学的Pascal或者C语言,一行一行往下写,不像梯形图那样横着一条条的。
啃硬骨头:语法基础逐个过
接下来就是具体语法了,我把我当时重点关注和实践的几个点给大家说说:
- 赋值语句:这个最基本了。ST里面赋值用的是 `:=` 这个符号。比如 `MyVariable := 10;` 就是把10这个值赋给一个叫 `MyVariable` 的变量。我一开始老容易写成C语言的 `=`,结果编译器老报错,后来才慢慢习惯过来。每条语句结束,一般都要有个分号 `;`。
- 数据类型:跟其他编程语言差不多,ST也有啥布尔型(BOOL,就是TRUE或FALSE)、整型(INT, SINT, DINT等)、实型(REAL)、时间(TIME)这些。定义变量的时候就得先想好用啥类型。
- 条件判断:这个老重要了。主要是 `IF...THEN...ELSIF...THEN...ELSE...END_IF;` 结构。比如:
IF StartButton THEN
MotorRun := TRUE;
ELSIF StopButton THEN
MotorRun := FALSE;
ELSE
MotorRun := MotorRun; // 保持原样
END_IF;
看,这样是不是比梯形图里绕来绕去的线圈和触点有时候要清晰点?特别是逻辑复杂的时候。我还试了 `CASE` 语句, `CASE Variable OF 1: Action1; 2: Action2; ELSE DefaultAction; END_CASE;` 这种,处理多分支选择也挺方便。
- 循环结构:常用的有 `FOR...TO...BY...DO...END_FOR;` 和 `WHILE...DO...END_WHILE;` 还有 `REPEAT...UNTIL...END_REPEAT;`。我当时就用 `FOR` 循环写了个简单的累加程序,从1加到100,感受了一下它的执行流程。比如:
SumValue := 0;
FOR Counter := 1 TO 100 DO
SumValue := SumValue + Counter;
END_FOR;
这个 `END_FOR`、`END_IF`、`END_WHILE` 这些 `END_XXX` 千万别忘了写,不然编译通不过
- 函数和功能块(FB):这个就更高级一点了。可以把一些常用的代码段封装成函数(FUN)或者功能块(FB)。功能块牛逼的地方在于它可以有自己的内部变量(静态变量),每次调用都能记住上次的状态。我当时就试着写了个简单的计时器FB的逻辑雏形,虽然软件里一般都有现成的,但自己写一遍理解更深。
实践出真知:写个小例子跑跑看
光看语法肯定不行,我就拿手头最简单的任务练手:控制一个虚拟的指示灯,按一下按钮灯亮,再按一下灯灭。用ST写这个逻辑,先是定义了按钮输入 `Button_Press`(BOOL类型),指示灯输出 `Lamp_Out`(BOOL类型),还有一个内部变量 `Lamp_State_Memory`(BOOL类型)用来记住灯当前的状态。
逻辑大概是这样:
IF Button_Press AND NOT Edge_Flag THEN // 检测按钮上升沿
Lamp_State_Memory := NOT Lamp_State_Memory; // 状态取反
END_IF;
Edge_Flag := Button_Press; // 更新边沿检测标志
Lamp_Out := Lamp_State_Memory; // 输出给灯
(这里简化了上升沿检测,实际项目中会用专门的R_TRIG功能块)
然后在仿真环境里,点几下那个虚拟按钮,看着灯的状态跟着变,那种感觉还挺不错的!虽然是个特简单的例子,但起码让我对ST的执行流程有了点感觉。
小总结一下
总的来说,ST这东西,对我这种习惯了梯形图的人来说,一开始确实需要转换一下思维。但熟悉了之后,会发现它在处理复杂算法、数据运算、或者需要大量文本化逻辑描述的时候,确实比图形化语言要灵活和高效。代码也更容易管理和阅读(前提是写得规范,注释要到位)。
我这也就是个入门的实践记录,里面肯定还有很多理解不到位的地方。ST的水还深着,什么指针、结构体、面向对象(有些PLC支持),都还没怎么碰。不过万事开头难嘛先把基础打扎实了,后面再慢慢深入。
今天就先分享到这儿,希望能给同样在入门ST或者对ST感兴趣的朋友一点点小启发。下次有机会,再聊聊我在项目里具体是怎么用ST解决问题的。睡觉!
还没有评论,来说两句吧...