登录
首页 PLC论坛 西门子SIEMENS
回帖 发帖
正文

主题:[分享]什么是IEC 61131?-- 已降低阅读标准

点击:65986 回复:335

[replyview]
用户自定义数据类型,是由应用程序员,利用文本编辑器,通过使用一个TYPE...END_TYPE声明来编辑的。导出数据类型可以是枚举数据类型、结构或数组。
数组数据类型包括了一个数据类型的几个元素。一个数组可用于仅仅在类型声明的一行之内,声明同一类型的几个元素。
结构数据类型包括了不同的数据类型的几个元素。
用户定义字符串,是具有可变数目的字符的STRING数据类型。声明一个用户自定义的字符串时,其长度在数据类型后面的括号内。
枚举数据类型将可能值限制在所枚举的元素范围内。使用了该数据类型的变量,只能具有所枚举的值。
[/replyview]
05-02-04 11:18
[replyview]声明数组
数组数据类型包括同一个数据类型的几个元素。一个数组中的特定元素是通过一个数组下标来定义和访问的。一个数组可用于仅仅在类型声明的一行之内,声明同一类型的几个元素。
数组数据类型声明的例子:
TYPE
graph    :ARRAY[1..23]    OF INT;
END_TYPE
在本例子中,数据类型‘图形’包括了23个‘INT’数据类型的元素。数组的所有元素都被一个接一个地连续存储在PLC存储器里。
要想声明一个数组,您首先要在数据类型工作单的类型声明中声明该数组。然后,您就可以在POU的变量工作单中声明变量了(请参考下面的编程示例)。
多维数组
如果需要多维数组,则可以使用数组的数组。下图展示了一个数组的数组:
 
TYPE
graph    :ARRAY[1..10]    OF INT;
my array    :ARRAY [1..3] OF graph;
END_TYPE
 
在一个数组的数组中,单个元素是用两个下标来访问的,如下图所示:
 
变量声明:
VAR
var1   :my_array;
var2   :INT;
END_VAR
 
使用ST语言的代码本体声明:
var2 := var1[1] [3];
 
初始化数组
数组可以被初始化,即:可以对数组中的每个元素赋一个初值。正如上面所描述的那样,每一个元素都是通过其下标来访问的。一个数组的初始化可以在编辑代码本体声明时进行。
 
变量声明:
VAR
graph    :ARRAY[1..10]    OF INT;
END_VAR
 
使用ST语言的代码本体声明:
graph[1]:=7;
graph[2]:=1092;
.
.
.
graph[10]:=13;
 
不必初始化一个数组的所有元素。如果未使用任何初始值,则数组元素是在启动程序的执行时用默认初值来初始化的。
[/replyview]
05-02-04 11:19
[Post=30]一个数组应该被典型地用于描述同一主题的数据。让我们想象一个每隔3秒钟就改变一个输入值的过程。有必要保存这些输入值中的每一个,以便将其与所设定点相比较。所有的输入值都具有相同的数据类型。这种情况下,声明一个数组很有用,因为在代码本体声明中,可以用一个循环语句(如FOR循环),容易地比较这两个值。数组的单个组分可以用数组下标来访问。
 
类型声明:
TYPE
graph    :ARRAY[1..23]    OF INT;
set_point    :ARRAY[1..23]    OF INT;
END_TYPE
变量声明:
VAR
input        :graph;        (* 机器的输入值 *)
values        :set_point;        (* 相比较的值 *)
i            :INT :=1;        (* 用于数组下标的变量 *)
run            :BOOL    :=TRUE;
ERROR        :BOOL;
timer        :FB_TIMER;        (* 声明FB实例 *)
END_VAR
使用ST语言的代码本体声明:
timer (pt:=t#3s;in:=run);
IF timer.Q THEN    (* 向数组''graph''提供输入值 *)
input[i] := %IW0;    (* 给数组赋输入值 *)
run := 0;    (* 边沿检测,以便再次启动定时器 *)
i := i+1;    (* 更高的数组下标 *)
ELSE
run :=1;    (* 递增记数 *)
END_IF;
IF i = 23
FOR i:=1 TO 23 BY 1 DO
IF input[i] <> values[i] THEN     (* 比较数组
''graph''和''set point'' *)
ERROR := TRUE;
END_IF;
END_FOR;
i := 1;
END_IF;
[/Post]
最后修改:2005-11-8 22:30:21
05-02-04 11:20
[Post=30]声明结构
结构数据类型包括了同一数据类型或不同数据类型的多个元素。
TYPE
machine:
STRUCT
x_pos    :INT;
y-pos    :INT;
depth    :INT;
rpm    :UINT;
END_STRUCT;
END_TYPE
在该例子中,结构数据类型‘machine’由x_pos、y_pos、depth和rpm等组分组成。所有的组分都描述了机器的特性。
编程举例
在必须要声明描述同一对象的多个数据的情况下,就应该使用结构。例如,一个钻孔机在一个工件上钻多个孔。所有的孔都具有工件上的x和y坐标位置、钻孔深度以及钻孔用的每分钟转数。对各个孔的具体值是不同的,但是所需的变量总是同样的。这种情况下,声明一个由分别用于位置、钻孔深度和每分钟转数的三个组分组成的结构会很有用。对于每个孔,可以给各组分赋不同的值。用于钻孔过程的功能块只需使用作为结构的同一个变量。
结构数组
可以在数组内使用结构,如下面的例子所示:
 
TYPE
machine:
STRUCT
x_pos    :REAL;
y_pos    :REAL;
depth    :INT;
rpm    :INT;
END_STRUCT;
my array    :ARRAY[1..10]    OF machine;
END_TYPE
 
一个结构数组的应用例子可能是具有多个钻孔机的转移线。通过数组下标,可以访问具体的钻孔机,并且通过各结构组分,可以分配用于钻孔的不同值。
带有数组的结构
可以在结构内使用数组,如下面的例子所示:
 
TYPE
graph    :ARRAY[1..10]    of INT;
drive:
STRUCT
rpm    :INT;
inputs    :IN_BOOL;
performance    :graph;
END_STRUCT;
END_TYPE
 
初始化结构
在编辑代码本体声明时,可以通过给各组分赋值的方式,来初始化结构。下图显示了一个例子:
变量声明:
VAR
var1   :machine;
first    :BOOL    :=TRUE;
END_VAR
 
使用ST语言的代码本体声明:
IF first THEN
var1.x-pos := REAL#1.3E+2
var1.rpm := 3000;
...
first := FALSE;
END_IF
...
 
[/Post]
最后修改:2005-11-8 22:30:51
05-02-04 11:21
[Post=60]用户自定义的字符串数据类型是具有可变数目的字符的字符串。声明一个用户自定义的字符串时,其长度被放在该数据类型后面的括号内。
用户定义字符串数据类型声明的例子。
TYPE
STRING10    :STRING(10)
END_TYPE
在这个例子中,字符串的长度是10个字符。
限制:最短的合理字符串长度为1,最长的合理字符串长度为32766。
[/Post]
最后修改:2005-11-8 22:31:30
05-02-04 11:23
[Post=50]枚举数据类型声明的例子:
TYPE
light    :(red, yellow, green);
END_TYPE
在该例子中,‘light’数据类型只能具有‘red’、‘yellow’或‘green’等值。
[/Post]
最后修改:2005-11-8 22:32:44
05-02-04 11:26
IEC 61131-3中的直接量
直接量可用于输入数据的外部表示。直接量对于数值、字符串和时间数据的表达是必需的。每当您要输入值时,就必须使用直接量。
05-02-04 11:27
[Post=50]下表显示了可供使用的数值直接量:
类型 例子
整数直接量 -12 0 123_456 +986
实数直接量 -12.0 0.0 0.4560 3.14159_26
带有指数的实数直接量 -1.34E-12 -1.34e-12 1.0E+6
二进制直接量 INT#2#1111_1111
八进制直接量 INT#8#377
十六进制直接量 INT#16#FF SINT#16#ff
布尔FALSE和TRUE FALSE TRUE
布尔0和1 0,1
用于变量工作单中的直接量、INT或BOOL数据类型的直接量,可以不带关键字而使用,如下面的例子所示:
对于 INT#16#ff,您可以用16#ff。
对于 BOOL#FALSE,您可以用FALSE。
在变量声明中,您可以用“var1:DINT:=10”,但在代码本体中,您必须使用“LD DINT#10”。
[/Post]
最后修改:2005-11-8 22:33:18
05-02-04 11:28
[replyview]字符串直接量是包括在两个单引号字符之间的零个或多个字符序列。
下表显示了可供使用的字符串直接量:
类型 例子
空串 ''
带空格的串 ' '
非空串 'this is a text'
[/replyview]
05-02-04 11:29
[Post=100]持续时间数据可以由小时、分、秒、毫秒及其组合来表示。
下表显示了可供使用的持续时间直接量:
类型 例子
短前缀  T#14ms t#14ms t#12m18s3.5ms T#25h_15m t#25h_15m
长前缀  TIME#14 ms time#14ms TIME#25h_15m time#25h_15m
[/Post]
05-02-04 11:30

上一页 下一页

工控新闻

更多新闻资讯