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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。