小弟初用TDC做项目开发,遇到了一个比较棘手的问题,请各位路过的专家给予指导。
问题如下:
我编写了两个任务,一个是扫描周期为2ms的时间循环任务,一个是硬件中断任务(为了测试方便,使用软件中断代替硬线连接的外部中断输入)。在时间循环任务中有两个功能块,一个是自增的功能块,每次增加2,输出值即为程序运行的时间值(毫秒数)。时间循环任务中还有一个功能块SQGB产生一个高电平宽度为25ms的方波用于启动中断任务,即该功能块的输出连接到软件中断任务初始化功能块PAS的IN上,PAS的TMB管脚设定为0,即只有上升沿才能触发中断任务。中断任务中有一个比较功能块NCM,输入值X1和X2分别为时间循环任务中自增功能块的输出和一个设定值40,输出QU连接到时间循环任务中自增功能块的输入上。
编写这两个任务想实现的功能是通过时间循环任务产生时间值(ms),并每隔50ms启动中断任务一次。中断任务读取改时间值,若此时间值大于40,则对时间循环任务中的自增功能块输入及输出复位,使其从0开始自增。
遇到的问题是:
由于中断任务启动周期为50ms,第一次中断发生时,中断任务读取的时间数肯定是50,大于设定值40,NCM的输出位QU为1,由于中断任务没有时间概念,中断任务结束后,这个标志位QU始终为1。由于使用这个标志作为时间循环任务中自增功能块的复位标志,因此在第二个50毫秒中,时间任务中的自增快总是0,第二个50ms结束时,中断任务第二次被启动,读取的时间值为0,小于40,NCM的输出位QU为0,这显然是不正确的,因为中断任务的启动周期是50ms,此时读取的时间值应该是50才对,也就是NCM的输出位QU永远为1才对。
小弟仔细考虑了一下,觉得是因为cfc不像C语言似的可以使用中间变量,中断任务的输出直接和循环任务的输入相连,中断结束后,输出的标志位无法改变引起的。知道原因,却找不到处理这类中断和时间循环任务的方法,叙述的有点啰嗦,有兴趣的可以详聊,我发测试程序过去。