s7300SCL编程笔记.docx
《s7300SCL编程笔记.docx》由会员分享,可在线阅读,更多相关《s7300SCL编程笔记.docx(15页珍藏版)》请在冰豆网上搜索。
![s7300SCL编程笔记.docx](https://file1.bdocx.com/fileroot1/2023-1/5/fa367914-eb69-40b9-a72b-2ea78242be43/fa367914-eb69-40b9-a72b-2ea78242be431.gif)
s7300SCL编程笔记
SCL编程
一.数据类型:
基本数据类型
复杂数据类型
用户自定义数据类型
BOOL
位
DATE_AND_TIME
UDT
BYTE
字节
日历:
格式:
Date1:
DT:
=DT#1990-01-01-00:
00:
00
名称
类型
初始值
UDT的面向源文件的输入和STRUCT变量的输入一样,都限定在关键字TYPE和END_TYPE这间。
如:
TYPEudtname
STRUCT
Komp1name:
datatype:
=pre-assignment;
Komp1name:
datatype:
=pre-assignment;
……….
END_STRUCT
END_TYPE
WORD
字
DWORD
双字
CHAR
字符
STRING
字符串
格式:
M1:
STRING[NO.]:
=初始值;
INT
整数
DINT
双整数
REAL
浮点数
ARRAY
数组
格式:
M1:
ARRAY[N..M]OFINT;
数组名:
ARRAY[N..M]OFINT;
在数组里寻址:
数组[NO.]
S5TIME
时间:
时,分,秒。
如S5T#1h1m1s
DATE
日期:
年,月,日。
如;
D#2012-4-26
TIME
表示:
日期,时,分,秒,毫秒。
如:
TIME#24h20h31m
23s648ms
STRUCT
结构
TIME_OF_DAY
如:
TIME_OF_DAY#00:
00:
00
TOD#00:
00:
00
注:
还有两种类型:
P:
POINTER(指针数据类型)。
A:
ANY(任何类型)
数组的定义:
M1:
ARRAY[n0..m0,n1..m1]OFINT;
二.寻址
绝对寻址
地址区域
位
字节
字
双字
输入
Iy.x
IBy
IWy
IDy
输出
Qy.x
QBy
QWy
QDy
外围输入
---
PIBy
PIWy
PIDy
外围输出
---
PQBy
PQWy
PQDy
存储位
M
MBy
MWy
MDy
全局数据地址
DB.DXy.x
DB.Dy.x
DB.DBy
DB.DWy
DB.DDy
符号寻址
如:
DB10.setpoint
“motor1data”.DW12
间接寻址
如:
E[byteindex,bitindex]
MB[byteindex]
DB10.DW[byteindex]
三.SCL运算符和表达式
结合
名称
运算符
优先级
圆括号
(表达式)
(,)
1
算术
幂
一元加,一元减
乘法,除法
加法,减法
**
+,-
*,/,DIV,MOD
+,-
2
3
4
5
比较
小于,小于等于,大于,大于等于
等于,不等于
<,<=,>,>=
=,<>
6
7
二进制结合
非(一元)
与逻辑运算
异或
或逻辑运算
NOT
AND,&
XOR
OR
3
8
9
10
赋值
赋值
:
=
11
注:
以上运算符的表达式基本大多和我们的数学表达式一样。
这里只讲解一下AND,XOR,OR指令。
如:
a1:
=a1ANDW#16#FFFF
a1:
=a1XORW#16#FFFF
a1:
=a1ORMW10
四.控制语句
控制语句:
语句说明:
IF
依赖布尔值的程序分支
CASE
依赖INT值的程序分支
FOR
具有运行变量的程序循环
WHILE
具有执行条件的程序循环
REPEAT
具有删除条件的程序循环
CONTINUE
当前循环通道的消除
EXIT
退出程序循环
GOTO
跳转到跳转标号
RETURN
退出块
注意:
当使用程序循环时,请确保不超过循环监测时间。
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变量:
=n0TOnBYmDO
…………………..;
………………….;
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;
……………..
CASESelection;
1:
GOTOM1;
2:
GOTOM2;
3:
GOTOM3;
ELSEGOTODND;
END_CASE;
M1:
语句1;
GOTODND;
M2:
语句2;
GOTODND;
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_PULSES_PEXTS_ODTS_ODTSS_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_BLOCKTIME
VAR_INPUT
MY_TIMER:
ARRAY[1..4]ofSTRUCT
T_NINT;
TV:
WORD;
END_STRUCT;
…
END_VAR
…
FORI:
=1TO4DO
CurrTime:
=S_ODT(T_N=MY_TIMER.T_NO,S:
=true,
MY_TIMER.TV);
END_FOR;
FUNCTION_BLOCKTIMER
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_BLOCKCOUNT
VAR_INPUT
Count:
ARRAY[1..4]ofSTRUCT
C_NINT;
PV:
WORD;
END_STRUCT;
…
END_VAR
…
FORI:
=1TO4DO//动态调用计数器
S_CD(C_N=Count.C_NO,S:
=true,PV:
=Count.PV);
END_FOR;
FUNCTION_BLOCKCOUNTER
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.141592;
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.排序
FUNCTIONFC4:
VOID
Know_How_Protect
VAR_TEMP
//TemporaryVariables
loop_count:
INT;
index_1:
INT;
index_2:
INT;
Data_Store:
ARRAY[0..5]OFINT;
T:
INT;
N:
INT;
END_VAR
//StatementSection
//BlockParameters
VAR_INPUT//InputParameters
INT0:
INT;
INT1:
INT;
INT2:
INT;
INT3:
INT;
INT4:
INT;
INT5:
INT;
END_VAR
VAR_IN_OUT
//I/OParameters
END_VAR
VAR_OUTPUT
//OutputParameters
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;
FORloop_count:
=0TO5BY1DO
//查找最小值
IFmin_data>Data_Store[loop_count]THENmin_data:
=Data_Store[loop_count];
END_IF;
END_FOR;
FORindex_1:
=0TO5BY1DO
FORindex_2:
=index_1TO5BY1DO
IFData_Store[index_1]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效验:
FUNCTIONFC101:
VOID
//RTU通信SCL程序
//BlockParameters
VAR_INPUT
//InputParameters
ZH:
BYTE;//站号
GNM:
BYTE;//功能码
SZDZ1:
BYTE;//数据地址1
SZDZ2:
BYTE;//数据地址2
SZNR1:
BYTE;//数据内容1
SZNR2:
BYTE;//数据内容2
END_VAR
VAR_IN_OUT
//I/OParameters
END_VAR
VAR_OUTPUT
//OutputParameters
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
//TemporaryVariables
CRC:
WORD;
SHUZU:
ARRAY[0..7]OFBYTE;//数组
N:
INT;//外循环6次
M:
INT;//内循环8次
ZZ:
INT;//数组指针
YCW:
WORD;//CRC右移位时,判断最后一位。
TEM:
WORD;//用做CRC最后结果的高8位和低8位的分别传送。
END_VAR
BEGIN
//StatementSection
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寄存器
FORN:
=0TO5BY1DO//外循环6次
CRC:
=CRCXORSHUZU[ZZ];//将CRC寄存器与各字节异或
FORM:
=0TO7BY1DO//内循环8次
YCW:
=CRC;//将CRC寄存器的内容送给YCW中
YCW:
=YCWANDW#16#0001;
//取CRC寄存器的最后一位,也就是下面移位的溢出位
CRC:
=SHR(IN:
=CRC,N:
=1);//对CRC寄存器右移一位
IFYCW=W#16#0001THENCRC:
=CRCXORW#16#A001;
//判断溢出位是否是1,是1就将CRC寄存器与16#A001异或。
END_IF;
END_FOR;
ZZ:
=ZZ+1;//一个字节处理好了,数组指针加1。
END_FOR;
TEM:
=CRC;//将CRC内的内容送给TEM
TEM:
=TEMANDW#16#00FF;//取TEM(CRC)的低8位
SHUZU[6]:
=WORD_TO_BYTE(TEM);//将TEM低8位送给数组的6号位
TEM:
=CRC;//再将CRC内的内容送给TEM
TEM:
=TEMANDW#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