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 \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 \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 \ENDIF ENDIF
IF IN(33)=0 THEN WA(20)
IF IN(33)=1 THEN STOP \ENDIF ENDIF GOTO LOOP
以上程序你可以通过下载HITECH的免费软件在电脑上试试.
如果是机器在运行状态你想暂停,可以用FEED HOLD INPUT(FH_IN)输入来实现,当想停时把FH_IN设成ON,当要从新从原来状态继续运行,则把FH_IN设为OFF就OK了. 范例五:
PROGRAM3 IFTHEN ELSE Conditional Tests 1) 新建程序,键入以下代码: IF IN(0)=OFF THEN PRINT \0 is off\
ENDIF
打开终端0 ,in(0)置为off,运行程序,观察结果 2)in(0)置为on,重新运行程序,观察结果。 3)更改程序如下: IF IN(0)=OFF THEN PRINT \0 is off\ELSE
PRINT \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 \ELSE
STOP \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 \而此时第13号任务已经被上次运行的程序占据,所以系统会报错,main程序退出。如果你把run \改成 run \的话,你会看到会有多个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 \
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 \run \
'------------------------------------------ '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 \STOP \
'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