关于s7300 空字符串问题

分享到:
323
下一篇 >

菜鸟:

我用scl 编写了个简单fb,当输入为true时,输出为'abc',输入为false时,输出为' '。

编译仿真后发现,当输出从true变为false时,字符串第2位从之前的3变为0,而后面的每个字符位还是'a' 'b' 'c'。

很奇怪,我还以为后面每一位都为空。我再一看scl编译后的stl,也确实是只是

l w#16#a00

t diw[ar2,p#2.0]

是不是只要第2位的数为0时,西门子就认为该字符串为空。

如果该变量在wincc显示的话,就算后面字符位都不为空,而字符串第2位的数为0,显示也是空。

刚才用wincc和plcsim仿真了一下,确实就算后面字符位都不为空,而字符串第2位的数为0,显示也是空

大虾:

这得从PLC对字符串的识别来说起,西门子规定,字符串(STRING)类型全长为N+2个字节,N为实际字符长度,其中,字节0为允许*大长度值,这就是说,实际字符串的长度如果超过这个值,则非法。字节1为实际字符长度,PLC取数据时为提高效率(减少模糊性,因为字符串不定长,不太好判断字符串的边界),首先读取这两个数据,再按照这两个字节的数据取后面的字节,字节1为0,则表示该字符串为空,至于后面的字节是什么内容,谁知道?也无意义不是,全零或全1不得是一种数据状态,总之通过1字节知道他们无意义就好了。所以,你输出空字符串时,读写执行机制一旦检测到是“0”,就不会多此一举的去管后面的字节了。

菜鸟:刚才又试了一个输入为true时,输出为'abc',输入为false时,输出为'abcd'。

看来是这样的,plc关心字符串实际长度,实际长度以外的就不检查了。

前辈我问个问题,如果对一个db区内的10个数据排序为什么要内部循环9次外部却要10次呢

L #DB_NO

T %LW6

OPN DB [ %LW6] //打开数据块

L #LEN ////装载10到LW2中,因为有十个数据,要进行十次排序,9次也可以的

LL0: T %LW2

L P#0.0 ////装载地址指针

LAR1

L #LEN

+ -1

LL1: T %LW4 ////内部循环,进行9次,直到把*大值排到*后

L DBW [ AR1 , P#0.0 ]

L DBW [ AR1 , P#2.0 ]

JC LL2 ////比较前后两个值,如果前面大于后面的,则前后数据交换

L DBW [ AR1 , P#0.0 ]

T #m_temp

L DBW [ AR1 , P#2.0 ]

T DBW [ AR1 , P#0.0 ]

L #m_temp

T DBW [ AR1 , P#2.0 ]

LL2: +AR1 P#2.0 ////指针自动进行加2

L %LW4

LOOP LL1 ///这个指令自动的将A寄存器里的值减1

L %LW2

LOOP LL0

SET

SAVE

CLR

大虾:

应该是算法问题,每次都是一个*前面的数和后面的9个数比较,然后这样进行10次吧


你可能感兴趣: 工控菜鸟园 自动化系统 PLC 西门子
无觅相关文章插件,快速提升流量