【工控老马】西门子PLC s7-300SCL编程详解

SCL编程详解

一. 数据类型:
在这里插入图片描述

注:还有两种类型:P:POINTER(指针数据类型)。A:ANY(任何类型)

数组的定义:M1:ARRAY[n0…m0,n1…m1] OF INT;

二. 寻址
○1绝对寻址
在这里插入图片描述

○2符号寻址
如:DB10.setpoint
“motor1data”.DW12

○3间接寻址
如:E[byteindex,bitindex]
MB[byteindex]
DB10.DW[byteindex]

三.SCL运算符和表达式
在这里插入图片描述

注:以上运算符的表达式基本大多和我们的数学表达式一样。这里只讲解一下AND,XOR,OR指令。

如:a1:=a1 AND W#16#FFFF
a1:=a1 XOR W#16#FFFF
a1:=a1 OR MW10

四.控制语句
在这里插入图片描述

注意:当使用程序 循环时,请确保不超过循环监测时间。

  1. IF语句:
    IF 条件0
    THEN 语句0;
    ELSIF 条件1
    THEN 语句1;
    ELSIF 条件2
    THEN 语句2;
    ELSE 语句3;
    END_IF;

  2. CASE语句:“选择”内的值等于Const内的值就执行那个语句。其它语句不执行,就执行END_CASE;
    CASE 选择 OF
    Const1:语句1;
    Const2:语句2;
    ………
    Constn:语句n;
    END_CASE;

  3. FOR语句
    FOR 变量:=n0 TO n BY m DO
    ……………………;
    ………………….;
    END_FOR;
    注意:这里的n为整型变量或整数值。m为每循环加几。

  4. WHILE语句:只要条件满足,程序循环就重复。
    WHILE 条件 DO
    语句;
    END_WHILE;

  5. REPEAT语句:只要条件不满足,就重复程序循环。
    REPEAT
    语句;
    UNTIL 条件;
    END_REPEAT;

  6. CONTINUE语句:在FOR, WHILE, REPEAT循环中终止当前程序通道。

  7. EXIT语句:在FOR, WHILE, REPEAT循环中终止所有程序通道。

  8. RETURN语句:语句无条件地退出当前执行的块。

  9. GOTO语句:
    例:
    LABEL //定义标签
    M1,M2,M3,END;
    END_LABEL;
    ………………
    CASE Selection;
    1:GOTO M1;
    2:GOTO M2;
    3:GOTO M3;
    ELSE GOTO DND;
    END_CASE;
    M1:语句1;
    GOTO DND;
    M2:语句2;
    GOTO DND;
    M3:语句3;
    END: ;

五.常量:

  1. 位常量:值为TRUE或者FALSE.

  2. 字符常量:(这里是一个字符)
    Charac_1:=’B’
    Charac_2:=char#43;
    Charac_3:=char#’B’ //字符‘B’
    Charac_4:=’$41’ //字符‘A’

  3. 字符串常量:
    M1:=’ABCDEFJH’

  4. 日期常量:
    T1:=DATE#1995-11-11;
    T2:=D#1995-11-11

  5. 时间常量
    N1:=TIME#10.2S;
    N2:=T#3D_2S_3MS;

  6. TIME_OF_DAY常量:
    TM1:=TIME_OF_DAY#12:11:10.1;
    TT2:=TOD#10:10:10;

  7. DATE_AND_TIME常量:
    TT:=DT#2012-4-26-18:12:00;

六.定时器和计数器:

1.定时器有5种,依次为:S_PULSE S_PEXT S_ODT S_ODTS S_OFFDT
VAR
CurrTime : S5time;
BiVal : word;
ActFlag : bool;
END_VAR
//在调用定时器时,部分参数可以省略,但左边的赋值变量一定不能省略。
CurrTime:=S_ODT(T_N=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_N INT;
TV : WORD;
END_STRUCT;

END_VAR

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

FUNCTION_BLOCK TIMER
VAR_INPUT
mytimer:TIMER;
END_VAR

CurrTime:=S_ODT(T_N=mytimer,…);

2、计数器
S_CU 增计数器
S_CD 减计数器
S_CUD 增/减计数器

e.g.
S_CUD (C_N=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_N INT;
PV : WORD;
END_STRUCT;

END_VAR

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

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

七.数学函数:
三角函数 对数功能
SIN 正弦 EXP 以e为底的指数功能
COS 余弦 EXPD 以10为底的指数功能
TAN 正切 LN 自然对数
反三角函数 LOG 以10为底的对数
ASIN 反正弦 其它数学功能
ACOS 反余弦 ABS 求绝对值
ATAN 反正切 SQR 求平方
SQRT 求平方根

例子:
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

八.移位函数:
ROL、ROR、SHL、SHR
例子:
RESULT := ROL (IN:=CRC, N:=5); //CRC ,左移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填充

九.SCL块
SCL所用的块结构与标准编程语言有完全相同的方式。
注意:没有功能值返回的功能FC是VOID数据类型。

十.实例:
1.排序
FUNCTION FC4:VOID
Know_How_Protect

VAR_TEMP
// Temporary Variables
loop_count:INT;
index_1:INT;
index_2:INT;
Data_Store:ARRAY[0…5] OF INT;
T :INT;
N :INT;
END_VAR

// Statement Section

// Block Parameters

VAR_INPUT // Input Parameters
INT0:INT;
INT1:INT;
INT2:INT;
INT3:INT;
INT4:INT;
INT5:INT;

END_VAR

VAR_IN_OUT
// I/O Parameters
END_VAR

VAR_OUTPUT
// Output Parameters
min_data:INT;
l_0,l_1,l_2,l_3,l_4,l_5: INT;
END_VAR

Data_Store[0]:=INT0;
Data_Store[1]:=INT1;
Data_Store[2]:=INT2;
Data_Store[3]:=INT3;
Data_Store[4]:=INT4;
Data_Store[5]:=INT5;

min_data:=Data_Store[0];
N:=0;
T:=0;

FOR loop_count:=0 TO 5 BY 1 DO
//查找最小值
IF min_data > Data_Store[loop_count] THEN min_data:=Data_Store[loop_count];
END_IF;
END_FOR;

FOR index_1:=0 TO 5 BY 1 DO
FOR index_2:=index_1 TO 5 BY 1 DO
IF Data_Store[index_1] < Data_Store[index_2] THEN
T:=Data_Store[index_2];
Data_Store[index_2]:=Data_Store[index_1];
Data_Store[index_1]:=T;
END_IF;
END_FOR;
END_FOR;

l_0:=Data_Store[0];
l_1:=Data_Store[1];
l_2:=Data_Store[2];
l_3:=Data_Store[3];
l_4:=Data_Store[4];
l_5:=Data_Store[5];
END_FUNCTION

2.求RTU效验:
FUNCTION FC101 : VOID
//RTU通信SCL程序
// Block Parameters
VAR_INPUT
// Input Parameters
ZH:BYTE;//站号
GNM:BYTE;//功能码
SZDZ1:BYTE;//数据地址1
SZDZ2:BYTE;//数据地址2
SZNR1:BYTE;//数据内容1
SZNR2:BYTE;//数据内容2
END_VAR

VAR_IN_OUT
// I/O Parameters
END_VAR

VAR_OUTPUT
// Output Parameters
SCZH:BYTE;//站号
SCGNM:BYTE;//功能码
SCSZDZ1:BYTE;//数据地址1
SCSZDZ2:BYTE;//数据地址2
SCSZNR1:BYTE;//数据内容1
SCSZNR2:BYTE;//数据内容2
XYM1:BYTE;//效验1
XYM2:BYTE;//效验2
END_VAR

VAR_TEMP
// Temporary Variables
CRC:WORD;
SHUZU:ARRAY[0…7]OF BYTE;//数组
N:INT;//外循环6次
M:INT;//内循环8次
ZZ:INT;//数组指针
YCW:WORD;//CRC右移位时,判断最后一位。
TEM:WORD;//用做CRC最后结果的高8位和低8位的分别传送。

END_VAR
BEGIN
// Statement Section
ZZ:=0;//对指针清零
TEM:=0;//清零

SHUZU[0]:=ZH;//将输入的站号送给数组的0位
SHUZU[1]:=GNM;//将输入的功能码送给数组的1位
SHUZU[2]:=SZDZ1;//将输入的数据地址1送给数组的2位
SHUZU[3]:=SZDZ2;//将输入的数据地址2送给数组的3位
SHUZU[4]:=SZNR1;//将输入的数据内容1送给数组的4位
SHUZU[5]:=SZNR2;//将输入的数据内容2送给数组的5位
CRC:=W#16#FFFF;//将16#FFFF送给CRC寄存器

FOR N:=0 TO 5 BY 1 DO//外循环6次
CRC:=CRC XOR SHUZU[ZZ];//将CRC寄存器与各字节异或
FOR M:=0 TO 7 BY 1 DO//内循环8次
YCW:=CRC;//将CRC寄存器的内容送给YCW中
YCW:=YCW AND W#16#0001;
//取CRC寄存器的最后一位,也就是下面移位的溢出位
CRC:=SHR(IN:=CRC,N:=1);//对CRC寄存器右移一位

IF YCW=W#16#0001 THEN CRC:=CRC XOR W#16#A001;
//判断溢出位是否是1,是1就将CRC寄存器与16#A001异或。
END_IF;

END_FOR;
ZZ:=ZZ+1; //一个字节处理好了,数组指针加1。
END_FOR;
TEM:=CRC;//将CRC内的内容送给TEM
TEM:=TEM AND W#16#00FF;//取TEM(CRC)的低8位
SHUZU[6]:=WORD_TO_BYTE(TEM);//将TEM低8位送给数组的6号位
TEM:=CRC;//再将CRC内的内容送给TEM
TEM:=TEM AND W#16#FF00;//取TEM(CRC)的高8位
TEM:=SHR(IN:=TEM,N:=8);//再高8位右移8位
SHUZU[7]:=WORD_TO_BYTE(TEM);//将高8位的内容送到数组的7号位

SCZH:=SHUZU[0];//输出站号
SCGNM:=SHUZU[1];//输出功能码
SCSZDZ1:=SHUZU[2];//输出数据地址1
SCSZDZ2:=SHUZU[3];//输出数据地址2
SCSZNR1:=SHUZU[4];//输出数据内容1
SCSZNR2:=SHUZU[5];//输出数据内容2
XYM1:=SHUZU[6];//输出效验码
XYM2:=SHUZU[7];//输出效验码

END_FUNCTION

西门子S7-1200 SCL编程指令手册.pdf》是一本详细介绍了西门子S7-1200系列PLC控制器的SCL(Structured Control Language,结构化控制语言编程指令的手册SCL是一种高级编程语言,可以在S7-1200 PLC中实现复杂的控制算法和逻辑。该手册包含了SCL编程指令的详细说明和使用方法,对于PLC编程人员来说是非常宝贵的参考资料。 手册的内容主要分为几个部分:基本概念介绍、语法规则、数据类型、基本指令、控制指令等。首先,手册介绍了SCL编程的基本概念,如变量、数据类型、运算符等,帮助读者更好地理解SCL编程的基本原理。接着,手册详细说明了SCL的语法规则,包括变量声明、循环语句、条件语句等,让读者了解如何正确编写SCL程序。 手册还列举了SCL编程中常用的数据类型,如整数、浮点数、字符串等,并提供了相应数据类型的定义和使用方法。此外,手册还介绍了一些基本指令,例如赋值指令、运算指令、输入输出指令等,读者可以通过这些指令完成基本的算术运算和数据处理。此外,手册还介绍了一些常用的控制指令,如循环控制、条件控制等,帮助读者更好地掌握SCL编程。 总之,《西门子S7-1200 SCL编程指令手册.pdf》对于想要学习和掌握S7-1200 PLCSCL编程的人来说是一本非常有价值的资料。通过学习该手册,读者可以了解SCL编程的基本概念和语法规则,掌握常用的编程指令,从而编写出高效、可靠的PLC控制程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工控老马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值