基本数据类型分享

电子说

1.2w人已加入

描述

基本数据类型

基本数据类型:包括位、位序列、整数、浮点数、日期时间。此外字符也属于基本数据类型,请参见文档String与WString。

1.位和位序列

数据

2.整数数据类型

数据

3.浮点型实数数据类型

如 ANSI/IEEE 754-1985 标准所述,实(或浮点)数以 32 位单精度数 (Real) 或 64 位双精度数 (LReal) 表示。单精度浮点数的精度最高为 6 位有效数字,

而双精度浮点数的精度最高为 15 位有效数字。在输入浮点常数时,最多可以指定 6 位 (Real) 或 15 位 (LReal) 有效数字来保持精度。

数据

4.时间和日期数据类型

数据

TIME 数据作为有符号双整数存储,基本单位为毫秒。存储的数值是多少,就代表有多少ms。编辑时可以选择性使用日期 (d)、小时(h)、分钟 (m)、秒 (s) 和毫秒 (ms) 作为单位。
不需要指定全部时间单位。例如,T#5h10s 和 500h 均有效。所有指定单位值的组合值不能超过以毫秒表示的时间日期类型的上限或下限(-2,147,483,648 ms 到 +2,147,483,647 ms)。

DATE 数据作为无符号整数值存储,被解释为添加到基础日期 1990 年 1 月 1 日的天数,用以获取指定日期。编辑器格式必须指定年、月和日。

TOD (TIME_OF_DAY) 数据作为无符号双整数值存储,被解释为自指定日期的凌晨算起的毫秒数(凌晨 = 0 ms)。必须指定小时(24 小时/天)、分钟和秒。可以选择指定小数秒格式。

结构数据类型(Struct)

Struct类型是一种由多个不同数据类型元素组成的数据结构,其元素可以是基本数据类型,也可以是Struct、数组等复杂数据类型以及PLC数据类型(UDT)等。Struct类型嵌套Struct类型的深度限制为 8 级。Struct类型的变量在程序中可作为一个变量整体,也可单独使用组成该Struct的元素。Struct 类型可以在DB、OB/FC/FB接口区、PLC数据类型(UDT) 处定义使用。

Struct数据类型使用非常灵活,随时可以使用,但是相对于PLC数据类型 (UDT) 有以下缺点,所以建议需要使用Struct类型时,可以使用PLC数据类型(UDT)代替。

维护成本增加:如果对一个Struct进行了多次复制,则在更改过程中该Struct也必需进行相应的多次更改。

Struct与 PLC 数据类型(UDT)的相同结构不兼容。

由于系统会检查所有结构元素的类型是否匹配,因而会导致性能下降。

存储空间要求增加:每个Struct都是一个单独的对象,其描述信息将加载到PLC中。

Struct应用案例

1. 单独使用组成该Struct的元素时,和普通的变量没有区别,只是每出现一个Struct的嵌套层级,变量名增加一个前缀,如图1-2所示。

数据

图1 Struct的定义

数据

图2 Struct的使用

2. Struct可以将一种类型变量放在一起,利于区分,如图3-4所示。

数据

图3 原始结构

数据

图4 增加了Struct类型的结构

图4和图3功能明显相同,但图4相对图3,分类更加清晰。

3. 通讯程序中,通常可以把需要发送的数据放在一个Struct中,即看做一个整体,这样在发送区只需填写一个变量即可,如图5所示。

数据

图5 使用了图4定义的Struct类型

4. MOVE指令支持相同Struct类型的直接传送,如果传送双方是大量数据,并且结构相同,可以先分别将双方数据建立在一个结构,然后用一个MOVE指令一次传送即可,如图6所示。

数据

程序中直接MOVE,即可传送整个Struct,而不需要若干MOVE。并且,即使两边Struct中的对应元素名称不同也可以传送成功,如图7所示。

数据

图7 Struct的传送

PLC数据类型(UDT)

从TIA 博途 V11 开始,S7-1200 支持PLC数据类型(UDT)。

UDT类型是一种由多个不同数据类型元素组成的数据结构,元素可以是基本数据类型,也可以是STRUCT、数组等复杂数据类型以及其它UDT等。UDT类型嵌套UDT类型的深度限制为 8 级。
UDT类型可以在DB、OB/FC/FB接口区处使用。从TIA 博途 V13SP1 开始,S7-1200 V4.0开始,PLC变量表中的I和Q也可以使用UDT类型。
UDT类型可在程序中统一更改和重复使用,一旦某UDT类型发生修改,执行软件全部编译可以自动更新所有使用该数据类型的变量。
定义为UDT类型的变量在程序中可作为一个变量整体使用,也可单独使用组成该变量的元素。此外还可以在新建DB块时,直接创建UDT类型的DB,该DB只包含一个UDT类型的变量。
UDT类型作为整体使用时,可以与Variant、DB_ANY类型及相关指令默契配合。
理论上来说,UDT是Struct类型的升级替代,功能基本完全兼容Struct类型。

UDT建立及应用案例

1. 新建UDT

点击CPU菜单下,PLC数据类型中的“添加新数据类型”按钮,如图1所示。

数据

图1 新建UDT

2. 在弹出页面可以添加需要的变量、类型、起始值、注释等,如图2所示。

数据

图2 定义UDT内的变量

3. 在图2红框处右键属性常规,可以修改该数据类型的名称,如图3所示。

数据

图3 修改UDT名称

4. DB中使用,如图4所示。

数据

图4 定义UDT类型的变量

5. 程序中使用,类似于Struct,如图5所示。

数据

图5 UDT的使用

6. 根据UDT定义DB块,如图6所示。

数据

图6 建立UDT类型的DB

此时打开DB块,可以发现和在DB中新建UDT变量差了层级,在使用内部变量没有太多差别。并且这种方式下,除非修改UDT,否则无法更改DB块中的内容,如图7所示,变量均为灰色。重要用途:参见DB_ANY。

数据

图7 UDT类型的DB展开

7. 从TIA 博途 V14SP1开始,相同结构,但不同名称的UDT的变量,可以直接复制,如图8-11所示。

数据

图8 定义不同名称的UDT,但内部变量类型相同

数据

图9 使用UDT建立变量

数据

图10 UDT类型间的MOVE

SCL的版本程序,如图11所示

数据

图11 SCL版本程序

UDT在PLC变量表的应用

实现功能:将Profinet IO通讯中的I点送入DB,将DB送入Q点,如图12-16所示。

1. 建立I点和Q点两个UDT,元素变量类型及排布设置参照通讯对象

数据

图12 I点定义的UDT

数据

图13 Q点定义的UDT

2. PLC变量表和DB块使用UDT

数据

图14 PLC变量表中使用图12-13定义的UDT

数据

图14 DB块中使用的UDT类型定义变量

3. 写MOVE程序传递

数据

图16 程序详情

SCL版本程序如图17所示。

数据

图17 SCL版本程序

S7-1200 数组数据类型(ARRAY)

ARRAY类型是由数目固定且数据类型相同的元素组成的数据结构。
ARRAY类型的定义和使用需要注意以下几点:

ARRAY类型可以在DB、OB/FC/FB接口区、PLC数据类型处定义;无法在PLC变量表中定义。

数组定义:Array[维度1下限..维度1上限,维度2下限..维度2上限,...]of <数据类型>,最多可包含 6 个维度;

数组元素的数据类型包括:除数组类型、Variant类型以外的所有类型;

数组下标的数据类型为整数,下限值必须小于或等于上限值,上下限的限值在S7-1200 V3.0及其以前为Int范围(-32768~+32767),在S7-1200 V4.0及其以后前为DInt范围(-2147483648 ~+21474836487),可以使用局部常量或全局常量定义上下限值,数组的元素个数受DB块剩余空间大小以及单个元素大小的限制;

从S7-1200 V2.0开始,下标可以不仅仅是常数、常量,也可以是变量,还可以是混合使用(多维数组),如果编程语言是SCL的话,下标还可以是表达式。使用数组的变量下标,可以在程序中很容易地实现间接寻址。注意,下标变量必须是符号名,不能是DB1.DBW0这种没有对应符号名的绝对地址。

从S7-1200 V4.2开始,FC的Input/Output/InOut以及FB的InOut可以定义形如Array[*]这种变长数组,要求必须是优化FC/FB块,在调用FC/FB的实参中可以填写任意数据类型相同的数组变量;当然,也可以多维变长的数组,例如Array[*,*]of Int。

数组可以使用单个数组元素例如"DB1".Static_1[1],也可以使用整个数组例如"DB1".Static_1。多维数组可以降维使用,例如三维数组:3D[0..2,0..3,0..4]of Int是一个3×4×5大小的Int数组,3D[0]是一个4×5大小的二维Int数组,3D[0,1]是一个5个元素的一维Int数组,当然多维数组下标也可以换成变量,例如3D[Tag_1,1]这种;

S7-1200 V4.2开始,多重背景支持数组形式,即Array of FB,这样可以在FB中使用循环指令更方便的编写程序。不支持Array[*] of FB。

注:在TIA 博途 V10.5 SP2,S7-1200 V1.0的时候,曾经引入FieldRead 和 FieldWrite 指令,用于数组下标的变址寻址,这种方法在TIA 博途 V11之后可以由下标变量完全取代,并且更为简化,所以该指令也只是位于“移动操作>原有”中,用于早期版本向上移植时使用,它的使用方法参见FieldRead 和 FieldWrite 间接寻址

S7-1200 数组的基本使用

1. DB中创建

数据

图1 Array在DB中的创建

2. FC的InOut中创建

数据

图2 Array在FC形参中的创建

3. 数组作为实参

数据

图3 Array作为FC的实参

4. FC程序中使用数组元素,使用形参

数据

图4 FC程序中使用形参

5. FC程序中使用数组元素,下标为变址寻址,使用形参

实现以下功能,将0-7这8个数,送入数组下标为0-7的8个元素,如图5-7所示。

数据

图5 FC形参设置

数据

图6 程序详情

SCL的版本如图7所示。

数据

图7 SCL版本的程序

6. 在程序中直接使用数组元素

数据

图8 程序中直接使用数组元素

7. 在程序中直接使用数组元素,下标为变址寻址

实现以下功能,将0-7这8个数,送入数组下标为0-7的8个元素,如图9-11所示。

数据

图9 DB1的定义

数据

图10 程序详情

SCL的版本如图11所示。

数据

图11 SCL版本程序

Array[*]使用

实现以下功能,使用FC的Input定义数组Array[*] of Int,求变长数组元素的总和

1. 使用Array[*] ,必须使用如图12所示的指令,计算数组元素的上下限,从而得出元素个数:

数据

图12 指令位置

2. 定义变量,如图13所示。赋初始值,计算上下限,如图14所示。

数据

图13 定义形参

数据

图14 计算上下限

(1)输入Array[*]类型的变量

(2)所求上下限的维数,从1开始,例如一维数组只能是1,二维数组可以是1也可以是2

(3)该维数下的下限/上限,DINT类型

3. 求和,如图15所示

数据

图15 求和的程序

4. SCL的版本如图16所示

数据

图16 SCL版本程序

5. OB1中调用实参为不同数组元素个数的数组,如图17所示。

数据

图17 OB1调用程序

Array of FB的使用

实现:FB3多次调用FB4,在FB3内部循环调用,减少程序量。

FB4的两个Input:Start,Stop,一个InOut:Run,建立Array[0..7] of FB4。同时建立变量 Array[0..7] of Struct,作为对应FB4的输入和输出,如图17所示。

数据

图17 程序详情

关闭

系统数据类型(SDT)

系统数据类型由系统提供具有预定义的结构,结构由固定数目的具有各种数据类型的元素构成,不能更改该结构。系统数据类型只能用于特定指令。
可以在DB块、OB/FC/FB接口区使用。

表1 常见系统数据类型

系统数据类型 长度字节 说明
IEC_TIMER 16 定时器结构。
此数据类型可用于“TP”、“TOF”、“TON”、“TONR”、“RT”和“PT”指令。
IEC_SCOUNTER 3 计数值为 SINT 数据类型的计数器结构。
此数据类型用于“CTU”、“CTD”和“CTUD”指令。
IEC_USCOUNTER 3 计数值为 USINT 数据类型的计数器结构。
此数据类型用于“CTU”、“CTD”和“CTUD”指令。
IEC_COUNTER 6 计数值为 INT 数据类型的计数器结构。
此数据类型用于“CTU”、“CTD”和“CTUD”指令。
IEC_UCOUNTER 6 计数值为 UINT 数据类型的计数器结构。
此数据类型用于“CTU”、“CTD”和“CTUD”指令。
IEC_DCOUNTER 12 计数值为 DINT 数据类型的计数器结构。
此数据类型用于“CTU”、“CTD”和“CTUD”指令。
IEC_UDCOUNTER 12 计数值为 UDINT 数据类型的计数器结构。
此数据类型用于“CTU”、“CTD”和“CTUD”指令。
ERROR_STRUCT 28 编程错误信息或 I/O 访问错误信息的结构。
此数据类型用于“GET_ERROR”指令。
CREF 8 数据类型 ERROR_STRUCT 的组成,在其中保存有关块地址的信息。
NREF 8 数据类型 ERROR_STRUCT 的组成,在其中保存有关操作数的信息。
VREF 12 用于存储 VARIANT 指针。
此数据类型用在运动控制工艺对象块中。
CONDITIONS 52 用户自定义的数据结构,定义数据接收的开始和结束条件。
此数据类型用于“RCV_CFG”指令。
TADDR_Param 8 指定用来存储通过 UDP 实现开放用户通信的连接说明的数据块结构。
此数据类型用于“TUSEND”和“TURCV”指令。
TCON_Param 64 指定用来存储那些通过工业以太网实现开放用户通信的连接说明的数据块结构。
此数据类型用于“TSEND”和“TRCV”指令。
HSC_Period 12 使用扩展的高速计数器,指定时间段测量的数据块结构。
此数据类型用于“CTRL_HSC_EXT”指令。

表1中的部分数据类型还可以在新建DB块时,直接创建系统数据类型的DB,如图1所示。通过这种方法建立出的DB块可以配合DB_ANY类型使用,参见链接1、 链接2。

此外通过以下方式也可以实现建立系统数据类型DB

1. 定时器计数器自动生成的背景DB

2. 计数器自动生成的背景DB

3. 开放式用户通信程序建立的基于TCON_IP_V4(无法通过添加新块的方式创建)、TADDR_Param、TCON_Param的DB块

根据SDT定义DB块

数据

图1 建立SDT类型的DB

硬件数据类型

硬件数据类型:硬件数据类型由 CPU 提供。 可用硬件数据类型的数目取决于 CPU。

根据硬件配置中设置的模块存储特定硬件数据类型的常量。 在用户程序中插入用于控制或激活已组态模块的指令时,可将这些可用常量用作参数。

数据类型 基本数据类型 说明
REMOTE ANY 用于S7通信PUT/GET指令中指定远程CPU的数据地址,必须以P#指针的形式作为实参
例如P#DB1.DBX0.0 BYTE 10
HW_ANY UINT 任何硬件组件(如模块)的标识。
HW_DEVICE HW_ANY DP 从站/PROFINET IO 设备的标识
例如:在ModuleStates指令中使用
HW_DPSLAVE HW_DEVICE DP 从站的标识
例如:在ModuleStates、DPNRM_DG指令中使用
HW_IO HW_ANY CPU 或接口的标识号,该编号在 CPU 或硬件配置接口的属性中自动分配和存储
例如:在LED、DPRD_DAT、RDREC指令中使用
HW_IOSYSTEM HW_ANY PN/IO 系统或 DP 主站系统的标识
例如:在DeviceStates指令中使用
HW_SUBMODULE HW_IO 重要硬件组件的标识
例如:在GETIO指令中使用
HW_INTERFACE HW_SUBMODULE 接口组件的标识
HW_IEPORT HW_SUBMODULE 端口的标识 (PN/IO)
HW_HSC HW_SUBMODULE 高速计数器的标识
例如:在CTRL_HSC、CTRL_HSC_EXT指令中使用
HW_PWM HW_SUBMODULE 脉冲宽度调制标识
例如:在CTRL_PWM指令中使用
HW_PTO HW_SUBMODULE 脉冲发生器标识
例如:在CTRL_PTO指令中使用
AOM_IDENT DWORD AS 运行系统中对象的标识
EVENT_ANY AOM_IDENT 用于标识任意事件
EVENT_ATT EVENT_ANY 用于指定动态分配给硬件中断 OB 的事件
例如,在ATTACH、DETACH指令中使用
EVENT_HWINT EVENT_ATT 用于指定硬件中断事件
OB_ANY INT 用于指定任意组织块
例如,在时间错误OB启动信息中出现
OB_DELAY OB_ANY 指定调用的延时中断OB
例如,用于SRT_DINT、CAN_DINT、QRY_DINT指令
OB_TOD OB_ANY 指定调用的时间中断OB
例如,用于SET_TINT、CAN_TINT、ACT_TINT、QRY_TINT指令
OB_CYCLIC OB_ANY 指定调用的循环中断OB
例如,用于SET_CINT、QRY_CINT指令
OB_ATT OB_ANY 用于指定动态分配给事件的硬件中断OB
例如,用于ATTACH、DETACH指令
OB_PCYCLE OB_ANY 用于指定循环OB事件类别事件的组织块
OB_HWINT OB_ATT 用于指定发生硬件中断时调用的组织块
OB_DIAG OB_ANY 用于指定发生诊断中断时调用的组织块
OB_TIMEERROR OB_ANY 用于指定发生时间错误时调用的组织块
OB_STARTUP OB_ANY 用于指定发生启动事件时调用的组织块
PORT HW_SUBMODULE 用于指定通信端口
例如,用于自由口、Modbus RTU指令
RTM UINT 用于指定运行小时计数器值
例如,用于RTM指令
CONN_ANY WORD 用于指定任意连接。
CONN_OUC CONN_ANY 用于指定通过工业以太网进行开放式通信的连接
例如,用于TCON、TSEND_C指令
DB_WWW DB_ANY 通过自定义 Web 应用生成的 DB 号该数据类型在Temp区域中的长度为 0
例如,用于WWW指令
DB_DYN DB_ANY 用户程序生成的DB编号
例如,用于CREAT_DB指令

        责任编辑:彭菁

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分