PLC
直播中

大红枣

11年用户 630经验值
私信 关注

与字符串处理相关的函数有哪些

与字符串处理相关的函数有哪些?它们分别有何功能?

回帖(1)

王金凤

2021-9-10 17:11:51
  如下图,前面几个小节,我们介绍了数学运算,数据转换,数据操作分类下的全部函数,
  这小节我们来介绍字符串处理相关的函数。
  字符串处理相关的函数,顾名思义就是针对字符串数据的一些处理,如大小写转换,
  复制剪切插入,查找子字符串,编码转换等等。
  这些函数如下所示,共有28个,
  StringToLower, StringToUpper, StringToReverse
  StringTrimLeft, StringTrimRight
  StringCat, StringInsert,StringCopy, StringMid
  StringExcluding, StringIncluding
  StringFind, StringFindOneOf,StringReverseFind
  StringCompare, StringCompareNoCase
  StringGet,StringGetEx,
  StringLength
  StringSet,StringSetEx
  String2Unicode, Utf82Unicode ,Unicode2Utf8
  UnicodeCat,UnicodeCopy, UnicodeCompare, UnicodeExcluding
  宏指令的学习只有在编程软件中实践,才能够比较直观地了解每个函数的功能与使用。
  所以在学习下面的指令前,我们可以在编程软件界面上,准备一个字符元件,设置其读写地址为LW0,长度20个字,以便可以直观的显示出每个指令的执行结果。
  元件的具体设置如下图所示。
  1. StringToLower,
  函数用于将指定字符串转换为小写形式,要注意接收转换结果的字符数组要有足够的空间,不然函数执行失败。
  我们可以在宏编辑界面使用下面的代码,模拟运行查看函数的执行结果。
  macro_command main()
  char source[5, result[5]
  bool rst
  //函数将指定的字符串转换为小写形式,结果resul
  rst = StringToLower(“aBCdE”, result[0])
  //也可以传递字符元素,表示转换索引0开始的全部字符
  rst = StringToLower(source[0], result[0])
  if rst == true then
  SetData(result[0], “Local HMI”, LW, 0, 5)
  end if
  end macro_command
  2. StringToUpper。
  与上面函数StringToLower执行结果相反,此函数将指定字符串转换为大写形式,
  一样要注意的存储转换结果的字符数组空间要足够大,不然函数执行失败。
  也可以编译模拟下面函数的使用例程,查看执行结果。
  macro_command main()
  char source[5, result[5]
  bool rst
  //函数将指定的字符串转换为大写形式,结果resul
  rst = StringToUpper(“aBCdE”,result[0])
  //也可以传递字符元素,表示转换索引0开始的全部字符
  rst = StringToUpper(source[0], result[0])
  if rst == true then
  SetData(result[0], “Local HMI”, LW, 0, 5)
  end if
  end macro_command
  3. StringToReverse。
  此函数用于将指定字符串的内容进行反向重新排序。
  例如“1234”,重新排序后变成“4321”
  可以在宏编辑器里运行下面代码查看执行结果。
  macro_command main()
  char source[5, result[5]
  bool rst
  //函数将指定的字符串顺序反向重排,结果resul
  rst = StringToReverse(“aBCdE”,result[0])
  //也可以传递字符元素,表示转换索引0开始的全部字符
  rst = StringToReverse(source[0], result[0])
  if rst == true then
  SetData(result[0], “Local HMI”, LW, 0, 5)
  end if
  end macro_command
  4. StringTrimLeft, StringTrimRight。
  这两个函数用于从左边或右边删除最左边或最右边指定的字符串。
  例如StringTrimLeft(“*1234”,“*”, result[0])
  最左边是“*”则删除,不是则原样输出,结果result=“1234”
  可以在宏编辑器使用下面代码,模拟运行查看结果。
  macro_command main()
  char source[12, set[3,result[12]
  bool rst
  //判断source[12最左边是否为set[3,是则删除,结果保存到result
  //执行结果为resul 。要注意result要能足够容纳结果,不然函数执行失败。
  //rst = StringTrimLeft(source[0], set[0], result[0])
  //也可以使用这一种形式去除最左边字符串,结果resul
  //rst = StringTrimLeft(“,.*aBCdE,.*”, “,.*”, result[0])
  //有从左边去除,对应就有从右边去除,结果resul
  rst =StringTrimRight(source[0], “,.*”, result[0])
  if rst==true then
  SetData(result[0], “Local HMI”, LW, 0, 12)
  end if
  end macro_command
  5. StringCat。
  此函数用于在指定字符串尾部添加新的字符串。
  例如char source[12,result[20
  执行函数后StringCat(source[0], result[0])
  在字符串Result尾部添加了“abc”,并只在在result里。
  最终result=“123abc”。
  要注意的是result要有足够空间保存结果,不然函数执行失败。
  可以在宏编辑器里执行下载代码查看执行结果。
  macro_command main()
  char source[12, set[3,result[20
  bool rst
  //result=”123abc”
  rst =StringCat(source[0], result[0])
  if rst==true then
  SetData(result[0], “Local HMI”, LW, 0, 12)
  end if
  end macro_command
  6.StringInsert。
  此函数用于的一字符串指定的位置插入另一字符串,索引的位置从0开始计数。
  结果保存在***入的字符串存储空间里。
  同样也要注意结果存储空间足够大,不然函数执行失败。
  例如char source[12, result[20 StringInsert(1,source[0],result[0])
  程序会在字符串result[20的1位置,也就是在“1“的后面插入source[12
  执行后result[20
  在宏编辑界面使用下面代码,模拟运行,查看执行结果。
  macro_command main()
  char source[12, set[3,result[20
  bool rst
  //resul
  rst = StringInsert(1,source[0],result[0])
  if rst==true then
  SetData(result[0], “Local HMI”, LW, 0, 12)
  end if
  end macro_command
  7.StringCopy。
  此函数用于实现两个字符串间的复制。
  例如char source[12,result[20 StringCopy(source[0],result[0])
  函数将source[12内容复制到result中,结果为result=“abc”
  同样要注意result有足够空间保存结果。
  也可以在编辑器里模拟运行下面代码,查看执行结果。
  macro_command main()
  char source[12, set[3,result[20
  bool rst
  //执行结果resul
  rst = StringCopy(source[0],result[0])
  if rst==true then
  SetData(result[0], “Local HMI”, LW, 0, 12)
  end if
  end macro_command
  8. StringMid
  函数用于将一字符串内的子字符串提取出来。
  例如char source[12,result[20] StringMid(source[1], 1, result[0])
  程序将字符串“abc”第一个字符开始的1个字符串提取出来,保存到result。
  字符串索引从0开始计算,所以第“abc”第一个字符为b,执行结果result=“b”
  同样也要注意存储结果的空间大小,太小,函数执行会失败。
  模拟运行下面代码,可以查看执行结果
  macro_command main()
  char source[12, set[3,result[20]
  bool rst
  //执行结果resul
  rst = StringMid(source[1], 1, result[0])
  if rst==true then
  SetData(result[0], “Local HMI”, LW, 0, 12)
  end if
  end macro_command
  9. StringExcluding。
  此函数在一字符串中从左查找另一指定字符串不包含的字符,包含时结束查找,
  并返回查找结果。
  例如char source[12, set[3,result[20
  StringExcluding(source[0], set[0], result[0])
  从左开始在字符串“abcdefg”中找到第一个“b”包含在“bc”字符串中,
  结束查找,返回”b”前面的所有内容“a”。
  所以执行结果result=“a”,这里(source[0],中的索引0表示开始查找的位置,可任意。
  我们可以执行下边代码查看执行结果。同样也要考虑存储结果的空间大小。
  macro_command main()
  char source[12, set[3,result[20
  bool rst
  //执行结果resul
  rst = StringExcluding(source[0], set[0], result[0])
  if rst==true then
  SetData(result[0], “Local HMI”, LW, 0, 12)
  end if
  end macro_command
  10. StringIncluding。
  此函数在一字符串中从左查找另一指定字符串所包含的字符,不包含时结束查找,
  并返回查找结果。
  例如 char source[12, set[3,result[20
  StringIncluding(source[0], set[0], result[0])
  在字符串” AABBCDEFG”中查找”AB”,从左开始查找,A,A,B,B都在字符串“AB”中包含,
  但C不在字符串“AB”中,所以停止查找,返回先前查找的结果”AABB”。
  Result =“AABB”
  可以在宏界面模拟运行下面代码查看结果。
  macro_command main()
  char source[12, set[3,result[20
  bool rst
  //执行结果resul
  rst = StringIncluding(source[0], set[0], result[0])
  if rst==true then
  SetData(result[0], “Local HMI”, LW, 0, 12)
  end if
  end macro_command
  11. StringFind。StringReverseFind。
  这两函数用于在一字符串中,从左向右,或从右向左查找指定的字符串,
  找到则返回找到字符串的索引。
  例如char source[12, set[3,result[20
  int pos pos =StringFind(source[0], set[0])
  在字符串“abcdefg”中查找“bc”,可以找到“bc“,索引为1,所以pos=1.
  如果找不到返回-1.
  可以在宏编辑界面模拟执行下面的代码,查看执行结果。
  macro_command main()
  char source[12, set[3,result[20
  int pos
  //从右向左查找,结果POS=-1
  //pos =StringReverseFind(source[0], set[0])
  //从左向右查找,结果pos=-1
  pos =StringFind(source[0], set[0])
  DEC2ASCII(pos, result[0], 4)
  SetData(result[0], “Local HMI”, LW, 0, 12)
  end macro_command
  12. StringFindOneOf。
  相对于前面StringFind ,StringReverseFind,这个函数要求相对不高。
  在一字符串中从左到右查找指定字符串,有一字符在指定字符串中包含,则停止查找,
  返回字符索引。
  例如
  char source[12, set[3,
  int pos
  pos =StringFindOneOf(source[0], set[0])
  在字符串“abcdefg”中从左向右查找字符串“hdi”,找到字符d在字符串“hdi”中包含,则停止查找。返回d在字符串“abcdefg”的索引,pos=3。
  下面是实操代码,可以运行查看执行结果。
  macro_command main()
  char source[12, set[3,result[20
  int pos
  pos =StringFindOneOf(source[0], set[0])
  //结果pos=3
  DEC2ASCII(pos, result[0], 4)
  SetData(result[0], “Local HMI”, LW, 0, 12)
  end macro_command
  13. StringCompare, StringCompareNoCase
  这两函数用于对比两字符串,相同返回true,不相同返回false.
  StringCompare比对时区分大小写,
  StringCompairNoCase则不分大小写。
  例如bool rst rst = StringCompare(“hdi”, “hdi”)
  执行结果为TRUE,因为参与 对比两字符串相同。
  rst = StringCompareNoCase (“hdi”, “HDI”)
  函数不区分大小写,所以结果也为true,
  我们也可以实践模拟下面的代码,查看执行结果
  macro_command main()
  char source[12, set[3,result[20
  bool rst
  //执行结果 rst=false,
  rst = StringCompare(source[0], set[0])
  //结果rst=true
  //rst = StringCompare(“hdi”, “hdi”)
  DEC2ASCII(rst, result[0], 4)
  SetData(result[0], “Local HMI”, LW, 0, 12)
  end macro_command
  14. StringGet,StringGetEx,
  两个函数用于获取触摸屏或PLC等指定寄存器的字符串。
  例如char result [12,
  StringGet(result [0], “Local HMI”, LW, 0, 20)
  表示从触摸屏“Local HMI”,的地址LW0开始,读取20个字符。
  存放到字符数组result中。
  Local HMI为添加硬件的类型,这里没有添加PLC等硬件,所以默认只有触摸屏。
  20为读取的数据个数,数据类型为字符,所以表示读取20个字符。
  StringGetEx和StringGet相似,只不在执行时不会等待硬件回应,直接执行剩余代码。
  我们知道硬件在通讯时会有延时现象,导致程序宏执行卡顿,
  所以使用这个函数可以避免程序延时。
  下面的宏指令可以模拟运行,查看获取LW 9120的结果。
  macro_command main()
  char source[12, set[3,result[20
  bool rst
  //LW 9120为系统预留编程软件版本号
  StringGet(result[0], “Local HMI”, LW, 9120, 4)
  //StringGetEx(result[0], “Local HMI”, LW, 10884, 2)
  end macro_command
  StringLength
  StringSet,StringSetEx
  15. StringLength
  此函数获取指定字符数据的字符个数。
  例如int nLength nLength =StringLength“abcdefg”)
  字符串有7个字符,所以nLength=7.
  同样执行下面代码,查看显示结果。
  macro_command main()
  char source[12, set[3,result[20
  int nLength
  //“abcdefg”有7个字符,所以nLength=7
  nLength =StringLength(source[0])
  DEC2ASCII(nLength, result[0], 4)
  SetData(result[0], “Local HMI”, LW, 0, 4)
  end macro_command
  16. StringSet,StringSetEx
  有从硬件读取字符串就有向硬件写入字符串,这两个函数用于向PLC等硬件写入字符串。
  例如
  char source[12,
  StringSet(source[0], “Local HMI”, LW, 0, 12)
  代码实现向触摸屏“Local HMI”,LW0开始的地址写入12个字符,
  字符来源于字符数组source。
  如果添加PLC等其他硬件,可以将Local HMI换成硬件名称,
  将地址LW0改成硬件支持的地址。
  可以模拟运行下面代码,查看界面显示的内容。
  macro_command main()
  char source[12, set[3,result[20]
  //在前面添加的数值元件显示出字符串。
  StringSet(source[0], “Local HMI”, LW, 0, 12)
  end macro_command
  另外函数StringSetEx是StringSet扩展,用法都一样,只是不会通讯硬件响应,
  径直执行函数后面的代码。
  17. String2Unicode, Utf82Unicode ,Unicode2Utf8
  前面我们使用的字符都可以在ASCII表查找到,但世界语言很多,ASCII表不能够表示全部语言,所以就从ASCII基础上扩展出了UNICODE,UNICODE可以表示世界上的全部语言。
  这两种编码字符间可以相互转换使用。
  另外还有一个UTF-8编码,全称是8-bit Unicode Transformation Format,
  是一种针对Unicode的可变长度字符编码。
  也可以和Unicode进行相互转换。
  在使用这三个函数前,我们在界面添加一个字符显示元件,
  如下图设置让其能显示出UNICODE编码字符。
  char result[20]
  String2Unicode(“工控编程吧,欢迎关注”, result[0])
  将字符串常量转换为UNICODE形式,保存到result字符数组中。
  要注意只会转换字符串常量,且结果存储空间要够大。
  执行下面宏,可以在界面的字符元件上显示出中文。
  Utf82Unicode ,Unicode2Utf8也是同样的转换操作,就不演示了。
  macro_command main()
  char result[20]
  String2Unicode(“工控编程吧,欢迎关注”, result[0])
  StringSet(result[0], “Local HMI”, LW, 0, 20)
  end macro_command
  剩下的四个函数
  UnicodeCat,UnicodeCopy, UnicodeCompare, UnicodeExcluding,
  是关于UNICODE字符的衔接,复制,对比,包含判断等函数,和ASCII对应的函数一样使用,只是少了很多选择,在使用上也是很多问题,不是很稳定,这里了解下就好。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分