提出问题:
平时在写PLC程序的时候,随便定义一个常开常闭触点,都要定义一个变量去驱动它,而所有变量通常都要分配地址。现在问题来了,西门子PLC的变量地址应该怎么写?不同类型的变量所占存储空间不一样,地址的写法也不一样。
问:常用的数据类型有哪些?它们分别占多大的存储空间?
答:
bool布尔型:占1个bit位
Byte字节型:占1个byte字节 = 8个bit位
Int整型:占1个Word字 = 2个Byte字节 = 16个bit位
Real浮点型:占1个DW双字 = 2个Word字 = 4个Byte字节 = 32个bit位
问:常见的变量地址的写法有什么含义?
答:从地址的写法,可以看出其在存储区的起始位即其所占的空间大小,比如,以下为以M存储区为例的解释:
I0.2:表示存储在I存储区,从第0个字节的第2个位开始,占1个bit位的变量
QB3:表示存储在Q存储区,从第3个字节开始,占1个Byte字节的变量
MW4:表示存储在M存储区,从第4个字节开始,占1个Word字的变量
MD8:表示存储在M存储区,从第8个字节开始,占1个DWord双字的变量
所以,
详细讲解见下视频:
无论是输入存储区(I0.0开始)、还是输出存储区(Q0.0开始)、还是辅助存储区(M0.0开始),都可以存以上不同类型的数据。下表以M存储区为例,介绍存储区地址的写法。
思考:变量的地址在分配时有什么注意事项?地址是否会重复,冲突?
答:会,举个例子
如果我有一个bool型变量(占1个bit),给它分配了M1.0这个地址,意味着MB1、MW0和MD0都不能再用了;
如果我有一个int型变量(占1个Word),给它分配了MW2这个地址,意味着M2.0~M3.7、MB2~MB3、MD0都不能再用了;
如果我有一个real型变量(占1个DWord),给它分配了MD4这个地址,意味着M4.0~M7.7、MB4~MB7、MW4~MW6都不能再用了;
基本数据类型
基本数据类型:包括位、位序列、整数、浮点数、日期时间。此外字符也属于基本数据类型。
1.位和位序列
2.整数数据类型
此处注意位序列和无符号整数类型的区别:
3.浮点型实数数据类型
实(或浮点)数以 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应用案例
单独使用组成该Struct的元素时,和普通的变量没有区别,只是每出现一个Struct的嵌套层级,变量名增加一个前缀,如图1-2所示。

图1 Struct的定义

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

图3 原始结构

图4 增加了Struct类型的结构
图4和图3功能明显相同,但图4相对图3,分类更加清晰。
通讯程序中,通常可以把需要发送的数据放在一个Struct中,即看做一个整体,这样在发送区只需填写一个变量即可,如图5所示。

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

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

图7 Struct的传送