IEC61131-3直接表示变量:数据宽度和数据类型

IEC61131-3 directly represented variables: data width and datatype

IEC61131-3 语言中的直接表示变量 (DRV) 在其 "addresses" 中包含一个数据宽度说明符:X 表示 1 位,B 表示字节,W for word,D for dword,等等

此外,当声明 DRV 时,IEC 数据类型被指定为任何变量(BYTE、WORD、INT、REAL...)。

我不确定这些事情之间有何关联。它们是否正交?可以用 W (字节)地址定义一个 REAL 变量吗?预期结果是什么?

一本书说:

Assigning a data type to a flag or I/O address enables the programming system to check whether the variable is being accessed correctly. For example, a variable declared by AT %QD3 : DINT; cannot be inadvertently accessed with UINT or REAL.

这并没有让我更清楚。以这个片段为例(回想一下 W 表示 Word,即 16 位 - DINTREAL 都对应于 32 位)

 X AT %MW3 : DINT;
 Y AT %MD4.1 : DINT;
 Z AT %MD4.1 : REAL; 

第一行将 32 位 IEC var 映射到 16 位位置。这是合法的吗? write/read 等同于 "cast" 还是什么?

其他行声明了两个指向同一地址的不同类型的 32 位 IEC 变量(我想这应该是合法的)。阅读或写作时的预期结果是什么?

不幸的是,就像 PLC 世界中的所有事物一样,它都是特定于供应商和型号的。

西门子编译器不允许你像MD4.1那样用位元来声明实地址,它只允许MD4,数据长度必须是双字,不允许MB4。

阅读不等同于演员。例如,您将 MW2 声明为整数并在那里复制一些值。 PLC 将整数存储为,可以说是二进制补码格式。稍后在程序中,您将 MD2 读取为真实的。 PLC 不会尝试将整数转换为实数,它只是盲目地读取字节并将其视为实数,而不管在那里保存了什么或在那里声明了什么。没有自动铸造。

这就是西门子 S7 的工作原理 plc-s。但是你必须非常小心,因为每个供应商都有自己的方式。