关于探讨PLC数据类型

分享到:
946
下一篇 >

各位是否有以下疑惑:

1. INT数据类型与WORD 数据类型有何区别?DINT与TIME呢?

2. S5 TIME数据类型结构是什么样的?怎样自行修改或生成符合S5 TIME数据类型的值?

3. 仪表传送一组流量数值,是用字符串方式发送,接收到数值后,怎样还原为浮点数?

4. MOVE指令与数据类型转换指令怎样区分?都有什么样的应用场合?

5. 隐式转换和显示转换是什么含义,在TIA 博途中,设置IEC检查对数据类型转换会有什么影响。

另外,复杂数据类型的应用,如:STRUCT与UDT的应用与区别、*数组、ANY数据类型,各种数据类型的存储与寻址方式,相互转换等,谈谈应用过程中的疑惑与认识,希望大家收获多多!


1. INT数据类型与WORD 数据类型有何区别?DINT与TIME呢?

int数据类型是有符号整数,占用2个字节即一个字的地址,数据范围:-32768至32767;

在字中,高字节的*高位表示数据的正负(0正1负),其他15位用来表示数据。

WORD取值范围是:2#0---2#1111_1111_1111_1111是双字节数

或者利用MOVE指令,可以自动转换类型。

MOVE DBXX.DBD可以直接复制给MD。

所以,主要是数据处理时,需要数据转换。


2. S5 TIME数据类型结构是什么样的?怎样自行修改或生成符合S5 TIME数据类型的值?

大虾1:S5 TIME数据类型是BCD。范围是从001到999 。

L #TNT // INT 变量

ITB

L W#16#2000 (B#0010 0000 0000 0000)  //10为1s

OW

T #OUT // S5T time

------------------------------------------------------------------------------

大虾2:S5 TIME 是西门子PLC S7-300、400等编程中的一种数据类型。用于表示时间。

其有效范围为:T#0H_0M_0S_10MS 到T#2H_46M_30S_0MS,

其表达如:S5T#10ms,S5T#2s等等。 

对于S5 TIME,有效的精度是基于0.01s,0.1s,1s,10s这几个时间基准。


3、 仪表传送一组流量数值,是用字符串方式发送,接收到数值后,怎样还原为浮点数?

可以把数据转成字符串来传送,比如上面的数据,传送时只需要传:

I4FFFFEEEE就行了,**字节F表示是整数,**字节表示16位,这些都可自定义的。

接收到了以后用atoi转换就行


4、MOVE指令与数据类型转换指令怎样区分?都有什么样的应用场合?

定义了数据类型,必须要通过MOVE指令或相关的其他转化格式指令,转变为有符合性定义的,或者是没有定义数据类型的。比如DB里的INT,不能在WORD类型中使用,但MW,没有定义其类型,可以自动转化。

字符串转换为浮点数的方法

可以用程序编辑器的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。

------------------------------------------------------------------------------

数组的一个很重要的作用是定义数据块的大小。数据中的变量需要先定义,后使用。使用数据块中的变量超出了定义的范围时,将会出错。假设需要用数据块来保存1000个历史数据,分别定义1000个变量是不可想象的艰巨任务。在数据块中定义名称为XYZ的数组ARRAY[1..1000] INT,就可以轻而易举的解决这个难题。可以用XYZ[abcd](abcd为数组元素的下标)来访问数组中的元素。虽然定义的数组元素的数据类型为INT,也可以用数据块中的**地址按位、字节、字和双字来访问数据块中的地址。

------------------------------------------------------------------------------

STEP7 V12中的数据类型转换

1.数据类型转换的分类

在STEP7 V12中,分配或提供块参数的实参时,必须确保数据类型是兼容的。如果操作数不是同一数据类型,则必须进行转换。 

数据类型的转换方式分为隐式转换和显式转换。

如果操作数的数据类型是兼容的,则自动执行隐式转换。编程语言 LAD、FBD、SCL 和 GRAPH 支持隐式转换。STL不支持隐式转换。

2.IEC检查

IEC检查用于操作数的数据类型兼容性检查。如果激活“IEC 检查”,则应用较严格的条件。

1)为项目中的所有新块设置IEC检查:

在设置窗口的“PLC 编程 > 常规”组的“新块的默认设置”组中,选中或**“IEC检查”复选框。

2)为某个块设置IEC检查:

打开块,打开巡视窗口的“属性”选项卡。在区域导航中选择“常规”组的“属性”,选中或**“IEC检查”复选框。

3.隐形转换

隐形转换可以根据设定的严格或较宽松的条件来进行兼容性测试。

1) 进行 IEC 检查

在已经设置了IEC检查的情况下,下列规则适用于LAD、FBD和GRAPH 编程语言:

可以进行隐式转换的数据类型仅有BYTE和WORD。

源数据类型的位长度不能超过目标数据类型的位长度。例如,无法为预计为 BYTE 数据类型的参数指定 WORD 数据类型的操作数。

在已经设置了IEC 检查的情况下,下列规则适用于SCL编程语言:

无法将位字符串隐式转换为其它数据类型。例如,无法为预计为 INT 数据类型的参数指定 WORD数据类型的操作数。

源数据类型的位长度不能超过目标数据类型的位长度。例如,无法为预计为 BYTE 数据类型的参数指定 WORD 数据类型的操作数。

2) 不进行IEC检查(默认的设置)

在未设置 IEC 检查的情况下,下列规则适用于 LAD、FBD 和 GRAPH 编程语言:

可以对 BYTE、WORD、DWORD、INT、DINT、TIME、S5TIME、TOD、DATE 和 CHAR 数据类型进行隐式转换。

源数据类型的位长度不能超过目标数据类型的位长度。 例如,无法为预计为 WORD 数据类型的参数指定 DWORD 数据类型的操作数。

在未设置 IEC 检查的情况下,下列规则适用于 SCL 编程语言:

位字符串可以被隐式转换为其它数据类型。例如,可以对预期为 WORD 数据类型的参数提供 WORD 数据类型的操作数。

位字符串无法被隐式转换为浮点数。例如,无法为预计为 REAL 数据类型的参数指定 WORD 数据类型的操作数。

如果位长度相同,那么位字符串只能被隐式转换为 TIME、TOD、DATE 和 CHAR 数据类型。例如,无法为预计为 DATE 数据类型的参数指定 DWORD 数据类型的操作数。

源数据类型的位长度不能超过目标数据类型的位长度。 例如,无法为预计为 INT 数据类型的参数指定 DINT 数据类型的操作数。

在到达/离去参数处输入的操作数位长度必须与为所述参数设定的位长度相同。

4.显式转换

如果因操作数不兼容而不能进行隐式转换,则可以使用显式转换指令。可以在“指令”任务卡中找到转换指令。

在使能输出 ENO 上将显示所有溢出。例如,如果源数据类型的值大于目标数据类型的值,则会发生溢出。

STEP7 V12的在线帮助给出了S7-300/400、S7-1500和S7-1200设置或未设置IEC检查时,各种数据类型相互之间是否允许隐式转换或显示转换的详细信息,并给出了显式转换使用的指令。

------------------------------------------------------------------------------

一、在S7编程中字符类型[CHAR]使用比较少见,但在一些与条码扫描的通讯设备中却较为常见,例如工装线产品质检和计数或商场收银系统。

二、这类条码扫描设备通常先与PLC进行RS232C或RS485串口通讯后读入CHAR数据类型,然后经组合和转换后,在触摸屏Touch中显示。

三、其实CHAR数据类型处理很简单,具体使用事项和方法如下:

1、首先CHAR字符采用ASCII编码;

2、其次CHAR字符占用一个Byte;

3、因此��读取的CHAR字符存放至定义为CHAR类型的存储区变量中,例如MB2→CHAR即可;

4、如果要对定义的CHAR类型的变量赋值,需对输入的字符常量加一对单引号,例如:'$'、'F'、'【'、'?'。

5、使用效果见以下ASCII码表与程序对照图。


------------------------------------------------------------------------------

从根本上讲,PLC技术是以计算机技术的发展为依托的,而**语言的变化和发展恰恰体现和运用了计算机技术的进步,所以PLC的设计和运行机理,也参照了**语言的制定规则以及使用方法。

简单的以非**数据类型的C语言举例说明,如C语言中如果在一个函数的声明中不显示地声明返回值的类型,它就默认返回整形。具体这个函数能不能实现你原本的预期,返回一个你希望看到的“数据类型”,那就要取决于编译器的“心情”。

在程序中,不建议使用隐式声明,一方面它会有存在“非预期值”的隐患,另一方面也不利于程序清楚地表达我们的意图。

再有函数的返回值问题,不管FC执行的怎么样,多少都要给个确定的值,不管是1是0还是-1,还是多少多少,这有点像人家借了你的钱,到了原本约定还钱的日子,却什么动静都没有,不见钱,也不见句话,这就闹心了!


而PLC中,如数据传送指令,在S7-200系列中,传送命令有,MOVB,MOVW,MOVD,对不同数据长度的数据类型作处理,而到了S7-300/400系列,只有一个MOVE命令,其输入IN对应数据类型有,BYTE,WORD,DOUBLE WORD,在STL模式下,我们知道和MOVE的功能相同的指令是装载L和传送T,其中关键是要用到一个叫“累加器”的类似“中间人”“中介”的32位寄存器,为什么是32位?因为它像个大口袋一样,可以把BYTE,WORD,DOUBLE WORD统统装得下。当把一个双字D传送入一个字W,由于内存地址溢出,这时W中的数据是不是我们原本想要传送的D中的数据,这就要看原本数据的大小了,这里我们可以看出,在这里数据的类型(或者说叫长度)取决于对这个数据操作时存储它使用的存储空间有多大。


数据类型使用中常出现类型不匹配的现象,个人认为类型匹配在某种程度上讲,就是存储空间长短大小的匹配,也常常伴随着“边界”问题。


其实,计算机语言中的很多东西,主要是一些想法,我们也可以像TIA Portal中的项目移植一样,也移植到PLC使用中,多少总归有些益处吧。


一口之言,仅供参考。

------------------------------------------------------------------------------

数据类型ANY是任意的数据类型吗?

数据类型ANY的名称ANY很有意思,从所周知,ANY这个单词可翻译为“任意”的,它的实参可以是任意的数据类型!在调用逻辑块时,参数类型ANY用于将任意的数据类型传递给声明的形参。ANY可用于实参的数据类型未知,或实参可以使用任意数据类型的情况。

我们来做一个实验,在FC中定义一个数据类型为ANY的输入参数IN1。在OB1中调用FC1,分别设置IN1的实参为M0.2(位)、MB0、MW0、MD0、DB1.DBW0等各种长度的地址,或数据块中的各类地址,都是允许的。ANY的实参也可以是一片连续的地址区,例如P#DB1.DBX0.0 INT 50(DB1中从DW0开始的50个整数)。

数据类型ANY为了定义一片地址区,占用了10个字节,因此ANY*合理的用法还是用来定义地址区。如果用于单独的地址,那就大材小用了。在实参的数据类型是已知的、确定的情况下,不宜用ANY这个数据类型。

------------------------------------------------------------------------------

STRUCT与UDT的应用与区别:

工程中如果有大量的相同的设备或工艺,那么可以用这两个数据类型,例如有多个电机,那么只需要对一个电机的参数声明一个STRUCT数据类型或者UDT数据类型,在DB块中,其它电机的参数就可以拷贝建好的STRUCT或者使用UDT数据类型。UDT本质是数据类型,用户自定义的,类似个模板,修改此模板则所有相关使用的地方均要修改。

另外还可以在接口参数中声明,用来传递参数,很方便。

这两种数据类型使用时的寻址,是不是只能是符号寻址?还有就是频繁修改STRUCT和UDT的时候感觉比较麻烦,不知有没有什么简单办法。

------------------------------------------------------------------------------

刚开始我从来没运用过array数组,*近把滤波程序(“定时对模拟量采集,N次后,算平均值,”)写成可多次调用的FB时,我觉得array数组很好的提高了编程效率,而且让编程思路更为清晰。本身对模拟量信号采集N次,就是把一个个数组合成一个相同数据类型的数组。假使我采集10次,只要再变量中这样定义,Array [0..9] Of Int,就不要一个个的在变量表中输了。而且数组一建立,就很容易的完成数据‘先进先出’这样的原则了,再配合循环等指令,这个可移植,可多次调用的标准功能块就完成了。

我觉得这次的应用探讨,对像我这样不经常使用西门子PLC和刚学习的新手来说还是很好的一个学习资料。因为对每种数据类型深入的理解后,才能在编程时不至于出错,并且可以提高编程效率。而且自己多动手对自己没应用过的数据类型尝试编一下程序,可能会牵扯出自己更多的不会的知识,进而可以学习它。

------------------------------------------------------------------------------

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/club/bbs/post.aspx?b_id=4&a_id=898840

------------------------------------------------------------------------------

数据类型Time和S5Time的区别 

S5Time是16位的SIMATIC时间,默认的时间基准为10ms,范围为S5T#0H_0M_0S_10MS ~ S5T#2H_46M_30S_0MS。SIMATIC定时器使用S5Time类型的时间。

SIMATIC定时器在梯形图里只能使用S5T#格式的时间值,在语句表里可以使用S5T#或T#格式的时间值。

Time是IEC时间,32位的有符号整数,单位为1ms,范围为T#-24D_20H_31M_23S_648MS ~ T#24D_20H_31M_23S_647MS。

IEC定时器使用Time类型的时间。IEC定时器(SFB3~SFB5)是功能块,需要指定配套的背景数据块。

------------------------------------------------------------------------------

INT数据类型与WORD 数据类型有何区别?

INT是16位长度,    格式为:十进制有符号数字,范围为-32768到 32767,这样表示形式为L1 0,L -10

WORD 是16位数据,格式可以为:二进制的数字,十六进制的数字,BCD,十进制无符号数字,

可这样表示L 2#0001_0000_0000_0000,L W#16#1000,L C#999,L 10

可见,*大区别就是编程时,他们可运用的格式。

------------------------------------------------------------------------------

字符串数据类型[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或累加器(累加器也是一个特殊的**地址),数据类型的属性就被剥去了,只剩下***的数据,就像小鸡的颜色被水洗掉了一样。这时就可以把数据当作规定了长度的各种数据类型来使用。

------------------------------------------------------------------------------

数据类型字节、字和双字都是无符号数,它们的数值用十六进制数表示。

库里有的块的输入参数的数据类型是字节、字和双字。实参为常数时,哪怕是2,也要写成16#2的格式。如果输入2,将会出错。

出错也不怕,输入的数字会变为红色。

输入值变红后,就需要查看块的在线帮助,看数据类型或数据的大小是否满足要求。

------------------------------------------------------------------------------

对ANY数据类型的错误理解的分析

菜鸟:ANY指针可以这么用么?

各位好,*近学习一下ANY指针,写了段测试代码,但是无法执行,请问是不是ANY指针不能这么使用呢?谢谢!

代码如下:    

L     P##TEMP0

LAR1  

L     W#16#1001

T     W [AR1,P#0.0]

L     W#16#0

T     W [AR1,P#2.0]

L     W#16#0

T     W [AR1,P#4.0]

L     DW#16#81000000

T     D [AR1,P#6.0]


SET   

A      [AR1,P#0.0]

=     Q      0.0


大虾:下面是我的分析:

上面这段代码实际上是在填写ANY的10个字节的值,虽然辛苦,做的却是无用功。问题在于他没有理解ANY的使用方法。

ANY是参数类型,只是用来作块的输入、输出参数。在调用逻辑块时, ANY用于将任意的数据类型传递给声明的形参。ANY的实参可以是单个的任意地址,也可以是一片连续的地址区,例如P#DB1.DBX0.0 INT 50(DB1中从DW0开始的50个整数)。但是ANY的10个字节的值是操作系统根据块的实参的值自动生成的,而不是用户生成的。我们可以用寄存器间接寻址读取ANY的10个字节中包含的大量信息,例如实参的基本数据类型,数据块的编号,重复因子(变量的个数),地址区的起始地址等等。


你可能感兴趣: 工控菜鸟园 图片 自动化系统 操作系统 PLC
无觅相关文章插件,快速提升流量