SCL编程问答.docx
《SCL编程问答.docx》由会员分享,可在线阅读,更多相关《SCL编程问答.docx(76页珍藏版)》请在冰豆网上搜索。
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功能。
(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中如何编辑、比较字符串,或将字符串转变为其他的数据类型?
订货号:
描述:
此条目下处理下列问题:
∙
∙
∙
对一个字符串中的某个字符进行直接读写访问
字符串中的单个元素是无法单独访问的,例如这样的格式不允许:
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一些例子与说明。
(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协议(见条目号:
)传送有可变信息长度的数据,字符串的管理和字节部分可能必须分开。
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/指针
X
X
X
X
X1)
X1)
声明视图
VAR_IN_OUT
基本类型
复杂类型
ANY/指针
X
X
FC
声明视图
VAR 或VAR_TEMP
基本类型
复杂类型
ANY/指针
X
X
X
X
X
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" 被复制到输出变量"