[其他ST产品] PLC编程之ST语言

[复制链接]
2147|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结构:
基本语法是:
  1. IF bool_expression_1 THEN
  2.   <逻辑语句>
  3. ELSE IF bool_expression_2 THEN //这两行可选
  4.   <逻辑语句>
  5. ElSE //这两行可选
  6.   <逻辑语句>
  7. END_IF;

 楼主| lxs0026 发表于 2021-12-28 16:15 | 显示全部楼层
举例:
  1. IF a>b THEN
  2.       flag:=1;
  3.   ELSE IF a<b THEN
  4.       flag:=2;
  5.   ELSE
  6.       flag:=3;
  7.   END_IF;
 楼主| lxs0026 发表于 2021-12-28 16:17 | 显示全部楼层
说明:
  IF语句和梯形图里的常开常闭指令类似,不太推荐用IF语句写复杂逻辑,bool逻辑还是用梯形图写起来方便也直观,除非对ST语言非常热爱同时对梯形图一点不懂。
 楼主| lxs0026 发表于 2021-12-28 16:17 | 显示全部楼层
2,FOR结构:
基本语法是:

  1. FOR  count:= initial_value  TO final_value BY increment DO
  2.   <循环体>
  3. END_FOR;
 楼主| lxs0026 发表于 2021-12-28 16:23 | 显示全部楼层
举例:
  1. sum:=0;
  2. FOR  i:= 2  TO 100 BY 2 DO
  3.       sum:=sum+i; //计算0-100内偶数和,包含100
  4. END_FOR;
 楼主| lxs0026 发表于 2021-12-28 16:24 | 显示全部楼层
说明:
BY可后面跟的步长是可选的,如果没有默认为1.
如果要提前退出循环,可以在循环内部增加一个判断条件,配合EXIT语句实现,如下:
 楼主| lxs0026 发表于 2021-12-28 16:26 | 显示全部楼层
  1. FOR  count:= initial_value  TO final_value BY increment DO
  2. IF bool_expression THEN
  3. EXIT;
  4. END_IF;
  5. END_FOR;
 楼主| lxs0026 发表于 2021-12-28 16:43 | 显示全部楼层
3,CASE结构:
基本语法:
  1. CASE numeric_expression OF
  2. selector_1:
  3.   <逻辑语句>
  4. ……
  5. selector_n:
  6.   <逻辑语句>
  7. ELSE
  8.   <逻辑语句>
  9. END_CASE;
 楼主| lxs0026 发表于 2021-12-28 16:53 | 显示全部楼层
举例:
  1. CASE num OF
  2.   1,2,3:
  3.   a:=10;
  4.   4:
  5.   a:=20;
  6. else
  7.   a:=100;
  8. END_CASE;
 楼主| lxs0026 发表于 2021-12-28 16:54 | 显示全部楼层
说明:
CASE语句和其他高级语言中的CASE语句很类似,但是少了break,实际上这里的CASE只会执行第一个满足条件的语句,相当于在每一个选项里自动增加了一个break操作。
 楼主| lxs0026 发表于 2021-12-28 16:55 | 显示全部楼层
4,WHILE结构:
基本语法:
  1. WHILE bool_expression DO
  2.   <逻辑语句>
  3. END_WHILE;
 楼主| lxs0026 发表于 2021-12-28 17:14 | 显示全部楼层
举例:
  1. i:=0;
  2. sum:=0;
  3. WHILE i=100 DO
  4.   sum:=sum+i;
  5.   i:=i+1;
  6. END_WHILE;

 楼主| lxs0026 发表于 2021-12-28 17:14 | 显示全部楼层
基本结构就上面几种,不同的软件之间可能会有细小差别。
 楼主| lxs0026 发表于 2021-12-28 17:15 | 显示全部楼层
举例:
变量定义:
  1. PROGRAM STStructTest001

  2. TYPE
  3.         student:
  4.         STRUCT
  5.                 gender : ARRAY[1..10] OF BOOL;
  6.                 age : ARRAY[1..10] OF USINT;
  7.                 class : ARRAY[1..10] OF INT;
  8.                 score : ARRAY[1..10] OF  INT;
  9.         END_STRUCT;
  10.        
  11. END_TYPE

  12. VAR

  13.         //stu : ARRAY[1..10] OF student;
  14.         stu1: student;
  15.         num : INT;
  16.         boy : UINT;
  17.         girl: UINT;
  18.         ageSum : UINT;
  19.         scoreSum : UINT;
  20.         i : INT;
  21.         start : bool;
  22.         aveAge : REAL;
  23.         aveScore : REAL;

  24. END_VAR

 楼主| lxs0026 发表于 2021-12-28 17:17 | 显示全部楼层
代码:
  1. IF start THEN       
  2.         num := 10;
  3.         boy := 0;
  4.         girl := 0;
  5.         ageSum := 0;
  6.         scoreSum := 0;
  7.         FOR i:=1 to num BY 1 DO
  8.                 IF stu1.gender[i]=TRUE THEN
  9.                         boy := boy + 1;
  10.                 ELSE
  11.                         girl := girl + 1;
  12.                 END_IF;
  13.                 ageSum := ageSum + stu1.age[i];
  14.                 scoreSum := scoreSum + INT_TO_UINT(stu1.score[i]);
  15.         END_FOR;
  16. END_IF;

  17. aveAge := ageSum / num;
  18. aveScore := aveScore / num;

  19. END_PROGRAM
您需要登录后才可以回帖 登录 | 注册

本版积分规则

103

主题

1290

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部