实战攻坚!
下面我们讲讲该在TMS用户驱动子程序里面写些什么代码。
首先笔者得说说科威PLC的输入端口采样原理,为什么要进行输入端口采样呢?答案很简单,就是为了滤波。在PLC实际运行过程中,X端口可能会因为现场干扰收到一些毛刺信号,这些毛刺信号如果不进行处理,就会影响到PLC对X端口的状态的判断,那么我们必须得剔除掉这些毛刺,使系统工作在一个稳定的环境。 我们规定,如果连续采样8次X端口的值都是一致的,就判断此刻X端口的状态是实际的输入状态,这个也就是为什么我们把INPUT_CNT这个变量设置为8的原因。
还是老规矩,笔者贴出TMS的代码并为大家分析: TMS TMS: MOV C,KEY_SET ;1 MOV P4.3,C ;2 MOV C,PLC_PRO_ERR ;3 CPL C ;4 MOV P4.2,C ;5 MOV A,INPUT_CNT ;6 JNZ TMS1 ;7 RET
TMS1: DEC A ;8 MOV DPTR,#XINPUT ;9 ADD A,DPL ;10 MOV DPL,A ;11 MOV A,DPH ;12 ADDC A,#00H ;13 MOV DPH,A ;14 MOV A,P3 ;15 MOVX @DPTR,A ;16 DEC INPUT_CNT ;17 RET
1. 第1~5句:这4条语句是给RUN/SET和ERR两个灯赋状态的。在原理图中看到,由于ERR的LED与实际的P4.2中间反了一次向,故此在程序中也需要对此端口反向赋值。 2. 第6句:取INPUT_CNT当前值赋给寄存器A 3. 第7句:这句是一句跳转指令,作用是看对X输入端口当前的8次采样完成了没有,如果完成了,就直接返回,在SCAN用户驱动子程序会对其X0~X7寄存器的值进行更新;如果8次采样没有完成,则跳转到TMS1中进行X输入端口采样。 4. 第8~16句:将P3端口的值(即当前X输入端口的采样值)存放到从#XINPUT+7开始到#XINPUT一共8个单元。值得注意的是,完成8次采样的时间为2.5ms * 8 = 20ms。也就是说,从第1次采样开始到8次采样结束需要20ms的时间。结束时,#XINPUT~#XINPUT+7这8个单元的地址已被填充,等待SCAN用户驱动子程序的处理。这段程序通过改变采样指针DPTR的DPH和DPL,使其指向不同的外部寻址单元,这个小技巧希望大家能够熟练掌握。 5. 第17句:将INPUT_CNT减1。不要忘记这句话,否则你的程序将始终填充#XINPUT+7这个单元的数据,采样指针永远也指不到#XINPUT+6和其以下的单元。
好了,TMS就给大家分析完了,下一讲笔者将给大家讲述最后一个部分:SCAN。
本帖首发中国工控网科威PLC论坛,转载请声明!
|