ST编程语言.pdf
《ST编程语言.pdf》由会员分享,可在线阅读,更多相关《ST编程语言.pdf(43页珍藏版)》请在冰点文库上搜索。
结构文本(ST)TM246结构文本(ST)TM前提培训模块:
TM0AutomationStudio基础TMAutomationStudio在线通讯TM自动化运行(Runtime)系统TMAutomationStudio诊断软件:
无硬件:
无简介结构文本(ST)TM目录简介.目的结构文本特点.概述.特点.可能性结构文本基础.表达式.赋值.注释.操作符优先级命令组.布尔逻辑操作.算术运算.比较操作.判断.Case语句.Loops.调用功能块.指针和动态变量小结练习附录.关键字.函数结构文本(ST)TM简介1、简介结构文本是一种高级语言,如果你知道如何使用高级语言来编程,像:
Basic、PACSAL或C,那么你会很轻松的掌握StructuredText(ST)编程;如果不知道,你会看到ST有着简单、标准的结构,保证程序高效、快速运行并简单易懂。
图.书本印刷:
过去和现在在下一章里,你会学习到ST的命令、关键字、语法和其它的主题。
所有的这些你都可以做练习,我们有许多帮助你理解ST的简单例程。
结构文本(ST)TM1.1目的课程参与者将熟悉使用结构文本给自动化目标编程。
课程参与者将学到每个独立的命令组和它们之间如何工作。
课程参与者将了解结构文本预留的关键字。
图.综述简介结构文本(ST)TM2、结构化文本的特点2.1概述ST是针对自动化系统的高级文本编程语言。
简单的标准结构确保快速、高效的编程。
ST使用了高级语言的许多传统特性,包括:
变量、操作符和控制流程语句。
ST还能与其它的PLC编程语言一起工作。
那么什么是结构文本呢?
结构是指高水平的结构化编程能力,象一个结构化的编程;文本是指应用文本而不是梯形图和顺序函功能表的能力。
ST语言不能代替其它的语言,每种语言都有它自己的优点和缺点。
ST主要的一个优点就是能简化复杂的数学方程。
2.2特点结构化文本有以下特点:
高级文本编程语言结构化的编程简单的标准结构快速高效的编程使用直观灵活与PASCAL类似有计算机编程经验的人可以很容易地使用它符合IEC-标准2.3可能性AutomationStudio提供以下功能:
数字量和模拟量I/O逻辑操作逻辑比较表达式算术运算判断语句机器的状态语句循环语句功能块可选用的动态变量诊断工具结构文本特点结构文本(ST)TM3、结构文本基础3.1表达式表达式是指返回变量评估值的结构。
表达式由操作符和操作数组成。
操作数可以是常量,变量,调用函数或其它表达式。
3.2赋值操作符通过一个表达式和一个值来给变量赋值。
赋值语句包括位于左边的变量,赋值操作符:
=,及后边需要计算的表达式。
所有的语句,包括赋值语句,必须要以分号;结尾。
当这行程序执行后,变量Var的值是变量Var的两倍。
3.3注释虽然注释经常被删掉,但它们是源代码中非常重要的一部分。
它们解释了一部分代码,使程序更易读懂。
注释帮助你或其他人读你的程序,即使过去了很长时间。
注释不被编译,因此不会影响程序的执行。
注释应该用一对星号和小括号括起来(*comment*)。
结构文本基础例子:
图Assignment例子:
图.单行注释例子:
结构文本(ST)TM3.4操作符优先级如果在一个表达式中使用几个操作符,就会出现优先级的问题(执行的顺序)。
操作符按优先级的顺序来执行。
在任何一个表达式中,首先执行最高级别的操作符,接着执行低一级的操作符,等等,直到执行完所有的操作符。
具有相同级别的操作符按照书写顺序从左至右依次执行。
结构文本基础操作符符号/语法:
括号()最高优先级函数调用例子Callargument(s)LN(A),MAX(X),等.注释*取反NOT乘除取模(取除法的余数)*/MOD加减+-比较,=等于不等于=逻辑与AND逻辑异或XOR逻辑或OR最低优先级结构文本(ST)TM执行顺序:
结构文本基础例:
图.例:
执行顺序首先做乘法,然后是加法,最后是减法。
使用小括号(最高优先级),可以得到你想要的执行顺序。
看下面的例子。
例:
如下所示,将操作符放到小括号里可能影响执行的顺序。
图.例:
执行顺序表达式从左至右执行。
先执行小括号里的操作,接着是乘法。
因为小括号的优先级高于乘法的优先级。
可以看出,这两个例子看起来很相似,但结果不同。
结构文本(ST)TM4、命令组ST有下面的命令组:
布尔逻辑操作算术操作比较操作判断Case语句4.1布尔逻辑操作操作数不需要是BOOL类型。
布尔逻辑操作:
真值表:
这些操作符可以形成一个逻辑表达式和条件语句,结果是真(TRUE)或假(FALSE)。
命令组符号逻辑操作例子NOT取反a:
=NOTb;AND逻辑与a:
=bANDc;OR逻辑或a:
=bORc;XOR异或a:
=bXORc;输入ANDORXOR0000000000结构文本(ST)TM0ST编辑器允许任何数的分枝。
命令组例:
图.0电气图例:
图.0电气图练习:
当按下BtnLigntOn开关后,输出DoLight应该亮起,直到BtnLightOff按下后才关闭。
使用布尔逻辑操作编写该任务。
图.例子,逻辑操作结构文本(ST)TM4.2算术运算使用高级语言的决定性因素是看它处理算术运算的简单程度。
4.2.1基本的算术运算ST为应用程序提供了以下基本的算术运算:
数据类型是非常重要的参数。
看下面的表格。
:
*编译器出错信息:
Typemismatch:
CannotconvertREALtoINT.你可以看到,结果也依赖于语法和数据类型。
表达式左边的数据类型应该等同于(或大于)右边的数据类型。
命令组符号算术操作例子:
=赋值a:
=b;+加a:
=b+c;-减a:
=b-c;*乘a:
=b*c;/除a:
=b/c;MOD取模(显示余数)a:
=bmodc;语法数据类型结果ResOpOpRes:
=/;INTINTINTRes:
=/;REALINTINT.0Res:
=.0/;REALREALINT.Res:
=.0/;INTREALINTError备注:
左面数据类型:
=右面数据类型;结构文本(ST)TM4.2.2隐性数据类型转换该类型的转换由编译器完成。
编译器将表达式中低的数据类型转换成高的数据类型。
如果有两种或多个类型的变量参与运算,那么必须将它们转换成相同的类型以便执行运算。
图.隐性数据类型转换SINT_Var首先转换成INT类型。
命令组DatatypeBOOLSINTINTDINTUSINTUINTUDINTREALBOOLBOOLxxxxxxxSINTxINTDINTUSINTUINTUDINTREALINTxINTDINTINTUINTUDINTREALDINTxDINTDINTDINTUDINTUDINTREALUSINTxUSINTINTDINTUINTUDINTREALUINTxUINTUINTDINTUINTUDINTREALUDINTxUDINTUDINTUDINTUDINTUDINTREALREALxREALREALREALREALREALREAL例子:
图.固有数据类型转换例子结构文本(ST)TM4.2.3显性数据类型转换显性数据类型转换也是数据类型转换问题。
我们知道,表达式的左右两边要有相同的数据类型,但还需注意第一眼看上去好像没什么问题,但和(INT_Weight+INT_Weight)超过了INT的取值范围。
在这种情况下,必须使用显性数据类型转换。
变量DINT_TotalWeight应该为DINT类型,右边的变量中至少有一个应转换成DINT类型。
这种转换用的是OPERATOR库中的函数。
命令组例子:
例子:
练习:
在两个不同的地方检测玻璃钢的温度,编写程序来计算平均温度,并以模拟量显示输出。
注意模拟量输入和输出必须是INT类型。
图.玻璃钢结构文本(ST)TM命令组4.3比较操作高级编程语言ST或以允许比较操作的简单结构分枝。
比较的结果是真(TRUE)或假(FALSE)。
比较操作作为一个逻辑条件用在IF,ELSE,WHILE和UNTIL语句中。
4.4判断用IF语句表示判断,这里还要用到比较操作。
判断分三部分:
简单IF语句IFELSE语句IFELSIF语句嵌套的IF符号逻辑比较含义例子=等于IFa=bTHEN不等于IFabTHEN大于IFabTHEN=大于等于IFa=bTHEN小于IFabTHEN=小于等于IFabTHEN1.比较Result:
=1;1.语句(s)ELSIFTHENELSIFacTHEN2.比较(可选)Result:
=2;2.语句(s)ELSEELSE前面IF语句都不满足(可选)Result:
=3;3.语句(s)END_IFEND_IF判断结束结构文本(ST)TM命令组4.4.1IF最简单的IF判断语句。
基本上,如果条件表达式的结果为TRUE就执行语句。
如果条件表达式的结果是FALSE,程序就执行END_IF后面的语句。
条件表达式可以是简单关联的语句或用运算符(and,or等)连接的复合语句。
例子:
图.简单IF语句程序图.简单IF语句流程图结构文本(ST)TM4.4.2ELSE它是简单IF语句的扩展。
在IF结构中应该只有一个ELSE。
如果条件为TRUE,执行语句A。
如果条件为FALSE,执行语句B。
命令组图.IF-ELSE语句图.IFELSE程序结构文本(ST)TM命令组4.4.3ELSIF运用一个或多个ELSE_IF语句可以实现多个不同的条件,而不用使用多个简单的IF语句创建复杂的程序逻辑。
图.IF-ELSIF-ELSE流程图图.0IF-ELSIF-ELSE程序处理器自上而下地执行判定。
如果条件的结果为TRUE,那么就执行属于这个条件的指令和命令,之后处理器就跳到判断语句的结尾(END_IF)。
在程序的一次循环中,无论下一个条件是否为TRUE,只有上面属于第一个条件TRUE的语句被执行。
如果IF或ELSIF条件都不为TRUE,那么就执行属于ELSE下的指令。
结构文本(ST)TM命令组任务:
气象站第I部分用温度计来测量室外的温度,温度通过模拟量读取(=0),并且要以文本的形式在房间里显示。
当温度在C以下,显示cold(冷)。
当温度是在C到C之间,显示opt(最佳)。
当温度是C以上,显示hot(热)。
用IF,ELSIF和ELSE语句实现这个任务。
图.温度计,例子,IF备注:
在ST中,按如下指定一个字符串文本:
StringVar:
=COLD结构文本(ST)TM命令组4.4.4嵌套的IF语句嵌套对于依赖其它条件的条件测试很有用处。
一个嵌套的IF语句其优先级低于上一层的优先级,它的执行取决于上一层IF条件的结果。
使用嵌套时必须注意每个IF要和END_IF相匹配,否则会导致错误的执行顺序。
建议在每个嵌套的IF语句和它的执行语句中使用缩排。
IF语句可以嵌套在你想要的深度,但是三十或四十级以后,编辑器会用完内存,所以这是一种非常糟糕的编程格式!
这时你完全丢失了代码的总貌。
当使用嵌套多于级或级时,你应该重组程序代码。
图.嵌套IF语句图.嵌套IF语句程序结构文本(ST)TM0用两个但并不嵌套的IF语句也可以达到同样的功能,就像嵌套的语句一样。
可以在多个语句中运用标识变量或一个标志。
第一个IF语句描述该标志,其他的IF语句利用该变量。
命令组任务:
气象站第II部分检测温度和湿度。
只在当湿度介于0和%之间并且温度在和C之间显示文本OPT。
否则显示Temp.OK。
运用嵌套的IF语句完成该任务。
图.两个IF语句Fig.两个IF语句结构文本(ST)TM命令组在这种情况下,IF语句有相同的优先级,第二个IF语句和第一个IF语句一样每次都执行。
不用相同的变量,你可以有两个独立的IF语句。
当发生以下情况时,推荐使用Case语句代替IF语句:
IF结构有过多分层使用过多(三个或更多)的ELSE_IF在这种情况下Case语句更容易读懂。
CASE与IF结构相比较还具有另一个优点:
CASE语句中只做一次计算,并能创建更有效的代码。
结构文本(ST)TM命令组4.5Case语句在CASE语句中,控制变量与几个值作比较,如果表达式的结果与其中一个值相同,那么就执行相应的语句。
如果表达式的结果与任何一个值都不相同,那么就执行象IF语句一样的ELSE分支。
语句执行完后,继续执行END_CASE后的程序。
图.CASE流程图关键字语法描述CASEOFCASEstepvariableOFCASE开始,:
Display:
=MATERIAL从到:
Display:
=TEMP,.0:
Display:
=OPERATION,0END_CASEEND_CASECASE结束结构文本(ST)TM命令组在程序的一次循环中,只执行case的一个子句。
图.CASE语句程序CASE语句的语法:
CASE语句以CASE开始,以END_CASE结束,并且各自单独占一行。
在CASE和OF之间的变量必须是UINT类型。
在CASE的子句中,只能使用正整数,不允许使用变量名或表达式。
数字不能重叠使或在几个区域内使用。
备注:
在CASE语句步骤中可以用常量来代替数字。
这样可以更加容易读程序。
结构文本(ST)TM命令组任务:
酿造槽酿造槽的填充程度由low,ok,和high表示。
分别运用输出表示low,ok,和high等级。
通过读取模拟量输入内部转换成0-00%来表示槽中液体的水平面。
如果容量低于%,将会出发一个警告声。
运用CASE语句创建一个方案。
Fig.0酿造槽结构文本(ST)TM命令组4.6循环语句在很多应用程序中,需要多次执行某些步骤,这就是重复执行代码的原因,这个过程叫循环。
循环程序的设计中需要建立这样一种程序使它能够循环返回并循环执行自身程序。
循环语句使源代码简短并一目了然。
循环语句可以嵌套在其它语句中。
循环程序编写时很容易进入死循环,一直重复执行自身程序,引起控制器启动看门狗限制,并产生一个严重错误阻碍程序的执行。
因此,通常使用一些方法来跳出循环:
设定循环次数或条件改变时停止循环。
在ST中有几种不同的循环方式:
有限制的FOR无限制的WHILEREPEAT结构文本(ST)TM命令组4.6.1FOR如果提前可以确定循环的次数就用FOR语句,否则就用WHILE或REPEAT。
FOR语句可以递增或递减循环控制变量的值,使它从起始值到达终止值。
递增或递减的默认值为。
每次循环之前都会检测终止条件,如果循环控制变量的值超过终止值时,就不再执行语句段了。
关键字语法描述FORTOBYDOFORi:
=StartValTOStopValBYStepDO中的部分是可选的Res:
=value+;循环语句段END_FOREND_FORFOR语句结束图.FOR流程图图.0FOR语句程序FOR循环中的语句反复被执行,而递增值分配给了FOR语句的循环控制变量(i)。
每次循环后,变量StepVal会自动加。
StartVal和EndVal是循环控制变量的起始值和终止值。
当控制变量达到终止值时,程序就执行END_FOR语句。
循环控制变量、起始值和终止值都必须是相同的数据类型(U)SINT,(U)INT,(U)DINT),并且不能由循环语句改变。
结构文本(ST)TM命令组任务:
起重机个独立的负载悬挂在起重机上。
为了得到总负载,您需要累加每个独立的负载。
图.Crane使用FOR循环语句创建任务解决方案。
结构文本(ST)TM命令组4.6.2WHILEWHILE循环除了条件可以是任意的布尔表达式以外其他和FOR循环用处一样。
当条件满足时,执行循环语句。
当逻辑条件为TRUE就重复调用语句时,使用WHILE语句。
WHILE语句执行时首先检测条件。
如果条件为TRUE就执行语句段。
当执行完语句段后,再次检测条件,如果条件仍为TRUE,那么就再次执行语句段,直到条件不为TRUE。
如果条件一开始就为FALSE,那么就不会执行语句段。
关键字语法描述WHILEDOWHILEi退出条件END_REPEATEND_REPEAT循环结束图.REPEAT流程图图.REPEAT语句程序备注:
如果UNTIL条件永远不为TRUE,那么程序进入死循环,并产生一个运行错误。
结构文本(ST)TM04.6.4EXITEXIT语句是当终止条件满足时,退出所有的循环语句。
图.EXIT流程图图.EXIT语句程序图.嵌套循环中的EXIT流程图图.FOR嵌套语句中的EXIT语句程序当EXIT语句用在一个嵌套的循环中时,退出只是在EXIT所在的循环中执行。
循环结束后继续执行结束语句后的程序。
命令组结构文本(ST)TM4.7调用功能块ST中调用功能块的方法:
写出功能块的名称,并在括号中给的需的输入参数分配变量名。
在调用功能块之前,需要给输入参数分配所需的值。
功能块调用放在一行里,以分号结束。
在调用功能块之后才能读取FB输出值。
首先是功能块的名称,接着是位于括号里的输入参数。
输入参数用逗号隔开。
功能块调用以分号结束。
图.0调用功能块流程图图.调用功能块程序Functionblockcallindetail:
图.功能块调用的明细命令组结构文本(ST)TM任务:
瓶记数创建一个程序来计算传送带上瓶子的数量。
运用STANDARD库中的CTU(上升沿计数器)功能块。
图.瓶记数备注:
在调用功能块是可以参考AutomationStudio在线帮助。
命令组结构文本(ST)TM4.8指针和动态变量B&R为您提供指针以扩展ST的功能。
使用这些是可选的。
在运行时,系统给动态变量PV分配了一个内存地址,这个过程叫做动态变量的寻参或初始化。
当一个动态变量被初始化后,根据数据类型它可以获得它所指向的存储器的内容。
图.定位动态变量用ADR()操作符,返回的是小括号中变量的地址,为UDINT类型。
这行语句应该以分号“;”结束。
命令组结构文本(ST)TM5、小结结构文本是一种高级语言,并能提供非常广泛的指令。
ST的优势在于它的简洁性,它比ANSIC简单易学,比梯形图或指令表效率更高。
图.书本印刷:
过去和现在当学习完这个培训模块后,您就可以编写自己的ST任务了。
您也可以把该培训模块当作参考。
该编程语言尤其在数学功能和数学公式的运算时十分有用。
小结结构文本(ST)TM6、练习任务:
起重箱两个传送带(doConvTop,doConvBottom)把箱子传输到起重机。
如果光电池(diConvTop,diConvBottom)激活,相应的传送带停止并调用起重机。
如果起重机没有被调用,它返回到适当的位置(doLiftTop,doLiftBottom)。
当起重机到达正确位置(diLiftTop,diLiftBottom),起重机传送带(doConvLift)启动直到箱子完全位于起重机上。
然后起重机运动到卸载位置(doLiftUnload)。
当它到达该位置(diLiftUnload),箱子移到卸载带上。
知道箱子离开了起重机,起重机才能空闲接受下一个请求。
图.起重箱练习结构文本(ST)TM7、附录7.1关键字关键字是ST可用的语句,但不能作为变量名。
AutomationStudio编辑器用蓝色来显示它们。
关键字描述ACCESS使用动态变量。
BIT_CLRA:
=BIT_CLR(IN,POS)A为变量IN在POS位清0后的值。
IN值保持不变。
BIT_SETA:
=BIT_CLR(IN,POS)A为变量IN在POS位置后的值。
IN值保持不变。
BIT_TSTA:
=BIT_TST(IN,POS)位的状态值。
A为IN变量在POS位的状态值。
BY参考FOR语句。
CASE参考CASE语句。
DO参考WHILE语句。
EDGE检测上升沿和下降沿信号。
EDGENEG检测上升沿信号。
EDGEPOS检测下降沿信号。
ELSE参考IF语句。
ELSIF参考IF语句。
END_CASE参考CASE语句。
END_FOR参考FOR语句。
END_IF参考IF语句。
END_REPEAT参考REPEAT语句。
END_WHILE参考WHILE语句。
EXIT参考EXIT语句。
FOR参考FOR语句。
IF参考IF语句。
REPEAT参考REPEAT语句。
RETURN可以通过例子中的条件来结束函数。
THEN参考IF语句。
TO参考FOR语句。
UNTIL参考REPEAT语句。
WHILE参考WHILE语句。
附录结构文本(ST)TM7.2函数在结构文本中使用有些函数不需插入库函数。
AutomationStudio编辑器用蓝色显示这些函数。
函数例子ABS返回数的绝对值。
ABS(-)返回。
ACOS返回数的arccosine值。
(cosine的反函数)。
ADR返回变量的地址。
AND位操作逻辑与。
ASIN返回数的arcsine值。
(sine的反函数)。
ASR操作数算术右移:
A:
=ASR(IN,N)IN右移N位,左边由符号位填充。
ATAN返回数的arctangent值。
(tangent的反函数)。
COS返回数的cosine值。
EXP指数函数:
A:
=EXP(IN).EXPT一个操作数为另一个操作数的幂:
A:
=EXPT(IN,IN).LIMITA=LIMIT(MIN,IN,MAX)MIN是结果的下限,MAX是结果的上限。
如果IN小于MIN,则返回结果是MIN。
如果IN大于MAX,则返回结果是MAX。
否则,返回结果为IN。
LN返回数的自然对数。
LOG返回以0为底的数的对数。
MAX最大值函数。
返回两个数中较大的数。
MIN最小值函数。
返回两个数中较小的数。
MOD将USINT,SINT,INT,UINT,UDINT,DINT变量取模除另一个这些类型的变量。
MOVE把输入变量复制到输出变量。
:
=符号用有赋值语句中。
A:
=B;和A:
=MOVE(B)相同;MUX选择:
A=MUX(CHOICE,IN,IN,.INX);CHOICE指定返回哪个操作数(IN,IN,.INX)。
NOT位取反。
OR位操作逻辑或。
ROL循环左移操作数:
A:
=ROL(IN,N);IN中每位左移N次,最左面的位移到右边。
ROR循环右移操作数:
A:
=ROL(IN,N);IN中每位右移N次,最右面的位移到左边。
SEL二进制选择:
A:
=SEL(CHOICE,IN,IN)CHOICE必须是BOOL类型。
如果CHOICE为FALSE,那返回IN,否则返回IN。
SHL操作数的位左移:
A:
=SHL(IN,N);IN左移N位,右边的位以零填充。
附录结构文本(ST)TMSHR操作数的位右移:
A:
=SHR(IN,N);IN右移N位,左边的位以零填充。
SIN返回数的sine值。
sizeof以字节数返回指定变量的长度。
SQRT返回数的平方根。
TAN返回数的tangent值。
TRUNC返回数的整数部分。
XOR位操作逻辑异或附录结构文本(ST)TMNotes结构文本(ST)TM0培训模块综述TM00贝加莱B&R公司介绍*TM00图文显示的基础TM0贝加莱B&R产品系列*TM0贝加莱人机界面产品*TM0AutomationStudio基础TM0ASiV的基础TMAutomationStudio在线通信TM0ASiV的维护*TM自动化对象(Target)*TM0图文显示的编程规则TM自动化运行(Runtime)系统TM0ASiV报警系统TM0维护信息*TM0ASiV的国际化操作TM自动化组件和出错信息查询*TM0ASiV的远程操作TMAutomationStudio诊断TM0ASiV高级应用TM0结构化软件编程TM面向机器设备的AutomationStudio*TM00AutomationNetPVITM0梯形图(LAD)TM0PVI通信*TM功能块图(FBD)*TM0PVIDLL编程TM连续功能图(CFC)*TMPVI的服务TM顺序功能图(SFC)*TMPVIControl.NETTM指令表(IL)*TM0PVI维护和诊断*TM结构文本(ST)TM0PVIOPCTMAutomationBasic(AB)*TMANSICTM00APROL系统概念TM0内存管理和数据存贮TM