ENI是开中断指令。
一般常规编写程序的做法是先定义,定义通讯控制字节,定义通讯频率、定义通讯数据等, 开中断。
如果把ENI写在前面,从理论上是不符号西门子编程环境的,西门子的思想是先定义后使用的原则,符合欧洲人的思维逻辑。
程序大致含义是:
首先定义通讯(自由口通讯参数)
定义通讯数据,由M0.0上升沿触发发送指令,即把上面定义好的数据发送出去
当发送完成进入发送完成中断,执行接收并再次定义接收完成中断(实际上这个完全可以在初始化程序段中编辑),你的问题是重新定义接收完成中断后,仍然需要定义ENI指令一次。
当接收完成后进入接收完成中断,你重新又再次定义定时中断_0 = 20,(mS)这里同样没有再次定义ENI。
当定时中断激活后,会在20mS的间隔发送你 次定义好的数据。
我感觉你整体的程序架构不严谨,应该是初始化时,先定义好发送完成中断、接收完成中断,开中断,不需要定义定时中断的原因是自由口通讯是半双工通讯,一条通讯链路上只能有 的一条指令有效,而定义定时中断(它又不管你到底那条指令正常运行,或者指令没有运行,到点一定会发送一条指令的),这样会造成错误的几率会大。
正常应该是先定义通讯数据,完成后执行发送,在发送中断中编辑接收指令,在接收中断中再次编辑需要的发送指令,如此循环进行。
上述仅仅只是我是一点看法。