返回列表 发布新帖

ST语言简介

298 0
发表于 2024-7-10 18:16:53 | 查看全部 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
<p><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">1.ST语言简介</span></span><br/><span style="">1.1 ST语言特点</span><br/><span style="">&nbsp; &nbsp;&nbsp; &nbsp;结构化文本编程语言是一种高级语言,类似于 Pascal,是一种特别为工业控制应用而开发的一种语言,也是在 InoProShop中最常用的一种语言, 对于熟悉计算机高级语言开发的人员来说,结构化文本语言更是易学易用,它可以实现选择、迭代、跳转语句等功能。</span><br/><span style="">&nbsp; &nbsp; 此外,结构化文本语言还易读易理解,特别是当用有实际意义的标识符、批注来注释时,更是这样。 在复杂控制系统中, 结构化文本可以大大减少其代码量, 使复杂系统问题变得简单,缺点是调试不直观, 编译速度相对较慢。结构化文本的视图如图所示:</span><br/><img id="aimg_3605" src="/upload/image/20230707/1688714649649779.png" class="zoom" width="600" alt="ST语法编程基础-ST语言简介" title="" style="overflow-wrap: break-word; cursor: pointer;"/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);"></span><br/><span style="">结构化文本有以下特点:</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">1、高级文本编程语言</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">2、结构化的编程</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">3、简单的标准结构</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">4、快速高效的编程</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">5、使用直观灵活</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">6、与PASCAL类似</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">7、有计算机编程经验的人可以很容易地使用它</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">8、符合IEC 61131-3标准</span></span><br/><br/><span style="">1.2 ST语言的执行顺序</span><br/><span style="">使用结构化文本的程序执行顺序根据“行号” 依次从上至下开始顺序执行,如图所示。</span><br/><img id="aimg_3606" src="/upload/image/20230707/1688714649977853.png" class="zoom" width="600" alt="ST语法编程基础-ST语言简介" title="" style="overflow-wrap: break-word; cursor: pointer;"/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);"></span><br/><br/><span style="">1.3 表达式执行顺序</span><br/><span style="">整个 ST 程序由指令构成,指令由分号 “;”分隔。这些指令由关键字和表达式组成。其中,</span><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">表达式由操作符和操作数组成。一个操作数可以是一个常量,变量,功能调用或其他表达式。常量,例如:20,t#20s,‘22231 test’。</span><br/><span style="">变量,例如:iVar,Var1[2,3]。</span><br/><span style="">功能调用,值为调用返回值,例如:Fun1(1,2,4)。</span><br/><span style="">其它表达式:10+3,var1 OR var2,(x+y)/z,&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; iVar1:=iVar2+22。</span><br/><span style="">表达式的求值以特定的操作符优先权定义的顺序,按操作符对操作数进行求值。表达式中具有最高优先权的操作符应首先进行求值,接着是下一个较低优先权的操作符等,从高到低依次求值完成</span><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">。下表记录了ST语言的操作符及其优先级顺序。</span><br/><span style=""><img id="aimg_3607" src="/upload/image/20230707/1688714649559399.png" class="zoom" width="514" alt="ST语法编程基础-ST语言简介" title="" style="overflow-wrap: break-word; cursor: pointer;"/></span><br/><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">2.关键字</span></span><br/><span style="">关键字是语言元素特征化的词法单元。在 IEC61131-3 标准中,关键字作为编程语言的字,被用于定义不同结构或启动和中指特定的软件元素。</span><br/><span style="">部分关键字配对使用,如 FUNCTION 与 END_FUNCTION 等。部分关键字单独使用,如 ABS等。关键字不能用于任何其他目的,如不能作为变量名或扩展名,既不能用 TON 作为变量名,也不能用 VAR 作为扩展名。</span><br/><span style=""><img id="aimg_3608" src="/upload/image/20230707/1688714649609131.png" class="zoom" width="549" alt="ST语法编程基础-ST语言简介" title="" style="overflow-wrap: break-word; cursor: pointer;"/></span><br/><span style="">此外,下列功能模块和函数的标识符也被保留作为关键字:</span><br/><span style="">1) 标准数据类型: BOOL, REAL, INT 等。</span><br/><span style="">2) 标准函数名和功能块名: SIN, COS, RS, TON 等。</span><br/><span style="">3) 指令表语言中的文本操作符: LD, ST, ADD, GT 等</span><br/><span style="">4) 结构化文本语言中的文本操作符: NOT, MOD, AND 等。</span><br/><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">3.操作符</span><br/><img id="aimg_3609" src="/upload/image/20230707/1688714650101128.png" class="zoom" width="600" alt="ST语法编程基础-ST语言简介" title="" style="overflow-wrap: break-word; cursor: pointer;"/><br/><img id="aimg_3611" src="/upload/image/20230707/1688714650451133.png" class="zoom" width="600" alt="ST语法编程基础-ST语言简介" title="" style="overflow-wrap: break-word; cursor: pointer;"/></span><br/><span style=""><img id="aimg_3610" src="/upload/image/20230707/1688714650344447.png" class="zoom" width="600" alt="ST语法编程基础-ST语言简介" title="" style="overflow-wrap: break-word; cursor: pointer;"/></span><br/><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">4.常用ST指令介绍</span></span><br/><span style="">4.1 赋值指令</span><br/><span style="">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;赋值指令用于变量赋值,也就是赋值关键字的左边是变量,右侧为要赋的值,通过赋值关键字进行赋值。例如:Var1 := Var2 * 10;完成执行后,Var1值为Var2的10倍。其中的赋值关键字包含三种:“:=”、“S=”、“R=”。</span><br/><span style="">(1)&nbsp;&nbsp;“:=”为一般赋值,右值直接赋给左值,左值和右值相等。</span><br/><span style="">(2) “S=”为置位赋值,表示如果右值为TRUE,左值变量变为TRUE(置位),&nbsp;&nbsp;直到调用R=命令来初始化。</span><br/><span style="">(3)&nbsp;&nbsp;“R=”为复位赋值,表示如果右值为TRUE,左值变量变为FALSE(复位)。用于复位S=指令置位的变量。例如:a S= b; 一旦b为 TRUE后,a会保持 TRUE, 即使b 变为 FALSE后。</span><br/><br/><span style="">4.2 功能块的调用</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">语法:&nbsp;&nbsp;&lt;FB 实例名&gt;(FB输入变量:=&lt;值和地址&gt;|, &lt;更多FB 输入变量:=&lt;值和地址&gt;|...更多 FB 输入变量);</span></span><br/><span style="">下例中,一个延时功能块(TON)被调用,参数IN和PT被分配。那么结果变量Q被分配到变量A。延时FB通过&quot;TMR:TON&quot;实例化。</span><br/><span style="">&lt;FB instance name&gt;, &lt;FB variable&gt;:</span><br/><span style="">TMR(IN := %IX5, PT := 300);</span><br/><span style="">A:=TMR.Q;</span><br/><br/><span style="">4.3 RETUTN 指令</span><br/><span style="">RETURN指令表示当前置条件为TRUE时,离开此POU。</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">语法:</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;RETURN;</span></span><br/><span style="">示例</span><br/><span style="">IF b=TRUE THEN</span><br/><span style="">RETURN;</span><br/><span style="">END_IF;</span><br/><span style="">a:=a+1;</span><br/><span style="">如果b是TRUE,语句a:=a+1;不会被执行,POU会立即被返回。</span><br/><br/><span style="">4.4 IF 指令</span><br/><span style="">通过IF关键字,可以判断执行条件,根据执行条件,执行相应的指令。</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">语法:</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">IF &lt;布尔表达式1&gt; THEN</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&lt;IF_指令&gt;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">{ELSIF &lt;布尔表达式2&gt; THEN</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&lt;ELSIF_指令1&gt;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">ELSIF &lt;布尔表达式n&gt; THEN</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&lt;ELSIF_指令-1&gt;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">ELSE</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&lt;ELSE_指令&gt;}</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">END_IF;</span></span><br/><span style="">其中,{}内部分是可选的,</span><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">&nbsp;如果 &lt;布尔表达式1&gt; 为TRUE, 那么只有 &lt;IF_指令&gt; 被执行,其它不被执行,否则,从 &lt;布尔表达式2&gt;开始,一个一个计算布尔条件表达式直到其中一个表达式值为TRUE,然后执行此表达式对应的指令,如果没有表达式值为TRUE,那么执行 &lt;ELSE_指令&gt;对应的指令。</span><br/><span style="">示例</span><br/><span style="">IF temp&lt;17</span><br/><span style="">THEN heating_on := TRUE;</span><br/><span style="">ELSE heating_on := FALSE;</span><br/><span style="">END_IF;</span><br/><span style="">这里,当温度低于17度时,加热打开,否则它保持关闭。</span><br/><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">4.5 CASE 指令</span><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">使用CASE指令,可以根据一个条件变量,根据其对应的多个值罗列处理对应的命令。条件变量只能是整数。</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">语法:</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">CASE &lt;Var1&gt; OF</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&lt;value1&gt;: &lt;Instruction 1&gt;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&lt;value2&gt;: &lt;Instruction 2&gt;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&lt;value3, value4, value5&gt;: &lt;Instruction 3&gt;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&lt;value6 .. value10&gt;: &lt;Instruction4&gt;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">...</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&lt;value n&gt;: &lt;Instruction n&gt;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">ELSE &lt;ELSE Instruction&gt;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">END_CASE;</span></span><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">CASE指令根据以下流程处理:</span><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">*&nbsp;&nbsp;如果变量&lt;Var1&gt;的值为 &lt;valueI&gt;, 那么&lt;Instruction I&gt;会被执行</span><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">*&nbsp;&nbsp;如果 &lt;Var1&gt;没有匹配任何一个值,那么&lt;ELSE Instruction&gt;被执行</span><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">* 如果同一个指令在几个变量值时执行,那么可以把这些值一个接一个的写出来,用逗号隔开,因此共同执行</span><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">*&nbsp;&nbsp;如果同一个指令会在一个变量范围内执行,可以写上初始值和结束值,中间用两个点隔开。你可以把这些情况合一 。</span><br/><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">4.6 WHILE 循环</span><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">WHILE循环和FOR循环一样可以作为循环处理使用,但和FOR循环不同是循环条件可以是任意布尔表达式 。一旦循环条件满足,循环就执行,否则退出循环。</span><br/><span style="overflow-wrap: break-word; font-weight: 700; color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">语法:</span><br/><span style="overflow-wrap: break-word; font-weight: 700; color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">WHILE &lt;boolean expression&gt; DO</span><br/><span style="overflow-wrap: break-word; font-weight: 700; color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">&lt;instructions&gt;</span><br/><span style="overflow-wrap: break-word; font-weight: 700; color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">END_WHILE;</span><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">当&lt;Boolean_expression&gt;值为TRUE时,&lt;Instructions&gt;指令开始执行,直到&lt;Boolean_expression&gt;值为FALSE。&lt;Boolean_expression&gt;在第一次值为FALSE,那么 &lt;Instructions&gt;永不会被执行。如果&lt;Boolean_expression&gt; 永远不会为FALSE,那么 &lt;Instructions&gt; 重复执行不停,这叫做死循环,编程时一定确保不要出现死循环。</span><br/><span style="">示例</span><br/><span style="">WHILE Counter&lt;&gt;0 DO</span><br/><span style="">Var1:= Var1*2;</span><br/><span style="">Counter := Counter-1;</span><br/><span style="">END_WHILE</span><br/><span style="">在一定意义上来说,WHILE循环和REPEAT循环比FOR循环功能更强大,因为不需要在执行循环之前计算循环次数。因此,在有些情况下,用WHILE循环和REPEAT循环两种循环就可以了。然而,如果清楚知道循环次数,那么FOR循环更好。</span><br/><br/><span style="">4.7 REPEAT</span><br/><span style="">REPEAT循环不同于WHILE循环,因为循环条件是在循环指令执行后才检查的,这意味着,循环至少执行一次,不管循环条件值如何。语法:</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">REPEAT</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&lt;instructions&gt;&nbsp;&nbsp;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">UNTIL &lt;Boolean expression&gt;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">END_REPEAT;</span></span><br/><span style="">执行逻辑为:&lt;Instructions&gt;一直执行直到&lt;Boolean expression&gt;值为TRUE。如果&lt;Boolean expression&gt;在第一次值TRUE,那么 &lt;Instructions&gt; 只被执行一遍。如果 &lt;Boolean_expression&gt; 值永远不是TRUE,那么 &lt;Instructions&gt; 永远执行不停,导致死循环。</span><br/><span style="">示例</span><br/><span style="">REPEAT</span><br/><span style="">Var1:=Var1*2;</span><br/><span style="">Counter:=Counter-1;</span><br/><span style="">UNTIL Counter=0;</span><br/><span style="">END_REPEAT;</span><br/><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">4.8&nbsp;&nbsp;CONTINUE 语句</span><br/><span style="">CONTINUE指令在 FOR, WHILE和 REPEAT循环中使用,用于提前结束本轮循环,并重新开始下一轮循环。</span><br/><span style="">示例</span><br/><span style="">FOR Counter:=1 TO 5 BY DO</span><br/><span style="">INT1:=INT1/2;</span><br/><span style="">IF INT1=0 THEN</span><br/><span style="">CONTINUE;</span><br/><span style="">END_JF</span><br/><span style="">Var:=Var1/UBT1L</span><br/><span style="">END_FOR;</span><br/><span style="">Erg:=Var1;</span><br/><br/><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">4.9&nbsp;</span><span style="">FOR循环</span><br/><span style="">通过FOR循环,可以编写重复处理逻辑。</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">语法:</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">FOR &lt;INT_Var&gt; := &lt;INIT_VALUE&gt; TO &lt;END_VALUE&gt; {BY &lt;Step size&gt;} DO</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">&lt;instructions&gt;</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">END_FOR;</span></span><br/><span style="">{} 内的部分是可选的。INT_Var是计数器,是整数类型,只要计数器&lt;INT_Var&gt;不大于&lt;END_VALUE&gt;,&lt;Instructions&gt;会被执行。在执行 &lt;Instructions&gt; 之前首先要检查该条件,如果 &lt;INIT_VALUE&gt;大于 &lt;END_VALUE&gt;,&lt;instructions&gt; 不会被执行。</span><br/><span style="">当 &lt;Instructions&gt;执行一次后, &lt;INT_Var&gt;自动增加&lt;Step size&gt;。&lt;Step size&gt;可以是任意整数值,如果不写此参数,默认值为1。当&lt;INT_Var&gt;大于&lt;END_VALUE&gt;时,循环停止。</span><br/><span style="">示例</span><br/><span style="">FOR Counter:=1 TO 5 BY 1 DO</span><br/><span style="">Var1:=Var1*2;</span><br/><span style="">END_FOR;</span><br/><span style="">Erg:=Var1;</span><br/><span style="">我们假设Var1默认值是2, 经过FOR循环后,它的值是32。</span><br/><br/><span style="">4.10 注释</span><br/><span style="">在结构化文本中有两种写注释的方法。</span><br/><span style="">多行注释,用“(*”开始,“*)”结束。这允许注释跨行注释。例如: &quot;(*This is a comment.*)&quot;</span><br/><span style="">单行注释,用“//”作为注释的开始直到本行结束。例如: &quot;// This is a comment.&quot;</span><br/><span style="">注释可以在ST编辑器声明或实现部分的任意地方。</span><br/><span style="">注释的嵌套:注释可以放置在其他注释中</span><br/><span style="">示例</span><span style="color: rgb(51, 51, 51); font-family: &quot;Microsoft Yahei&quot;, Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">(*a:=inst.out; (*to be checked*)b:=b+1;*)</span></p>

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2025 英威腾技术论坛 版权所有 All Rights Reserved. 粤ICP备07504406号
关灯 在本版发帖
扫一扫添加微信客服
返回顶部
快速回复 返回顶部 返回列表