合信论坛

快捷导航
查看: 5730|回复: 0

inout引脚影响中断执行结果 丢中断

[复制链接]

10

主题

14

帖子

170

积分

注册会员

Rank: 2

积分
170
发表于 2019-10-21 09:59:15 | 显示全部楼层 |阅读模式
本帖最后由 chenxiaochong 于 2019-10-21 10:13 编辑

在中断程序里操作某个子程序的inout引脚的寄存器时,经常发生操作失败的情况(经常被误认为丢中断);实际上根本原因是inout引脚的原理导致的:
inout引脚的原理:
步骤1.扫描进入子程序时,将inout引脚的寄存器赋值到 L 区,
步骤2.执行子程序
步骤3.从子程序退出时,将 L 区的值 赋值给 inout引脚的寄存器

如果中断在步骤2处触发,在中断中改变了 inout引脚的寄存器,
举例:
子程序FC0 有一个inout引脚 L区地址 L0.0 ,主程序调用FC0时,分配地址M0.0给此inout引脚
启动20ms定时中断,并在中断中置位M0.0

1.png 2.png
4.png     5.png

程序如图,按照正常理解,VW0和 VW2应该一起增计数,两个寄存器数值应该相同
实际执行结果:
6.png

7.png

结果显示: VW2 > vw0 并且差距越来越大

分析:
步骤1.扫描进入子程序时,将inout引脚的寄存器赋值到 L 区,   M0.0=0 ---> L0.0 =0
步骤2.执行子程序     在步骤2的时候中断触发,中断中 M0.0=1 ;  但 L0.0 仍然=0(只有在步骤1时才会从外部传参数进L区)      因L0.0 =0 VW0不加1,
步骤3.从子程序退出时,将 L 区的值 赋值给 inout引脚的寄存器   因 L0.0=0; 故 M0.0 = L0.0 =0 ;(此次中断置位的M0.0被丢弃 执行失败)

解决办法: 不要在中断中直接操作任何FC块的inout引脚,在中断中操作一个中间变量,在主程序中,用中间变量给inout引脚赋值;
此例中,程序改动如下:
8.png    9.png

执行结果如下:

10.png

中断计数和FC0计数完全一致,已经解决上述问题;




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

客服热线
400-700-4858 周一至周五:09:00 - 18:00
深圳市南山区打石一路深圳国际创新谷6栋A座9层

深圳市合信自动化技术有限公司(简称“合信技术”)成立于2003年,高新技术企业,专注于工业自动化产品的研发、生产、销售和技术服务,依靠高质量、高性能的自动化控制产品与方案为客户创造最大价值,立志于成为全球领先的工业自动化解决方案供应商。

Archiver|手机版|小黑屋|COTRUST Inc. ( 粤ICP备13051915号 )

GMT+8, 2024-3-29 21:20 , Processed in 0.078942 second(s), 23 queries .

快速回复 返回顶部 返回列表