SPLIT的编程示例 (S7-1500) 下例中将 Array of CHAR 字符串转换为三个单独的 Array of STRING 字符串。说明 更加复杂的示例 如果要多次调用源区域,请使用这一(“SPLIT multiple calls”)指令的示例库 (页713)示例的 修改版本。 本例修改版中的函数“SLI_FC_calculateLength_SPLIT”考虑了起始位置(“positionInSource”),还会计算用于执行 SPLIT 的新断点(“#finalPosition”)。修改版的示例还允许将多个字符串(来自一个 Array of CHAR)转换为多个单独的字符串 (Array ofSTRING)。当待读取的 ARRAY 采用 FSR 格式时 SPLIT 指令的两个示例 源数组按照 DestStruct参数指定的目标字符串长度分隔成多个字符串。函数块“SLI_FB_SPLIT”:程序段 1 的结果函数“SLI_FC_encodeMode_SPLIT”会获取“SPLIT”指令将使用的模式,以转换来自输入参数的字符串。转换会以 CSV 格式执行(“format”为 FALSE)。应忽略其它字符(“ignoreAdditionalChar”为 TRUE),字符串结尾处的分隔符应包含在计数中(“countEndSeparator”为 TRUE),目标区域中的未使用空间应保持不变(“unusedStringsToZero”为 FALSE)。要使用的模式会在输出参数 MODE(“#statMode”)中 输出。函数“SLI_FC_calculateLength_SPLIT”会根据输入参数 SOURCEARRAY(“sourceArray”)和MODE(“#statMode”)计算字符串(“#splitLength”)。整个字符串的长度应为 18 个 字符。
函数块“SLI_FB_SPLIT”:程序段 2的结果 如果常开触点(“execute”)的信号状态为“TRUE”,则执行“SPLIT”指令。 输入参数RECSEPARATOR(“recSeparator”)和 ENDSEPARATOR(“endSeparator”)用于将源字符串的分隔符和表示转换结束的分隔符传递到“SPLIT”指令。本例中使用逗号和分号作为分 隔符。 Array of CHAR字符串通过输入参数 SRCARRAY(“sourceArrayCSV”)以 CSV 格式发送。该字 符串会转换为多个字符串,并有一个Array of STRING 在 DSTSTRUCT 参数(“destArray”) 中。 会根据第一个单元格中 POSITION参数(“positionInSource”)的“0”值开始读取 Array of CHAR 的字符。 说明 起始位置如果要使用其它起始位置(“positionInSource”),则必须调整函数“SLI_FC_calculateLength_SPLIT”中“CHARS_TO_Strg”指令的 PCHARS。此时,也可使用“SPLIT multiple calls”示例。 字符串转换结束时,会输出位置(positionInSource的值为 18),并指向 Array of CHAR 中 的下一单元格。输出参数 COUNT(“countOutputStrings”)指示发现的字符串数(“3”)。输出参数RET_VAL(“returnValue”)可用于指示本示例中的执行过程是否出错。由于限制通过“execute”变量执行“SPLIT”指令,不会出现缓冲区溢出的情况。 会出现下图所示的 CSV 格式的结果:函数块“SLI_FB_SPLIT”:程序段 3 的结果如果变量“positionInSource”的值等于变量“#splitLength”的值,则“execute”变量复位。读取 到Array of CHAR 的确定位置并已转换字符串后,会停止执行“SPLIT”指令。 其它转换 转换 CSV 格式/变量 2的源数据: 会出现下图所示的 CSV 格式的结果,但不计入分隔符:转换 FSR 格式的源数据:要转换源区域“sourceArrayFSR”的字符串,请使用 FSR 格式。 要求: • 输入参数 SRCARRAY(参见SPLIT)和 SOURCEARRAY(参见函数“SLI_FC_calculateLength_SPLIT”)互连到“sourceArrayFSR”变量。 •变量“format”和“countEndSeparator”的值为“TRUE”。目标:不应插入其它字符(“ignoreAdditionalChar”的值为“TRUE”)。但本例中未实现此目标。“SPLIT”指令会根据目标数组(“destArray”)的数据类型 (STRING[12]) 计算每一个将以长度为 12个字符的形式输出的字符串。由于源区域(“sourceArrayFSR”)中包含的字符串(包括填 充字符)的长度仅为 10字符,其中两个字符串会全部输出(填充为 12 个字符)。这样只 会移除第三个字符串的填充字符,该字符串只在结尾处有填充字符。目标区域(“destArray”)数组的未使用单元格保持不变(“unusedStringsToZero”为 FALSE)。“SPLIT”指令的输出参数 RET_VAL(“returnValue”)指示附加字符已忽略。ATH: 将 ASCII字符串转换为十六进制数 (S7-1200, S7-1500) 说明 使用指令“ATH”将 IN 输入参数中指定的 ASCII字符串转换为十六进制数。转换结果输出到 OUT 输出参数中。 • 使用 IN 参数 (ASCII)处的指针,可引用以下数据类型:STRING, WSTRING, CHAR, BYTE, Array of CHAR, Array ofBYTE, WCHAR, Array of WCHAR, Array of WORD。 • 使用 OUT参数(十六进制)处的指针,可引用以下数据类型:Array of CHAR, Array of BYTE, Array of WORD,STRING, BYTE, CHAR, WORD, INT, DWORD, DINT, SINT, USINT, UINT,UDINT。 以下数据类型jinxian于 S7-1500:Array of WCHAR, WSTRING, WCHAR,ULINT, LINT, LWORD 通过参数 N,可指定待转换 ASCII 字符的数量。Zui多可转换 32767 个有效 ASCII字符。只能 解释数字“0”到“9”、大写字母“A”到“F”以及小写字母“a”到“f”。所有其它字符都将转换为 0。 由于 ASCII字符为 8 位,而十六进制数只有 4 位,输出字长度仅为输入字长度的一半。 ASCII字符将按照读取时的顺序装换并保存在输出中。仅写入十六进制数。即,不对目标范 围进行初始化。
HTA:将十六进制数转换为 ASCII 字符串 (S7-1200, S7-1500) 说明 使用指令“HTA”将 IN输入中指定的十六进制数转换为 ASCII 字符串。转换结果存储在 OUT 参 数指定的地址中。 • 可以使用 IN 参数 (十六进制)中的指针引用以下数据类型:Array of CHAR、Array of BYTE、STRING、BYTE、CHAR、WORD、Array of WORD、INT、DWORD、Array of DWORD、DINT、SINT、USINT、UINT、UDINT。仅 S7-1500:Array of WCHAR、WSTRING、WCHAR、ULINT、LINT、LWORD、Array of LWORD • 使用 OUT 参数 (ASCII)中的指针,可以引用以下数据类型:STRING、WSTRING、Array of CHAR、Array of WCHAR、Arrayof BYTE、Array of WORD 使用参数 N,可指定待转换十六进制字节的数量。由于 ASCII 字符为 8位,而十六进制数只 有 4 位,输出值长度为输入值长度的两倍。在保持原始顺序的情况下,将十六进制数的 每个半位元组转换为一个字符。Zui多可将 32767 个字符写入 ASCII 字符串中。转换结果由数字“0”到“9”以及大写字母“A”到“F” 表示。 如果 OUT参数中无法显示转换的完整结果,则结果将部分写入该参数。 如果结果的地址范围大于转换结果,则仅将得到的 ASCII 字符串写入到 OUT参数中;而不 执行 OUT 初始化。LEN: 确定字符串的长度 (S7-1200, S7-1500) 说明 (W)STRING数据类型的变量包含两个长度:Zui大长度和当前长度(即当前有效字符的数 量)。 • 使用方括号为 STRING关键字中的每个变量指定字符串的Zui大长度。字符串占用的字节数 为Zui大长度加 2。 • 使用方括号为 WSTRING关键字中的每个变量指定字符串的Zui大长度。字符串占用的字数 为Zui大长度加 2。 •当前长度表示实际使用的字符位置数。当前长度必须小于或等于Zui大长度。 使用指令“LEN”,可查询 IN输入参数中指定的字符串当前长度。并将其作为数值输出到输出 参数 OUT 中。空字符串 ('') 的长度为零。如果该指令在执行过程中出错,则参数 OUT 处将输出值“0”。 说明 读出Zui大长度 使用指令“MAX_LEN(页 2682)”,可以读取字符串的Zui大长度。示例 在以下示例中,确定 STRING 数据类型字符串的长度。在全局数据块中创建两个用于存储数据的变量。