首页 Trio范例

Trio范例

举报
开通vip

Trio范例Trio范例 案例一: 通过点动或手动把负载移到要示教的相应位置,通过输入信号的上升沿触发记录下当前位置.根据需要移动 多次把整个示教轨迹记录下来. FOR I=0 TO 99 IF IN(0)=0 THEN WA(1) IF IN(0)=1 THEN TABLE(I,MPOS) TABLE(I+100,MPOS AXIS(1)) TABLE(I+200,MPOS AXIS(2)) ENDIF ENDIF NEXT I MOVEABS(0,0,0) FOR I=0 TO 99 MA(TABLE(I)...

Trio范例
Trio范例 案例一: 通过点动或手动把负载移到要示教的相应位置,通过输入信号的上升沿触发记录下当前位置.根据需要移动 多次把整个示教轨迹记录下来. FOR I=0 TO 99 IF IN(0)=0 THEN WA(1) IF IN(0)=1 THEN TABLE(I,MPOS) TABLE(I+100,MPOS AXIS(1)) TABLE(I+200,MPOS AXIS(2)) ENDIF ENDIF NEXT I MOVEABS(0,0,0) FOR I=0 TO 99 MA(TABLE(I),TABLE(I+100),TABLE(I+200)) NEXT I 范例二: PROGRAM 4 子程序 新建程序,敲入以下代码: WHILE TRUE IF IN(0)=ON THEN GOSUB message ENDIF WEND STOP message: PRINT "Input 0 is on" RETURN 置in(0)为on,单步运行程序,结合手册,写出GOSUB指令的功能。 范例三: 回复:PROGRAM 4 子程序 新建程序,敲入以下代码: WHILE TRUE IF IN(0)=ON THEN GOSUB message ENDIF WEND STOP message: IF IN(1)=OFF THEN RETURN ELSE PRINT "Input 0 is on" ENDIF RETURN 1):in(0)和in(1)都置为off,单步运行程序,观察结果 2):in(1)置为on,单步运行程序,观察结果 3):in(0)和in(1)都置为on 单步运行程序,观察结果 在观察结果时,打开终端0,观察终端0中的变化,还有注意观察程序运行的流程 案例四: 问:这几天要做一个中断子程序,原以为trio手册里有这方面的指令,可是找了几天也没找到有关的指令, 所以恳求知道中断指令的朋友能给予帮助,能给个例子更好~ 在此我先谢谢好心的朋友了~ 答:以HITECH屏为例.通过MODBUS SLAVE模式设定虚拟IO信号可以扩展很多.例如IN(32)和IN(33)分 "停止". 别代表"运行"和 LOOP: IF IN(32)=0 THEN WA(20) IF IN(32)=1 THEN RUN "PROGRAM1" ENDIF ENDIF IF IN(33)=0 THEN WA(20) IF IN(33)=1 THEN STOP "PROGRAM1" ENDIF ENDIF GOTO LOOP 以上程序你可以通过下载HITECH的免费软件在电脑上试试. 如果是机器在运行状态你想暂停,可以用FEED HOLD INPUT(FH_IN)输入来实现,当想停时把FH_IN设成O N,当要从新从原来状态继续运行,则把FH_IN设为OFF就OK了. 范例五: PROGRAM3 IFTHEN ELSE Conditional Tests 1) 新建程序,键入以下代码: IF IN(0)=OFF THEN PRINT "Input 0 is off" ENDIF 打开终端0 ,in(0)置为off,运行程序,观察结果 2)in(0)置为on,重新运行程序,观察结果。 3)更改程序如下: IF IN(0)=OFF THEN PRINT "Input 0 is off" ELSE PRINT "Input(0) is on" ENDIF in(0)置为off运行程序,观察结果, 4)in(0)置为on,运行程序 观察结果 范例六: 问:如何在trio上实现第三方的插补算法, 答:如果你的要求不是特别的高,那么可以用TrioBasic直接编程实现,首先明确一个概念,通常讲的差补算法主要针对伺服系统位置环的差补,其输出是对应各个轴的速度目标指令,因此在Trio控制器中可以有两种做法:(TrioBasic支持标准的数学运算,完全可以实现各种复杂的算法) 1. 简单做法:采用Trio控制器内成熟的PID算法,首先在需要差补的各个轴上都执行forward指令,然后通过实时检测mpos值得到当前轴位置,调用自己的差补算法得出下一拍对应轴的目标速度,然后通过给speed进行速度给定。 2. 复杂做法:自己实现最基本的各种算法调节,首先将对应驱动器设置为速度模式,设置Trio控制器对应轴为Servo模式,然后将该轴servo参数设置为0,此时通过mpos可以得到当前轴的位置,mspeed可以得到当前轴的瞬间速度,调用自己编写的算法得出对应目标速度然后通过对DAC参数进行电压输出,做为伺服系统的当前时刻的速度指令。 建议采用单任务模式,可以通过对Ticks参数的操作实现时间片的管理,ticks的精度默认为1ms,最快可以达到0.25ms。 如果您的差补算法比较复杂,而又有实时性及大量应用要求的话,您可以将您的差补算法用c语言编写,并配有必要的接口说明文档发给我们,我们的开发人员会进行评估,如果一切顺利后可以直接加载到控制器内核中,这样你可以象调用move,movecirc指令一样去调用自己的差补指令 范例七: 程序问题 [tr] [td] 建立了两个程序,名称分别为:MAIN、JRJ_CAMBOX。 目的是想在MAIN程序里将JRJ_CAMBOX做为任务运行。 在MAIN程序内写如下程序: loop: IF IN(0) THEN 'e_stop RUN "JRJ_CAMBOX",13 ELSE STOP "JRJ_CAMBOX" ENDIF GOTO loop 运行MAIN程序,再模拟,将IN(0)设置为ON, 结果就提示什么MAIN运行进程号14错误,然后MAIN就不执行了,但是JRJ_CAMBOX倒是在执行了。 为什么, 答:你做的main程序在不断循环执行,当in(0)被置为1时,第一次系统会正常启动“JRJ_CAMBOX”程序, 而且让“JRJ_CAMBOX”程序在第13号任务内运行。但是当main程序第二次到达if判断时,IN(0)同样条 件成立,此时你的程序依然是run "JRJ_CAMBOX",13 而此时第13号任务已经被上次运行的程序占据, 所以系统会报错,main程序退出。如果你把run "JRJ_CAMBOX",13 改成 run "JRJ_CAMBOX"的话,你 会看到会有多个JRJ_CAMBOX被运行起来后,main程序同样会报错退出。这是因为run指令后面不指 定任务号时,系统会自动将程序在最大任务号下启动,此时请注意程序和任务的区别~每个控制器都有 其最多执行的任务数量,当到达这个限制值时,系统已经没有更多的任务空间来执行这个程序时,同样 会报错,并将报错的程序退出。 范例八:(接范例七) 程序结构例子 Initialisation of variables '----------------------------------------------- GOSUB init_vars ' Initialisation of serial ports '----------------------------------------------- GOSUB init_serial 'Stops all movements and programs '----------------------------------------------- GOSUB stop_all ' Initialisation axis parameters '----------------------------------------------- RUN "STARTUP",3 WAIT UNTIL PROC_STATUS PROC(3)=1 ' Wait until process is stopped WAIT UNTIL PROC_STATUS PROC(3)=0 While(true) 'Wait the start signal While(in(start_0)=0) ' Check for motion error IF MOTION_ERROR or IN(emerg_stop_1) = 0 THEN '... GoSub e_stop ENDIF Wend 'Start the application programs wdog=On wa(100) run "app1",4 run "app2",5 '------------------------------------------ 'Main loop '------------------------------------------ runflag=1 While(runflag=1) ' Check for motion error IF MOTION_ERROR THEN '... GoSub m_error runflag=0 ENDIF ' Check for emergency stop IF IN(emerg_stop_1) = 0 THEN '... GoSub e_stop runflag=0 ENDIF Wend Wend m_error: ' Stop all movements GOSUB stop_all Return e_stop: ' Emergency Stop GoSub Stop_all Return stop_all: 'Stops all programs STOP "app1" STOP "app2" 'Stops all possible moves RAPIDSTOP WA(20) FOR i = 0 TO 2 BASE(i) CANCEL(1) WA(1) CANCEL(1) WA(1) CANCEL WAIT IDLE DATUM(0) 'Reset the possible following error SERVO = OFF NEXT i BASE(0) 'Disable all axis WDOG=OFF RETURN init_vars: Return init_serial: setcom(38400,8,1,2,1,4) Return 范例九: 问: 程序结构的问题 建立了两个程序,名称分别为:MAIN、JRJ_CAMBOX。 目的是想在MAIN程序里将JRJ_CAMBOX做为任务运行。 在MAIN程序内写如下程序: loop: IF IN(0) THEN 'e_stop RUN "JRJ_CAMBOX",13 ELSE STOP "JRJ_CAMBOX" ENDIF GOTO loop 运行MAIN程序,再模拟,将IN(0)设置为ON, 结果就提示什么MAIN运行进程号14错误,然后MAIN就不执行了,但是JRJ_CAMBOX倒是在执行了。 为什么, 是我程序有问题,还是仿真器的问题, 因为我发现这个仿真器不完善,而且我又是自学TRIO这个东西,没有实际的硬件模拟, 很头疼。 哎,为什么这个仿真器就不能完善点呢, 不然象我们这种初学者都不知道到底是程序问题还是仿真器的问题,郁闷 答:你的程序有问题,你做的main程序在不断循环执行,当in(0)被置为1时,第一次系统会正常启动“JRJ_CAMBOX”程序,而且让“JRJ_CAMBOX”程序在第13号任务内运行。但是当main程序第二次到达if判断时,IN(0)同样条件成立,此时你的程序依然是run "JRJ_CAMBOX",13 而此时第13号任务已经被上次运行的程序占据,所以系统会报错,main程序退出。如果你把run "JRJ_CAMBOX",13 改成 run "JRJ_CAMBOX"的话,你会看到会有多个JRJ_CAMBOX被运行起来后,main程序同样会报错退出。这是因为run指令后面不指定任务号时,系统会自动将程序在最大任务号下启动,此时请注意程序和任务的区别~每个控制器都有其最多执行的任务数量,当到达这个限制值时,系统已经没有更多的任务空间来执行这个程序时,同样会报错,并将报错的程序退出。 续 [tr] [td=3,1] [tr] [td] 谢谢 Trio技术支持,按你的说法,改成如下即可. RUN "JRJ_CAMBOX",13 loop: IF IN(0) THEN STOP "JRJ_CAMBOX" GOTO loop 主要是用习惯了PLC的编程习惯,所以一时绕不过弯来,呵. 其实我想做的是: 模仿PLC编程思维, 建立 一个主程序MAIN,在这里面循环执行对外部信号的监控,比如急停信号IN(0),启动信号IN(1)... ... 我开 始写的程序的意思就是想在没有急停时运行任务,而有急停时则停止该任务, 但是当急停取消后,它又 会执行的. [tr] [td=1,1,160] Trio技术支持: [/td] [td=2,1,587]播客 博客 引用 加为好友 发送留言 20 07-5-23 11:28:00 [tr] [td=3,1] [tr] [td] 给你个例子程序: ' Initialisation of variables '----------------------------------------------- GOSUB init_vars ' Initialisation of serial ports '----------------------------------------------- GOSUB init_serial 'Stops all movements and programs '----------------------------------------------- GOSUB stop_all ' Initialisation axis parameters '----------------------------------------------- RUN "STARTUP",3 WAIT UNTIL PROC_STATUS PROC(3)=1 ' Wait until process is stopped WAIT UNTIL PROC_STATUS PROC(3)=0 While(true) 'Wait the start signal While(in(start_0)=0) ' Check for motion error IF MOTION_ERROR or IN(emerg_stop_1) = 0 THEN '... GoSub e_stop ENDIF Wend 'Start the application programs wdog=On wa(100) run "app1",4 run "app2",5 '------------------------------------------ 'Main loop '------------------------------------------ runflag=1 While(runflag=1) ' Check for motion error IF MOTION_ERROR THEN '... GoSub m_error runflag=0 ENDIF ' Check for emergency stop IF IN(emerg_stop_1) = 0 THEN '... GoSub e_stop runflag=0 ENDIF Wend Wend m_error: ' Stop all movements GOSUB stop_all Return e_stop: ' Emergency Stop GoSub Stop_all Return stop_all: 'Stops all programs STOP "app1" STOP "app2" 'Stops all possible moves RAPIDSTOP WA(20) FOR i = 0 TO 2 BASE(i) CANCEL(1) WA(1) CANCEL(1) WA(1) CANCEL WAIT IDLE DATUM(0) 'Reset the possible following error SERVO = OFF NEXT i BASE(0) 'Disable all axis WDOG=OFF RETURN init_vars: Return init_serial: setcom(38400,8,1,2,1,4) Return 再续 [tr] [td=3,1] [tr] [td] 再来一个问题: 在一个进程(任务)中,想要实现对上位机(触摸屏)上一个按扭的上升沿动作, 比如触摸屏内设置两个按扭分别为A和B,那么要求按下A(即使是不松开),那么轴0前进10个用户单 位, 然后只有松开A再按下(即有一个上升沿动作)才会再前进10个用户单位. 即相当于“点动”功能了。 当然还得要求对这个进程是实时监控的,就是无论什么时候A有一个上升沿,那么前进10, B有一 个上升沿,那么后退10... 这中间还可以随时响应其他的命令。 有什么好的办法吗, [tr] [td=1,1,160] Trio技术支持: [/td] [td=2,1,587]播客 博客 引用 加为好友 发送留言 20 07-5-24 17:13:00 [tr] [td=3,1] [tr] [td] It's very easy to do, just like this: base(0) while true If in(a)=1 and a_flag=0 then if mtype=idle then move(10) endif a_flag=1 endif if in(a)=0 then a_flag=0 If in(b)=1 and b_flag=0 then if mtype=idle then move(-10) endif b_flag=1 endif if in(b)=0 then b_flag=0 wend 范例十: 逻辑判断例子 在一个进程(任务)中,想要实现对上位机(触摸屏)上一个按扭的上升沿动作, 比如触摸屏内设置两个按扭 分别为A和B,那么要求按下A(即使是不松开),那么轴0前进10个用户单位, 然后只有松开A再按下(即 有一个上升沿动作)才会再前进10个用户单位. 即相当于“点动”功能了。 当然还得要求对这个进程是实 时监控的,就是无论什么时候A有一个上升沿,那么前进10, B有一个上升沿,那么后退10... 这中间 还可以随时响应其他的命令。 有什么好的办法吗, base(0) while true If in(a)=1 and a_flag=0 then if mtype=idle then move(10) endif a_flag=1 endif if in(a)=0 then a_flag=0 If in(b)=1 and b_flag=0 then if mtype=idle then move(-10) endif b_flag=1 endif if in(b)=0 then b_flag=0 wend 范例十一: 问: 回原点,为什么回原点信号就停了呢,请TRIO师傅帮忙一下了 [tr] [td] loop: IF IN(1)=1 AND g_run_flag=0 AND g_zero_flag=0 THEN g_zero_flag=1 ENDIF IF g_zero_flag=1 AND IN(1)=1 THEN BASE(0) P_GAIN=0.32 I_GAIN=0.008 VFF_GAIN=1 UNITS=1 SERVO=1 FE_LIMIT=100 SPEED=2000 ACCEL=10*SPEED DECEL=10*SPEED CREEP=1 FWD_IN=-1 REV_IN=-1 DATUM_IN=0 INVERT_IN(0,ON) DATUM(3) MOVE(-10000) WAIT IDLE DEFPOS(0) IF IN(0)=0 AND g_zero_flag=1 THEN g_zero_flag=0 ENDIF VR(cur_couts)=108 ENDIF GOTO loop 答:回原点是一次性行为,没必要做一个循环。需要再次回原点,也只需再调用该程序一次。 FEEDHOLD_IN(FH_IN)设定一个进给保持(暂停)输入,就可以实现你想要的功能。该输入有效,机器就 暂停,该输入又复位,机器就继续运行。 范例十二: 『原创』 ' InitData'----------------------------------------------- GOSUB init_data ' Initialisation of serial ports----------------------------------------------- GOSUB init_serial 'Stops all movements and programs'----------------------------------------------- GOSUB stop_all ' Initialisation axis parameters'----------------------------------------------- RUN "STARTUP",3 'Wait until process is stopped WAIT UNTIL PROC_STATUS PROC(3)=0 WA(200) WDOG=ON WA(10) 'Return Machine Home When Power On GOSUB zero_m4 '---------------------------Main Cycle Start----------------------------------' WHILE(TRUE) 'Start the applic ation programs WDOG=ON IF IN(safety_gate) = 0 AND IN(emg_stop)=0 AND IN(line_cut)=0 THEN TABLE(display_alarm,0) RUN "app1",5 WAIT UNTIL PROC_STATUS PROC(5)=1 RUN "app2",6 WAIT UNTIL PROC_STATUS PROC(6)=1 CLEAR_BIT(4,1) runflag=1 ENDIF IF IN(safety_gate) = 1 THEN'Safety Gate Alarm TABLE(display_alarm,33) ENDIF IF IN(emg_stop)=1 THEN'Emergency Alarm TABLE(display_alarm,35) ENDIF IF IN(line_cut) = 1 THEN'Line Cut Alarm TABLE(display_alarm,36) ENDIF 'Main loop '------------------------------------------ WHILE(runflag=1) ' Check for motion error IF MOTION_ERROR THEN '... TABLE(display_alarm,34) GOSUB m_error runflag=0 ENDIF ' Check for Safety Gate Alarm and Emergency stop and Line Cut Alarm IF IN(1) = 1 OR IN(2)=1 OR IN(3)=1 OR READ_BIT(4,1)=1 THEN '... GOSUB e_stop GOSUB data_reset WA(10) CLEAR_BIT(4,1)'Reset Buttom runflag=0 ENDIF ' Check Manual Return Home IF READ_BIT(2,0)=1 AND a_flag=0 THEN '... BASE(0) WA(2) IF MTYPE = 0 THEN SET_BIT(4,0)'Zero Led Display GOSUB zero_m4 WA(1) CLEAR_BIT(4,0)'Zero Led Display ENDIF a_flag=1 ENDIF IF READ_BIT(2,0)=0 THEN a_flag=0 WEND WEND '---------------------------Main Cycle End----------------------------------' '---------------------------Sub Function Start------------------------------' m_error: ' Stop all movements GOSUB stop_all RETURN e_stop: ' Emergency Stop GOSUB stop_all RETURN stop_all: GOSUB stop_all_program GOSUB stop_all_moves GOSUB wdog_off RETURN stop_all_program: 'Stops all programs STOP "app1" WAIT UNTIL PROC_STATUS PROC(5)=0 STOP "app2" WAIT UNTIL PROC_STATUS PROC(6)=0 RETURN stop_all_moves: 'Stops all possible moves ADDAX(-1) AXIS(0) ADDAX(-1) AXIS(1) ADDAX(-1) AXIS(2) ADDAX(-1) AXIS(3) ADDAX(-1) AXIS(4) RAPIDSTOP WA(20) FOR i = 0 TO 7 BASE(i) CANCEL(1) WA(1) CANCEL(1) WA(1) CANCEL WAIT IDLE DATUM(0) 'Reset the possible following error SERVO = OFF NEXT i RETURN 'WDOG OFF wdog_off: BASE(0) 'Disable all axis WDOG=OFF RETURN init_data: safety_gate=1 emg_stop=2 line_cut=3 display_alarm=124 RETURN data_reset: ' TABLE(display_alarm,0) RETURN init_serial: 'ADDRESS=1 SETCOM(19200,7,2,2,1,5,1) WA(500) RETURN zero_m4: 'When Power On and Zero is Ok BASE(0) UNITS=16384*16/((11*3.14159*15/70)*1000)'0.001mm SPEED=10*16384*16/UNITS CREEP=4*16384*16/UNITS ACCEL=SPEED*100 'acc_time=10ms DECEL=SPEED*100 SERVO=0 DATUM_IN AXIS(0)=0 DATUM(3) WAIT UNTIL DPOS AXIS(0)=0 CANCEL CANCEL DEFPOS(0)AXIS(0) RETURN '---------------------------Sub Function End---------------------------------' 范例十三: 螺旋插补指令(MHELICAL) MHELICAL 螺旋插补 类型:运动控制指令 语法:MHELICAL(end1,end2,centre1,centre2,direction,distance3,[mode]) 说明:执行一个螺旋插补运动 在两个正交轴之间做圆弧插补,同时第三轴做线性运动,前五个参数和圆弧插补指令MOVECIRC()类似,第六个参数定义同时要走的第三轴的线性距离。End1和center1工作在当前的基本轴,End2和center2工作在下一轴。前四个距离和第六个参数是以各自轴的单位转换因子为单位。 参数: end1BASE基准轴要停止的相对于起点的位置 end2BASE基准阵列中,下一个轴的要停止的相对于起点的位置 centre1圆心相对于BASE基准轴起点的位置 centre2圆心相对于BASE基准阵列,下一个轴的起点的位置 direction圆弧插补方向软件开关设成1为顺时针方向/ 设成0为逆时针方向 distance 3 BASE基准阵列中,第三轴走的线性距离 mode: 0 =标准的螺旋插补 1 =只插补前两个轴第三轴随动 例子: 例1下面的这段程序的功能是,通过轴1和轴2,使得工具绕圆角长方形运动,通过转动轴3让工具始终与长方形垂直。轴3单位是度 REP_OPTION AXIS(3)=ON ‘ 运动开始三个轴需要回零点 MERGE=ON MOVEABS(360) AXIS(3) ‘校正3轴开始角度 WAIT IDLE AXIS(3) MOVE(0,12) MHELICAL(3,3,3,0,1,90) MOVE(16,0) MHELICAL(3,-3,0,-3,1,90) MOVE(0,-6) MHELICAL(-3,-3,-3,0,1,90) MOVE(-2,0) MHELICAL(-3,3,0,3,1,90) 例2:如下图所示,有一PVC切刀,通过XY两轴来控制,第三轴控制切刀角度。为了做到速 度的匹配,我们要用模式1。 BASE(0,1,2) : MERGE=ON '平滑运动开关启动 MOVE(50,0) MHELICAL(0,-6,0,-3,1,180,1) MOVE(-22,0) WAIT IDLE MOVE(-90) AXIS(2) '控制切刀转个直角弯 WAIT IDLE AXIS(2) MOVE(0,-50) MHELICAL(-6,0,-3,0,1,180,1) MOVE(0,50) WAIT IDLE '停一下,继续旋转切刀 MOVE(-90) AXIS(2) WAIT IDLE AXIS(2) MOVE(-22,0) MHELICAL(0,6,0,3,1,180,1) WAIT IDLE 范例十四: 例子1:有一飞剪系统,要求把纸带切成16m。工作过程中送料轴要求不能停。切刀运动距离是1.2m。例 子中用1m。纸的长度用一个测量编码器获得。设置单位为m.。编码器接入轴7。 WHILE IN(2)=ON MOVELINK(0,150,0,0,7) '纸走150m MOVELINK(0.3,0.6,0.6,0,7) ' 加速到纸的速度 MOVELINK(0.7,1.0,0,0.6,7) ' 跟踪纸,之后减速 WAIT LOADED ' 等到加速过程结束 OP(8,ON) ' 驱动切刀 MOVELINK(-1.0,8.4,0.5,0.5,7) ‘ 返回原点 WAIT LOADED OP(8,OFF) ' 切刀收起 WEND 范例十五: 运动过程中改变运动指令终点指令(movemodify) MOVEMODIFY 类型: 运动控制指令 语法: MOVEMODIFY (绝对位置) 备选: MM() 说明: MOVEMODIFY指令改变当前单轴线性运动的绝对结束位置(MOVE或MOVEABS)。如果当前没 有运动或当前运动不是直线运动,于是MOVEMODIFY等同于MOVEABS指令。ENDMOVE参数包括用户 定义的当前运动的结束位置。 MOVEMODIFY工作在缺省基本轴,除非AXIS定义临时基本轴。 参数: 绝对位置 将绝对位置设置成新的结束位置。 例子: 例1:传送带上有一快玻璃板,需要在遇到接近开关,发现上升沿后的250mm停下来,接近开关连接到 色标输入端子。 MOVE(10000) '在传送带启动一个相对长的运动 REGIST(3) '设置色标输入 WAIT UNTIL MARK 'MARK goes TRUE 发现传感器 OFFPOS = -REG_POS '使当前位置为0 WAIT UNTIL OFFPOS=0 '等 OFFPOS 结束 MOVEMODIFY(250) '改变运动终点到 250mm 范例十六: 例子程序分析 '--Zero VR(0) thru VR(4) used to store the five register FIFO data. VR(0)=0 VR(1)=0 VR(2)=0 VR(3)=0 VR(4)=0 '--Init some variables. i_pointer=0 'input data VR pointer o_pointer=1 'output data VR pointer inspect_i=8 'input point for product inspection station reject_o=9 'output point for product reject station dwell=500 'shift dwell time OP(reject_o,OFF) 'force product reject output signal off '--Main loop. WHILE 1=1 i_pointer = (i_pointer+1) MOD(5) 'increment FIFO input pointer o_pointer = (o_pointer+1) MOD(5) 'increment FIFO output pointer '--Check product inspection input to load FIFO. IF IN(inspect_i)=ON THEN VR(i_pointer)=1 'load 1 for rejected product ELSE VR(i_pointer)=0 'load 0 for good product ENDIF '--Check FIFO output pointer to fire product reject output. IF VR(o_pointer)=1 THEN OP(reject_o,ON) WA(dwell) OP(reject_o,OFF) GOSUB display_fifo WA(dwell) WEND display_fifo: pa=(i_pointer+4) MOD(5) pb=(i_pointer+3) MOD(5) pc=(i_pointer+2) MOD(5) pd=(i_pointer+1) MOD(5) PRINT #5,VR(i_pointer)[0];VR(pa)[0];VR(pb)[0];VR(pc)[0];VR(pd)[0] RETURN '============================================================= ================= 这是我在手册上看到的一个先入先出的例子,在这个例子中用来检测产品的好坏,不合格的产品被推出传 送带,在这个程序中的while 1=1的成是怎样得来的? i_pointer = (i_pointer+1) MOD(5) 'increment FIFO input pointer o_pointer = (o_pointer+1) MOD(5) 'increment FIFO output pointer 这两句的做用是什么呢? pa=(i_pointer+4) MOD(5) pb=(i_pointer+3) MOD(5) pc=(i_pointer+2) MOD(5) pd=(i_pointer+1) MOD(5) 这四句的做用又是什么呢? 答:在这里的WHILE 1=1 .......WEND和REPEAT.......UNTIL FALSE的作用相同, i_pointer = (i_pointer+1) MOD(5) o_pointer = (o_pointer+1) MOD(5) 这两句的作用是把VR区限定在VR(0)到VR(5),在程序值行时有这两句存在可以对VR(0)-VR(5)进行周期性 的循环扫描,
本文档为【Trio范例】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_769254
暂无简介~
格式:doc
大小:114KB
软件:Word
页数:32
分类:
上传时间:2017-09-23
浏览量:49