字符串数据类型
定义(Definition)
串数据类型定义一个最长254个字符的字符串。标准的区域保留有256个字符的字符串。内存区域存贮254个字符和2个头字节。
通过定义保存在串中的字符的最大数量,能够减少字符串要求的内存。一个空串,即没有数据的串是最小的值。
简单表达式当作在串中的字符的最大数量。串中允许所有ASCII代码的字符,也能包含特殊字符,如控制字符和非打印字符。能够用句法$hh键入,hh当作用十六进制表示和ASCII字符的值(如:‘$0D$0AText’)。
声明字符串内存空间时,能够定义能存贮在串中的最大字符数。如果不指定,则建立长度为254的串。
例子(Example)
VAR
Text1: String [123];
Text2: String;
END_VAR
在变量"Text1"声明中的常量"123"当作在串中的最大字符数。对于变量"Text2",保留254字符的长度。
初始化字符串(Initializing Character Strings)
串变量,同其他变量一样,能够用常量字符串在功能块的参数声明中初始化。初始化函数的参数则不可能。
如果初始的串短于声明的最大长度,多余字符不被初始化。当在程序中处理变量时,当前占用的字符位置才作考虑。
例子(Example)
x : STRING[7]:='Address';
如果要求串类型临时变量,例如缓冲结果,在他们首次使用之前,总必须在变量声明或赋值语句中用串常量初始化。
例子(Example)
FUNCTION Test : STRING[45]
VAR_TEMP
x : STRING[45];
END_VAR
x := 'a';
x := concat (in1 := x, in2 := x);
Test := x;
END_FUNCTION
没有初始化(语句)x := 'a';,函数返回错误结果。
串操作函数
LEN
LEN函数(FC21)返回串的当前长度(有效字符个数)。空串('')长度为0。函数不报告错误。
例 LEN (S:= 'XYZ' )
CONCAT
CONCAT函数将最多32个串变量合并为一个串。如果结果串比输出参数的串要度,结果串将限定在最大长度……
当使用S7-SCL函数CONCAT时,隐式地在“IEC函数”库中调用FC2。
Example CONCAT (IN1:= 'Valve', IN2:= ' open')
DELETE
DELETE函数(FC 4)在一个串中从P指示的字符开始删除L个字符。如果L和或P等于0,或者如果P大于输入串的当前长度,返回输入的串。如果L和P之和大于输入串的长度,则串删除到结束位置。如果L和/或P是负数,输出一个空串。
Example: DELETE (IN:= 'Temperature ok', L:= 6, P:= 5)
REPLACE
REPLACE函数(FC31)用第二个串(IN2)置换第一个串中P指示的位置开始的L个字符。如果L=0,则返回第一个串。如果P为0或1,则从起始位置开始置换。如果P在第一个串长度之外,第二个串接到第一个串之后。如果P和/或L是负数,则返回空串。当结果串长于输出参数指定的变量,则限定到最大长度。
Example REPLACE (IN1:= 'Temperature', IN2:= ' high' L:= 6, P:= 5)
FIND
FIND函数(FC11)返回第二个串(IN2)在第一个串(IN1)中的位置。查找从左开始;报告首次出现的位置。如果第一个串中不包含第二个串,则返回0。此函数不报告错误。
Example FIND (IN1:= 'Processingstation', IN2:='station')
串比较函数
使用S7-SCL比较函数=, <>, <, >, <=和>=能够比较串。编译器包括了自动调用要求的函数。简单地列出下列函数提供全部的情况。
EQ_STRNG和NE_STRNG
EQ_STRNG (FC10)和NE_STRNG (FC29)函数比较两个串格式的变量的内容是否相等(FC10)或不相等(FC29),并返回比较结果。如果参数串S1与参数串S2相等(不相等),则返回信号状态“1”的值。此函数不报告错误。
GE_STRNG and LE_STRNG
GE_STRNG (FC13)和LE_STRNG (FC19)函数比较串格式的两个变量大于(小于)或等于,并返回比较结果。如果参数串S1大于(小于)或等于参数串S2,则返回信号状态“1”的值。从左开始用其ASCII代码比较字符(如'a'大于'A')。第一个不同的字符决定了比较结果。如果较长串的左边部分与较短串相同,则认为较长串大。此函数不报告错误。
GT_STRNG and LT_STRNG
GT_STRNG (FC15)和LT_STRNG (FC24)函数比较串格式的两个变量大于(小于),并返回比较结果。如果参数串S1大于(小于)参数串S2,则返回信号状态“1”的值。从左开始用其ASCII代码比较字符(如'a'大于'A')。第一个不同的字符决定了比较结果。如果较长串的左边部分与较短串相同,则认为较长串大。此函数不报告错误。
数据格式转换函数
INT_TO_STRING和STRING_TO_INT
函数INT_TO_STRING和STRING_TO_INT将一个INT格式变量转换为字符串或将字符串转换为INT变量。函数I_STRNG (FC16)和STRNG_I (FC38)被从提供的“IEC函数”库中隐式地使用。串用一个前置符号表述。如果在返回参数指定的变量太短,则不进行转换。
DINT_TO_STRING和STRING_TO_DINT
函数DINT_TO_STRING和STRING_TO_DINT将一个DINT格式的变量转换为字符串或字符串转换为DINT变量。函数DI_STRNG (FC5)和STRNG_DI (FC37)被从提供的“IEC函数”库中隐式地使用。串用一个前置符号表述。如果在返回参数指定的变量太短,则不进行转换。
REAL_TO_STRING and STRING_TO_REAL
函数REAL_TO_STRING和STRING_TO_REAL将一个实数格式的变量转换为字符串或字符串转换为实数变量。函数R_STRNG (FC30)和STRNG_R (FC39)被从提供的“IEC函数”库中隐式地使用。串必须有下列格式:
?v.nnnnnnnE?xx (?= 符号, v =小数点前的数字, n =小数点后的数字, x =指数数字)
如果串的长度小于14,或其不是上述格式构造,将不进行转换。
如果返回参数指定的变量太短或IN参数中包含一个无效浮点数,没有转换。
SCL 字符串处理举例:
将信息文本放到一块(Putting together message texts)
//通过处理和存贮,将信息文本放到一块。
////////////////////////////////////////////////////////////////////
//块包含必要的信息文本和产生的最后20条信息
////////////////////////////////////////////////////////////////////
DATA_BLOCK Messagetexts
STRUCT
Index: int;
textbuffer: array [0..19] of string[34];
HW: array [1..5] of string[16]; // 5种不同设备
statuses: array [1..5] of string[12]; // 5种不同状态
END_STRUCT
BEGIN
Index :=0;
HW[1] := 'Motor ';
HW[2] := 'Valve ';
HW[3] := 'Press ';
HW[4] := 'Weldingstation ';
HW[5] := 'Burner ';
Statuses[1] := ' problem';
Statuses[2] := ' started';
Statuses[3] := ' temperature';
Statuses[4] := ' repaired';
Statuses[5] := ' maintained';
END_DATA_BLOCK
////////////////////////////////////////////////////////////////////
//函数将信息广西领先到一块,并输入到DB的信息文本中。信息文本存贮在一个环形缓冲区里。
//文本缓冲区的下一个空区索引也在DB信息文本内并被函数修正。
////////////////////////////////////////////////////////////////////
FUNCTION Textgenerator : bool
VAR_INPUT
unit: int;// 设备文本(名称)的索引
no: int;// 设备的ID号
status: int;
value: int;
END_VAR
VAR_TEMP
text : string[34];
i : int;
END_VAR
// 临时变量的初始化
text := '';
Textgenerator := true;
Case unit of
1..5 : case status of
1..5 : text := concat( in1 := Messagetexts.HW[unit],
in2 := right(l:=2,in:=I_STRNG(no)));
text := concat( in1 := text,
in2 := Messagetexts.statuses[status]);
if value <> 0 then
text := concat( in1 := text,
in2 := I_STRNG(value));
end_if;
else Textgenerator := false;
end_case;
else Textgenerator := false;
end_case;
i := Messagetexts.index;
Messagetexts.textbuffer[i] := text;
Messagetexts.index := (i+1) mod 20;
END_FUNCTION
////////////////////////////////////////////////////////////////////
//函数在%M10.0边沿触发时被循环程序调用,如果参数改变了,则输入一次信息。
////////////////////////////////////////////////////////////////////
Organization_block Cycle
Var_temp
Opsy_ifx : array [0..20] of byte;
error : BOOL;
End_var;
////////////////////////////////////////////////////////////////////
//下面的调用将信息"Motor 12 started"输入DB信息文本的文本缓冲区, %MW0为1,
//%IW2为12 及%MW2为2.
////////////////////////////////////////////////////////////////////
if %M10.0 <> %M10.1 then
error := Textgenerator (unit := word_to_int(%MW0),
no := word_to_int(%IW2),
status := word_to_int(%MW2),
value := 0);
%M10.1:=M10.0;
end_if;
end_organization_block
审核编辑 :李倩
-
函数
+关注
关注
3文章
4331浏览量
62597 -
数据类型
+关注
关注
0文章
236浏览量
13623
原文标题:数据格式转换函数
文章出处:【微信号:gh_a8b121171b08,微信公众号:机器人及PLC自动化应用】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论