数据格式转换函数

描述

字符串数据类型

定义(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

 


审核编辑 :李倩

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分