1 / 77
文档名称:

SCL编程问答.pdf

格式:pdf   大小:4,122KB   页数:77页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

SCL编程问答.pdf

上传人:小sjj 2023/1/10 文件大小:4.03 MB

下载得到文件列表

SCL编程问答.pdf

文档介绍

文档介绍:该【SCL编程问答 】是由【小sjj】上传分享,文档一共【77】页,该文档可以免费在线阅读,需要了解更多关于【SCL编程问答 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:.
访问S7-SCL数组的索引
>
问题:我能否得到一个访问SCL数组的索引?
解答:可以。在SCL中可以有一个访问数组变量的索引,这里索引也可以是一个单精度的
变量(与STEP7STL成对比)。
Example:
functionFC1:void
var
anna:ARRAY[1..30]OFINT;
willy:INT;
end_var
begin
willy:=1;
willy:=anna[willy];
end_function
索引
关键字:
在S7-SCL中如何进行SFC14和SFC15ANY参数的编程?
:.
使用说明
操作指南:
在S7-SCL和LAD/FBD/STL编辑器中,要在UDT或DB中声明一个ANY数据类型的
变量是不可能的,因为ANY变量是一个参数类型。但是,可以声明ANY变量是一个临时变
量。
当调用SFC14或SFC15时,应确保通过ANY变量“记录”被参数化的用户数据区的长度必
须与HWConfig中的模块组态中的用户数据区长度相同(例如3字节)。这就是为什么建议要
在STL中调用这些块,目的是可以定义ANY指针到精确的字节上(
BYTE3)。如果在符号编程过程中,在SCL或LAD/FBD/STL中,传送STRUCT或ARRAY
到ANY类型的块参数时,编译器传送适当的ANY指针。
如果直接调用SFC14或SFC15并通过“STRUCT”或“ARRAY”类型的变量用符号提供“记录”
参数,若从站组态的字节数是奇数,则SFC14/15报告错误代码80B1。
这个动作的原因是STEP7中的STRUCT与ARRAY总是按字的边界储存在存储器中,所
以总是传输的是偶数长度。
如果在S7-SCL中调用SFC14或SFC15并要动态地提供ANY指针,建议在SCL“变量
区域声明视图”中使用“AT”结构。:.

程序描述
"CALL_SFC14_15"功能块提供了SFC14读取和SFC15写一致性的数据到一个标准的从
站。数据被储存在"DB_Number"所指的DB块中"DB_Byte_Addr"所指的地址开始的地址区中。
字节的长度(“BYTE_COUNT”)一定要与STEP7组态所选模块的长度相同。如果
"SFC15_Select"参数的状态指示未"1"(True),用SFC15传输数据到从站,若指示为"0"
(False),用SFC14从从站读取数据。“LADDR”参数和返回值“RET_VAL”在STEP7SFC14/15
在线帮助中有描述。
用户创建数据区拷贝功能注意事项
例如,在"WORD_TO_BLOCK_DB(DBNo).DBB[Index]"形式下,用户需自定义两个索引标签,
数据区拷贝和索引的直接访问是不允许的。原因是数据块号和此数据块的地址仅可以在运行的
过程中被访问。除此之外系统是禁止访问的。
下载:.
附件下载包括有S7-SCL功能FC10的STEP7项目。复制“”文件到一个单独
的文件夹,然后双击打开文件。。可以使用
SIMATIC管理器打开和处理解压缩项目。
此处有STEP7项目中的两个相同的S7程序。
•“S7-Prog_d”包括德文注释的S7-SCL功能。
•“S7-Prog_e”包括英文注释的S7-SCL功能。
(48KB)
相关信息:
关于带AT功能的ANY指针的结构的更多信息可在条目号21946854获得。
关键字:
ANYpointer
S7-SCL中的全局常数
显示订货号
描述:.
使用S7-SCL,不能定义任何全局常数。
解决方法:
在STEP7的符号表中,使用相应的数据类型创建标记字或双字。为这些标记区域分配恒定
的数值。此后,便可以在整个项目中通过符号寻址和恒定分配的数值来使用标记数据区,这当
然也包括S7-SCL。
"Global_Const"变量,INT类型,地址是
"MW50"。在OB1里使用load和transfer指令赋值。由此即可在
项目和S7-SCL源程序里使用此变量。
图01
S7-SCL中如何编辑、比较字符串,或将字符串转变为其他的数据类型?
显示订货号
:.
描述:
此条目下处理下列问题:
•对一个字符串中的某个字符进行直接读写访问
•编辑,比较,转换数据类型
•编写一个字符串比较的FB例程
对一个字符串中的某个字符进行直接读写访问
字符串中的单个元素是无法单独访问的,例如这样的格式不允许:MB10=str[5]。图01实
例说明如何使用IECFC26“MID”函数、转换函数“STRING_TO_CHAR”和
“CHAR_TO_BYTE”对字符串中某个元素进行访问。
图01
参数含义:
•IN:STRING格式的输入变量。
•L:从位置P开始(含P)的字符串长度。(数据类型:INT)
•P:起始字符位置。(数据类型:INT)
•RET_VAL:STRING格式的输出变量。
编辑,比较转换数据类型:.
下面的PDF文件中是使用IEC标准函数进行字符串编辑的S7-SCL一些例子与说明。
S7_SCL_String_Parameterzuweisung_e(99KB)
字符串比较FC例程
FC的参数往往传递的是地址。由于FC的STRING类型的参数地址指向调用者中字符串的
存储位置,如果此FC被调用时,所传递的指向字符串的地址是无效的。然而对于FB,传
递的字符串存储于背景DB中,所传递的地址是总是有效的。对于包含字符串比较程序的
FC,在处理之前必须将字符串数据从IN,OUT,IN_OUT传到临时变量区,否则编译会
失败,错误消息是:“Parameterassignmentincorrect”(参数分配错误)。
图02是S7-SCL字符串比较FC程序示例。当此FC被调用时,如果没有被装载到FC的
临时变量区,string1和string2将无法被获取。
图02
然而,缓存字符串数据到临时变量区域将很快导致本地存储需求增长,如果只有少数的
STRING变量,使用临时变量是适宜的,但是STRING变量很多,建议使用DB变量缓存:.
字符串。图03为使用数据块DB100缓存输入变量的示例。
图03
关键字:
消息号15:4099,错误消息,临时变量,指针

如何读出带有S7-SCL关键字“AT”的字符串中的管理和字节部分?
显示订货号
说明:
在某些数据通信任务中,例如通过TCP协议(见条目号:19033929)传送有可变信息长度的数
据,字符串的管理和字节部分可能必须分开。S7-SCL的关键字AT可用于这一目的。
数据类型STRING包含最多254个字符。STRING数据类型的变量的最大长度为256个字符。
在变量创建时,也同时定义了其最大长度。当前长度(字符串使用的实际长度)在字符串重构或
编辑过程中被输入。字符串的第一个字节指定最大长度,第二个字节指定实际长度。接下来:.
的字符为ASCII格式。图T1-01显示了STRING数据类型的结构。
图01
注意事项:
数据类型STRING格式的更多信息可在STEP7的在线帮助中找到:
•“数据类型STRING的格式”。
可在S7-SCL的帮助中找到关于关键字“AT”的更多信息:
•声明变量范围的视图
在S7-SCL中关键字“AT”是变量或变量范围视图的一个定义。建议使用功能块的静态变量而不:.
是全局数据块。然后就可通过符号连接这个变量,例如ABC“STRING”类型。
使用S7-SCL指令AT通过STRING变量ABC来创建一个模板。如图T1-01所示,数据类型
STRING包含256个字节。字符串的最大长度和实际长度分别输入到字节1和字节2。在图
T1-02的样例程序中,字节“String_maximal”包含最大长度,而字节“String_actual”包含实际长
度。字符串中的字符,最多总共254个,通过域JKL:ARRAY[1..254]OFBYTE定义。
,例如字符串ABC中的第三个字节,及字符串中的第一个
字符。图T1-02包含了读取数据类型STRING的字节部分的一个S7-SCL程序。
•[1]:=MB1:.
•图02
在S7-SCL中如何访问BYTE、WORD和DWORD变量的各个位?
说明:
从S7-,可以使用AT函数去读写变量的元素。当定义变量视图后,可以
读写:
•变量数据类型为BYTE、WORD、DWORD的位
•变量数据类型为WORD、DWORD的字节
•变量数据类型为DWORD的字
AT特性主要用于INPUT,OUTPUT和本地变量。
功能的S7-SCL样例::.
图01

在这个S7-SCL的样例程序中,创建了输入叁数的多视图。如果FB40被调用,你能参数化
作为输入和输出变数的"MainVarByte"、"X2"和"X5"叁数。"FilterVar"叁数不在调用
块中出现。变量"MainVarByte"被分为变量"FilterVar"的8个布尔值。请参考S7-SCL的
在线帮助中"声明变量范围视图"部分。
数据类型的声明变量的数据类型
基本类型复杂类型
ANY/指针:.
声明视图基本类型
FBXX
复杂类型
VAR,VAR_TEMP,
ANY/指针XXX1)
VAR_IN,
X1)
或VAR_OUT
声明视图基本类型
X
复杂类型
VAR_IN_OUT
ANY/指针X
声明视图基本类型
FCXX
复杂类型
VAR或VAR_TEMP
ANY/指针XXX
X
声明视图基本类型
X
复杂类型
VAR_IN,VAR_OUT或VAR_IN_OUT
ANY/指针X

1)这里应该注意变量域“VAR_OUT”中的ANY指针在功能块中是不允许的。上述样例程序也不
能用于FC中的VAR_IN变量和VAR_OUT域。
(WORD数据类型)到一个输出变量(DWORD数据类型)。两
个输入变量的存储区"A_word"和"B_word"被复制到输出变量"C_dword"。:.
图03

变量“A_word”中的数据被写入到输出“C_dword”的低位字中,而变量“B_word”中的数据被写入
到高位字中。
C_dword
高位字节低位字节高位字节低位字节
高位字(“”)低位字(“”)
:.
以上样例也可用于要被复制到WORD变量中的BYTE变量。
注意:
不能定义一个由8个布尔类型变量组成的"BYTE"类型的结构。因为结构变量最小是一个
WORD,一个结构不能由一个字节组成。
补救:
定义一个8个布尔的队列替代现有的8个布尔变量组成的结构。这样就可以访问每个位了。
变量声明备注
错误
ByteVar:Byte;
编译的错误信息:"数据类型和变量类型不一
BoolVarATByteVar:STRUCT
致"
BoolVar_1:=BOOL;
BoolVar_2:=BOOL;
正确
ByteVar:BYTE;
()
BoolVarATByteVar:ARRAY[0..7]OF
BOOL;

这个限制不适用于变量类型WORD和DWORD。
软件环境:
本FAQ的图片由S7-。
如何使用AT函数在S7-SCL中构造一个ANY指针?:.
说明
在S7-SCL中可以使用AT命令来定义其它声明变量的视图。下面的两个例子描述了如何为
ANY指针声明组件,创建ANY指针以及确定用于从DB6复制数据到DB7的SFC20
(BLKMOV)的参数。
下表描述了如何在函数中定义一个ANY指针。
步骤
No.
1STEP7将参数类型ANY的数据保存在10个字节中。为此必须定义一个结构变量,它
包含如“datatype”,“repeatfactor”,“DBnumber”的参数类型,还有构造ANY指针的字节
和位地址。图01显示了在FC中两个结构变量“Test1”和“Test2”的样例声明。
Li%20Ran/2_Release/20110505/Finished/
图01
2使用S7-SCL指令AT通过结构变量“Test1”或“Test2”创建一个模板,并且给为此而定义
的变量声明“ANY”类型,例如“pAny_source”。这样使用指令
•"pAny_sourceATTest1:ANY;"
已经定义了一个ANY指针
3现在必须如图01所示通过结构说明预置ANY指针。以下指令对应于ANY指针:.
“P#”的结构:
•":=16#10;"//语法ID为十六进制
•":=16#02;"//为数据类型字节
•":=16#0A;"//长度为10字节
•":=16#06;"//为DB6
•":=dw#16#84000000;"//数据块的字节和位地址
4用定义了的ANY变量“pAny_source”和“pAny_destin”确定SFC20(BLKMOV)的ANY参
数(图01),例如,
•"erg:=SFC20(srcblk:=pAny_source,dstblk:=pAny_destin)";
INT类型的变量“erg”对应于函数的返回值(RET_VAL),
下表描述了如何在UDT中定义一个ANY指针。
步骤
No.
1首先创建一个UDT来定义ANY参数,例如为参数创建一个符号名为“AnyPoint”的
UDT1:
•SyntaxID:BYTE;//指定语法ID:.
•DataType:BYTE;//数据类型编码
•DataCount:INT;//重复因数
•DB_Number:WORD;//数据块数
•BytePointer:DWORD;//字节和位地址的指针
2在函数中声明了变量,如“AnyPoint”类型(UDT1)的“buffer_source”(源DB)和
“buffer_destin”(目的DB)。使用S7-SCL指令AT通过结构变量“buffer_source”和
“buffer_destin”创建模板,并声明为此而定义的变量为“ANY”类型,例如“Source_Any”和
“Destin_Any”。使用指令
•"Source_AnyATbuffer_source:ANY;"
•"Destin_AnyATbuffer_destin:ANY;"
已经定义ANY指针如图02所示。
Li%20Ran/2_Release/20110505/Finished/
图02
3现在必须用图02中的结构化指令预置ANY指针。以下指令对应于目的数据块的ANY
指针“P#”。
•":=16#10;"//语法ID为十六进制
•":=16#02;"//数据类型字节
•":=16#0A;"//本长度为10字节
•":=16#07;"//为DB7:.
•":=dw#16#84000000;"//数据块的字节和位地址
4用定义了的ANY变量“Source_Any”和“Destin_Any”确定SFC20(BLKMOV)的ANY
参数(图02),例如,
•"erg:=SFC20(srcblk:=Source_Any,dstblk:=Destin_Any)";
INT类型的变量“erg”对应于函数的返回值(RET_VAL)。
关于ANY指针的更多信息可见STEP7的在线帮助的以下标题中
•参数类型ANY的格式
注意事项
如果在S7-SCL中用STL程序调用一个函数,而且该函数有一个ANY类型的OUT参数,就
要用ANY指针将其参数化,例如,像“P#”不可能在S7-SCL中,因为
ANY指针在STL和S7-SCL中的处理是不一样的。当在S7-SCL中从ANY到ANY赋值
时,为了转发接收到INPUT参数的ANY指针,就会有10个字节从一个指针复制到其它指针
(6字节)。为了确定STL程序的ANYOUT参数推荐使用“STRUCT”类型(如上例所述)。如果
一个不是ANY的类型变量赋值给ANY变量,那么S7-SCL编译器就会创建地址(10字节)并且
将其写入ANY指针。
复制“”文件到一个单独的文件夹,并且双击打开。
子目录就会自动解包。可以使用SIMATIC管理器打开和处理压缩项目。STEP7项目包含两个
站。站_1包含在一个函数中定义ANY指针的程序而站_2包含在一个UDT中定义ANY指针
的程序。:.
Li%20Ran/2_Release/20110505/Finished/(88KB)
关键字
滤波器,滤波,变量数据类型,变量视图
HowcanyouconstructanANYpointerinS7-SCLusingtheATfunction?
Displaypartnumber
Instructions
InS7-
examplesbelowdescribehowtodeclarethecomponentsfortheANYpointer,createtheANY
pointerandparameterizetheSFC20(BLKMOV)forcopyingdatafromDB6toDB7.
ThetablebelowdescribeshowtoproceedtodefineanANYpointerinafunction.


structuredvariablethatcontainstheparametertypeslike"datatype","repeatfactor","DB
number",
showsasampledeclarationofthetwostructuredvariables"Test1"and"Test2":.

2UsetheS7-SCLinstructionATtocreateatemplateviathestructuredvariable"Test1"or
"Test2"anddeclarethe"ANY"typeforthevariabledefinedforthis,forexample
"pAny_source".Thuswiththeinstruction
•"pAny_sourceATTest1:ANY;"
:.

followinginstructionscorrespondtothestructureoftheANYpointer"P#
10":
•":=16#10;"//HexforthesyntaxID
•":=16#02;"//forthedatatypeByte
•":=16#0A;"//lengthhere10bytes
•":=16#06;"//forDB6
•":=dw#16#84000000;"//byteandbitaddressofthe
datablock
4ParameterizetheANYparametersoftheSFC20(BLKMOV)withthedefinedANY
variables"pAny_source"and"pAny_destin"(),forexample,
•"erg:=SFC20(srcblk:=pAny_source,dstblk:=pAny_destin)";
Thevariable"erg"oftheINTtypecorrespondstothefunction'sreturnvalue(RET_VAL).
ThetablebelowdescribeshowtoproceedtodefineanANYpointerinaUDT.

1TodefinetheANYparametersyoufirstcreateaUDT,forexampleaUDT1withthe
symbolicname"AnyPoint"fortheparameters::.
•SyntaxID:BYTE;//specificationofthesyntaxID
•DataType:BYTE;//codeforthedatatype
•DataCount:INT;//repeatfactor
•DB_Number:WORD;//numberfordatablock
•BytePointer:DWORD;//pointerforbyteandbitaddress
2Inthefunctionyoudeclarethevariables,forexample"buffer_source"(forthesourceDB)
and"buffer_destin"(forthedestinationDB)ofthetype"AnyPoint"(UDT1).Usethe
S7-SCLinstructionATtocreatethetemplatesviathestructuredvariables"buffer_source"
and"buffer_destin"anddeclarethe"ANY"typeforthevariablesdefinedforthis,for
example"Source_Any"and"Destin_Any".Thuswiththeinstructions
•"Source_AnyATbuffer_source:ANY;"
•"Destin_AnyATbuffer_destin:ANY;"
:.


followinginstructionscorrespondtotheANYpointer"P#"forthe
destinationdatablock.
•":=16#10;"//hexforthesyntaxID
•":=16#02;"//fordatatypeByte
•":=16#0A;"//lengthhere10bytes
•":=16#07;"//forDB7
•":=dw#16#84000000;"//byteandbitaddressofthe:.
datablock
4Parameterizeth