SCL编程问答.docx
- 文档编号:11042155
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:72
- 大小:918.45KB
SCL编程问答.docx
《SCL编程问答.docx》由会员分享,可在线阅读,更多相关《SCL编程问答.docx(72页珍藏版)》请在冰豆网上搜索。
SCL编程问答
访问S7-SCL数组的索引
>
问题:
我能否得到一个访问SCL数组的索引?
解答:
可以。
在SCL中可以有一个访问数组变量的索引,这里索引也可以是一个单精度的变量(与STEP7�STL成对比)。
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指针到精确的字节上(例如DB100.DBX0.0BYTE3)。
如果在符号编程过程中,在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”结构。
图.01
程序描述 "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项目。
复制“NY_SCL.zip”文件到一个单独的文件夹,然后双击打开文件。
STEP7V5.4项目及所有相关子目录就会自动解包。
可以使用SIMATIC 管理器打开和处理解压缩项目。
此处有STEP7 项目中的两个相同的S7程序。
∙“S7-Prog_d”包括德文注释的S7-SCL功能。
∙“S7-Prog_e”包括英文注释的S7-SCL功能。
ANY_SCL.zip(48KB)
相关信息:
关于带AT功能的ANY指针的结构的更多信息可在条目号21946854获得。
关键字:
ANYpointer
S7-SCL中的全局常数
隐藏订货号显示订货号订货号:
描述
使用S7-SCL,不能定义任何全局常数。
解决方法:
在STEP7的符号表中,使用相应的数据类型创建标记字或双字。
为这些标记区域分配恒定的数值。
此后,便可以在整个项目中通过符号寻址和恒定分配的数值来使用标记数据区,这当然也包括S7-SCL。
图.01在变量表中定义"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定义。
可通过变量DEF.JKL连结字节部分,例如字符串ABC中的第三个字节,及字符串中的第一个字符。
图T1-02包含了读取数据类型STRING的字节部分的一个S7-SCL程序。
∙DEF.JKL[1]:
=MB1
∙图02
在S7-SCL中如何访问BYTE、WORD和DWORD变量的各个位?
说明:
从S7-SCL版本V5.1起,可以使用AT函数去读写变量的元素。
当定义变量视图后,可以读写:
∙ 变量数据类型为BYTE、WORD、DWORD的位
∙ 变量数据类型为WORD、DWORD的字节
∙ 变量数据类型为DWORD的字
AT特性主要用于INPUT,OUTPUT和本地变量。
图.01显示了访问BYTE变量位的AT功能的S7-SCL样例:
图01
图.01
在这个S7-SCL的样例程序中,创建了输入叁数的多视图。
如果FB40被调用,你能 参数化作为输入和输出变数的"MainVarByte"、"X2"和"X5"叁数。
"FilterVar"叁数不在调用块中出现。
变量"MainVarByte"被分为变量"FilterVar"的8 个布尔值。
请参考S7-SCL的在线帮助中" 声明变量范围视图"部分。
数据类型的声明
变量的数据类型
基本类型
复杂类型
ANY/指针
FB
声明视图VAR,VAR_TEMP,VAR_IN,或 VAR_OUT
基本类型复杂类型ANY/指针
XX
XXX1)
X1)
声明视图VAR_IN_OUT
基本类型复杂类型ANY/指针
X
X
FC
声明视图VAR 或VAR_TEMP
基本类型复杂类型ANY/指针
XX
XXX
X
声明视图VAR_IN,VAR_OUT或VAR_IN_OUT
基本类型复杂类型ANY/指针
X
X
表.01
1)这里应该注意变量域“VAR_OUT”中的ANY指针在功能块中是不允许的。
上述样例程序也不能用于FC中的VAR_IN变量和VAR_OUT域。
图.02示例复制两个输入变量(WORD 数据类型)到一个输出变量(DWORD 数据类型)。
两个输入变量的存储区"A_word" 和"B_word" 被复制到输出变量"C_dword"。
图03
图.02
变量“A_word”中的数据被写入到输出“C_dword”的低位字中,而变量“B_word”中的数据被写入到高位字中。
C_dword
高位字节
低位字节
高位字节
低位字节
高位字(“C_dwort.B_high”)
低位字(“C_dwort.A_low”)
表. 02
以上样例也可用于要被复制到WORD变量中的BYTE变量。
注意:
不能定义一个由8个布尔类型变量组成的"BYTE"类型的结构。
因为结构变量最小是一个WORD,一个结构不能由一个字节组成。
补救:
定义一个8个布尔的队列替代现有的8个布尔变量组成的结构。
这样就可以访问每个位了。
变量声明
备注
ByteVar:
Byte;BoolVarATByteVar:
STRUCT BoolVar_1:
=BOOL; BoolVar_2:
=BOOL;
错误编译的错误信息:
"数据类型和变量类型不一致"
ByteVar:
BYTE;BoolVarATByteVar:
ARRAY[0..7]OFBOOL;
正确(如图.01)
表.03
这个限制不适用于变量类型WORD和DWORD。
软件环境:
本FAQ的图片由S7-SCL版本V5.3生成。
如何使用AT函数在S7-SCL中构造一个ANY指针?
订货号:
说明在S7-SCL中可以使用AT命令来定义其它声明变量的视图。
下面的两个例子描述了如何为ANY指针声明组件,创建ANY指针以及确定用于从DB6复制数据到DB7的SFC20(BLKMOV)的参数。
下表描述了如何在函数中定义一个ANY指针。
No.
步骤
1
STEP7将参数类型ANY的数据保存在10个字节中。
为此必须定义一个结构变量,它包含如“datatype”,“repeatfactor”,“DBnumber”的参数类型,还有构造ANY指针的字节和位地址。
图01显示了在FC中两个结构变量“Test1”和“Test2”的样例声明。
Li%20Ran/2_Release/20110505/Finished/S7_SCL_AT_Funktion_01.png图01
2
使用S7-SCL指令AT通过结构变量“Test1”或“Test2”创建一个模板,并且给为此而定义的变量声明“ANY”类型,例如“pAny_source”。
这样使用指令
∙"pAny_sourceATTest1:
ANY;"
已经定义了一个ANY指针
3
现在必须如图01所示通过结构说明预置ANY指针。
以下指令对应于ANY指针“P#DB6.DBX0.0Byte10”的结构:
∙"Test1.Any_id:
=16#10;" //语法ID为十六进制
∙"Test1.Source_DataType:
=16#02;" //为数据类型字节
∙"Test1.Source_Length:
=16#0A;" //长度为10字节
∙"Test1.Source_DB_Number:
=16#06;" //为DB6
∙"Test1.Source_Byte_Pointer:
=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/S7_SCL_AT_Funktion_02.png图02
3
现在必须用图02中的结构化指令预置ANY指针。
以下指令对应于目的数据块的ANY指针“P#DB7.DBX0.0Byte10”。
∙"buffer_destin.SyntaxID:
=16#10;" //语法ID为十六进制
∙"buffer_destin.DataType:
=16#02;" //数据类型字节
∙"buffer_destin.DataCount:
=16#0A;" //本长度为10 字节
∙"buffer_destin.DB_Number:
=16#07;" //为DB7
∙"buffer_destin.BytePointer:
=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#DB10.DBX0.0BYTE10”不可能在S7-SCL中,因为ANY指针在STL和S7-SCL中的处理是不一样的。
当在S7-SCL中从ANY到ANY赋值时,为了转发接收到INPUT参数的ANY指针,就会有10个字节从一个指针复制到其它指针(6 字节)。
为了确定STL程序的ANYOUT参数推荐使用“STRUCT”类型(如上例所述)。
如果一个不是ANY的类型变量赋值给ANY变量,那么S7-SCL编译器就会创建地址(10字节)并且将其写入ANY指针。
复制“SCL_Any.zip”文件到一个单独的文件夹,并且双击打开。
STEP7V5.5项目以及其全部相关子目录就会自动解包。
可以使用SIMATIC管理器打开和处理压缩项目。
STEP7项目包含两个站。
站_1包含在一个函数中定义ANY指针的程序而站_2包含在一个UDT中定义ANY指针的程序。
Li%20Ran/2_Release/20110505/Finished/disk_35.gifSCL_ANY.zip(88KB)
关键字滤波器,滤波,变量数据类型,变量视图
HowcanyouconstructanANYpointerinS7-SCLusingtheATfunction?
HidepartnumberDisplaypartnumberPartnumber:
InstructionsInS7-SCLyoucanusetheATcommandtodefineotherviewsofthedeclaredvariables.ThetwoexamplesbelowdescribehowtodeclarethecomponentsfortheANYpointer,createtheANYpointerandparameterizetheSFC20(BLKMOV)forcopyingdatafromDB6toDB7.
ThetablebelowdescribeshowtoproceedtodefineanANYpointerinafunction.
No.
Procedure
1
STEP7savesthedataoftheparametertypeANYin10bytes.Forthisyoumustdefineastructuredvariablethatcontainstheparametertypeslike"datatype","repeatfactor","DBnumber",aswellasthebyteandbitaddressforconstructingtheANYpointer.Fig.01showsasampledeclarationofthetwostructuredvariables"Test1"and"Test2"intheFC.
Fig.01
2
UsetheS7-SCLinstructionATtocreateatemplateviathestructuredvariable"Test1"or"Test2"anddeclarethe"ANY"typeforthevariabledefinedforthis,forexample"pAny_source".Thuswiththeinstruction
∙"pAny_sourceATTest1:
ANY;"
youhavedefinedanANYpointer.
3
NowyoumustpresettheANYpointerwiththestructuredinstructionsasinFig.01.ThefollowinginstructionscorrespondtothestructureoftheANYpointer"P#DB6.DBX0.0Byte10":
∙"Test1.Any_id:
=16#10;" //HexforthesyntaxID
∙"Test1.Source_DataType
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SCL 编程 问答