各位同学是否有以下疑惑:
1. INT数据类型与WORD 数据类型有何区别?DINT与TIME呢?
2. S5 TIME数据类型结构是什么样的?怎样自行修改或生成符合S5 TIME数据类型的值?
3. 仪表传送一组流量数值,是用字符串方式发送,接收到数值后,怎样还原为浮点数?
4. MOVE指令与数据类型转换指令怎样区分?都有什么样的应用场合?
5. 隐式转换和显示转换是什么含义,在TIA 博途中,设置IEC检查对数据类型转换会有什么影响。
另外,复杂数据类型的应用,如:STRUCT与UDT的应用与区别、*数组、ANY数据类型,各种数据类型的存储与寻址方式,相互转换也在本话题讨论范围之内,大家不要吝啬笔墨,踊跃发言,谈谈应用过程中的疑惑与认识,希望大家收获多多!
字符串转换为浮点数的方法
可以用程序编辑器的IEC库中的FC39 STRNG_R,将字符串转换为REAL数据类型格式变量。
用IEC库中的FC30 R_STRNG,可以将REAL格式的变量转换为字符串。
字符串由符号、小数点前的1位数字、小数点、小数点后的7位数字、E和2位指数数字字符组成。
下面是一个例程:
在DB1中定义字符串STR1[14],下面是OB1中的程序:
CALL "R_STRNG" //调用FC30,将REAL格式变量转换为字符串
IN :=1.234567e+003
RET_VAL:=DB1.STR1
CALL "STRNG_R" //调用FC39,将将字符串转换为REAL格式变量
S :=DB1.STR1
RET_VAL:=MD0
由监控可知FC30将1.234567e+003转换后,DB1.STR1中的字符串为’+0.1234567E+04’。用FC39将字符串DB1.STR1转换后,MD0中的浮点数为1.234567e+003。
一、在S7编程中字符类型[CHAR]使用比较少见,但在一些与条码扫描的通讯设备中却较为常见,例如工装线产品质检和计数或商场收银系统。
二、这类条码扫描设备通常先与PLC进行RS232C或RS485串口通讯后读入CHAR数据类型,然后经组合和转换后,在触摸屏Touch中显示。
三、其实CHAR数据类型处理很简单,具体使用事项和方法如下:
1、首先CHAR字符采用ASCII编码;
2、其次CHAR字符占用一个Byte;
3、因此将读取的CHAR字符存放至定义为CHAR类型的存储区变量中,例如MB2→CHAR即可;
4、如果要对定义的CHAR类型的变量赋值,需对输入的字符常量加一对单引号,例如:'$'、'F'、'【'、'?'。
5、使用效果见以下ASCII码表与程序对照图。

2. S5 TIME数据类型结构是什么样的?怎样自行修改或生成符合S5 TIME数据类型的值?
1) S5TIME为16位数据,BCD码格式。当使用S5TIME时,最大计时为S5T#2h46m30s(9990s).
格式如:2#0011 1001 1001 1001,即S5T#2h46m30s
10s 9 9 9
第14,13位表示时间基准,00为10ms,01为100ms,10为1s,11为10s.上例为11,即10s时基。
后12位为BCD码表示的时间值,上例为999,则999*10s=2h46m30s.
2)知道S5TIME的格式后,就可以在程序中正确的使用了。常见的如在触摸屏中有个INT变量设定的时间, 在程序中要转换成S5TIME.(INT转S5TIME).
因为S5TIME为BCD码格式,所以要先将INT转BCD(ITB).记得一定要转。可以看3楼的例子。我们也可以 自己编程做一下实验。ITB不写的话就会报错。
L 999 //0000 0011 1110 0111
ITB //0000 1001 1001 1001
L W#16#3000 //0011 0000 0000 0000
OW
T MW 700 //0011 1001 1001 1001 (S5T#2h46m30s)
A M 100.0
L MW 700
SD T 1
3)其他关于INT,TIME和S5TIME的转换见下帖。
http://www.ad.siemens.com.cn/clu ... d=4&a_id=898840
字符串数据类型[STRING]的使用也比较少见,常用于存储消息文本。
关于STRING类型变量使用事项如下:
1、STRING变量字符串以ASCII编码存储每个字符,最大长度256Byte,前两个Byte存储字符串长度信息,所以STRING变量最多包含254个字符。其中第一个Byte存储最大长度;第二个Byte存储实际字符长度。
2、STRING类型的变量可传递至相同类型(即相同的STRING长度)的块参数中,也可以传递至POINTER或ANY类型的FC/FB块参数中。
3、给STRING变量赋值常量需使用一对单引号,例如:'String'、'S7'、'failure_4'。
4、如果用ASCII编码的字符赋值,则该字符也必需使用一对单引号,而如果包含用于控制术语的特殊字符,则必需在字符前添加前缀符号$。例如:$$→美元字符;$P→换页字符;$L→换行字符;$R→回车字符;$T→空格字符。
5、STRING变量定义声明和初始化方法:变量名称:STRING[最大字符数]: '初始化文本',变量定义声明时可以无初始化文本。例如:FALT_SIG:STRING 'Motor failure_4'、Warning:STRING [50] ''。
如果变量定义声明时未指定最大字符数,那么STL/LAD/FBD程序编辑器则自动默认长度最大为254个字符。
6、可使用基本的STL指令访问STRING变量的各个字符。例如:L FALT_SIG[5] //装载变量FALT_SIG的第5个字符,即'r'。
7、还可以使用IEC库的FC功能块实现对STRING变量的访问和处理。
数据类型是什么?
数据类型是什么?数据类型是人为规定的数据的属性。在计算机和PLC中,数据实际上以二进制数的形式储存。按长度分为1位、8位、16位、32位的二进制数据。
除了数据的长度,数据类型包含了更多的内容,例如32位的数据类型有双字、32位整数、Time、浮点数、TIME_OF_DAY等。
数据的数据类型需要在符号表、块的局部变量表中定义,因此数据类型是人为指定的数据的属性。
指令和块的输入、输出参数的实参的数据类型必须与对应的形参要求的相同,否则程序将会出错。
OB40的参数OB40_MDL_ADDR的数据类型为WORD,不能直接用于要求数据类型为INT的整数比较指令。怎样解决这一难题呢?在梯形图中,可以用MOVE指令把OB40_MDL_ADDR的值传送给没有定义数据类型的一个绝对地址,例如MW10,MW10就可以用于比较指令了。MW10并没有因此自动获得数据类型INT,只是CPU“认为”MW10中的数据类型是INT,CPU被我们蒙骗了!
我见过不良小贩把白色的小鸡染成五颜六色来骗小孩,放到水里一洗,小鸡的彩色就消失了。如果把小鸡看成数据,染的颜色就是数据类型。把定义了数据类型的数据装入绝对地址MW10或累加器(累加器也是一个特殊的绝对地址),数据类型的属性就被剥去了,只剩下赤裸裸的数据,就像小鸡的颜色被水洗掉了一样。这时就可以把数据当作规定了长度的各种数据类型来使用。
|