您好,欢迎访问三七文档
Trio范例案例一:通过点动或手动把负载移到要示教的相应位置,通过输入信号的上升沿触发记录下当前位置.根据需要移动多次把整个示教轨迹记录下来.FORI=0TO99IFIN(0)=0THENWA(1)IFIN(0)=1THENTABLE(I,MPOS)TABLE(I+100,MPOSAXIS(1))TABLE(I+200,MPOSAXIS(2))ENDIFENDIFNEXTIMOVEABS(0,0,0)FORI=0TO99MA(TABLE(I),TABLE(I+100),TABLE(I+200))NEXTI范例二:PROGRAM4子程序新建程序,敲入以下代码:WHILETRUEIFIN(0)=ONTHENGOSUBmessageENDIFWENDSTOPmessage:PRINTInput0isonRETURN置in(0)为on,单步运行程序,结合手册,写出GOSUB指令的功能。范例三:回复:PROGRAM4子程序新建程序,敲入以下代码:WHILETRUEIFIN(0)=ONTHENGOSUBmessageENDIFWENDSTOPmessage:IFIN(1)=OFFTHENRETURNELSEPRINTInput0isonENDIFRETURN1):in(0)和in(1)都置为off,单步运行程序,观察结果2):in(1)置为on,单步运行程序,观察结果3):in(0)和in(1)都置为on单步运行程序,观察结果在观察结果时,打开终端0,观察终端0中的变化,还有注意观察程序运行的流程案例四:问:这几天要做一个中断子程序,原以为trio手册里有这方面的指令,可是找了几天也没找到有关的指令,所以恳求知道中断指令的朋友能给予帮助,能给个例子更好!在此我先谢谢好心的朋友了!答:以HITECH屏为例.通过MODBUSSLAVE模式设定虚拟IO信号可以扩展很多.例如IN(32)和IN(33)分别代表运行和停止.LOOP:IFIN(32)=0THENWA(20)IFIN(32)=1THENRUNPROGRAM1ENDIFENDIFIFIN(33)=0THENWA(20)IFIN(33)=1THENSTOPPROGRAM1ENDIFENDIFGOTOLOOP以上程序你可以通过下载HITECH的免费软件在电脑上试试.如果是机器在运行状态你想暂停,可以用FEEDHOLDINPUT(FH_IN)输入来实现,当想停时把FH_IN设成ON,当要从新从原来状态继续运行,则把FH_IN设为OFF就OK了.范例五:PROGRAM3IFTHENELSEConditionalTests1)新建程序,键入以下代码:IFIN(0)=OFFTHENPRINTInput0isoffENDIF打开终端0,in(0)置为off,运行程序,观察结果2)in(0)置为on,重新运行程序,观察结果。3)更改程序如下:IFIN(0)=OFFTHENPRINTInput0isoffELSEPRINTInput(0)isonENDIFin(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:IFIN(0)THEN'e_stopRUNJRJ_CAMBOX,13ELSESTOPJRJ_CAMBOXENDIFGOTOloop运行MAIN程序,再模拟,将IN(0)设置为ON,结果就提示什么MAIN运行进程号14错误,然后MAIN就不执行了,但是JRJ_CAMBOX倒是在执行了。为什么?答:你做的main程序在不断循环执行,当in(0)被置为1时,第一次系统会正常启动“JRJ_CAMBOX”程序,而且让“JRJ_CAMBOX”程序在第13号任务内运行。但是当main程序第二次到达if判断时,IN(0)同样条件成立,此时你的程序依然是runJRJ_CAMBOX,13而此时第13号任务已经被上次运行的程序占据,所以系统会报错,main程序退出。如果你把runJRJ_CAMBOX,13改成runJRJ_CAMBOX的话,你会看到会有多个JRJ_CAMBOX被运行起来后,main程序同样会报错退出。这是因为run指令后面不指定任务号时,系统会自动将程序在最大任务号下启动,此时请注意程序和任务的区别!每个控制器都有其最多执行的任务数量,当到达这个限制值时,系统已经没有更多的任务空间来执行这个程序时,同样会报错,并将报错的程序退出。范例八:(接范例七)程序结构例子Initialisationofvariables'-----------------------------------------------GOSUBinit_vars'Initialisationofserialports'-----------------------------------------------GOSUBinit_serial'Stopsallmovementsandprograms'-----------------------------------------------GOSUBstop_all'Initialisationaxisparameters'-----------------------------------------------RUNSTARTUP,3WAITUNTILPROC_STATUSPROC(3)=1'WaituntilprocessisstoppedWAITUNTILPROC_STATUSPROC(3)=0While(true)'WaitthestartsignalWhile(in(start_0)=0)'CheckformotionerrorIFMOTION_ERRORorIN(emerg_stop_1)=0THEN'...GoSube_stopENDIFWend'Starttheapplicationprogramswdog=Onwa(100)runapp1,4runapp2,5'------------------------------------------'Mainloop'------------------------------------------runflag=1While(runflag=1)'CheckformotionerrorIFMOTION_ERRORTHEN'...GoSubm_errorrunflag=0ENDIF'CheckforemergencystopIFIN(emerg_stop_1)=0THEN'...GoSube_stoprunflag=0ENDIFWendWendm_error:'StopallmovementsGOSUBstop_allReturne_stop:'EmergencyStopGoSubStop_allReturnstop_all:'StopsallprogramsSTOPapp1STOPapp2'StopsallpossiblemovesRAPIDSTOPWA(20)FORi=0TO2BASE(i)CANCEL(1)WA(1)CANCEL(1)WA(1)CANCELWAITIDLEDATUM(0)'ResetthepossiblefollowingerrorSERVO=OFFNEXTiBASE(0)'DisableallaxisWDOG=OFFRETURNinit_vars:Returninit_serial:setcom(38400,8,1,2,1,4)Return范例九:问:程序结构的问题建立了两个程序,名称分别为:MAIN、JRJ_CAMBOX。目的是想在MAIN程序里将JRJ_CAMBOX做为任务运行。在MAIN程序内写如下程序:loop:IFIN(0)THEN'e_stopRUNJRJ_CAMBOX,13ELSESTOPJRJ_CAMBOXENDIFGOTOloop运行MAIN程序,再模拟,将IN(0)设置为ON,结果就提示什么MAIN运行进程号14错误,然后MAIN就不执行了,但是JRJ_CAMBOX倒是在执行了。为什么?是我程序有问题,还是仿真器的问题?因为我发现这个仿真器不完善,而且我又是自学TRIO这个东西,没有实际的硬件模拟,很头疼。哎,为什么这个仿真器就不能完善点呢,不然象我们这种初学者都不知道到底是程序问题还是仿真器的问题,郁闷答:你的程序有问题,你做的main程序在不断循环执行,当in(0)被置为1时,第一次系统会正常启动“JRJ_CAMBOX”程序,而且让“JRJ_CAMBOX”程序在第13号任务内运行。但是当main程序第二次到达if判断时,IN(0)同样条件成立,此时你的程序依然是runJRJ_CAMBOX,13而此时第13号任务已经被上次运行的程序占据,所以系统会报错,main程序退出。如果你把runJRJ_CAMBOX,13改成runJRJ_CAMBOX的话,你会看到会有多个JRJ_CAMBOX被运行起来后,main程序同样会报错退出。这是因为run指令后面不指定任务号时,系统会自动将程序在最大任务号下启动,此时请注意程序和任务的区别!每个控制器都有其最多执行的任务数量,当到达这个限制值时,系统已经没有更多的任务空间来执行这个程序时,同样会报错,并将报错的程序退出。续[tr][td=3,1][tr][td]谢谢Trio技术支持,按你的说法,改成如下即可.RUNJRJ_CAMBOX,13loop:IFIN(0)THENSTOPJRJ_CAMBOXGOTOloop主要是用习惯了PLC的编程习惯,所以一时绕不过弯来,呵.其实我想做的是:模仿PLC编程思维,建立一个主程序MAIN,在这里面循环执行对外部信号的监控,比如急停信号IN(0),启动信号IN(1)......我开始写的程序的意思就是想在没有急停时运行任务,而有急停时则停止该任务,但是当急停取消后,它又会执行的.[tr][td=1,1,160]Trio技术支持:[/td][td=2,1,587]播客博客引用加为好友发送留言2007-5-2311:28:00[tr][td=3,1][tr][td]给你个例子程序:'Initialisationofvariables'-----------------------------------------------GOS
本文标题:Trio范例
链接地址:https://www.777doc.com/doc-1413481 .html