最近由于需要对西门子PLC进行字符串类型数据的读写,才专门了解了一下西门子PLC字符串类型的数据的使用及存储形式。在PLC中:
一、String数据类型包含总字符数和当前字符数。 String 类型提供了多达 256个字节,用于在字符串中存储最大总字符数(1 个字节)、当前字符数(1个字节)以及最多 254 个字节。 String 数据类型中的每个字节都可以是从 16#00 到16#FF 的任意值。
由此在PLC中定义一个String类型变量(以地址DB1.00为例)
注:PLC中对变量取消DB块优化选项可看到对应的地址偏移量
- 定义了string类型变量a,默认最大长度254,赋初始值为“A”
总字符数 | 当前字符数 | 字符1 | 字符2 | 字符3 | …….. | 字符254 |
254 16#FE | 1 16#01 | ‘A’16#41 | …….. | |||
字节0 | 字节1 | 字节2 | 字节3 | 字节4 | …….. | 字节255 |
2. 定义了string类型变量a[10],默认最大长度10,赋初始值为“A”
总字符数 | 当前字符数 | 字符1 | 字符2 | 字符3 | …….. | 字符10 |
10 16#0A | 1 16#01 | ‘A’16#41 | …….. | |||
字节0 | 字节1 | 字节2 | 字节3 | 字节4 | …….. | 字节11 |
所以,对PLC中字符串变量进行读写操作时,前两个字节(关于长度)就显得尤为重要,实际上写入字符串类型的数据就是通过向相应地址写入字节数组。
比如入向a[10]中写入“”ABC“”就是向DB0.00开始写入
0x0A,0x04,0x41,0x42,0x43(其中41,42,43对应的是ABC的ASCII码)
这样a[10]中,监视值显示为‘ABC’
总字符数 | 当前字符数 | 字符1 | 字符2 | 字符3 | …….. | 字符10 |
10 16#0A | 3 16#03 | ‘A’16#41 | ‘B’16#42 | ‘C’16#43 | …….. | |
字节0 | 字节1 | 字节2 | 字节3 | 字节4 | …….. | 字节11 |
读的时候,就从字节2开始将3个字节长度再转码就得到实际的字符串值了。
以上是对字符串string类型的读写操作。
二、
在PLC中还有一种 宽字符串类型:WString 数据类型支持单字(双字节)值的较长字符串。
第一个字包含最大总字符数;下一个字包含总字符数,接下来的字符串可包含多达 65534个字。 WString 数据类型中的每个字都可以是从 16#0000 到16#FFFF 的任意值。
与String类型形式相似,不过要注意这里是一个字符占一个字的存储空间(即两个字节)这里的A对应的就是16#0041
那么中文字符也是一个字符占一个字存储,比如“你”的Unicode编码16#4F60对应的写进去,注意前两个字(即4个字节是长度信息)也要对应正确,PLC中的监视值才会显示中文字符‘你’。
a[10],数据类型选择Wstring
总字符数 | 当前字符数 | 字符1 | 字符2 | 字符3 | …….. | 字符10 |
10 16#000A | 3 16#0003 | ‘你’16#4F60 | ‘好’16#597D | ‘吗’16#5417 | …….. | |
字0 | 字1 | 字2 | 字3 | 字4 | …….. | 字11 |