[数据类型]plc数据类型

  • 格式:doc
  • 大小:55.50 KB
  • 文档页数:26

[数据类型]plc 数据类型

[数据类型]plc 数据类型 篇一 : plc 数据类型

在STEP 7-Micro/WIN中编程时,在下列两种情况下您必须识别并使用数据类型:

?如果您以IEC 1131-3模式编程,则必须为全局符号表中的所有数值选择数据类型。,]

?如果您在局部变量表中赋值,则必须为每个局部变量定义数据类型。

当您明确地为数值指定数据类型时,您为STEP 7-Micro/WIN

提供清晰的指令,指明需要为数值分配多少内存空间以及如何表示数值。

每个SIMATIC和IEC 1131-3指令或参数化子程序均由精确定义识别。该定义可被称为签名。对于所有的标准指令,每个指令操作数允许使用的数据类型集均从签名获得。对于参数化子程序,用户通过局部变量表建立子程序签名。

STEP 7-Micro/WIN V3.0编程软件为SIMATIC模式执行简单的数据类型检查,为IEC 1131-3模式执行细致的数据类型检查。这意味着为局部或全局变量指定一种数据类型时,软件在下表所列的每个等级中确保操作数数据类型与指令签名相匹配。

基本数据类型 数据类型大小 说明 范围

布尔 1位 布尔 0至1

字节 8位 不带符号的字节 0至255

字节 8位 带符号的字节 -128至+127

字 16位 不带符号的整数 0至65,535

整数 16位 带符号的整数 -32768至+32767

双字 32位 不带符号的双整数 0至4294967295 双整数 32位 带符号的双整数 -2147483648至+2147483647 实数 32位 IEEE

32 位浮点 +1.175495E-38

+3.402823E+38-1.175495E-38至3.402823E+38

字符串 2至255字节 ASCII字符串照原样存储在PLC内存中,形式

为1字符串长度接ASCII数据字节 ASCII字符代码128至255 复杂数据类型

说明 范围

TON 打开接通延时定时器 1 ms10 ms100 ms T32, T96T33 -

T36, T97 - T100T37 - T63, T101 -T255

TOF 关闭接通延时定时器 1 ms10 ms100 ms T32, T96T33 -

T36, T97 - T100T37 - T63, T101 - 255

TP 脉冲定时器 1 ms10 ms100 ms T32, T96T33 - T36, T97 -

T100T37 - T63, T101 - 255

CTU 向上计数器 0至255 至

CTD 向下计数器 0至255

CTUD 向上,向下计数器 0至255

SR 设置主要双稳态触发器 无关

RS 复原主要双稳态触发器 无关

STEP 7-Micro/WIN 提供三级数据类型检查

1. IEC编辑器具有细致数据类型检查。,)在该模式中,参数数据类型必须与符号或变量的数据类型完全匹配。欲支持细致数据类型检查,过载指令除外,每个正式参数只有一种数据类型。例如,SRW指令的IN参数的数据类型为字。在细致数据类型检查中,只有被指定字数据类型的变量才能成功编译。使用细致数据类型检查时,数据类型为整数的变量对字指令参数无效。细致数据类型检查仅在IEC

1131-3模式中进行。 用户选择的数据类型 等同数据类型

布尔 布尔

字节 字节

字 字

整数 整数

双字 双字

双整数 双整数

实数 实数

字符串 字符串

2. 处于SIMATIC模式中的局部变量表具有简单数据类型检查。指令。

指令 允许使用的数据类型 允许使用的数据类型 编译指令

ADD 整数 字、整数 ADD_I

ADD 双整数 双字、双整数 ADD_D

ADD 实数 实数 ADD_R

当所有操作数的数据类型均为双整数时,编译器生成”加双整数”指令。如果过载指令数据类型混合,会出现编译错误。根据数据类型检查的等级决定哪些为非法。在下例中,如果使用细致数据类型检查,则生成编译程序错误,但如果使用简单数据类型检查则成功编译。

ADD IN1 = INT, IN2 = WORD, IN3 = INT.

细致数据类型检查:引起编译错误。

简单数据类型检查:成功编译至ADD_I。

简单数据类型检查不会阻止出现常见运行时间编程错误。例如,使用简单数据类型检查时,编译程序不能帮助避免在运行时间发生以下常见编程错误:ADD

40000,1被解释为负数,而不是不带符号的40,001。 在IEC中为过载指令使用直接编址

IEC-1131编程模式也允许使用直接表示的内存位置,作为指令参数配置的一部分。参数中可使用变量和内存位置。但是,使用直接表示的内存位置时必须清楚地识别数据类型的隐含意义,因为这些位置不

包含明确的类型信息。,,另外,不能从任何过载IEC指令决定类型信息,因为过载指令接收多种数据类型。

直接表示的参数数据类型通过检查指令中包含的其他类型的参数来决定。当指令参数配置使用某一指定类型的变量时,则假定所有直接表示的参数均为该类型。

名称 地址 数据类型 注解

Var1 实数 这是浮点数变量。

Var2 双整数 这是双整数变量。

Var3 整数 这是整数变量。

举例 说明

假定VD100和VD200为实数类型,因为Var1是实数类型。 VD300和VD400为双整数类型,因为Var2是双整数类型。 假定VW500和VW600为整数类型,因为Var3是整数类型。 假定AC0和AC1为实数类型,因为Var1是实数类型。

这种配置被视作非法,因为无法确定类型。累加器中的数据类型可为双整数或实数。

这种配置被视作非法,因为无法确定类型。累加器指针中的数据类型可为双整数或实数。

使用数据类型转换指令

转换指令允许从一种数据类型移至另一种数据类型。,)STEP 7-Micro/WIN支持在下列简单数据类型之间的移动数值转换指令。 转换指令 IEC细致数据类型检查允许的操作数 SIMATIC局部变量表中的简单数据类型检查允许的操作数

字节至整数 入: 字节出: 整数 入: 字节出: 字、整

整数至字节 入: 整数出: 字节 入: 字、整数出: 字节

整数至双整数 入: 整数出: 双整数 入: 字、整数出: 双字、双整数

双整数至整数 入: 双整数出: 整数 入: 双字、双整数出: 字、整数

双整数至实数 入: 双整数出: 实数 入: 双字、双整数出: 实数

实数至双整数 入: 实数出: 双整数 入: 实数出: 双字、双整数

字符串至整数 入: 字符串

双字 出: 整数 入: 字符串,

双字 出: 字、整数

整数至字符串 入: 整数出: 用双字代表的字符串 入: 字、整数出: 用双字代表的字符串

字符串至双整数 入: 字符串

双字 出: 双整数 入

字符串,

双字 出: 双字、双整数

双整数至字符串 入: 双整数出: 用双字代表的字符串 入: 双字、双整数出:

用双字代表的字符串

字符串至实数 入: 字符串

双字 出: 实数 入: : 字符串

双字 出: 实数 实数至字符串 入: 实数出: 用双字代表的字符串 入: 实数出: 用双字代表的字符串

在IEC 1131-3编辑模式中,您可以使用过载移动指令在整数和字、双整数和双字之间转换。,)过载移动指令允许相同大小的数据类型自由移动,而不生成编译错误。

IEC 1131-3过载移动 入 出 :

移动 整数 字 移动 字 整数

移动 双整数 双字 移动 双字 双整数

篇二 : MSComm控件编程中的几种数据类型,VARIANT数据类型,COleVariant类,CO

以下内容参考自MSDN和百度百科1.VARIANT and VARIANTARG

SAFEARRAY的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型等信息。SafeArray也并不单独使用,而是将其再包装到VARIANT类型的变量中,然后才作为参数传送出去。在VARIANT的vt成员的值如果包含VT_ARRAY|...,那么它所封装的就是一个SafeArray,它的parray成员即是指向SafeArray的指针。SafeArray中元素的类型可以是VARIANT能封装的任何类型,

包括VARIANT类型本身。

使用SafeArray的具体步骤:

方法一:

包装一个SafeArray:

. 定义变量,如:

VARIANT varChunk; SAFEARRAY *psa;

SAFEARRAYBOUND rgsabound[1];

. 创建SafeArray描述符:

uIsRead=f.Read;//readarray from a file.

ifbreak;

rgsabound[0].cElements =uIsRead;

rgsabound[0].lLbound = 0;

psa =SafeArrayCreate;

. 放置数据元素到SafeArray:

for

{

if))

::MessageBox;

}

一个一个地放,挺麻烦的。

. 封装到VARIANT内:

varChunk.vt = VT_ARRAY|VT_UI1;

varChunk.parray = psa;

这样就可以将varChunk作为参数传送出去了。

读取SafeArray中的数据的步骤:

. 用SafeArrayGetElement一个一个地读

BYTE buf[lIsRead];

for

{