打印
[其他ST产品]

PLC编程之ST语言

[复制链接]
997|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lxs0026|  楼主 | 2021-12-28 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST语言是IEC61131-3中规定的5中标准语言之一,目前常用见品牌的PLC都支持这种语言(施耐德,AB可以直接选择创建该类型的程序段或者功能块,西门子的略微麻烦一点),ST语言的一个好处是移植性好,各家的ST语言基本都是类似的,所以如果有一个巨牛X的算法,用ST语言实现是再好不过的了,这样可以很容易的在多个品牌的PLC上移植,当前,有个前提条件是在这个算法中不要使用太多的系统功能块,因为系统功能块往往都是各个品牌比较个性的东西,会给移植带来麻烦。另外,ST语言最适合写一些复杂的算法,个人觉得尤其是对应一些数组的操作,用ST语言是最方便的,当然有梯形图也能实现,不过远没有用ST来的方便。ST语言的语法和pascal,C语言等都非常像,有时候各种语言用多了,就会混,所以这里将ST语言的几种常用控制语句记录下来。

使用特权

评论回复
沙发
lxs0026|  楼主 | 2021-12-28 16:03 | 只看该作者
1,IF结构:
基本语法是:
IF bool_expression_1 THEN
  <逻辑语句>
ELSE IF bool_expression_2 THEN //这两行可选
  <逻辑语句>
ElSE //这两行可选
  <逻辑语句>
END_IF;

使用特权

评论回复
板凳
lxs0026|  楼主 | 2021-12-28 16:15 | 只看该作者
举例:
IF a>b THEN
      flag:=1;
  ELSE IF a<b THEN
      flag:=2;
  ELSE
      flag:=3;
  END_IF;

使用特权

评论回复
地板
lxs0026|  楼主 | 2021-12-28 16:17 | 只看该作者
说明:
  IF语句和梯形图里的常开常闭指令类似,不太推荐用IF语句写复杂逻辑,bool逻辑还是用梯形图写起来方便也直观,除非对ST语言非常热爱同时对梯形图一点不懂。

使用特权

评论回复
5
lxs0026|  楼主 | 2021-12-28 16:17 | 只看该作者
2,FOR结构:
基本语法是:

FOR  count:= initial_value  TO final_value BY increment DO
  <循环体>
END_FOR;

使用特权

评论回复
6
lxs0026|  楼主 | 2021-12-28 16:23 | 只看该作者
举例:
sum:=0;
FOR  i:= 2  TO 100 BY 2 DO
      sum:=sum+i; //计算0-100内偶数和,包含100
END_FOR;

使用特权

评论回复
7
lxs0026|  楼主 | 2021-12-28 16:24 | 只看该作者
说明:
BY可后面跟的步长是可选的,如果没有默认为1.
如果要提前退出循环,可以在循环内部增加一个判断条件,配合EXIT语句实现,如下:

使用特权

评论回复
8
lxs0026|  楼主 | 2021-12-28 16:26 | 只看该作者
FOR  count:= initial_value  TO final_value BY increment DO
IF bool_expression THEN
EXIT;
END_IF;
END_FOR;

使用特权

评论回复
9
lxs0026|  楼主 | 2021-12-28 16:43 | 只看该作者
3,CASE结构:
基本语法:
CASE numeric_expression OF
selector_1:
  <逻辑语句>
……
selector_n:
  <逻辑语句>
ELSE
  <逻辑语句>
END_CASE;

使用特权

评论回复
10
lxs0026|  楼主 | 2021-12-28 16:53 | 只看该作者
举例:
CASE num OF
  1,2,3:
  a:=10;
  4:
  a:=20;
else
  a:=100;
END_CASE;

使用特权

评论回复
11
lxs0026|  楼主 | 2021-12-28 16:54 | 只看该作者
说明:
CASE语句和其他高级语言中的CASE语句很类似,但是少了break,实际上这里的CASE只会执行第一个满足条件的语句,相当于在每一个选项里自动增加了一个break操作。

使用特权

评论回复
12
lxs0026|  楼主 | 2021-12-28 16:55 | 只看该作者
4,WHILE结构:
基本语法:
WHILE bool_expression DO
  <逻辑语句>
END_WHILE;

使用特权

评论回复
13
lxs0026|  楼主 | 2021-12-28 17:14 | 只看该作者
举例:
i:=0;
sum:=0;
WHILE i=100 DO
  sum:=sum+i;
  i:=i+1;
END_WHILE;

使用特权

评论回复
14
lxs0026|  楼主 | 2021-12-28 17:14 | 只看该作者
基本结构就上面几种,不同的软件之间可能会有细小差别。

使用特权

评论回复
15
lxs0026|  楼主 | 2021-12-28 17:15 | 只看该作者
举例:
变量定义:
PROGRAM STStructTest001

TYPE
        student:
        STRUCT
                gender : ARRAY[1..10] OF BOOL;
                age : ARRAY[1..10] OF USINT;
                class : ARRAY[1..10] OF INT;
                score : ARRAY[1..10] OF  INT;
        END_STRUCT;
       
END_TYPE

VAR

        //stu : ARRAY[1..10] OF student;
        stu1: student;
        num : INT;
        boy : UINT;
        girl: UINT;
        ageSum : UINT;
        scoreSum : UINT;
        i : INT;
        start : bool;
        aveAge : REAL;
        aveScore : REAL;

END_VAR

使用特权

评论回复
16
lxs0026|  楼主 | 2021-12-28 17:17 | 只看该作者
代码:
IF start THEN        
        num := 10;
        boy := 0;
        girl := 0;
        ageSum := 0;
        scoreSum := 0;
        FOR i:=1 to num BY 1 DO
                IF stu1.gender[i]=TRUE THEN
                        boy := boy + 1;
                ELSE
                        girl := girl + 1;
                END_IF;
                ageSum := ageSum + stu1.age[i];
                scoreSum := scoreSum + INT_TO_UINT(stu1.score[i]);
        END_FOR;
END_IF;

aveAge := ageSum / num;
aveScore := aveScore / num;

END_PROGRAM

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

89

主题

1050

帖子

1

粉丝