SCL(StructuredControlLanguage)语言,也就是结构化控制语言,它其实和IEC标准制定的ST语言是一样的。S7-SCL可以编译成STL,虽然其代码量相对于STL编程有所增加,但我们更关心的是程序结构和程序的总体效率。类似于计算机行业的发展,汇编语言已经被舍弃,取而代之的是C/C++等高级语言。S7-SCL对工程设计人员要求较高,需要其具有一定的计算机高级语言的知识和编程技巧。
STL是STEP7时代推出的语言,它不是STRUCTTEXTLANGUAGE的缩写,所以它和ST语言完全没关系。STL语言是一种汇编语言,是面向机器底层的语言,可以直接操作寄存器,可读性不强,和80C51单片机的机器语言是一个层面。所以它是一种低级语言,而ST和SCL都是中高级语言。
二、S7-SCL常见问题1)如何规范地的开发一个S7-SCL程序?
解答:开发一个S7-SCL程序,应当遵循如下流程:
•规划需要的块类型,即程序的整体结构;
•规划子任务(FB,FC等等);
•定义各个子任务的之间输入/输出接口;
•定义各个子任务在原文件中的顺序及调用关系;
•定义符号表
•编译检查;
•下载调试。
2)S7-SCL支持哪些STEP7块,与其它语言有什么关系?
解答:S7-SCL支持如下
STEP7的块:OB,FC,FB,DB,UDT。
在S7程序中,S7-SCL块可以与其它STEP7编程语言生成的块互相调用。
S7-SCL可以被编译成STL,S7-SCL生成的块也可以作为库文件被其它语言引用。
由于S7-SCL程序由ASCII文本构成,所以它非常容易被导入或导出。
3)为什么双击打开S7-SCL类型的程序后,显示的格式却是STL格式?
解答:S7-SCL程序编译后生成的执行代码实际上为STL格式,如下图中的FC1,虽然其标示为SCL格式,但如果用户将Source目录中的FC1的源文件删除后,再双击打开FC1后,显示的将为STL格式。

【文末免费领取学习电工/PLC学习资料】
【文末免费领取学习电工/PLC学习资料】
【文末免费领取学习电工/PLC学习资料】
4)什么是OKFlag?
解答:在S7-SCL程序中,OK是一个布尔类型的特殊本地变量。它用来显示块执行是否正确。
OK标志的使用与STL编程中对于FC/FB的ENO处理(STL是用状态字的BR位来保存状态)非常相似。
在程序的开始,可以将OK标志赋值为TURE,如果程序执行有错误(例如0作为除数),则当程序退出时,用户通过程序将OK标志改写为FALSE,此数值将被存储在输出参数ENO当中。
OK标志是一个系统变量,不需要定义,如果用户希望在程序中使用此标志,可以在S7-SCL编程菜单OptionsCustomizeCompiler中,应当选择SetOKflag.项。否则ENO将无法被评估。
OK标志使用的例子:
OK:=TRUE;
Division:=1/IN;
IFOKTHEN//除法操作正常;
//此处可以添加在除法操作正常情况下,其它的用户程序ELSE//除法操作不正常;
//:END_IF;
5)在STL中可以读取一个组织块的信息(例如OB1中的循环时间),在S7-SCL中是否存在同样的可能?
解答:STEP7中的任意OB块在生成之后,其内部都自动生成一些特有的临时变量,例如OB1中的变量OB1_PREV_CYCLE即为CPU上个扫描周期所用的时间。在S7-SCL编辑器中,通过“InsertBlockTemplateOB”创建一个OB模板。
在缺省情况下,此模板的临时变量区域将创建一个ARRAYOFBYTE类型的临时变量。此区域与OB块的临时变量区域是相对应的,但由于没有变量名称标识,并且数据类型也不相同,所以用户使用起来非常不方便。如果用户想要使用S7-SCL格式的OB块内的特有变量,请按下列步骤进行:
•在路径STEP7的安装路径\Step7\S7DATA\S7wiz下,包含所有OB块的STL格式模板,可以使用写字板打开这些模板(例如),并复制相应变量定义。
•创建一个新的S7-SCL源文件并插入刚才复制的变量定义。
•调整S7-SCL源文件中的语法结构;
•在这个程序的开始部分,可以设置"Title"和"Version",例如Title=''和Version='0.1';
•在BEGIN语句后面插入一个分号,至此,即完成格式修改。另外,也可以打开本文中的S7-SCL例子目录中的OB_Templ项目,其中包括了44个S7-SCL源文件格式的组织块。
6)如何理解FC/SFC的输出参数RET_VAL(返回值)?
解答:对于此问题,如果读者对PASCAL语言或者高级编程语言非常熟悉,可能此问题就非常容易解释。许多SFC(系统功能)都有输出参数RET_VAL(返回值),它提供一个可供评估的错误代码。STEP7在线帮助中提供有更多关于系统功能和输出参数RET_VAL的信息。
通过在SIMATIC管理器中选中SFC然后按“F1”键可以获取相关的在线帮助信息。同样,一个FC也可以返回一个结果,下面给出了一些例子,说明了如何在S7-SCL中调用带有返回值(RET_VAL)的功能(FC或SFC)。
定义FC1,函数类型为INT(返回值)

调用FC1,得到返回值:

调用一个系统功能(SFC24):当调用系统功能SFC24“TEST_DB”(测试数据块)时,得到关于CPU主内存中一个数据块的信息。SFC24确定指定DB的数据字节数,并检查该DB是否受到写保护。选定DB所包含的数据字节数通过参数“DB_LENGTH”输出,参数“WRITE_PROT”包含关于选定DB的写保护ID的信息(FALSE表示没有写保护)。

7)在S7-SCL程序中,PLC中的地址标识与STL/LAD中的地址标识有何区别,使用中有何注意事项?
解答:在S7-SCL程序中,PLC中的地址标识与STL/LAD中的地址标识基本相同,方便了编程人员快速掌握S7-SCL语言。下图为PLC中的S7-SCL程序地址标识格式,图中一些格式有些特殊,实际上,下面的格式在S7-SCL中都是正确的。
:=;
:=;
:=;
:=;
:=;
:=;
:=;
所以说,在一般情况下,编程人员依旧可以STL的标识方式用于S7-SCL。注意:如果数据块编号及地址都使用了间接寻址方式,则必须使用S7-SCL特定的标识方式,例如如下语句:
STATUS_1:=WORD_TO_BLOCK(INDEX).DW[COUNTER];(此格式正确)
STATUS_1:=WORD_TO_BLOCK(INDEX).DBW[COUNTER];(此格式错误)

上图为S7-SCL中的PLC地址格式。x可以为0至65535之间的数字(绝对地址),y可以为0至7之间的数字(位地址),对于其它FB,OB,DB,T,C等等的标识格式,S7-SCL格式基本与STL格式相同,此处不做说明。
8)为什么用户人工输入的程序在编译时经常提示语法错误?
解答:S7-SCL程序和所有的高级语言一样,有着自己特定的语法,而很多编程人员容易在人工输入程序时忽视语法格式,这样就造成编译错误。因此强烈建议编程人员使用S7-SCL的模板向导。在菜单Insert中,提供了BlockCall,BlockTemplate,ControlStructure,三个向导,用户可以通过使用此向导,提高输入效率。例如在下图中指出了两个常见错误,用户如果使用向导,就不容易出错误:

【文末免费领取学习电工/PLC学习资料】
【文末免费领取学习电工/PLC学习资料】
【文末免费领取学习电工/PLC学习资料】
9)S7-SCL程序中如何使用多重背景?
解答:S7-SCL程序中可以使用多重背景,下面的程序列出了正确格式,声明完成后,在程序中即可调用:
Supply1:FB10;//将Supply1定义为FB10类型;
Supply2,Supply3,Supply4:FB100;
//将Supply2,Supply3,Supply4定义为FB100类型。
10)如何在S7-SCL程序中实现数据块间接寻址?
解答:S7-SCL程序中对数据块间接寻址提供了良好的支持,编程也很简单。
1下面的程序列出了正确格式:
STATUS_1:=[COUNTER];//字节间接寻址;
STATUS_2:=[WNO,BITNO];//位间接寻址,用户改变WNO,BITNO数值即可;
STATUS_1:=[COUNTER];//Database1为DB类型的本地变量;
STATUS_2:=[WNO,BITNO];
STATUS_1:=WORD_TO_BLOCK_DB(INDEX).DW[COUNTER];
//INDEX被定义为BLOCK_DB数据类型,COUNTER为整数数据类型,这样可以实现数据块编号,字节地址同时间接寻址,此功能是一种功能很强间接寻址方式。
2以下是数据块直接寻址方式格式:
STATUSBYTE:=;//字节直接寻址格式;
STATUS_3:=;//位直接寻址格式;
MEASVAL:=;//字直接寻址格式;
STATUSBYTE:=Status_;
STATUS_3:="Newdata".;
MEASVAL:=;
STATUS_1:=WORD_TO_BLOCK_DB(INDEX).DW10;
11)在S7-SCL程序中调用FC/FB与在STL/LAD中调用FB/FC有何区别?
解答:在STL/LAD程序中调用FB可以不把参数填写完整,但在S7-SCL程序中调用FB时,必须把FB参数填写完整;对于FC的调用S7-SCL与STL/LAD区别不大。强烈建议编程人员使用S7-SCL的模板向导调用FB。
12)为了将S7-SCL中的位数据类型(BYTE,WORD或DWORD)转换到“REAL”数据类型时,需要使用哪种数据类型转换程序?
解答:为了将S7-SCL中的位数据类型(BYTE,WORD或DWORD)转换到数字数据类型“REAL”时,需要使用以下指令:
•从BYTE到REAL:“DINT_TO_REAL(DWORD_TO_DINT(BYTE_TO_DWORD(value))”
•从WORD到REAL:“DINT_TO_REAL(DWORD_TO_DINT(WORD_TO_DWORD(value))”
•从DWORD到REAL:“DINT_TO_REAL(DWORD_TO_DINT(value))”
注意事项:用户在将BYTE,WORD或DWORD数据类型转换到“REAL”数据类型时,S7-SCL中常见的错误可以参考下例:
从WORD到REAL:“DWORD_TO_REAL(WORD_TO_DWORD(value))”(错误程序)。
如果执行了这一转换,会得到错误的结果。原因:DINT_TO_REAL函数将把源数据转换并按照IEEEREAL的格式存储到目的变量,而DWORD_TO_REAL仅仅是从源数据拷贝位串至目的变量。因此,为了获得正确的“REAL”数,必须总是通过中间步骤“DWORD_TO_DINT”和“DINT_TO_REAL”实现。
13)在S7-SCL中如何区分某个变量名是本地变量,还是符号名?
解答:S7-SCL中本地变量与符号名的引用有如下区别:
•如果引用中只有变量名,则此变量为本地变量,如:Motor_Status:=Motor_1;
•如果引用中变量名称上包括“”,则此变量为符号名,如:Motor_Status:=“Motor_1”。
14)如何访问一个字符串中的单个字符?
解答:对于字符串中的单个字符,使用如下的访问格式,是错误的:
MB10:=str[5]这样的表达式无法实现将字符串的第5个字符送至MB10中。
方法:可以使用IEC函数MID来得到字符串的某个部分,例子如下:
VAR
str:STRING[20];
_VARMB10:=CHAR_TO_BYTE(STRING_TO_CHAR(MID(IN:=str,L:=1,P:=5)));
15)如何加密我的S7-SCL程序?
解答:S7-SCL程序加密与STL程序加密方法几乎一样,用户可以在程序中加入关键字:
KNOW_HOW_PROTECT,再进行编译即可,下图中的FC1在编译后,即出现了加锁保护的图标。
注意:提供给最终用户的项目中应当删除S7-SCL源代码,否则用户在双击加密的块后(例如下图中的FC1),依然可以关联打开S7-SCL源代码。

注意:提供给最终用户的项目中如果删除S7-SCL源代码,用户将只能看到STL格式的程序,稍微复杂些的S7-SCL程序在STL格式下几乎是无法阅读的。此方法类似于加密的效果。
16)如何对S7-SCL程序中的数据块及静态变量初始化?
解答:S7-SCL程序中对数据块及静态变量初始化和STL语言格式类似,下面的程序列出了正确格式:
DAT1:REAL:=100.5;
A1:INT:=10;
A2:STRING[6]:='FACTOR';
A3:ARRAY[1..12]OFREAL:=0.0,10(100.0),1.0;
小贴士今天小编就给大家分享一部电气软件的“葵花宝典”。这市面上少有,整理汇总齐全且免费下载,且针对电气从业者,量身归类梳理的,兼具实用与专业技术为一身。电工必备软件(电脑版+手机APP),供大家下载收藏,一起来看看!

②选择“免费资料”即可,喜欢请多多点赞分享!

免责声明:本文章如果文章侵权,请联系我们处理,本站仅提供信息存储空间服务如因作品内容、版权和其他问题请于本站联系