本文摘于 西门子官网内容
一、位、位序列、整数、浮点数、日期时间
基本数据类型:包括位、位序列、整数、浮点数、日期时间。此外字符也属于基本数据类型,请参见文档 String 与 WString。
此外 BCD 码虽然不属于数据类型,但也是一种数字表示方式。
1.1 位和位序列
注意:虽然位序列有数值表示方式,但一般不直接用于数学运算。通常在控制字、状态字、错误代码、标志字、状态位集合等处使用位序列。而数学运算使用下面的整数数据类型与浮点数数据类型。
数据类型 | 位大小 | 数值类型 | 数值范围 | 常数示例 | 地址示例 |
---|---|---|---|---|---|
Bool | 1 | 布尔运算 | FALSE 或者 TRUE | TRUE |
|
二进制 | 2#0 或 2#1 | 2#0 | |||
无符号整数 | 0 或 1 | 1 | |||
八进制 | 8#0 或 8#1 | 8#1 | |||
十六进制 | 16#0 或 16#1 | 16#1 | |||
Byte | 8 | 二进制 | 2#0 到 2#1111_1111 | 2#1000_1001 |
|
无符号整数 | 0 到 255 | 15 | |||
有符号整数 | -128 到 127 | -63 | |||
八进制 | 8#0 到 8#377 | 8#17 | |||
十六进制 | B#16#0 到 B#16#FF / 16#0 到 16#FF | B#16#F、16#F | |||
Word | 16 | 二进制 | 2#0 到 2#1111_1111_1111_1111 | 2#1101_0010_1001_0110 |
|
无符号整数 | 0 到 65535 | 61680 | |||
有符号整数 | -32768 到 32767 | 72 | |||
八进制 | 8#0 到 8#177_777 | 8#170_362 | |||
十六进制 | W#16#0 到 W#16#FFFF / 16#0 到 16#FFFF | W#16#F1C0、16#A67B | |||
DWord | 32 | 二进制 | 2#0 到 2#1111_1111_1111_1111_1111_1111_1111_1111 | 2#1101_0100_1111_1110_1000_1100 |
|
无符号整数 | 0 到 4_294_967_295 | 15_793_935 | |||
有符号整数 | -2_147_483_648 到 2_147_483_647 | -400000 | |||
八进制 | 8#0 到 8#37_777_777_777 | 8#74_177_417 | |||
十六进制 | DW#16#0 到 DW#16#FFFF_FFFF / 16#0 到 16#FFFF_FFFF | DW#16#20_F30A、16#B_01F6 |
1.2 整数数据类型
数据类型 | 位大小 | 数值范围 | 常数示例 | 地址示例 |
---|---|---|---|---|
USInt | 8 | 0 到 255 | 78、2#01001110 |
|
SInt | 8 | -128 到 127 | +50、16#50 | |
UInt | 16 | 0 到 65535 | 65295、0 |
|
Int | 16 | -32768 到 32767 | 30000、+30000 | |
UDInt | 32 | 0 到 4_294_967_295 | 4042322160 |
|
DInt | 32 | -2_147_483_648 到 2_147_483_647 | -2131754992 |
1.3 浮点型实数数据类型
如 ANSI/IEEE 754-1985 标准所述,实(或浮点)数以 32 位单精度数 (Real) 或 64 位双精度数 (LReal) 表示。 单精度浮点数的精度最高为 6 位有效数字,
而双精度浮点数的精度最高为 15 位有效数字。在输入浮点常数时,最多可以指定 6 位 (Real) 或 15 位 (LReal) 有效数字来保持精度。
数据类型 | 位大小 | 数值范围 | 常数示例 | 地址示例 |
---|---|---|---|---|
Real | 32 | -3.402823e+38 到 -1.175495e-38、±0、+1.175 495e-38 到 +3.402823e+38 | 123.456、-3.4、1.0e-5 |
|
LReal | 64 | -1.7976931348623158e+308 到 -2.2250738585072014e-308、 ±0、 +2.2250738585072014e-308 到 +1.7976931348623158e+308 |
12345.123456789e40、1.2E+40 |
|
1.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 小时/天)、分钟和秒。 可以选择指定小数秒格式。
数据类型 | 位大小 | 范围 | 常数示例 |
---|---|---|---|
Time | 32 | T#-24d_20h_31m_23s_648ms 到 T#24d_20h_31m_23s_647ms 存储形式: -2,147,483,648 ms 到 +2,147,483,647 ms |
|
DATE | 16 | D#1990-1-1 到 D#2168-12-31 |
|
TOD/ |
32 | TOD#0:0:0.0 到 TOD#23:59:59.999 |
|
1.5 BCD 码
BCD 格式不能作为数据类型使用,但是以下转换指令支持 BCD 数字格式转换:
- BCD16_TO_INT
- INT_TO_BCD16
- BCD32_TO_DINT
- DINT_TO_BCD32
转换举例:16#100 >10#100,10#888777>16#888777
数据类型 | 位大小 | 范围 | 常数示例 |
---|---|---|---|
BCD16 | 16 | -999 到 999 | 123、-123 |
BCD32 | 32 | -9999999 到 9999999 | 1234567、-1234567 |
二、char和String
2.1 char 和 string 的定义:
1、数据类型为 char (Character) 的变量长度为 8 bit 位,占用1个 byte 的内存。char 数据类型将单个字符存储为 ASCII 编码形式。
通常是指计算机中使用的字母、数字和符号,包括:1、2、3、A、B、C、常见符号等。每个字符占用空间为1字节。
2、数据类型为 string 的操作数可存储多个字符,最多可包括 254 个字符。字符串中的第一个字节为总长度,第二个字节为有效字符数量。
字符串(string)在存储上类似字符的数组,所以它每一个元素都是可以提取的字符,如:"abcdefg"叫字符串,而其中的每个元素叫字符。
2.3 char 和 string 在西门子 PLC 中的格式
例如,在 PLC 中创建一个 DB 块,并将属性设置为标准 DB 块,在 DB1 块中创建如下的字符串和字符,并赋予起始值。如下图所示:
图.01
(1)string 数据类型的格式
下载到 PLC 中,通过监视表逐个查看每个字节中的值。如下图所示:
图.02
可以看出:
a.数据类型为 string 的字符串,通过查看 DB 块偏移地址可见该字符串占用256字节;查看字符串第一个字节,其最多存储字符总数量为254个。
b.数据类型为 string[10] 的字符串,通过查看 DB 块偏移地址可见该字符串占用12字节;查看字符串第一个字节,其最多存储字符数量为10个。
c.字符串的第一个字节为该字符串总长度,第二个字节为当前存储的有效字符数量。
(2)char 和16进制数的关系
在计算机领域,所有的数据都是以2进制数存储的,那么 char,16进制数和2进制数又有什么关系?
如下图所示:
图.03
可以看出:
a.通过字符 'A' 的16进制数和2进制数,可见字符(char)、16进制数只是在 PLC 中显示的形式不同,实际存储的是一个2进制值。
b.通过字符 '1' 和数值1(MB0的值)的16进制数和2进制数,可见字符 '1' 和数值1是两种不同数据。因此,实际使用是必须注意区别。
c.下图是 ASCII 字符(char):'0','1',……'E','F' 对应的2进制,10进制,16进制对应关系的截图。
图.04
更多的 ASCII 字符对应关系,请查看下面的链接。
ASCII 码表链接:ASCII
ASCII码表 0-127
Bin | Dec | Hex | 缩写/字符 | 解释 |
00000000 | 0 | 00 | NUL(null) | 空字符 |
00000001 | 1 | 01 | SOH(start of headling) | 标题开始 |
00000010 | 2 | 02 | STX (start of text) | 正文开始 |
00000011 | 3 | 03 | ETX (end of text) | 正文结束 |
00000100 | 4 | 04 | EOT (end of transmission) | 传输结束 |
00000101 | 5 | 05 | ENQ (enquiry) | 请求 |
00000110 | 6 | 06 | ACK (acknowledge) | 收到通知 |
00000111 | 7 | 07 | BEL (bell) | 响铃 |
00001000 | 8 | 08 | BS (backspace) | 退格 |
00001001 | 9 | 09 | HT (horizontal tab) | 水平制表符 |
00001010 | 10 | 0A | LF (NL line feed, new line) | 换行键 |
00001011 | 11 | 0B | VT (vertical tab) | 垂直制表符 |
00001100 | 12 | 0C | FF (NP form feed, new page) | 换页键 |
00001101 | 13 | 0D | CR (carriage return) | 回车键 |
00001110 | 14 | 0E | SO (shift out) | 不用切换 |
00001111 | 15 | 0F | SI (shift in) | 启用切换 |
00010000 | 16 | 10 | DLE (data link escape) | 数据链路转义 |
00010001 | 17 | 11 | DC1 (device control 1) | 设备控制1 |
00010010 | 18 | 12 | DC2 (device control 2) | 设备控制2 |
00010011 | 19 | 13 | DC3 (device control 3) | 设备控制3 |
00010100 | 20 | 14 | DC4 (device control 4) | 设备控制4 |
00010101 | 21 | 15 | NAK (negative acknowledge) | 拒绝接收 |
00010110 | 22 | 16 | SYN (synchronous idle) | 同步空闲 |
00010111 | 23 | 17 | ETB (end of trans. block) | 传输块结束 |
00011000 | 24 | 18 | CAN (cancel) | 取消 |
00011001 | 25 | 19 | EM (end of medium) | 介质中断 |
00011010 | 26 | 1A | SUB (substitute) | 替补 |
00011011 | 27 | 1B | ESC (escape) | 溢出 |
00011100 | 28 | 1C | FS (file separator) | 文件分割符 |
00011101 | 29 | 1D | GS (group separator) | 分组符 |
00011110 | 30 | 1E | RS (record separator) | 记录分离符 |
00011111 | 31 | 1F | US (unit separator) | 单元分隔符 |
00100000 | 32 | 20 | (space) | 空格 |
00100001 | 33 | 21 | ! | |
00100010 | 34 | 22 | " | |
00100011 | 35 | 23 | # | |
00100100 | 36 | 24 | $ | |
00100101 | 37 | 25 | % | |
00100110 | 38 | 26 | & | |
00100111 | 39 | 27 | ' | |
00101000 | 40 | 28 | ( | |
00101001 | 41 | 29 | ) | |
00101010 | 42 | 2A | * | |
00101011 | 43 | 2B | + | |
00101100 | 44 | 2C | , | |
00101101 | 45 | 2D | - | |
00101110 | 46 | 2E | . | |
00101111 | 47 | 2F | / | |
00110000 | 48 | 30 | 0 | |
00110001 | 49 | 31 | 1 | |
00110010 | 50 | 32 | 2 | |
00110011 | 51 | 33 | 3 | |
00110100 | 52 | 34 | 4 | |
00110101 | 53 | 35 | 5 | |
00110110 | 54 | 36 | 6 | |
00110111 | 55 | 37 | 7 | |
00111000 | 56 | 38 | 8 | |
00111001 | 57 | 39 | 9 | |
00111010 | 58 | 3A | : | |
00111011 | 59 | 3B | ; | |
00111100 | 60 | 3C | < | |
00111101 | 61 | 3D | = | |
00111110 | 62 | 3E | > | |
00111111 | 63 | 3F | ? | |
01000000 | 64 | 40 | @ | |
01000001 | 65 | 41 | A | |
01000010 | 66 | 42 | B | |
01000011 | 67 | 43 | C | |
01000100 | 68 | 44 | D | |
01000101 | 69 | 45 | E | |
01000110 | 70 | 46 | F | |
01000111 | 71 | 47 | G | |
01001000 | 72 | 48 | H | |
01001001 | 73 | 49 | I | |
01001010 | 74 | 4A | J | |
01001011 | 75 | 4B | K | |
01001100 | 76 | 4C | L | |
01001101 | 77 | 4D | M | |
01001110 | 78 | 4E | N | |
01001111 | 79 | 4F | O | |
01010000 | 80 | 50 | P | |
01010001 | 81 | 51 | Q | |
01010010 | 82 | 52 | R | |
01010011 | 83 | 53 | S | |
01010100 | 84 | 54 | T | |
01010101 | 85 | 55 | U | |
01010110 | 86 | 56 | V | |
01010111 | 87 | 57 | W | |
01011000 | 88 | 58 | X | |
01011001 | 89 | 59 | Y | |
01011010 | 90 | 5A | Z | |
01011011 | 91 | 5B | [ | |
01011100 | 92 | 5C | \ | |
01011101 | 93 | 5D | ] | |
01011110 | 94 | 5E | ^ | |
01011111 | 95 | 5F | _ | |
01100000 | 96 | 60 | ` | |
01100001 | 97 | 61 | a | |
01100010 | 98 | 62 | b | |
01100011 | 99 | 63 | c | |
01100100 | 100 | 64 | d | |
01100101 | 101 | 65 | e | |
01100110 | 102 | 66 | f | |
01100111 | 103 | 67 | g | |
01101000 | 104 | 68 | h | |
01101001 | 105 | 69 | i | |
01101010 | 106 | 6A | j | |
01101011 | 107 | 6B | k | |
01101100 | 108 | 6C | l | |
01101101 | 109 | 6D | m | |
01101110 | 110 | 6E | n | |
01101111 | 111 | 6F | o | |
01110000 | 112 | 70 | p | |
01110001 | 113 | 71 | q | |
01110010 | 114 | 72 | r | |
01110011 | 115 | 73 | s | |
01110100 | 116 | 74 | t | |
01110101 | 117 | 75 | u | |
01110110 | 118 | 76 | v | |
01110111 | 119 | 77 | w | |
01111000 | 120 | 78 | x | |
01111001 | 121 | 79 | y | |
01111010 | 122 | 7A | z | |
01111011 | 123 | 7B | { | |
01111100 | 124 | 7C | | | |
01111101 | 125 | 7D | } | |
01111110 | 126 | 7E | ~ | |
01111111 | 127 | 7F | DEL (delete) | 删除 |
2.3 使用 string 数据类型在 HMI 上显示汉字
例如,在某些不支持 WString 数据类型(关于 WString 参见:跳转链接)的 HMI 设备上显示汉字,也是可以使用 string 数据类型显示的。
但由于 string 数据类型中存储的汉字编码标准为 GBK 编码;因此,需要在 HMI 设备上选择相应的编码标准。
如下图所示,在 string 数据类型的起始值中定义汉字 '你好',且字符背景底色为浅黄色(编译时会有警告信息,这是TIA软件建议 string 数据类型中不使用汉字的友情提示),但不影响使用。
图.05
在线监控时发现汉字无法按 Unicode 编码方式正确显示,设置显示格式为16进制数,通过下图所示的字符编码对应关系,发现其对应的是 GBK 编码。如下图所示:
图.06
所以,在 HMI 设备上显示 string 数据类型中存储的汉字时,需要在 HMI 上设置对应的 GBK 编码方式,是可以显示汉字的。
关于16进制数和 GBK 编码对应关系,可以通过如下网址查询:GBK
2.4 常问问题:
1、HTA 和 ATH 指令的输入和输出使用限制?
通过 TIA 软件的在线帮助,查看指令功能说明:
指令 HTA 功能——输入范围为16进制数:16#0,1,……E,F,输出范围为由 ASCII 字符(char):'0','1',……'E','F' 组成的数组或字符串 。
指令 ATH 功能——输入范围为由 ASCII 字符(char):'0','1',……'E','F' 组成的数组或字符串,输出范围为16进制数:16#0,1,……E,F 。
注意:指令 ATH 和指令 HTA 的输入和输出都是受到限制的。
2、HTA 和 ATH 指令的作用?
在具体的应用中需要互相转换字符('0','1',……'E','F')和16进制数值(16#0,1,……E,F),那么HTA和ATH就为转换这两种类型的数据提供了方便。
以 HTA 指令为例,在 OB1 中调用 HTA 指令,实现如下要求的转换:
a.W#16#12AB需要转换为 ASCII 字符数组,使用 HTA 指令转换结果为 CHAR#['1','2','A','B']。
b.W#16#12AB需要转换为 ASCII 字符串,使用 HTA 指令转换结果为 '12AB' 。
如下图所示:
图.07
结果:使用 HTA 指令转换后,数据类型及占用字节空间发生了变化;同样的,使用 ATH 指令可以做反向转换,这里不再举例说明。
3、字符串存储的 'abcdef',通过赋值更新为了 'DCBA',为何查看字符存储单元时,字符 'e' 和 'f' 还能监视到?该如何处理?
简单测试程序,如下图所示:
图.08
当M0.0触发之后,再触发M0.2,结果如下图所示:
图.09
例子中,6字符的字符串更新为4字符的字符串,原字符串的后2个字符没有更新;倘若这10个字符的字符串需要通过串口或 TCP 通信完整(字符串总长12字节)的发送到通信伙伴,那么在字符串信息更新后的发送信息中将包含这两个不需要发送的字符。
结果:字符串更新时,仅更新有效字符数量的部分。
建议处理方法:更新字符串之前,先清空该字符串中所有字符。
4、如何输入特殊字符(如:回车,换行,$ 等)?
例如,需要输入的字符串为 '$ABCD$+回车+换行',可以参考如下表格:
图.10
根据表格说明,字符串在 PLC 中的书写格式:'$$ABCD$$$R$L' 或 '$$ABCD$$$N',如下图所示:
图.11
三、Wstring
3.1 wchar 和 wstring 的定义:
1、数据类型为 wchar(宽字符)的变量长度为 16 位,占用2个 byte 的内存。 wchar 数据类型将扩展字符集中的单个字符保存为 UFT-16 编码形式。
2、数据类型为 wstring (宽字符串)的操作数用于在一个字符串中存储多个数据类型为 wchar 的 Unicode 字符。如果未指定长度,则字符串的长度为预置的 254 个字。
Unicode 是国际标准字符集,可译为万国码或统一码等,包含中日韩越汉字和世界上绝大多数语言文字。
如需了解 Unicode 码,请查看下面链接:Unicode码
3.2 wchar 和 wstring 在西门子 PLC 中的格式
本节以汉字为例说明汉字在西门子 PLC 中的格式。
例如,在 PLC 中创建一个 DB 块,并将属性设置为标准 DB 块,在 DB1 块中创建如下的汉字字符串和汉字字符,并赋予起始值。如下图所示:
图.01
1、wstring 数据类型的格式
下载到 PLC 中,通过监视表逐个查看每个字中的值。如下图所示:
图.02
可以看出:
a.数据类型为 wstring 的汉字字符串,通过查看 DB 块偏移地址可见该字符串占用254字;查看字符串第一个字,其最多存储汉字字符总数量为254个。
b.数据类型为 wstring[10] 的汉字字符串,通过查看 DB 块偏移地址可见该字符串占用12字;查看字符串第一个字,其最多存储汉字字符数量为10个。
c.汉字字符串的第一个字为该字符串总长度,第二个字为当前存储的有效字符数量。
2、wchar 和16进制数的关系
在计算机领域,所有的数据都是以2进制数存储的,那么 wchar,16进制数和2进制数又有什么关系?
如下图所示:
图.03
可以看出:
a.通过汉字字符 '好' 的16进制数和2进制数,可见字符(wchar)、16进制数只是在PLC中显示的形式不同,实际存储的是一个2进制值。
通过下面的网页,可以查看汉字和16进制数的对应关系。
unicode 转中文,中文转 unicode,链接:Unicode码
b.通过汉字字符 '1' 的16进制数和2进制数,可见汉字字符(wchar)'1' 显示的16进制数为16#0031,而字符(char)'1' 对应的16进制数为16#31。因此,如果使用 wchar 存储仅占一个字节的 char 字符时,则高八位为16#00,低八位是相同的,都是2进制的2#0011_0001。
3.3 常问问题:
1、定义为 wstring 的字符串,是否能保存数字和英文字母的字符?
可以。
例如,wchar#'A',实际存储时,对应的16进制数为16#0041,wchar#'1',实际存储时,对应的16进制数为16#0031。
如下图所示:
图.04
也就是说,使用 wchar 存储仅占一个字节的英文字母或数字时,对应 wchar 的字的高八位将为16#00。
2、如何输入特殊字符(如:回车,换行,$ 等)?
例如,需要输入的汉字字符串为 '$早上好$+回车+换行',可以参考如下表格:
图.05
根据表格说明,字符串在 PLC 中的书写格式:'$$早上好$$$R$L'或'$$早上好$$$N',如下图所示:
图.06
标签:字符,存储,进制,16,浮点数,数据类型,PLC,字符串 From: https://www.cnblogs.com/yulia/p/18138202