TwinCAT基础编程手册.docx
- 文档编号:12679349
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:31
- 大小:105.47KB
TwinCAT基础编程手册.docx
《TwinCAT基础编程手册.docx》由会员分享,可在线阅读,更多相关《TwinCAT基础编程手册.docx(31页珍藏版)》请在冰点文库上搜索。
TwinCAT基础编程手册
TwinCAT软件编程
用户指令手册V1.0
2002.10.28
1.标准数据类型
1.1BOOL
BOOL类型变量可取值TRUE和FALSE。
保留8位内存空间。
1.2整型数据类型
所有的整型数据类型为:
●BYTE字节
●WORD字
●DWORD双字
●SINT短整型
●USINT无符号短整型
●INT整型
●UINT无符号整型
●DINT双精度整型
●UDINT无符号双精度整型
各个不同的数据类型有不同的值范围。
下表为整型数据的值范围和占用的内存空间
类型
下限
上限
内存空间
BYTE
0
255
8位
WORD
0
65535
16位
DWORD
0
4294967295
32位
SINT
-128
127
8位
USINT
0
255
8位
INT
-32768
32767
16位
UINT
0
65535
16位
DINT
-2147483648
2147483647
32位
UDINT
0
4294967295
32位
当用大类型转换为小类型时,将导致丢失信息。
1.3REAL/LREAL
REAL和LREAL被称为浮点数类型。
用于有理数表示。
REAL占用32位内存空间,LREAL占用64位。
1.4STRING
STRING类型变量可以是包含任何字符的字符串。
其容量大小在声明变量时说明,如果不对容量大小进行说明,其缺省值为80个字符。
字符串变量声明示例:
str:
STRING(35):
=‘ThisisaString’;
1.5时间、日期类型
TIME、TIME_OF_DAY(缩写TOD)、DATE和DATE_AND_TIME(缩写DT)数据类型在内部作为DWORD处理。
TIME和TOD中的时间用毫秒表示,TOD中的时间从12:
00AM开始。
DATE和DT中的时间用秒表示,并从1970年1月1日12:
00AM开始。
时间数据的格式在常数一节中说明。
1.6常数
1.6.1BOOL–常数
BOOL–常数为逻辑值TRUE和FALSE。
1.6.2TIME–常数
TIME常数可以在TwinCATPLC控制中声明。
主要用于标准库中定时器的操作,格式如下:
T#xxdxxhxxmxxsxxms
其中:
T表示时间常数起始,#数值符号,d天,h小时,m分,s秒,ms毫秒。
下面是ST中分配的正确的TIME常数示例:
TIME1:
=T#14ms;
TIME1:
=T#100s12ms;(*单位最大的成员允许超过其极限*)
TIME1:
=t#12h34m15s;
不正确的TIME常数示例:
TIME1:
=t#5m68s;(*单位较小的成员超过其极限*)
TIME1:
=15ms;(*遗漏T#*)
TIME1:
=t#4ms13d;(*单位顺序错*)
1.6.3DATE–常数
该常数用于输入日期。
DATE常数的声明用d、D、DATE或date,后接#构成,可以输入格式为年-月-日的任何日期。
示例:
DATE#1996-05-06
d#1972-03-29
1.6.4TIME_OF_DAY常数
该常数主要用于存储一天中的时间。
TIME_OF_DAY声明用tod#,TOD#,TIME_OF_DAY#或time_of_day#后接一个时间格式:
小时:
分:
秒。
秒可以用实数表示。
示例:
TIME_OF_DAY#15:
36:
30.123
tod#00:
00:
00
1.6.5DATE_AND_TIME–常数
日期常数和时间常数可以组合成所谓的DATE_AND_TIME常数。
DATE_AND_TIME常数用dt#,DT#,DATE_AND_TIME#或date_and_time#开始,后接日期和时间,日期和时间之间用–连接。
示例:
DATE_AND_TIME#1996-05-06-15:
36:
30
dt#1972-03-29-00:
00:
00
1.6.6数值常数
数值可以用二进制、八进制、十进制和十六进制数表示。
示例:
14(十进制数)
2#1001_0011(二进制数)
8#67(八进制数)
16#A(十六进制数)
这些数值可以是BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT,REAL或LREAL类型,不允许直接从“大类型”向“小类型”转换。
例如,DINT变量不能简单地以INT型变量使用。
可以用标准库中的转换功能实现其转换。
1.6.7REAL/LREAL–常数
REAL和LREAL常数可以用尾数和指数表示,并使用美国标准。
示例:
7.4取代7,4
1.64e+009取代1,64e+009
1.6.8STRING–常数
字符串是由字符组成的序列。
STRING常数使用单引号对区分。
一些特殊的符号可用下表表示:
字符
说明
$$
美元符号
$L或$l
行给进
$N或$n
新行
$P或$p
页给进
$R或$r
行结束
$T或$t
制表
$’
单引号
示例:
‘YourName’
‘SusiandClaus’
‘:
-)$’’
2.变量类型转换功能
不能直接从“大类型”向“小类型”变量转换。
(例如:
从INT到BYTE,或从DINT到WORD)。
要完成此功能,可以使用特殊功能块实现。
作为一种规则,你可以用此功能将一种类型的变量转换成任何需要的类型变量。
句法:
2.1BOOL_TO_变换
BOOL类型变量到不同类型的变换:
对于数值类型变量,操作数为TRUE时,结果为1;操作数为FALSE时,结果为0。
对字符串类型变量,其结果分别为‘TRUE’和‘FALSE’。
ST中的示例:
i:
=BOOL_TO_INT(TRUE);(*结果为1*)
str:
=BOOL_TO_STRING(TRUE);(*结果为'TRUE'*)
t:
=BOOL_TO_TIME(TRUE);(*结果为T#1ms*)
tof:
=BOOL_TO_TOD(TRUE);(*结果为TOD#00:
00:
00.001*)
dat:
=BOOL_TO_DATE(FALSE);(*结果为D#1970-01-01*)
dandt:
=BOOL_TO_DT(TRUE);(*结果为DT#1970-01-01-00:
00:
01*)
2.2TO_BOOL–变换
其它类型变量到BOOL的转换:
当操作数不为零时,结果为TRUE,当操作数为零时,结果为FALSE;当字符串变量的操作数为’TRUE’时,结果为真,否则,结果为假。
ST中的示例:
b:
=BYTE_TO_BOOL(2#11010101);(*结果为TRUE*)
b:
=INT_TO_BOOL(0);(*结果为FALSE*)
b:
=TIME_TO_BOOL(T#5ms);(*结果为TRUE*)
b:
=STRING_TO_BOOL('TRUE');(*结果为TRUE*)
2.3整型数类型之间的转换
整型数值类型到其它数值类型的转换:
当从大类型向小类型转换时,存在丢失信息的危险。
如果转换的数值超过其极限;则该数的第一个字节将被忽略。
ST中的示例:
si:
=INT_TO_SINT(4223);(*结果为127*)
如果你将整数4223(十六进制为16#107f)作为SINT变量保存,其结果为127(十六进制为16#7f)。
IL中的示例:
LD2
INT_TO_REAL
MUL3.5
2.4REAL_TO-/LREAL_TO–转换
REAL或LREAL类型到其它数值类型的转换:
数值将向上或向下取整并转换成新的数据类型。
但变量类型STRING,BOOL,REAL和LREAL除外。
当从大类型向小类型转换时,存在丢失信息的危险。
请注意:
当向字符串变量转换时,保留16个数据,如果(L)REAL数据有更多的数,则第十六个数将被取整。
如果字符串的长度定义为短型,则从右端开始截取。
ST中的示例:
i:
=REAL_TO_INT(1.5);(*结果为2*)
j:
=REAL_TO_INT(1.4);(*结果为1*)
IL中的示例:
LD2.7
REAL_TO_INT
GE%MW8
2.5TIME_TO-/TIME_OF_DAY–转换
TIME或TIME_OF_DAY类型到其它类型的转换:
时间在内部以毫秒单位及DWORD方式处理(对于TIME_OF_DAY变量,用12:
00AM起始)。
该值将被转换。
当从大类型向小类型转换时,存在丢失信息的危险。
对于字符串类型变量,其结果为时间常数。
ST中的示例:
str:
=TIME_TO_STRING(T#12ms);(*结果为'T#12ms'*)
dw:
=TIME_TO_DWORD(T#5m);(*结果为300000*)
si:
=TOD_TO_SINT(TOD#00:
00:
00.012);(*结果为12*)
2.6DATE_TO-/DT_TO–转换
DATE或DATE_AND_TIME类型到其它类型的转换:
时间在内部以1970.01.01开始所经过的时间,并以秒为单位及DWORD方式处理。
该值将被转换。
当从大类型向小类型转换时,存在丢失信息的危险。
对于字符串类型变量,其结果为日期常数。
ST中的示例:
b:
=DATE_TO_BOOL(D#1970-01-01);(*结果为FALSE*)
i:
=DATE_TO_INT(D#1970-01-15);(*结果为29952*)
byt:
=DT_TO_BYTE(DT#1970-01-15-05:
05:
05);(*结果为129*)
str:
=DT_TO_STRING(DT#1998-02-13-14:
20);(*结果为'DT#1998-02-13-14:
20'*)
2.7STRING_TO–转换
STRING类型到其它类型的转换:
字符串类型变量中必须包含有效的目标变量类型值,否则其转换结果为零。
ST中的示例:
b:
=STRING_TO_BOOL('TRUE');(*结果为TRUE*)
w:
=STRING_TO_WORD('abc34');(*结果为0*)
t:
=STRING_TO_TIME('T#127ms');(*结果为T#127ms*)
2.8TRUNC(取整)
从REAL到INT类型转换。
数值的所有部分都将被使用。
当从大类型向小类型转换时,存在丢失信息的危险。
ST中的示例:
i:
=TRUNC(1.9);(*结果为1*).
i:
=TRUNC(-1.4);(*结果为1*).
IL中的示例:
LD2.7
TRUNC
GE%MW8
3.用户定义的数据类型
3.1数组
支持一维、二维和三维数组的成员数据类型。
数组可在POU的声明部分和全局变量表中定义。
语法:
<数组名>:
ARRAY[
ll1,ll2为数组维数的下限标识,ul1和ul2为数组维数的上限标识。
数值范围必须为整数。
示例:
Card_game:
ARRAY[1..13,1..4]OFINT;
数组的初始化:
可以对数组中的所有元素进行初始化,或不进行初始化。
数组初始化示例:
arr1:
ARRAY[1..5]OFINT:
=1,2,3,4,5;
arr2:
ARRAY[1..2,3..4]OFINT:
=1,3(7);(*等同1,7,7,7*)
arr3:
ARRAY[1..2,2..3,3..4]OFINT:
=2(0),4(4),2,3;(*等同0,0,4,4,4,4,2,3*)
结构化中的数组初始化示例:
TYPESTRUCT1
STRUCT
p1:
int;
p2:
int;
p3:
dword;
END_STRUCT
ARRAY[1..3]OFSTRUCT1:
=(p1:
=1;p2:
=10;p3:
=4723),(p1:
=2;p2:
=0;p3:
=299),
(p1:
=14;p2:
=5;p3:
=112);
数组部分元素初始化示例:
arr1:
ARRAY[1..10]OFINT:
=1,2;
数组中的元素如果没有初始化值,则用基本类型的缺省值初始化其值。
在上例中,元素arr1[3]到元素arr1[10]均被初始化为0。
二维数组的元素存取,使用下列语法:
<数组名>[Index1,Index2]
示例
Card_game[9,2]
注:
如果你在项目中定义了一个名为CheckBounds的功能,则可以自动检查数组的上下限超限错误!
下图中给出了如何实现该功能的示例。
下面的示例用CheckBounds功能测试数组的超限问题。
CheckBounds功能允许A[0]到A[7]元素分配值TRUE,而不会给A[10]分配值,这样可以避免对数组元素的错误操作。
3.2指针
当程序运行时,变量或功能块地址保存在指针中。
指针声明为如下句法形式:
<指针名>:
POINTERTO<数据类型/功能块>;
指针可指向任何数据类型、功能块和用户定义的数据类型。
对地址操作的ADR功能,可将变量或功能块的地址指向指针。
指针后加内容操作符”^”可取出指针中的数据。
示例:
pt:
POINTERTOINT;
var_int1:
INT:
=5;
var_int2:
INT;
pt:
=ADR(var_int1);
var_int2:
=pt^;(*var_int2的值为5*)
3.3牧举
牧举为用户定义的数据类型,并由一组字符串常数组成。
这些常数被视为牧举值。
牧举值在项目中为全局使用的变量,即使它们在POU中为本地声明的变量。
创建牧举变量的最好方法是在数据类型对象组织下创建。
用关键字TYPE开始,END_TYPE结束。
句法:
TYPE<牧举变量>:
(
牧举变量可以取牧举值中的任何一个值。
缺省情况下,第一个牧举值为零,其后依次递增。
示例:
TRAFFIC_SIGNAL:
(Red,Yellow,Green:
=10);(*每个颜色的初始值为red0,yellow1,green10*)
TRAFFIC_SIGNAL:
=0;(*交通信号值为red*)
FORi:
=RedTOGreenDO
i:
=i+1;
END_FOR;
不能对同一个牧举值多次使用。
示例:
TRAFFIC_SIGNAL:
(red,yellow,green);
COLOR:
(blue,white,red);
错误:
red不能对TRAFFIC_SIGNAL和COLOR变量同时使用。
3.4结构
结构作为对象在数据类型页中创建。
使用TYPE关键字开始,END_TYPE关键字结束。
结构声明的句法如下:
TYPE<结构名>:
STRUCT
<声明变量1>
.
.
<声明变量n>
END_STRUCT
END_TYPE
<结构名>是一种类型,在项目中为全程识别,并且可作为标准数据类型使用。
允许内嵌结构。
唯一的限制是变量不能带地址(不允许用AT声明!
)。
下例为多边形的结构示例:
TYPEPolygonline:
STRUCT
Start:
ARRAY[1..2]OFINT;
Point1:
ARRAY[1..2]OFINT;
Point2:
ARRAY[1..2]OFINT;
Point3:
ARRAY[1..2]OFINT;
Point4:
ARRAY[1..2]OFINT;
End:
ARRAY[1..2]OFINT;
END_STRUCT
END_TYPE
可以使用下面的句法存取结构中的成员。
<结构_名>.<成员名>
例如:
结构名为“Week”,其中包含一个成员“Monday”,可以用Week.Monday获取该值。
3.5参考(别名类型)
可以使用用户定义的参考数据类型,创建已经更名的变量、常数或功能块。
在数据类型页中创建参考对象。
使用TYPE关键字开始,END_TYPE关键字结束。
句法:
TYPE<标识符>:
<分配项>;
END_TYPE
示例:
TYPEmessage:
STRING[50];
END_TYPE;
3.6替代范围类型
替代范围类型,是对其基本数据类型重新设置范围的一种数据类型。
声明可以在数据类型页中进行,但变量也可直接用子范围类型声明:
在数据类型页中声明的句法如下:
TYPE
类型
说明
必须为有效的IEC标识符
数据类型中的一种。
如SINT,USINT,INT,DINT,UDINT,BYTE,WORD,
DWORD(LINT,UINT,LWORD).
常数,必须为基本类型,设定的下边界在其类型范围之内。
常数,必须为基本类型,设定的上边界在其类型范围之内。
示例:
TYPE
SubInt:
INT(-4095..4095);
END_TYPE
用子范围类型直接声明的变量:
VAR
i1:
INT(-4095..4095);
i2:
INT(5...10):
=5;
ui:
UINT(0..10000);
END_VAR
如果常数被分配为一个子范围类型(在声明或实现段中),但其值没有落在该范围之内(例如i:
=5000),系统将会发出错误信息。
为了在运行期间检查边界范围,推荐使用功能CheckRangeSigned或CheckRangeUnsigned。
这样,边界有效性验证可通过合适的方法和手段捕获(例:
数值可以截取或设置错误标志)。
示例:
当变量属于有符号子范围类型时(如上例中的i),则功能CheckRangeSigned被调用;可以通过编程的方法使其值在允许范围之内。
FUNCTIONCheckRangeSigned:
DINT
VAR_INPUT
value,lower,upper:
DINT;
END_VAR
IF(value CheckRangeSigned: =lower; ELSIF(value>upper)THEN CheckRangeSigned: =upper; ELSE CheckRangeSigned: =value; END_IF 为了自动调用功能,功能名CheckRangeSigned被指定,并且接口也被指定: 返回值和三个DINT类型的参数。 当调用时,功能参数如下: 值 分配给范围类型的值 下限 下限边界范围 上限 上限边界范围 返回值 实际分配给范围类型的值 对i: =10*y进行边界有效性验证的示例: i: =CheckRangeSigned(10*y,-4095,4095); 示例中,y即使是1000,i经过上例赋值后其值仍然为4095。 同样,功能CheckRangeUnsigned过程同上: 功能名和接口必须正确。 FUNCTIONCheckRangeUnsigned: UDINT VAR_INPUT value,lower,upper: UDINT; END_VAR 注意: 如果没有CheckRangeSigned和CheckRangeUnsigned,则运行时,没有子类型的类型检验发生,变量i可以在–32768和32767之间取任何值。 注意: 如果功能CheckRangeSigned和CheckRangeUnsigned按照上例实现,则在FOR循环中可对子范围类型连续使用循环。 示例: VAR ui: UINT(0..10000); END_VAR FORui: =0TO10000DO ... END_FOR FOR循环不会剩余,因为ui不会大于10000。 象CheckRange功能内容一样,当在FOR循环中使用增量值时,也应考虑这些问题。 4.编程方式 4.1指令表IL 指令表(IL)由一系列指令组成。 每条指令都由一个新行开始,包含一个操作符以及和操作符类型相关的一个或多个操作数,并用逗号分开。 在指令前可以有标号,后接一个冒号。 注解必须在一行的最后,指令之间可以插入空行。 示例 标号 操作符 操作数 注解 LD 17 ST lint (*comment*) GE 5 JMPC next LD idword EQ istruct.sdword STN test next: 在IL语言中,可以使用下面的操作符和修饰符。 修饰符: ●JMP、CAL、RET中带C: 指令在预置表达式结果为TRUE时执行。 ●JMPC、CALC、RETC中带N: 指令在预置表达式结果为FALSE时执行。 ●其它指令中带N: 操作数取反(不是累加器)。 下表为IL中全部的操作符及可能的修饰符和相关的意义: 操作符 修饰符 意义 LD N 使当前结果等于操作数 ST N 在操作数位置保存当前结果 S 如果当前结果为TRUE,置位布尔操作数为TRUE R 如果当前结果为TRUE,复位布尔操作数为FALSE AND N,( 位与 OR N,( 位或 XOR ( 位异或 ADD ( 加 SUB ( 减 MUL ( 乘 DIV ( 除 GT ( > EQ ( = NE ( <> LE ( <= LT ( < JMP CN 跳转到标号 CAL CN 调用功能块 RET CN 从调用的功能块返回 ) 评估括号操作 IL是一种面向行的语言。 标号 : 操作符/功能 操作数(表) 注释 跳转
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TwinCAT 基础 编程 手册