说说西门子200smart modbus自由口通讯的那些事16
前天,与一个“坛友”聊自由口通讯的那些问题,当聊到一个通讯项目中一个正常的发送、接收轮询进程时,需要插入一个外部中断(目的是优先执行这一串定义好了的发送数据指令),这个功能使那位坛友陷入了通讯的“迷茫”。我在聊这个通讯过程中,大致了解到这个外部中断优先于正常的自由口通讯轮询的工作机制,相当于控制系统中的急停按钮(或许这个比喻的不十分恰当),但我理解是这么个意思。当需要执行外部中断(发送数据指令时)断开发送或者接收通讯指令,优先执行外部中断连接的发送数据指令,在QQ聊天中回复了一个简单的思路,就是需要调用中断分离指令,不知道经过这几天的时间那位“坛友”把这个问题处理了没有。
今天先来说说中断分离指令(DTCH),理解这个指令还是比较容易的,打开F1帮助也有比较详细的说明。由于忘记带通讯电缆,无法进行实际的自由口通讯演示,我就这个中断分离指令的应用做一个简单的演示。
假设,先定义一个定时中断,在定时中断子程序中编辑INC_DW(中断次数的累加),同时,再定义外部输入I0.0上升沿中断,当启用外部I0.0上升沿中断时,停止定时中断(即中断分离定时中断),当外部中断执行完毕后,为方便中断分离的理解,定时中断的启用沿用手动启用的方式,便于观察指令执行的过程概念。
编程思路:
1) 首先定义2个中断,定时中断及外部I0.0的上升沿中断,定时中断采用SMB34所对应的中断事件号10,I0.0上升沿中断所对应的中断事件号0。
2) 当需要人工启用I0.0的上升沿中断时,启用中断分离指令(DTCH),停止定时中断,启用外部I0.0的上升沿中断
3) 假设,上升沿中断执行完毕,手动启用一个标志位M0.0,重新启用初始化中断的操作
程序步骤:
1) 定义一个中断初始化子程序在主程序中调用
2) 在定时中断子程序中编辑定时中断的次数累加,并存放到数据区VD100
3) 在外部I0.0的上升沿中断子程序中编辑中断次数的累加,并存放到数据区VD104,当人工需要执行外部I0.0的上升沿中断时,分离定时中断事件号10,停止执行定时中断而改为执行外部中断
4) 当外部I0.0上升沿中断子程序执行完毕,人工启用M0.0,返回到定时中断的执行中
程序:假设设置定时中断周期100mS
定义中断:

在主程序中调用:

在定时中断子程序中编辑定时中断次数累加程序:

在外部I0.0上升沿中断子程序中编辑中断次数及分离定时中断,图示:

为方便观察控制程序的运行,打开“状态图表”,输入VD100(定时中断次数);VD104外部I0.0上升沿中断次数,并在主程序中添加人工手动启用定时中断及外部I0.0的上升沿中断,图示:执行第二次外部I0.0的上升沿中断时

程序运行的结果功能满足中断分离及重新调用的需要,虽然看似与通讯中断没有关联,但停止中断的调用是可以借鉴了的,望那位“坛友”看到此贴能够得到一些帮助和启发,其中,你需要启用发送、接收中断的分离,待外部I0.0上升沿中断结束后,再重新启用这2个通讯中断,原则上就是把M0.0的标志位改为SM4.5(prot0口)、SM4.6(prot1口)替代,人工重新启用一般在通讯项目中不被常用,目的也是为了快速进入正常的通讯轮询,另外,你还需要考虑由于外部I0.0上升沿执行时被终止了的发送、接收指令,如何再次发送、接收数据的关联。