在S型LC中使用高级语言编程.docx
- 文档编号:27967922
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:15
- 大小:201.34KB
在S型LC中使用高级语言编程.docx
《在S型LC中使用高级语言编程.docx》由会员分享,可在线阅读,更多相关《在S型LC中使用高级语言编程.docx(15页珍藏版)》请在冰豆网上搜索。
在S型LC中使用高级语言编程
在S7300/400型PLC中使用高级语言编程
S7-SCL是一种类似于Pasical、Deliphi的高级编程语言,其符合国际标准IEC61131-3,也就是说支持该标准的任意厂家的PLC均可以使用与之相似的语言编程。
这种语言适合于处理复杂的逻辑和大量的数学运算,由于其具有高级语言的编程结构,因此和S7的STL语句表编程方式比较起来有着更加方便的控制方式,可以这样说,只要是必须使用语句表的地方,我们均可以考虑使用SCL,也许STL在执行时比SCL更加高效,但事实上也不一定,首先SCL可以编译成STL,同时SCL设计时可以优化编程,而STL若运用不当,可能还会将低效率。
当然在目前的这种系列的PLC上,效率对于我们来说已是次要的,我们更关心的是编程结构。
就像在PC机上,舍弃了汇编语言,而主要采用C/C++等高级语言。
总体来说,SCL适合于编写标准功能块,由于在维护中,它和STL一样,不象Lad一样利于维护,因此这些标准功能块都应该有文档说明,以便用户了解其功能。
下面的内容主要是参考西门子的S7-SCL文档,对SCL进行了系统的介绍,最后给出了示例。
这里假设读者是学过S7-300/400编程,并曾经学过至少一种计算机高级编程语言。
一、软件的使用
1、创建一个新的S7-SCLSource文件
打开工程项目à选择CPU站à选择S7Programà选择Sources
在右边窗口的空白处点右键选InsertNewObjectà点击SCLSource
双击创建的SCLSource文件,进入SCL编辑界面。
2、块保护
在SCLSource文件的开头添加关键字:
KNOW_HOW_PROTECT,当打开由其创建的块时,只能显示参数,而看不到内容。
3、主菜单”Insert”下的”BlockTemplate”可用于插入如OB,FB等各种块的结构。
”ControlStructure”菜单可插入各种流程控制结构,这些都可以简化编程。
4、在运行程序之前,首先必须对它进行编译,可以编译整个Source文件或者某个被选择的块,通过选择菜单File>CompileSelectedBlocks。
也可以把几个Source文件一起进行编译,其方法是创建一个S7-SCLcompilationcontrolfile.在该文件中依次输入需要编译的SCLSource文件名,然后执行编译即可。
二、语法规则
1、编写SCLSource文件的一般规则
●FB,FC,OB,DB以及用户定义的UDT,它们使用的任意数字号均可以在SCLSource中编辑。
●每种块类型都有它自己的结构。
●每段落或者每个变量的声明以符号”;”标志结束。
●不区分大小写。
●注释仅存在于程序文档中,它不影响程序运行。
●当一个功能块被调用时,其背景数据块被自动创建,因此它们不需要被编辑。
●DB0有特定用途,因此在程序中不能创建DB0.
2、编写块的先后次序
●被调用的块必须位于调用块之前。
●UDT的定义必须位于其被使用的位置之前。
●共享数据块必须位于那些使用它的所有块之前。
三、数据类型
1、数据类型预览
Ⅰ、基本数据类型
2、补充
<1>、DATE_AND_TIMEDataType
其值的范围:
DT#1990-01-01-0:
0:
#2089-12-31-23:
59:
该类型以BCD码形式存储。
例如20/Oct./199512:
20:
30and10milliseconds显示如下:
DATE_AND_TIME#1995-10-20-12:
20:
DT#1995-10-20-12:
20:
<2>STRING
.声明
VAR
Text1:
String[123];VAR
CONTROLLER1:
3,1..4]OFINT:
=-54,736,-83,77,
-1289,10362,385,2,
60,-37,-7,103;
CONTROLLER2:
ARRAY[1..10]OFREAL;声明一个结构MOTOR中包含另一个结构DATA。
对结构声明时,可以初始化元素,也可以在使用之前再初始化。
VAR
MOTOR:
STRUCT
DATA:
STRUCT
LOADCURR:
REAL;
VOLTAGE:
INT:
=5;
END_STRUCT;
END_STRUCT;
END_VAR
结构以WORD的形式结尾,否则系统自动把丢失的字节补到结构中去。
<5>用户定义类型UDT(使用关键字TYPE)
<6>POINTER类型
.
.
ret:
=SFC79(N:
=N_out,SA:
=out);
END_FUNCTION
1000]OFREAL;
END_VAR
BEGIN
.
FC100(N_out:
=ii,out:
=aa);.
END_FUNCTION_BLOCK
<7>ANY类型
.
VAR_INPUT5:
..:
INT;
声明时可以初始化:
VALUE:
REAL:
=;
数组的初始化有两种方式:
CONTROLLER1:
ARRAY[1..2,1..2]OFINT:
=-54,736,-83,77;
当把相邻的数组元素赋相同的值时,例如,把A3[2]到A3[11]的值设为:
A3:
ARRAY[1..12]OFREAL:
=,10,;
2、块参数
输入参数:
用于接收当块被调用时的输入值,他们是只读的。
输出参数:
传输当前值到这个调用块,在被调用块中应该对该参数赋值
输入/输出参数:
用于接收当块被调用时的输入值,并可以把结果返回到调用块。
3、使用多重背景
声明方式如下:
Supply1:
FB10;
CONST
Number:
=10;10M3f1995-11-111995-05-051995-01-011995-02-02
W10;
注:
和Lad及STL语言比较起来,SCL在对数据块中的字、字节等操作时,少一个”B”字符。
七、表达式、操作符和地址
1、操作符预览
八、控制流程
1、IF选择语句
IFconditionTHEN
…
ELSIFconditionTHENIFARRAY[INDEX]=INDEXTHEN
CONTINUE;
END_IF;
2、CASE选择语句
CASEintVariantOF
1:
DISPLAY:
=OVEN_TEMP;
2:
DISPLAY:
=MOTOR_SPEED;
3..10:
DISPLAY:
=INT_TO_DINT(TW);50]OFSTRING;
END_VAR
BEGIN
FORINDEX:
=1TO50BY2DO..
LAB1:
INDEX:
=1;
GOTOLAB3;
LAB2:
INDEX:
=2;
…
7、调用块
绝对地址调用,例如:
(X1:
=5,X2:
=78,......);....);
DISTANCE(X1:
=5,Q1=:
Checksum);
每一个功能块有一个输入隐藏参数EN,和一个输出隐藏参数ENO,这两个参数是系统设定的,均为BOOL型,不需要声明,但在编程中可以使用,例如:
..
ELSE
..
END_IF;
九、定时器和计数器
1、计数器
S_CU增计数器
S_CD减计数器
S_CUD增/减计数器
.
S_CUD(C_N=C12,4]ofSTRUCT
C_NINT;
PV:
WORD;
END_STRUCT;
…
END_VAR
…
FORI:
=1TO4DO_NO,S:
=true,PV:
=Count[I].PV);
END_FOR;
FUNCTION_BLOCKCOUNTER
VAR_INPUT
MYCounter:
COUNTER;
END_VAR
…
CurrVal:
=S_CD(C_N=MyCounter,.....);4]ofSTRUCT
T_NINT;
TV:
WORD;
END_STRUCT;
…
END_VAR
…
FORI:
=1TO4DO
CurrTime:
=S_ODT(T_N=MY_TIMER[I].T_NO,S:
=true,
MY_TIMER[I].TV);
END_FOR;
FUNCTION_BLOCKTIMER
VAR_INPUT
mytimer:
TIMER;
END_VAR
…
CurrTime:
=S_ODT(T_N=mytimer,.....);
十、S7-SCL中的标准功能
1、数据类型转换函数
隐式转换,其依照的顺序为:
BOOL>BYTE>WORD>DWORD
INT>DINT>REAL
.
VAR
PID_CTRLLER_1:
BYTE;
PID_CTRLLER_2:
WORD;
END_VAR
IF(PID_CTRLLER_1<>PID_CTRLLER_2)THEN....
RESULT:
=EXPD(3);141592;
RESULT:
=SIN(PI/6);.);
<2>最小值函数
//用于获取这些参数中的最小值,参数最多可以有32个,其参数类型除了S5TIME以外,任意其他数//子类型均可以,但所有的参数数据类型必须一致。
A:
=MIN(IN1:
=a,IN1:
=b,IN1:
=c,IN1:
=d);
<3>极限值函数
A:
=LIMIT(MN:
=5,IN:
=Executionsteps,MX:
=10);
<4>MUX函数
A:
=MUX(K:
=SELECT,IN0:
=Steps,IN1:
=Number,IN2:
=Total);
9、系统功能/功能块、标准库
SCL像其他语言一样,可以调用各种功能块,包括系统功能、功能块SFC/SFB
十一、示例(均在PLC-SIM上测试通过)
1、编写位偏移程序
传递M变量的起始字节和位、偏移量,然后根据偏移量,算出当前M变量的字节和地址。
例如针对,若给定偏移量1,则当前还是,若给定2,则为,依次类推,若给定偏移量6,则为
//根据偏移量来设定字节和位
FUNCTIONFC200:
void
VAR_INPUT//输入变量
byteNINT;//指定M起始字节号
bitNINT;//指定起始位号
bitNum:
INT;//指定位数
END_VAR
VAR_OUTPUT//输出变量
currBit:
INT;//当前位
currByte:
INT;//当前字节
END_VAR
VAR_TEMP
tmp:
INT;
END_VAR
BEGIN
tmp:
=(bitNo+bitNum-1)DIV8;
currByte:
=byteNo+tmp;
currBit:
=bitNo+bitNum-(8*tmp+1);
END_FUNCTION
2、功能选择程序
假设某个机床有若干过手动功能,使用两个按钮”+”和”-“,按一次”+”,功能号加一,然后相应的功能选择指示灯被点亮,譬如,当前功能3被选中,与之对应的指示灯亮,这时按一次按钮”+”,则功能4被选中,与之对应的指示灯亮,而与功能3对应的指示灯灭,同时,当功能号到达最大值时,若再按一次按钮”+”,则功能号转到1,重新开始循环,按钮”-“与”+”正好相反,用于控制功能号递减。
同时要求,当按住某个按钮超过1s时,则功能号每过200ms钟加一或者减一。
/////////////////////////////////////////////主要控制功能FC10////////////////////////////////////////
FUNCTIONFC10:
VOID
VAR_INPUT//输入变量
fnAdd:
BOOL;//接收"+"按钮
fnSub:
BOOL;//接收"-"按钮
byteNINT;//指定M起始字节号,这些M位与相应得某个功能对应。
bitNINT;//指定起始位号
bitNum:
INT;//指定总的位数
END_VAR
VAR//静态变量
pus1:
BOOL;//记录按钮"+"的脉冲
pus2:
BOOL;//记录按钮"-"的脉冲
button:
BOOL;//确定按钮"+"或者按钮"-"被按下
currNINT;//记录当前的功能号
currBit:
INT;//当前位
currByte:
INT;//当前字节
//定时器输出
p1:
BOOL;
p2:
BOOL;
p11:
BOOL;//记录按钮"+"的时钟
p111:
BOOL;
p22:
BOOL;//记录按钮"-"的时钟
p222:
BOOL;
CurrTime:
S5TIME;
END_VAR
VAR_TEMP
i:
INT;
END_VAR
BEGIN
////若都接通,则推出块
IFfnAdd&fnSubTHEN
RETURN;
END_IF;
/////////////////////////////////////////获取按钮"+"的脉冲///////////////////////////////////////////
IFfnAdd&(button=false)THEN
pus1:
=true;
ELSE
pus1:
=false;
END_IF;
//////////////////////////////////////////按钮"-"的脉冲/////////////////////////////////
IFfnSub&(button=false)THEN
pus2:
=true;
ELSE
pus2:
=false;
END_IF;
IF(fnSub&(fnAdd=false))OR(fnAdd&(fnSub=false))THEN
button:
=true;
ELSE
button:
=false;
END_IF;
//////////////////////////添加定时器监测////////////////////////////////////////////////////
CurrTime:
=S_ODT(T_N=T10,S:
=fnAdd,TV:
=T#800ms,Q:
=p1);//按钮按下的时间
CurrTime:
=S_ODT(T_N=T11,S:
=p1&p111,TV:
=T#200ms,Q:
=p11);
IFp11=trueTHEN
p111:
=false;//当定时器有输出后,断开信号,使其在下一扫瞄周期中无输出
ELSE
p111:
=true;//在按钮按下的情况下重启定时器计时
END_IF;
CurrTime:
=S_ODT(T_N=T20,S:
=fnSub,TV:
=T#1s,Q:
=p2);
CurrTime:
=S_ODT(T_N=T21,S:
=fnSub&p222,TV:
=T#200ms,Q:
=p22);
IFp22=trueTHEN
p222:
=false;//当定时器有输出后,断开信号,使其在下一扫瞄周期中无输出
ELSE
p222:
=true;//在按钮按下的情况下重启定时器计时
END_IF;
///////////////////////////////////////////////////////////////////////////////////////////////////////
//功能号从1开始,最后一个的号等于bitNum
IFpus1=trueORp11THEN//按钮"+"的脉冲
IFcurrNocurrN=currNo+1;
ELSE
currN=1;
END_IF;
ELSIFpus2=trueORp22THEN//按钮"-"的脉冲
IFcurrNo>1THEN
currN=currNo-1;
ELSE
currN=bitNum;
END_IF;
END_IF;
//把它的上一个功能置0
m[currByte,currBit]:
=false;
fc200(byteN=byteNo,bitN=bitNo,bitNum:
=currNo,currBit:
=currBit,currByte:
=currByte);
//把当前功能置1
m[currByte,currBit]:
=true;
END_FUNCTION
注:
上程序有些繁琐,主要是在编写按钮脉冲时有些费事,好像SCL不提供脉冲沿检测函数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LC 使用 高级 语言 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)