S7 200 SMART MODBUS指令使能问题

昨天在试验的时候发现个奇怪的问题,官网上的%ignore_a_1% RTU 例程我把M0.1使能放在初始化指令之后程序就无法正常运行,放在初始化指令之后就正常,这是怎么一回事?按道理M0.0置位后才出发M0.1,那我把这段程序放在初始化指令之后也应该是对的逻辑啊?

问题补充:
有点想不通,系统手册V2.4  的“7.1.6 正跳变和负跳变检测”里是这样说明:因为正跳变和负跳变指令需要断开到接通或接通到断开转换,所以无法在首次扫描时检测上升沿或下降沿跳变。 首次扫描期间, CPU 会将初始输入状态保存在存储器位中。在后续扫描中,这些指令会将当前状态与存储器位的状态进行比较以检测是否发生转换。

也就说:开机运行的第一个扫描周期内是上升沿和下降沿是无法触发任何指令的,那初始化指令第一个周期内LD M0.0 N SET M0.1是无效的,但是MBUS_CTRL有效,虽然置位了M0.0,但是把M0.0的初始状态保存到了存储器,那到了第二个扫描周期,把M0.0现在的状态跟存储器里存的M0.0初始化状态比较,触发上升沿,那LD M0.0 N SET M0.1这段不管放在哪只要放在MBUS_MSG指令之前都生效啊。因为第二个扫描周期到了嘛

图片说明:

S7 200 SMART MODBUS指令使能问题    S7 200 SMART MODBUS指令使能问题   

最佳答案

这其实是扫描周期的问题:
先从你画错误的那个说起,为啥不行?第一个扫描周期:程序段1,不说了就是初始化复位和赋值,M0.0被初始化为0,程序段2,MODBUS RTU初始化,这时M0.0为1,继续往下走,程序段3,M0.0为1,上升沿,但是因为是第一个扫描周期所以沿指令无效,这时就不会执行往后的置位指令(m0.5),所以不会轮训,程序继续往下走直至第一个扫描周期结束,没有执行M0.5置位。
第二个扫描周期,程序段1不执行,程序段2已经初始化完成,程序段3 m0.0还是为1,但是上一个周期也为1,所以不执行。。。完后的循环都和第二次一样,一直不会执行轮训程序。
第二个图:第一个扫描周期:程序段1,和第一个图一样,;程序段2,这时M0.0的状态就是0,没有上升沿;程序段3MODBUS RTU初始化,这时M0.0为1,继续往下走,程序段4,这时候M0.5还是没有置1,因为第一个周期,程序段2还没有执行程序,所以不会执行轮训。
第二个周期:程序段1不执行,程序段2这时候再去读取上一个周期的值M0.0就是1了,所以会执行置位M0.5的程序;程序段3已经初始化完成,程序段4,这时候就开始轮训了
如果想放任意位置的话,可以在M0.0前面添加一个SM0.1的常闭触点,这样就可以保证这个程序可以放在这两个位置中的任何一个。

提问者对于答案的评价:
非常感谢,等了几天了总算把你盼来了,您解释的非常详细,让我明白了我的不足,学习了,看来我的逻辑还要加强!

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc287824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年10月30日 下午11:47
下一篇 2020年10月30日 下午11:47

相关推荐