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 \ELSE
STOP \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 \而此时第13号任务已经被上次运行的程序占据,所以系统会报错,main程序退出。如果你把run \改成 run \的话,你会看到会有多个JRJ_CAMBOX被运行起来后,main程序同样会报错退出。这是因为run指令后面不指定任务号时,系统会自动将程序在最大任务号下启动,此时请注意程序和任务的区别!每个控制器都有其最多执行的任务数量,当到达这个限制值时,系统已经没有更多的任务空间来执行这个程序时,同样会报错,并将报错的程序退出。 续
[tr] [td=3,1] [tr] [td] 谢谢 Trio技术支持,按你的说法,改成如下即可. RUN \loop:
IF IN(0) THEN STOP \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 \
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 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