目录
String的用处
Sting指令的理解
1.String的用处
a).解决Num计算超出限制的问题
【知识点】:我们查看手册可以知道Num的取值范围是:-8388607 到+8388608
【造成困扰】:如果我们的取值范围或者计算过程中出现上限或者下限溢出的问题有时候系统会提示错误有时候并不会提示,*终导致计算的结果是错误的。
【测 试】:我们把 8388608 + 8388608 = 16777216 进行测试
VAR stringdig strdig_1:="8388608";
PERS string Num_res:="1.67772E+07";
PERS stringdig StringDig_res:="16777216";
PROC StringDigTest()
StringDig_res := StrDigCalc(strdig_1, OpAdd, strdig_1);
Num_res:=valtostr(8388608+8388608);
ENDPROC
程序中得到的结果分别存储在StringDig_res和Num_res中,可以看到StringDig显示的结果是16777216,Num_res则丢失了后面的16。
程序中我采用了StringDig变量,这个变量会在数值超过Num范围的时候转成特定的字符串进行操作结果返回 String 这样就完美结果了数值范围超出造成的**度丢失。
程序中得到的结果分别存储在StringDig_res和Num_res中,可以看到StringDig显示的结果是16777216,Num_res则丢失了后面的16。
程序中我采用了StringDig变量,这个变量会在数值超过Num范围的时候转成特定的字符串进行操作结果返回 String 这样就完美结果了数值范围超出造成的**度丢失。
有人也许会提出为什么不用Num转成DNum进行计算,这个主要问题是Num和Dnum进行相互转换的时候会有精度丢失在数值的小数点后面会有很多小尾巴。在进行矩阵运算的中间过程产生的数据异常巨大数据丢失的精度也会很多,*终导致结果可能不够**。当然一开始就使用Dum进行计算结果用DNum保存也就避免了问题。同样是用StringDig也是同样的效果。*后再通过 StiToval 进行转换到Num也是一种办法。
Dnum的取值范围是 -4503599627370496至(+)4503599627370496。
StingDig是Long Int 类型,对就是Int REPAID底层就是用其他语言实现的 我有一个猜测以后我有机会再分析。
StingDig是Long Int 类型,对就是Int REPAID底层就是用其他语言实现的 我有一个猜测以后我有机会再分析。
2.String指令的理解
常用的字符串处理函数有:StrFind,StrLen,StrPart等等
利用StrLen获取字符串的长度,再利用StrFind获取关键Key字符串(需要查找的字符)的小标,*后利用StrPart进行函数的截取。下面是简单的函数使用测试:
PROC FindString()
VAR string Robot_String:="Robot-1200";
VAR num len;
VAR num index;
VAR string part;
!Steps:
!获取字符的长度
!获取Key字符串的下标
!进行字符的截取
!显示结果
len:= StrLen(Robot_String);
index:= StrFind(Robot_String,1,"1");
part:=StrPart(Robot_String,index,len-index+1);
TPWrite("part "+ part);
ENDPROC
但是我个人喜欢下面的程序写法风格:
TPWrite
(
StrPart(Robot_String,
StrFind(Robot_String,1,"1"),
StrLen(Robot_String)-StrFind(Robot_String,1,"1")+1)
);
看每个人的写程序的风格,这样写会牺牲一点性能,当然这种情况也有其他的思路解决,这要归功于RAPID的灵活和函数的多样,ABB一直再更新这些函数。
看每个人的写程序的风格,这样写会牺牲一点性能,当然这种情况也有其他的思路解决,这要归功于RAPID的灵活和函数的多样,ABB一直再更新这些函数。
另一种思路:我们发现 1200和前面的字符完全不同于其他是数字,我们便可以搜寻**个数字然后停止检索。
index:=StrFind(Robot_String,1,STR_DIGIT);
STR_DIGIT是一组数字集合所以一旦匹配到数字结合数字就停止匹配。这样可以让代码实用性更加的广泛。而不是一定要是1200也可以是6400当然这个只是一个例子并不是和贴切。
另一种思路:采用另一种指令模块匹配,采用StrMatch函数 代码示例如下:
index:=StrMatch(Robot_String,1,"1200");
直接在被检索的对象中检索“1200”这样代码是针对性比较强的,如果匹配的字符类型比较多的话可以采用函数化的写法将“1200”参数化,这样代码编写也能起到不错的效果,省去了下次反复代码的烦恼。
其他我比较喜欢的几个String函数
StrMap(String Mapping)可以实现字符的转化,*经典的就是完成大小写的转化,下面我会给出示例代码:
PROC StringMapping()
VAR string str;
str := StrMap("abb robot",STR_LOWER, STR_UPPER);
TPWrite(str);
ENDPROC
*终在屏幕上输出的结果是:ABB ROBOT的大写情况。在需要切换大小的情况下省去了很多的麻烦,同时如果需要大写切换成小写也把StrMap的函数*后两个参数STR_LOWER和STR_UPPER进行位置调换,函数简单而且易于阅读。
了解相关资讯请点击:ABB机器人配件
*终在屏幕上输出的结果是:ABB ROBOT的大写情况。在需要切换大小的情况下省去了很多的麻烦,同时如果需要大写切换成小写也把StrMap的函数*后两个参数STR_LOWER和STR_UPPER进行位置调换,函数简单而且易于阅读。
了解相关资讯请点击:ABB机器人配件
本文摘自:网络 日期:2019-06-17