西门子字符串存储格式

  如果要做上位机开发需要解析西门子的字符串,那么就需要他的存储方式,所以特地研究了一下。

  在C语言中,定义一个字符串如下:

char str[8] = "hello";

  那么在内存的存储方式如下:

 

 

   从上图可以看出,前面5个字节存储的是字符的ASCII码的值,最后会以null也就是16进制的0结束。如果字符串只有5个字符,那么就至少需要6个字节的空间。如果要计算字符串的长度那么可以查询数组,直到有字节的值为0,则认为字符串结束,这样就可以计算字符串长度。

  在西门子S7-1200/1500中,字符串的存储格式如下(数据块没有勾选“优化的块访问”):

 

  在上图中定义了字符串长度为6的字符串变量,表示最多可以容纳6个字符,实际占用8个字节的内存,第一个字节为定义字符串的长度,第二个字节为实际的字符串长度,上面的字符串长度为5,那第二个字节的数据就为5,后面的Byte3~Byte7为存储的字符串,由于实际字符数量只有5个,那么Byte8一般为初始值0,如果没有使用“优化的块访问”,定义的字符串长度为5,那么实际占用的空间也是8个字节,西门子的存储应该是按16位对齐的。

 

 

 

  如果定义了一个不带字符串长度的变量,如下图:

 

   上图的变量可以理解数据类型为String[254],最多可以容纳长度为254的字符串,占用256个字节的空间。上图的变量Byte1=0xFE,Byte2=0x05(实际字符串长度),Byte3~Byte7为存储的字符串,后面的Byte8~Byte256也会被占用,一般为0x00。所以,西门子定义字符串变量一般会根据需要定义特定长度的的字符串变量,不定义字符串长度,则默认占用256字节空间,太浪费空间!

 

posted @ 2022-10-10 16:26  修行的蜗牛  阅读(1147)  评论(0编辑  收藏  举报