Trio范例.doc_第1页
Trio范例.doc_第2页
Trio范例.doc_第3页
Trio范例.doc_第4页
Trio范例.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Trio范例案例一:通过点动或手动把负载移到要示教的相应位置,通过输入信号的上升沿触发记录下当前位置.根据需要移动多次把整个示教轨迹记录下来.FOR I=0 TO 99IF IN(0)=0 THENWA(1)IF IN(0)=1 THENTABLE(I,MPOS)TABLE(I+100,MPOS AXIS(1)TABLE(I+200,MPOS AXIS(2)ENDIFENDIFNEXT IMOVEABS(0,0,0)FOR I=0 TO 99MA(TABLE(I),TABLE(I+100),TABLE(I+200)NEXT I范例二:PROGRAM 4 子程序新建程序,敲入以下代码:WHILE TRUEIF IN(0)=ON THENGOSUB messageENDIFWENDSTOPmessage:PRINT Input 0 is onRETURN 置in(0)为on,单步运行程序,结合手册,写出GOSUB指令的功能。范例三:回复:PROGRAM 4 子程序新建程序,敲入以下代码:WHILE TRUEIF IN(0)=ON THENGOSUB messageENDIFWENDSTOPmessage:IF IN(1)=OFF THENRETURNELSEPRINT Input 0 is onENDIFRETURN 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 THENWA(20)IF IN(32)=1 THENRUN PROGRAM1ENDIFENDIFIF IN(33)=0 THENWA(20)IF IN(33)=1 THENSTOP PROGRAM1ENDIFENDIFGOTO LOOP以上程序你可以通过下载HITECH的免费软件在电脑上试试.如果是机器在运行状态你想暂停,可以用FEED HOLD INPUT(FH_IN)输入来实现,当想停时把FH_IN设成ON,当要从新从原来状态继续运行,则把FH_IN设为OFF就OK了.范例五:PROGRAM3 IFTHEN ELSE Conditional Tests1) 新建程序,键入以下代码:IF IN(0)=OFF THEN PRINT Input 0 is offENDIF打开终端0 ,in(0)置为off,运行程序,观察结果2)in(0)置为on,重新运行程序,观察结果。3)更改程序如下:IF IN(0)=OFF THEN PRINT Input 0 is offELSE PRINT Input(0) is onENDIFin(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_stopRUN JRJ_CAMBOX,13ELSESTOP JRJ_CAMBOXENDIFGOTO 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_serialStops all movements and programs-GOSUB stop_all Initialisation axis parameters-RUN STARTUP,3WAIT UNTIL PROC_STATUS PROC(3)=1 Wait until process is stoppedWAIT UNTIL PROC_STATUS PROC(3)=0While(true)Wait the start signalWhile(in(start_0)=0) Check for motion errorIF MOTION_ERROR or IN(emerg_stop_1) = 0 THEN.GoSub e_stopENDIFWendStart the application programswdog=Onwa(100)run app1,4run app2,5-Main loop-runflag=1While(runflag=1) Check for motion errorIF MOTION_ERROR THEN.GoSub m_errorrunflag=0ENDIF Check for emergency stopIF IN(emerg_stop_1) = 0 THEN.GoSub e_stoprunflag=0ENDIFWendWend m_error: Stop all movementsGOSUB stop_allReturne_stop: Emergency StopGoSub Stop_allReturnstop_all:Stops all programsSTOP app1STOP app2Stops all possible movesRAPIDSTOPWA(20)FOR i = 0 TO 2BASE(i)CANCEL(1)WA(1)CANCEL(1)WA(1)CANCELWAIT IDLEDATUM(0) Reset the possible following errorSERVO = OFFNEXT iBASE(0)Disable all axisWDOG=OFFRETURNinit_vars:Returninit_serial:setcom(38400,8,1,2,1,4)Return范例九:问:程序结构的问题建立了两个程序,名称分别为:MAIN、JRJ_CAMBOX。 目的是想在MAIN程序里将JRJ_CAMBOX做为任务运行。 在MAIN程序内写如下程序:loop:IF IN(0) THEN e_stopRUN JRJ_CAMBOX,13ELSESTOP JRJ_CAMBOXENDIFGOTO 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,13loop:IF IN(0) THEN STOP JRJ_CAMBOXGOTO loop 主要是用习惯了PLC的编程习惯,所以一时绕不过弯来,呵. 其实我想做的是: 模仿PLC编程思维, 建立一个主程序MAIN,在这里面循环执行对外部信号的监控,比如急停信号IN(0),启动信号IN(1). . 我开始写的程序的意思就是想在没有急停时运行任务,而有急停时则停止该任务, 但是当急停取消后,它又会执行的. tr td=1,1,160 Trio技术支持: /td td=2,1,587播客 博客 引用 加为好友 发送留言 2007-5-23 11:28:00 tr td=3,1 tr td 给你个例子程序: Initialisation of variables-GOSUB init_vars Initialisation of serial ports-GOSUB init_serialStops all movements and programs-GOSUB stop_all Initialisation axis parameters-RUN STARTUP,3WAIT UNTIL PROC_STATUS PROC(3)=1 Wait until process is stoppedWAIT UNTIL PROC_STATUS PROC(3)=0While(true)Wait the start signalWhile(in(start_0)=0) Check for motion errorIF MOTION_ERROR or IN(emerg_stop_1) = 0 THEN.GoSub e_stopENDIFWendStart the application programswdog=Onwa(100)run app1,4run app2,5-Main loop-runflag=1While(runflag=1) Check for motion errorIF MOTION_ERROR THEN.GoSub m_errorrunflag=0ENDIF Check for emergency stopIF IN(emerg_stop_1) = 0 THEN.GoSub e_stoprunflag=0ENDIFWendWend m_error: Stop all movementsGOSUB stop_allReturne_stop: Emergency StopGoSub Stop_allReturnstop_all:Stops all programsSTOP app1STOP app2Stops all possible movesRAPIDSTOPWA(20)FOR i = 0 TO 2BASE(i)CANCEL(1)WA(1)CANCEL(1)WA(1)CANCELWAIT IDLEDATUM(0) Reset the possible following errorSERVO = OFFNEXT iBASE(0)Disable all axisWDOG=OFFRETURNinit_vars:Returninit_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播客 博客 引用 加为好友 发送留言 2007-5-24 17:13:00 tr td=3,1 tr td Its very easy to do, just like this: base(0)while trueIf in(a)=1 and a_flag=0 thenif mtype=idle thenmove(10)endifa_flag=1endifif in(a)=0 then a_flag=0If in(b)=1 and b_flag=0 thenif mtype=idle thenmove(-10)endifb_flag=1endifif in(b)=0 then b_flag=0wend范例十:逻辑判断例子在一个进程(任务)中,想要实现对上位机(触摸屏)上一个按扭的上升沿动作, 比如触摸屏内设置两个按扭分别为A和B,那么要求按下A(即使是不松开),那么轴0前进10个用户单位, 然后只有松开A再按下(即有一个上升沿动作)才会再前进10个用户单位. 即相当于“点动”功能了。 当然还得要求对这个进程是实时监控的,就是无论什么时候A有一个上升沿,那么前进10, B有一个上升沿,那么后退10. 这中间还可以随时响应其他的命令。 有什么好的办法吗?base(0)while trueIf in(a)=1 and a_flag=0 thenif mtype=idle thenmove(10)endifa_flag=1endifif in(a)=0 then a_flag=0 If in(b)=1 and b_flag=0 thenif mtype=idle thenmove(-10)endifb_flag=1endifif in(b)=0 then b_flag=0wend范例十一:问:回原点,为什么回原点信号就停了呢?请TRIO师傅帮忙一下了tr td loop:IF IN(1)=1 AND g_run_flag=0 AND g_zero_flag=0 THENg_zero_flag=1ENDIFIF g_zero_flag=1 AND IN(1)=1 THENBASE(0)P_GAIN=0.32I_GAIN=0.008VFF_GAIN=1UNITS=1SERVO=1FE_LIMIT=100SPEED=2000ACCEL=10*SPEEDDECEL=10*SPEEDCREEP=1FWD_IN=-1REV_IN=-1DATUM_IN=0INVERT_IN(0,ON)DATUM(3)MOVE(-10000)WAIT IDLEDEFPOS(0)IF IN(0)=0 AND g_zero_flag=1 THENg_zero_flag=0ENDIF VR(cur_couts)=108ENDIFGOTO loop 答:回原点是一次性行为,没必要做一个循环。需要再次回原点,也只需再调用该程序一次。FEEDHOLD_IN(FH_IN)设定一个进给保持(暂停)输入,就可以实现你想要的功能。该输入有效,机器就暂停,该输入又复位,机器就继续运行。范例十二:原创 InitData-GOSUB init_data Initialisation of serial ports-GOSUB init_serialStops all movements and programs-GOSUB stop_all Initialisation axis parameters-RUN STARTUP,3Wait until process is stoppedWAIT UNTIL PROC_STATUS PROC(3)=0WA(200)WDOG=ONWA(10)Return Machine Home When Power OnGOSUB zero_m4-Main Cycle Start-WHILE(TRUE)Start the applic ation programsWDOG=ONIF IN(safety_gate) = 0 AND IN(emg_stop)=0 AND IN(line_cut)=0 THENTABLE(display_alarm,0)RUN app1,5WAIT UNTIL PROC_STATUS PROC(5)=1RUN app2,6WAIT UNTIL PROC_STATUS PROC(6)=1CLEAR_BIT(4,1)runflag=1ENDIFIF IN(safety_gate) = 1 THENSafety Gate AlarmTABLE(display_alarm,33)ENDIFIF IN(emg_stop)=1 THENEmergency AlarmTABLE(display_alarm,35)ENDIFIF IN(line_cut) = 1 THENLine Cut AlarmTABLE(display_alarm,36)ENDIFMain loop-WHILE(runflag=1) Check for motion errorIF MOTION_ERROR THEN.TABLE(display_alarm,34)GOSUB m_errorrunflag=0ENDIF Check for Safety Gate Alarm and Emergency stop and Line Cut AlarmIF IN(1) = 1 OR IN(2)=1 OR IN(3)=1 OR READ_BIT(4,1)=1 THEN.GOSUB e_stopGOSUB data_resetWA(10)CLEAR_BIT(4,1)Reset Buttomrunflag=0ENDIF Check Manual Return HomeIF READ_BIT(2,0)=1 AND a_flag=0 THEN.BASE(0)WA(2)IF MTYPE = 0 THENSET_BIT(4,0)Zero Led DisplayGOSUB zero_m4WA(1)CLEAR_BIT(4,0)Zero Led DisplayENDIFa_flag=1ENDIFIF READ_BIT(2,0)=0 THEN a_flag=0WENDWEND-Main Cycle End-Sub Function Start-m_error: Stop all movementsGOSUB stop_allRETURNe_stop: Emergency StopGOSUB stop_allRETURNstop_all:GOSUB stop_all_programGOSUB stop_all_movesGOSUB wdog_offRETURNstop_all_program:Stops all programsSTOP app1WAIT UNTIL PROC_STATUS PROC(5)=0STOP app2WAIT UNTIL PROC_STATUS PROC(6)=0RETURNstop_all_moves:Stops all possible movesADDAX(-1) AXIS(0)ADDAX(-1) AXIS(1)ADDAX(-1) AXIS(2)ADDAX(-1) AXIS(3)ADDAX(-1) AXIS(4)RAPIDSTOPWA(20)FOR i = 0 TO 7BASE(i)CANCEL(1)WA(1)CANCEL(1)WA(1)CANCELWAIT IDLEDATUM(0) Reset the possible following errorSERVO = OFFNEXT iRETURNWDOG OFFwdog_off:BASE(0)Disable all axisWDOG=OFFRETURNinit_data:safety_gate=1emg_stop=2line_cut=3display_alarm=124RETURNdata_reset:TABLE(display_alarm,0)RETURNinit_serial:ADDRESS=1SETCOM(19200,7,2,2,1,5,1)WA(500)RETURNzero_m4:When Power On and Zero is OkBASE(0)UNITS=16384*16/(11*3.14159*15/70)*1000)0.001mmSPEED=10*16384*16/UNITSCREEP=4*16384*16/UNITSACCEL=SPEED*100 acc_time=10msDECEL=SPEED*100SERVO=0DATUM_IN AXIS(0)=0DATUM(3)WAIT UNTIL DPOS AXIS(0)=0CANCELCANCELDEFPOS(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=ONMOVEABS(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 IDLEMOVE(-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)=ONMOVELINK(0,150,0,0,7) 纸走150mMOVELINK(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 LOADEDOP(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 使当前位置为0WAIT 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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论