最近由于需要对西门子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 |
以下是基于HSL库做的一个字符串类型数据读写测试小工具,其中Wstring读写可进行中英文字符串的读写
https://download.csdn.net/download/swmyaopeng/11143873