快速入门 | 篇十一: 正运动技术运动控制器中断的应用
1、材料准备与控制器接线参考
1)材料准备
电脑1台,安装ZDevelop3.01以上版本软件。
控制器1个。
24V直流电源1个。
总线驱动器+电机(或步进驱动器+电机)若干。
控制器接线端子若干。
网线若干。
连接线若干。
输入输出设备、扩展模块、人机界面等根据实际需求选择。
2)控制器接线参考
2、中断概念
1)中断响应
中断处理包括两个部分的内容:保护断点和现场,执行中断程序处理。响应中断请求后转到中断程序的入口,执行中断程序。
3、三种中断
1)掉电中断
4、中断函数
INT_ENABLE:中断总开关,1-开启,0-关闭
ONPOWEROFF:掉电中断
2)PLC中断相关函数
DI:禁止中断,同BASIC命令,INT_ENABLE=0关闭
ONPOWEROFF:掉电中断
INT_ONn:外部输入中断,上升沿有效,n-输入口编号
INT_OFFn:外部输入中断,下降沿有效,n-输入口编号
ONTIMERn:定时器中断,n-定时器编号
LBL:定义中断函数
IRET:中断结束返回主函数
5、三种中断使用(Basic)
三类中断运行时,中断程序单独占用一个任务号。
不同类型中断使用例程如下:
仅支持一个,掉电瞬间触发执行,执行时间短,只能写少数几条语句。
'主程序
INT_ENABLE = 1
DPOS(0)=VR(0) '上电读取保存的数值,恢复坐标
DPOS(1)=VR(1)
DPOS(2)=VR(2)
END '主程序结束
GLOBAL SUB ONPOWEROFF () '掉电中断
VR(0) = DPOS(0) '保存坐标到VR
VR(1) = DPOS(1)
VR(2) = DPOS(2)
END SUB
2)外部中断(上升沿/下降沿)中断使用
支持PLC功能的控制器才可以使用外部中断,必须是全局的SUB过程。INT_ONn()上升沿触发,INT_OFFn()下降沿触发,n是IN输入编号,只能选择控制器自带的编号0-31。
示例:
INT_ENABLE=1 '开启中断
END '主程序结束
GLOBAL SUB INT_ON0 () '外部上升沿中断程序
PRINT '输入IN0上升沿触发'
END SUB
GLOBAL SUB INT_OFF0 () '外部下降沿中断程序
PRINT '输入IN0下降沿触发'
END SUB
3)定时器中断使用
定时器中断支持同时开启多个,中断个数由定时器个数决定,必须是全局的SUB过程。ONTIMERn()中n是定时器编号。
定时器开启:TIMER_START(定时器编号,定时时间ms)
定时器结束:TIMER_STOP (定时器编号)
定时器状态:value = TIMER_IFEND (定时器编号),只读参数,返回值:0-正在定时,1-定时完成。
示例:
INT_ENABLE=1 '开启中断
TIMER_START(0,100) '定时器0开启,100ms后执行一次
END
GLOBAL SUB ONTIMER0() '中断程序
PRINT 'ontimer0 enter'
'TIMER_START(0,100) '希望周期执行中断,在SUB里再次打开定时器
END SUB
6、三种中断使用(PLC)
在PLC编程中,使用LBL指令定义要调用的中断函数,中断函数与Basic通用。
外部中断使用时要注意X编号为8进制,如:LBL @INT_ON8定义的外部中断的触发条件为X10的上升沿,实际接线使用IN8输入口。
中断程序运行时,占用一个任务号,此任务号为自动分配,不用手动设置。
7、中断使用注意事项
1)必须支持PLC功能的固件才能使用外部中断。
2)中断函数编写为全局SUB过程。
3)各中断之间无优先级,支持中断嵌套,多个中断可以同时执行,同一时间处理的中断函数不宜过多。
控制器内部只有一个任务在处理所有的中断信号响应,有一个固定的中断任务号,如果中断处理函数过多,并且中断处理函数的代码太长,会造成所有的中断响应变慢,甚至是中断堵塞,影响其他中断执行。
例程:
INT_ENABLE=1 '开启中断
TIMER_START(0,1000) '定时器0开启
TIMER_START(1,1100) '定时器1开启
END
GLOBAL SUB ONTIMER0() '中断处理函数
RUNTASK 3, MyIntHandler() '开任务运行
END SUB
GLOBAL SUB MyIntHandler()
DELAY 1000 '假设大量的堵塞性代码
WAIT UNTIL IN(0) <> 0
?'第一个中断'
END SUB
GLOBAL SUB ONTIMER1() '中断处理函数
?'第二个中断'
END SUB
8、中断演示例程(Basic)
'主程序
BASE(0,1)
ATYPE=1,1 '设为脉冲轴类型
UNITS=100,100
DPOS=0,0
SPEED=100,100
ACCEL=1000,1000
DECEL=1000,1000
SRAMP=100,100
INT_ENABLE=1 '开启中断总开关
TIMER_START(2,1000) '定时器2开启,1000ms后执行一次
DPOS(0)=VR(0) '上电读取保存的数值,恢复坐标
DPOS(1)=VR(1)
PRINT 'dpos(0),dpos(1)',dpos(0),dpos(1)
WHILE 1
IF SCAN_EVENT(IN(0))>0 THEN
TRIGGERBASE(0,1)
MOVEABS(0,0)
MOVECIRC2(100,100,200,0) '三点画半圆
ENDIF
WEND '主程序结束
'中断程序,均为全局SUB
GLOBAL SUB ONTIMER2() '定时器中断程序
PRINT '定时器中断2'
'TIMER_START(2,1000) '在sub里打开定时器,中断周期执行
END SUB
GLOBAL SUB INT_ON2 () '外部上升沿中断程序
PRINT '输入IN2上升沿触发...'
END SUB
GLOBAL SUB INT_OFF2 () '外部上升沿中断程序
PRINT '输入IN2下降沿触发...'
END SUB
GLOBAL SUB ONPOWEROFF () '掉电中断
VR(0) = DPOS(0) '保存坐标到VR
VR(1) = DPOS(1)
END SUB
9、中断演示例程(PLC)
//主程序 X0定时中断0,X1-定时中断1,X2-上升沿/下降沿中断,X3-关闭所有中断
LBL @MAIN
LD M8002
EI
EXE @ PRINT 'VR(0)',VR(0)
LD X0
TMR T0 K2000
LD T0
OUT Y0
LD X1
ANI Y1
TMR T1 K3000
LD T1
OUT Y1
LD X3
DI
FEND
//外部中断,由控制器上的输入口控制
LBL @INT_ON2
LD M8000
EXE @ PRINT '外部中断2上升沿'
IRET
LBL @INT_OFF2
LD M8000
EXE @ PRINT '外部中断2下降沿'
IRET
//定时器0中断,定时器到达预设值开启中断
LBL @ONTIMER0
LD M8000
EXE @ PRINT '定时器中断0'
IRET
//定时器1中断,定时器到达预设值开启中断
LBL @ONTIMER1
LD M8000
EXE @ PRINT '定时器中断1'
IRET
//掉电中断,控制器断电执行此中断
LBL @ONPOWEROFF
LD M8000
MOV K12345 D0
EXE @ VR(0)=MODBUS_REG(0)
IRET
END