热门搜索:
西门子6SL32202YD30-0UB0
上海朕锌电气设备有限公司
西门子销售部 cpu plc s7-200
s7-300 s7 400 s7 1200 s7 1500
mm440 mm430 mm420 g120 变频器 V90变频器
s7 288模块 伺服电机 触摸屏
6SL3210-1KE11-8AF2
这不,VW0 =32766,而非32767。嘿嘿嘿,PLC就像是“没有”脑子的忠实“奴仆”,任劳任怨工作它不会造假和偷懒的,数据就明明白白的放着呢。仔细想了想,其实PLC确确实实的严格按我刚才的思路,不折不扣的运行,它没有错,错是在我当时的理解和判断上。
重新整理一下思路,我打算这样来描述这个情况。当VW0小于32767时,数据是往上增的趋势在时刻运行。当数据增加到32767时,如果我不及时关闭INC_W整理,那么,再加1,就是负数了,16位数据高位是符号位是西门子数据的基本定义。不要转移数据往上加这个思路点,继续思考,当VW0 = 32767,那么M0.0 置位条件满足,置位M0.0 = 1。让程序继续运行到下一个周期吧,这时,由于M0.0 = 1,它触点的所有逻辑变反,这时,INC_W的加1指令已经无法满足加1指令的条件了,那么,减1指令是满足了是,所以,VW0 = 32767实际显示32766少1,是被DEC_W指令“偷偷”减掉的。这么理解这个DEC_W指令减的?
再看这个传送VW4和VW6的程序段,关闭往上加的程序,是VW0开始往下减的那个扫描周期,因为,我把这些程序写在网络2的下面,所以,关闭INC_W指令,需要开始往下减的开始同一个周期中,我是将置位指令写到INC_W指令的上面,来规避这个问题。这就是我理解的,所谓小问题,大文章,没有仔细推敲这个过程,或者直接就是先写置位程序,再写INC_W指令程序不一定能够遇到这样的问题,每个人编程的习惯各有差异,较终我们需要的程序必须,也一定能够满足当初的思路,这就是我们平时在说的工艺要求是一致的。
在我把这个验证过程写下来时,我又想到一个问题,我在编程时并没有给VW0等*过数据类型,+32767 ~ -32768是INT的数据类型,而不是word的数据类型。当我打开INC_W和DEC_W指令帮助时,发现了问题的初衷,在F1帮助中,INC_W/DEC_W指令的IN数据类型就定义了INT数据类型,我定义与不定义,调用指令时,系统已经“自动”给定的数据类型了,这个就是大家常说的“隐式”数据类型,是系统根据具体调用的指令自动生成的。