ST语言.docx
- 文档编号:10909746
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:17
- 大小:56.72KB
ST语言.docx
《ST语言.docx》由会员分享,可在线阅读,更多相关《ST语言.docx(17页珍藏版)》请在冰豆网上搜索。
ST语言
ST语言学习心得
一、工程的简介和建立工程
1.工程文件的结
工程文件的后缀名为pro,在新工程中建立的第一个程序结构单元(ProgramOrganizationUnit)将被自动命名为PLC_PRG,这个程序结构单元就类似于C
语言中的主程序。
在PLC_PRG中可以调用各种函数及功能块,而函数和功能块都属于程序结构单元。
PLC-1131-3DS能够区分在同一工程中的不同对象:
程序结构单元(POU)
数据类型(datatypes)
资源(resources)
2.工程的设置:
1)首先应该设置PLC的输入输出以保证工程中使用的地址的准确性。
2)接着建立解决问题的程序结构单元
3)选择适当的语言编写程序
4)写好程序之后,对程序进行编译去除程序中的所有错误。
3.工程的测试:
当工程之中的所有错误被去除之后激活仿真模式,就是与仿真PLC连接,与此同时将工程下载到PLC中,这样PLC-1131-3DS就处于在线方式了。
现在能以适当的顺序测试工程了,手动改变输入变量的值,观察输出是否正确。
用PLC-1131-3DS调试程序
当程序发生错误时,你可以设置断点。
当处理发生中断时,你就可以及时的在断点处检查所有工程变量的值。
工作在单步方式(singlestep)下,可以检验程序的逻辑错误。
你可以强制输入或输出变量的值。
使用流控制(flowcontrol)可以知道哪些程序段已经执行。
采样轨迹(SamplingTrace)显示变量在长时间的变化过程曲线。
整个工程可以以文本文件的形式导出。
总而言之PLC-1131-3DS对于PLC编程是一种完善和方便的工具。
4.工程的组成
(1)工程(Project)
一个工程包括了PLC程序中所有的对象,工程中包含了如下对象:
·程序结构单元POUs
·数据类型datatypes
·资源resources
·库函数libraries
(2)程序结构单元(POU)
函数 (Functions),功能块(functionblocks)和程序(programs)都是程序结构单元(POUs)。
每个POU包括了定义变量和程序主体两个部分。
程序主体用IEC编程语言编写,其中包括:
指令表(IL)
结构文本(ST)
SFC
FBD
梯形图(LD).
PLC-1131-3DS支持所有的标准IEC程序结构单元。
POUs之间能够相互调用,但是不允许递归调用.
(3)函数(Function)
当定义函数的时候,不要忘记函数中必须含有返回值的数据类型,也就是说在函数名的后面必需紧跟冒号和一个数据类型。
二.ST结构化文本编程
1.定义
"结构"是指高水平的结构化编程能力,象一个"结构化的编程";"文本"是指应用文本而不是梯形图和顺序函功能表的能力。
ST语言不能代替其它的语言,每种语言都有它自己的优点和缺点。
ST主要的一个优点就是能简化复杂的数学方程。
2.特点
高级文本编程语言
结构化的编程
简单的标准结构
快速高效的编程
使用直观灵活
与PASCAL类似
有计算机编程经验的人可以很容易地使用它
符合IEC61131-3标准
3.功能
数字量和模拟量I/O
逻辑操作
逻辑比较表达式
算术运算
判断语句
机器的状态语句
循环语句
功能块
可选用的动态变量
诊断工具
4.结构文本基础
IFvalue<7THEN
WHILEvalue<8DO
value:
=value+1;
END_WHILE;
END_IF;
4.1 表达式
表达式是指返回变量评估值的结构。
表达式由操作符和操作数组成。
操作数可以
是常量,变量,调用函数或其它表达式。
4.2赋值操作符
通过一个表达式和一个值来给变量赋值。
赋值语句包括位于左边的变量,赋值操
作符":
=",及后边需要计算的表达式。
所有的语句,包括赋值语句,必须要以分
号";"结尾。
当这行程序执行后,变量"Var1"的值是变量"Var2"的两倍。
4.3注释
虽然注释经常被删掉,但它们是源代码中非常重要的一部分。
它们解释了一部分
代码,使程序更易读懂。
注释帮助你或其他人读你的程序,即使过去了很长时
间。
注释不被编译,因此不会影响程序的执行。
注释应该用一对星号和小括号括
起来"(*comment*)"。
4.4操作符优先级
如果在一个表达式中使用几个操作符,就会出现优先级的问题(执行的顺序)。
操作符按优先级的顺序来执行。
在任何一个表达式中,首先执行最高级别的操作符,接着执行低一级的操作符,
等等,直到执行完所有的操作符。
具有相同级别的操作符按照书写顺序从左至右
依次执行。
操作符
符号/语言
优先级
括号
()
依次降低
函数调用
例子
Callargument(s)
LN(A),MAX(X),等
注释
**
取反
NOT
乘
*
除
/
取模(取除法的余数)
MOD
加
+
减
-
比较
<,>,<=,>=
等于
=
不等于
<>
逻辑与
AND
逻辑异或
XOR
逻辑或
OR
4.5结构文本格式编程格式指令
指令类型
例子
赋值(Assignment)
A:
=B;CV:
=CV+1;C:
=SIN(X);
调用功能块或者函数的返回值(CallingafunctionblockanduseoftheFBoutput)
CMD_TMR(IN:
=%IX5,PT:
=300);
A:
=CMD_TMR.Q
返回(RETURN)
RETURN;
IF(条件)
D:
=B*B;
IFD<0.0THEN
C:
=A;
ELSIFD=0.0THEN
C:
=B;
ELSE
C:
=D;
END_IF;
CASE(分支)
CASEINT1OF
1:
BOOL1:
=TRUE;
2:
BOOL2:
=TRUE;
ELSE
BOOL1:
=FALSE;
BOOL2:
=FALSE;
END_CASE;
FOR(循环)
J:
=101;
FORI:
=1TO100BY2DO
IFARR[I]=70THEN
J:
=I;
EXIT;
END_IF;
END_FOR;
WHILE(循环)
J:
=1;
WHILEJ<=100ANDARR[J]<>70DO
J:
=J+2;
END_WHILE;
REPEAT(重复)
J:
=-1;
REPEAT
J:
=J+2;
UNTILJ=101ORARR[J]=70
END_REPEAT;
EXIT(退出)
EXIT;
Emptyinstruction(空指令)
;
用结构文本编程格式编写的程序与其它格式的编程语言相比出错概率低,编写的程序具有可读性高的特点。
(1)调用功能块(Callingafunctionblock)
结构文本编程格式通过在功能块名后面的括号里分配参数值来调用功能块的功能
在下面的例子中通过分配参数IN和PT的值调用一定时器功能块,它的结果变量的值被赋给变量A。
CMD_TMR(IN:
=%IX5,PT:
=300);
A:
=CMD_TMR.Q
(2)返回指令(RETURNinstruction)
返回指令用来结束函数调用,当条件满足时返回主程序
(3)条件指令(IFinstruction)
使用IF指令检验是否满足条件,当条件满足时执行相应的的指令
语法:
IF<布尔表达式_1>THEN
{ELSIF<布尔表达式_2>THEN
.
.
ELSIF<布尔表达式_n>THEN
ELSE
END_IF;
{}里面的内容是可选的。
如果<布尔表达式1>的返回值为真(TRUE),那么只有
不执行。
否则检验<布尔表达式2>的返回值是否为真,这样连续判断<布尔表达式n>的返回值,直到返回值为真时执行对应的指令。
如果执行到最后表达式的返回值也没有为真,那么执行
例:
IFtemp<17
THENheating_on:
=TRUE;
ELSEheating_on:
=FALSE;
END_IF;
这段程序控制加热功能的开启和关闭,当温度高于17度时不加热,当温度低于17度时就加热。
(4)分支指令(CASEinstruction)
使用分支指令可以将一些具有相同条件变量的指令结合在一个结构中
语法:
CASE<变量1>OF
<=1>:
<指令1>
<=2>:
<指令2>
...
<=n>:
<指令n>
ELSE
END_CASE;
CASE指令根据下面的模式处理程序:
如果变量的值为i,那么执行<指令i>中的指令。
如果没有相应的变量的值,那么执行ELSE指令
如果需要几个不同的变量值执行相同的指令,那么可以将几个变量值写在一起用逗号隔开,后面接需要执行的指令。
例:
CASEINT1OF
1,5:
BOOL1:
=TRUE;
BOOL3:
=FALSE;
2:
BOOL2:
=FALSE;
BOOL3:
=TRUE;
ELSE
BOOL1:
=NOTBOOL1;
BOOL2:
=BOOL1ORBOOL2;
END_CASE;
(5)循环指令(FOR)
<步长Stepsize>}DO
<指令Instructions>使用FOR循环指令可以重复程序处理的过程。
语法:
整形变量INT_Var:
INT;
FOR<整形变量INT_Var>:
=<初始值INIT_VALUE>TO<终止值END_VALUE>{BY
END_FOR;
{}中的内容可选的.
只要
在执行指令之前就检验这个条件,如果条件得不到满足就不执行
当指令被执行一次之后<整形变量INT_Var>就增加
当得到
停止循环。
例:
FORCounter:
=1TO5BY1DO
Var1:
=Var1*2;
END_FOR;
Res:
=Var1;
我们假设Var1的初始值为1,那么循环结束时变量Var1的值为32。
(6)循环指令(WHILEloop)
WHILE循环指令的用法与FOR循环指令相似,它们的不同之处在于WHILE循环的判断条件有些不同,它可以是任何布尔表达式。
也就是说只要满足你给定的条件时,就执行循环指令。
语法:
WHILE<布尔表达式>
<指令>
END_WHILE;
只要<布尔表达式>的返回值为真TRUE,也就是条件满足的时候,<指令>将重复执行,直到<布尔表达式>的返回值为假FALSE。
如果在第一次判断条件时就不满足,那么没有执行一次指令循环就结束了。
当<布尔表达式>的返回值始终为真时,指令就无限的循环执行下去,进入死循环状态。
这在编程时要尽量避免。
例:
WHILEcounter<>0DO
Var1:
=Var1*2;
Counter:
=Counter-1;
END_WHILE
WHILE循环和REPEAT循环在某种意义上来说比FOR循环更实用,因为在某种情况下我们不能确定循环的次数,在这种情况下只能用WHILE循环指令或者REPEAT循环指令。
但是FOR循环指令的循环次数是一定的,所以用FOR循环指令编程可以避免死循环的出现。
(7)循环指令(REPEATloop)
REPEAT循环指令不同于WHILE循环指令的地方在于指令执行条件的判定顺序,REPEAT循环指令在判断条件之前就执行指令,也就是说REPEAT循环指令至少可以执行一次而不考虑判定条件。
WHILE循环指令就不同,可能指令一次也不执行就终止循环。
语法:
REPEAT
<指令>
UNTIL<布尔表达式>
END_REPEAT;
当<布尔表达式>的返回值为真时,就是说判定条件满足的时候就终止循环。
如果<布尔表达式>在第一次检验的时候满足条件,那么整个循环只执行一
次。
如果条件始终得不到满足,进入死循环状态,编程时需尽量避免这种情况的发生。
例:
REPEAT
Var1:
=Var1*2;
Counter:
=Counter-1;
UNTIL
Counter=0
END_REPEAT;
(8)退出指令(EXITinstruction)
如果EXIT指令出现在FOR、WHILE、REPET循环指令里面的时候,循环将不考虑中断条件是否满足就无条件中断正在进行中的循环。
4.6布尔逻辑操作
操作数不需要是BOOL类型。
布尔逻辑操作:
符号
逻辑操作
例子
NOT
取反
a:
=NOTb;
AND
逻辑与
a:
=bANDc;
OR
逻辑或
a:
=bORc;
XOR
异或
A:
=bXORc;
这些操作符可以形成一个逻辑表达式和条件语句,结果是真(TRUE)或(FALSE)。
4.7算术运算
4.7.1 基本的算术运算
ST为应用程序提供了以下基本的算术运算:
符号
算术操作
例子
:
=
赋值
a:
=b;
+
加
a:
=b+c;
-
减
a:
=b-c;
*
乘
a:
=b*c;
/
除
a:
=b/c;
MOD
取模(显示余数)
a:
=bmodc;
数据类型是非常重要的参数,结果也依赖于语法和数据类型。
表达式左边的数据类型应该等同于(或大于)右边的数据类型。
4.7.2隐形数据类型转换
该类型的转换由编译器完成。
编译器将表达式中低的数据类型转换成高的数据类
型。
如果有两种或多个类型的变量参与运算,那么必须将它们转换成相同的类型
以便执行运算。
数据类型
BOOL
SINT
INT
DINT
USINT
UINT
UDINT
REAL
BOOL
BOOL
\
\
\
\
\
\
\
SINT
\
INT
DINT
USINT
UINT
UDINT
REAL
INT
\
SINT
DINT
USINT
UINT
UDINT
REAL
DINT
\
SINT
INT
USINT
UINT
UDINT
REAL
USINT
\
SINT
INT
DINT
UINT
UDINT
REAL
UINT
\
SINT
INT
DINT
USINT
UDINT
REAL
UDINT
\
SINT
INT
DINT
USINT
UINT
REAL
REAL
\
SINT
INT
DINT
USINT
UINT
UDINT
4.7.3显性数据类型转换
当两个变量在计算时,所得结果超过了某一类型数据所表示的范围,只是就需要显示的进行数据转换。
4.7.4比较操作
高级编程语言ST或以允许比较操作的简单结构分枝。
比较的结果是真(TRUE)或假(FALSE)。
符号
逻辑比较含义
例子
=
等于
Ifa=bthen
<>
不等于
Ifa<>bthen
>
大于
Ifa>bthen
>=
不小于
Ifa>=bthen
<
小于
Ifa <= 不大于 Ifa<=bthen 比较操作作为一个逻辑条件用在IF,ELSE,WHILE和UNTIL语句中. 4.8调用功能模块 ST中调用功能块的方法: 写出功能块的名称,并在括号中给的需的输入参数分 配变量名。 在调用功能块之前,需要给输入参数分配所需的值。 功能块调用放在一行里,以 分号结束。 在调用功能块之后才能读取FB输出值。 首先是功能块的名称,接着是位于括号里的输入参数。 输入参数用逗号隔开。 功 能块调用以分号结束。 4.9指针和动态变量 在运行时,系统给动态变量PV分配了一个内存地址,这个过程叫做动态变量的 寻参或初始化。 当一个动态变量被初始化后,根据数据类型它可以获得它所指向的存储器的内容。 //DynVarACCESSADR(statVar) 用ADR()操作符,返回的是小括号中变量的地址,为UDINT类型。 这行语句应该 以分号“;”结束。 三梯形图与结构化文本间的转换 3.1梯形图的数据结构 梯形图的主要数据结构如下所示: typedefstruct_node{ unsignedinttype;//节点类型 Posp;//节点位置 ParamList*Param;//节点参数 void*firstin;//入弧 void*firstou;t//出弧 intIn;//入度 intOu;t//出度 intcurIn;//当前入度 intcurOu;//当前出度 intvisited;//是否已访问标识 struct__node*nex;t//下一节点 }Node;//节点数据结构 typedefstruct__arc{ Node*tai;l//弧指向的尾节点 Node*head;//弧指向的头节点 struct__arc*hlink;//指向弧头相同的另一条弧 struct__arc*tlink;//指向弧尾相同的另一条弧 }Arc;//弧数据结构 3.2梯形图存储结构 将梯形图转换为AOV图,然后再对其进行拓扑排序,对各节点进行处理。 3.3梯形图向结构文本的转换 梯形图向结构文本的转换主要是通过对本文前一部分建立的AOV图的各节点进行拓扑排序,然后对节点分类处理.拓扑排序的方法是,从上往下从左到右检索各节点,处理当前入度为0的节点,并将其访问位标识,将其每个出弧指向的头节点的当前入度减1,并删除该出弧,然后处理下一个当前入度为0的节点。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ST 语言