访问S7-SCL数组的索引问题:我能否得到一个访问SCL数组的索引?解答:可以。在SCL中可以有一个访问数组变量的索引,这里索引也可以是一个单精度的变量(与STEP7�STL成对比)。Example:functionFC1:voidvaranna:ARRAY[1..30]OFINT;willy:INT;end_varbeginwilly:=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获得。关键字:ANYpointerS7-SCL中的全局常数显示订货号描述使用S7-SCL,不能定义任何全局常数。解决方法:在STEP7的符号表中,使用相应的数据类型创建标记字或双字。为这些标记区域分配恒定的数值。此后,便可以在整个项目中通过符号寻址和恒定分配的数值来使用标记数据区,这当然也包括S7-SCL。图.01在变量表中定义Global_Const变量,INT类型,地址是MW50。在OB1里使用load和transfer指令赋值。由此即可在项目和S7-SCL源程序里使用此变量。图01S7-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/指针XXXXX1)X1)声明视图VAR_IN_OUT基本类型复杂类型ANY/指针XXFC声明视图VAR或VAR_TEMP基本类型复杂类型ANY/指针XXXXXX声明视图VAR_IN,VAR_OUT或VAR_IN_OUT基本类型复杂类型ANY/指针XX表.011)这里应该注意变量域“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:STRUCTBoolVar_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.步骤1STEP7将参数类型ANY的数据保存在10个字节中。为此必须定义一个结构变量,它包含如“datatype”,“repeatfactor”,“DBnumber”的参数类型,还有构造ANY指针的字节和位地址。图01显示了在FC中两个结构变量“Test1”和“Test2”的样例声明。Li%20Ran/2_Release/20110505/Finished/S7_SCL_AT_Funktion_01.png图012使用S7-SCL指令AT通过结构变量“Test1”或“Test2”创建一个模板,并且给为此而定义的变量声明“ANY”类型,例如“pAny_source”。这样使用指令pAny_sourceATTest1:ANY;已经定义了一个ANY指针3现在必须如图01所示通过结构说明预置ANY指针。以下指令对应于ANY指针“P#DB6.DBX0.0Byte10”的结构: