您当前的位置:五五电子网电子知识plc技术PLC入门如何在S7300/400型PLC中使用高级语言编程 正文
如何在S7300/400型PLC中使用高级语言编程

如何在S7300/400型PLC中使用高级语言编程

点击数:7480 次   录入时间:03-04 11:55:44   整理:http://www.55dianzi.com   PLC入门
Value_2:=2#0101; // 2进制值为5
Value_3:=8#17; // 10进制值为14
Value_4:=16#F; // 16进制值为15
Value_5:=INT#16#3f_ff // 16进制值,类型被定义

3、Real常量

NUM4:= -3.4 ;
NUM5:= 4e2 ;
NUM6:= real#1.5;

4、字符常量(单个字符)

Charac_1 := B;
Charac_2 := char#43;
Charac_3 := char#B; //字符’B’
CHARACTER := $41 ; //字符A

5、字符串常量

NAME:= SIEMENS;

6、日期常量

TIMEVARIABLE1:= DATE#1995-11-11 ;
TIMEVARIABLE2:= D#1995-05-05 ;

7、时间常量

Interval1:= TIME#10.5S ;
Interval2:= T#3D_2S_3MS ;

8、Time-of-Day常量

TIMEOFDAY1:= TIME_OF_DAY#12:12:12.2 ;
TIMEOFDAY2:= TOD#11:11:11 ;

9、Date and Time常量

TIMEOFDAY1:= DATE_AND_TIME#1995-01-01-12:12:12.2 ;
TIMEOFDAY2:= DT#1995-02-02-11:11:11;

六、CPU的内存区域
1、可以直接操作字节、字、位
STATUSBYTE :=IB10;
STATUS_3 :=I1.1;
MEASVAL :=IW20;
2、可以通过索引对位、字、字节操作,该索引可以是变量
MEASVAL_1 :=IW[COUNTER]; //若COUNTER=5,则MEASVAL_1的值为IW5
OUTLABEL :=I[BYTENO, BITNO]; // 若BYTENO=3,BITNO=1,则OUTLABEL=I3.1
注:当获取的数据类型是BYTE, WORD or DWORD,时,使用一个索引参数,当获取的数据类型为BOOL时,必须使用两个索引参数,分别指定字节号和位号。
3、对数据块的操作


STATUSBYTE :=DB101.DB10; //字节操作
STATUS_2:= DB12.DX[WNO, BITNO]; //位操作,支持索引
STATUSBYTE :=Status_data.DW[COUNTER]; //字操作,支持索引
MEASVAL :=Measdata.DW20;
STATUS_1 :=WORD_TO_BLOCK_DB(INDEX).DW10;
注:和Lad及STL语言比较起来,SCL在对数据块中的字、字节等操作时,少一个”B”字符。

七、表达式、操作符和地址

1、操作符预览



八、控制流程
1、IF选择语句
IF condition THEN

ELSIF condition THEN // ELSIF语句可以不使用,或者使用一个或者多个

ELSE // ELSE语句可以不使用

END_IF ;
e.g.
IF ARRAY[INDEX] = INDEX THEN
CONTINUE ;
END_IF ;

2、CASE选择语句
CASE intVariant OF
1 : DISPLAY:= OVEN_TEMP;
2 : DISPLAY:= MOTOR_SPEED;
3..10: DISPLAY:= INT_TO_DINT (TW); //可以指定连续的值
QW4:= 16#0004;
11,13,19: DISPLAY:= 99; //也可以把一系列值列出来
QW4:= 16#0005;
ELSE: // ELSE:可以省略
DISPLAY:= 0;
TW_ERROR:= 1;
END_CASE ;

3、FOR循环语句
FUNCTION_BLOCK FOR_EXA
VAR
INDEX: INT ;
IDWORD: ARRAY [1..50] OF STRING;
END_VAR
BEGIN
FOR INDEX := 1 TO 50 BY 2 DO //从1到50,增量为2
IF IDWORD [INDEX] = KEY THEN
EXIT; //退出循环
END_IF;
END_FOR;
END_FUNCTION_BLOCK
注:一些关键字
EXIT 退出其所在的循环。
CONTINUE 终止当前循环的执行,控制程序进入下一循环。
RETURN 退出当前正在被执行的块。
4、WHILE循环
WHILE INDEX <= 50 AND IDWORD[INDEX] <> KEY DO //两个条件均满足才执行循环
INDEX := INDEX + 2;
END_WHILE ;


5、REPEAT循环
REPEAT
INDEX := INDEX + 2 ; //该语句与WHILE的区别是UNTIL之前的语句总是先执行一次
UNTIL INDEX > 50 OR IDWORD[INDEX] = KEY //这两条件之一若满足,则退出循环
END_REPEAT ;

6、GOTO跳转语句
IF A > B THEN
GOTO LAB1 ; //若条件满足,则跳到LAB1处
ELSIF A > C THEN
GOTO LAB2 ;
END_IF ;
// . . .
LAB1: INDEX := 1 ;
GOTO LAB3 ;
LAB2: INDEX := 2 ;

7、调用块
绝对地址调用,例如:
FB10.DB20(X1:=5,X2:=78,......); //参数可以任意排列
FC31 (X1:=5, Q1:=Checksum) ;
符号地址调用,例如:
DRIVE.ON (X1:=5,X2:=78,......);
DISTANCE (X1:=5, Q1=:Checksum) ;
每一个功能块有一个输入隐藏参数EN,和一个输出隐藏参数ENO,这两个参数是系统设定的,均为BOOL型,不需要声明,但在编程中可以使用,例如:
//若MY_ENABLE为FALSE,则FC85不会被执行,只有为TRUE,才会执行
Result := FC85(EN:= MY_ENABLE, PAR_1:= 27);
FB30.DB30 ([Parameter supply]);
IF ENO THEN //若FB30的调用没有问题,则…
// . . .
ELSE
// . . .
END_IF;

九、定时器和计数器
1、计数器
S_CU 增计数器
S_CD 减计数器
S_CUD 增/减计数器
e.g.
S_CUD (C_NO:=C12, //绝对调用定时器,指定计数器号
CD:=I0.0,
CU:=I0.1,
S:=I0.2 & I0.3, //置位条件
PV:=120, //设定计数器值
R:=FALSE, //复位条件
CV:=binVal, //输出参数,二进制计数值
Q:=actFlag); //输出参数,计数器的状态
FUNCTION_BLOCK COUNT
VAR_INPUT
Count: ARRAY [1..4] of STRUCT
C_NO: INT;
PV : WORD;
END_STRUCT;

END_VAR

FOR I:= 1 TO 4 DO //动态调用计数器
S_CD(C_NO:=Count[I].C_NO, S:=true, PV:= Count[I].PV);
END_FOR;
FUNCTION_BLOCK COUNTER
VAR_INPUT
MYCounter:COUNTER;
END_VAR

CurrVal:=S_CD(C_NO:=MyCounter,.....); //动态调用计数器

2、定时器
定时器有5种,依次为:S_PULSE S_PEXT S_ODT S_ODTS S_OFFDT
VAR
CurrTime : S5time;
BiVal : word;
ActFlag : bool;
END_VAR
//在调用定时器时,部分参数可以省略,但左边的赋值变量一定不能省略。
CurrTime:=S_ODT(T_NO:=T10, //绝对调用,制定定时器号
S:=TRUE, //置位条件
TV:=T#1s, //设定定时器值
R:=FALSE, //复位条件
BI:=biVal,
Q:=actFlag);
FUNCTION_BLOCK TIME
VAR_INPUT
MY_TIMER: ARRAY [1..4] of STRUCT
T_NO: INT;
TV : WORD;
END_STRUCT;

END_VAR

FOR I:= 1 TO 4 DO
CurrTime:= S_ODT(T_NO:=MY_TIMER[I].T_NO, S:=true,
MY_TIMER[I].TV);
END_FOR;

FUNCTION_BLOCK TIMER
VAR_INPUT
mytimer:TIMER;
END_VAR

CurrTime:=S_ODT(T_NO:=mytimer,.....);

十、S7-SCL中的标准功能
1、数据类型转换函数
隐式转换,其依照的顺序为:
BOOL > BYTE > WORD > DWORD
INT > DINT > REAL


e.g.
VAR
PID_CTRLLER_1 : BYTE ;
PID_CTRLLER_2 : WORD ;
END_VAR
IF (PID_CTRLLER_1 <> PID_CTRLLER_2) THEN ... //此时PID_CTRLLER_1被转换成WORD
当然,也可以使用以下功能显示的转换:
BOOL_TO_BYTE 、 BOOL_TO_DWORD 、BOOL_TO_WORD 、BYTE_TO_DWORD 、BYTE_TO_WORD 、 CHAR_TO_STRING 、DINT_TO_REAL 、INT_TO_DINT 、INT_TO_REAL、WORD_TO_DWORD

BYTE_TO_BOOL :Copies the least significant bit
DINT_TO_TOD :Copies the bit string Y
DINT_TO_BOOL :DWORD_TO_BOOL(DINT_TO_DWORD(x)) Y
DINT_TO_BYTE :DWORD_TO_BYTE(DINT_TO_DWORD(x)) Y
DINT_TO_STRING :DI_STRNG Y
DINT_TO_BCD(x)
DINT_TO_BCD_DWORD(x)

2、ROUND和TRUNC
ROUND():将REAL数四舍五入取整返回DINT
TRUNC():舍弃REAL数的小数部分取整返回DINT



3、一般数学函数


例子:
RESULT := ABS (-5) ; //5
RESULT := SQRT (81.0); //9
RESULT := SQR (23); //529
RESULT := EXP (4.1); //60.340 ...
RESULT := EXPD (3); //1_000
PI := 3. 141 592 ;
RESULT := SIN (PI / 6) ; //0.5
6、移位函数
ROL、ROR、SHL、SHR
例子:
RESULT := ROL (IN:=BYTE#2#1101_0011, N:=5); //2#0111_1010 ,左移5位 ,移出的填充到右边空位
RESULT := ROR (IN:=BYTE#2#1101_0011, N:=2); //2#1111_0100 ,右移2位 ,移出的填充到左边空位
RESULT := SHL (IN:=BYTE#2#1101_0011, N:=3); //2#1001_1000 ,左移3位,空余部分用0填充
RESULT := SHR (IN:=BYTE#2#1101_0011, N:=2); //2#0011_0100 ,右移2位,空余部分用0填充

7、字符串函数
由于PLC编程中字符、字符串的使用比较少,这里不详叙,感兴趣的可以参考西门子文档中的 14.4 Functions for Processing Strings (P293-P303)

8、选值函数
最大值函数
//用于获取这些参数中的最大值,参数最多可以有32个,其参数类型除了S5TIME以外,任意其他数//子类型均可以,但所有的参数数据类型必须一致。
A:=MAX(IN1:=a, IN2:=b, IN3:=c, IN4:=d...);
最小值函数
//用于获取这些参数中的最小值,参数最多可以有32个,其参数类型除了S5TIME以外,任意其他数//子类型均可以,但所有的参数数据类型必须一致。

上一页  [1] [2] [3]  下一页


本文关键字:如何  语言编程  PLC入门plc技术 - PLC入门

上一篇:PLC的编程步骤