我的问题与找答案中“自由口通讯RCV指令不结束?”的问题基本一样,这个问题的答案是通过复位sm86.7和执行RCV指令可以结束RCV指令,但没有说明是在哪里执行这两段代码?是在接收结束中断子程序还是在主程序?另外,我还想知道在smb87中设置了超时及其smw92中设置了超时时间后,在接收超时之后,是否进入接收结束中断。我在接收结束中断子程序中运用了复位sm86.7和执行了RCV指令,但没有效果。所以才想要知道究竟在哪里执行这两条指令才能结束RCV指令,实现接收超时退出RCV?
需要说明的是,不希望通过在发送结束中断程序中启动定时中断的方式来判断接收超时,如果这样的话,我认为没有利用smb87本身所具有的这项功能。
问题补充:
针对yanxiao的回答3,由于超时没有产生接收结束中断,所以认为说使用RCV结束没有效果
针对回答4:通过设置smb87=16#BC和smw92=200,我认为已经符合自动结束条件,却没有触发接收结束中断
最佳答案
捣鼓了半天,版主在我之前回复了,那我省略一部分,补充个例子。
一般执行XMT后,在发送完成中断里执行RCV,同时启动定时中断或者启动定时器或者执行开始间隔时间BITIM,计时时间到复位使能位SM87.7/SM187.7,同时执行RCV,这样结束RCV
指令,说说两种常用的方法:
1 发送完成中断里执行RCV并连接定时中断,定时中断里执行如下程序:
LD SM0.0
R SM87.7, 1
RCV VB0, 0
S SM87.7, 1
LD SM0.0
DTCH 10
LD SM0.0
XMT VB100, 0
2 发送完成中断里执行RCV并执行BITIM指令,主程序里执行结束RCV程序
发送完成中断:
LD SM0.0
RCV VB0, 0
S M0.0, 1
BITIM VD200
主程序:
LD M0.0
CITIM VD200, AC0
AW>= AC0, 550 //大于550毫秒
R SM87.7, 1
RCV VB0, 0
S SM87.7, 1
R M0.0, 1
用定时器也可以,方法和上面的差不多。
针对yanxiao的回答3,由于超时没有产生接收结束中断,所以认为说使用RCV结束没有效果
针对回答4:通过设置smb87=16#BC和smw92=200,我认为已经符合自动结束条件,却没有触发接收结束中断
答:只要符合自动结束条件(用指令显式结束RCV除外),都会触发接收结束中断,超时也不例外。
提问者对于答案的评价:
经过测试,终于弄明白符合自动结束条件,在这里指的是超时自动触发接收结束中断的关键,其实是smw92=0,smb87的il和c/m以及tmr必须置位,缺一不可。
专家置评
已阅,最佳答案正确。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc298335.html