用STEP 7-Micro/WIN编程(CPU226)的时候发现两个问题:
1. 我编写的代码,进行某种操作后代码可能会自动重新改掉。比如:
LDW< VW100, 0
MOVW 2, VW102
MOVW 4, VW104
NOT
MOVW 22, VW102
MOVW 44, VW104
程序会被自动修改为:
LDW< VW100, 0
LPS
MOVW 2, VW102
MOVW 4, VW104
NOT
MOVW 22, VW102
LPP
NOT
MOVW 44, VW104
貌似每个NOT后的连续代码都会被自动展开为单条带NOT语句s,逻辑上是一致的。但语句一多,好多堆栈+NOT夹在代码中间,看的眼花。。。
我的问题是,这个是如何造成的,是Micro/WIN的一个功能吗?我可以在哪边设置转换或者不转换。
2.某些CALL指令返回的第一条未能执行
比如:
LDB= VW100, 1
MOVW 2, VW102
CALL SSS
MOVW SSS_V, AQW0
CRET
正常情况下,CALL返回后的MOVW SSS_V, AIW0是会被执行到的,但某些情况下这句话貌似无效果:
- 某些情况指:我所有代码中就一个地方这么用不行,这个地方的调用顺序是MAIN->SSS->AAA->BBB,正好CALL SSS的返回是从BBB的CRET到AAA的CRET出来。
- 无效果指:我在模拟器上无效果,我还没有上机直接试
我研究了半天发现,只要在CALL SSS和MOVWSS_V, AIW0之间插入一句指令,这个AIW0输出就有效了。比如:
CALL SSS
NOP 1
//或者用MOVW SSS_V, AQW0,
//再或者用XORW VW999, VW999
MOVW SSS_V, AQW0
随便弄一句,模拟器上AQW0就会有输出。
我的问题是:这是什么原因造成的呢?
BTW:虽然就一个地方有问题,但我现在每个CALL返回后都只能来一句NOP 1。在没弄清楚这个问题之前,我现在只能这样来确保程序没问题。。。
暂时就这2个问题,谢谢各位了
问题补充:
说明文字中的两个AIW0应该为AQW0
最佳答案
1、第一个问题,是因为你在STL下写,转成了LAD,再转回STL所致。STL可以写得很干净,但LAD转过来的,就啰嗦了。
2、第二个问题不存在。如果后call被执行,后面的mov一定执行,没有例外。
提问者对于答案的评价:
应该是这样的
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc348801.html