Trio范例.docx

上传人:b****4 文档编号:5916337 上传时间:2023-05-09 格式:DOCX 页数:23 大小:104.91KB
下载 相关 举报
Trio范例.docx_第1页
第1页 / 共23页
Trio范例.docx_第2页
第2页 / 共23页
Trio范例.docx_第3页
第3页 / 共23页
Trio范例.docx_第4页
第4页 / 共23页
Trio范例.docx_第5页
第5页 / 共23页
Trio范例.docx_第6页
第6页 / 共23页
Trio范例.docx_第7页
第7页 / 共23页
Trio范例.docx_第8页
第8页 / 共23页
Trio范例.docx_第9页
第9页 / 共23页
Trio范例.docx_第10页
第10页 / 共23页
Trio范例.docx_第11页
第11页 / 共23页
Trio范例.docx_第12页
第12页 / 共23页
Trio范例.docx_第13页
第13页 / 共23页
Trio范例.docx_第14页
第14页 / 共23页
Trio范例.docx_第15页
第15页 / 共23页
Trio范例.docx_第16页
第16页 / 共23页
Trio范例.docx_第17页
第17页 / 共23页
Trio范例.docx_第18页
第18页 / 共23页
Trio范例.docx_第19页
第19页 / 共23页
Trio范例.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Trio范例.docx

《Trio范例.docx》由会员分享,可在线阅读,更多相关《Trio范例.docx(23页珍藏版)》请在冰点文库上搜索。

Trio范例.docx

Trio范例

Trio范例

案例一:

通过点动或手动把负载移到要示教的相应位置,通过输入信号的上升沿触发记录下当前位置.根据需要移动多次把整个示教轨迹记录下来.

FORI=0TO99

IFIN(0)=0THEN

WA

(1)

IFIN(0)=1THEN

TABLE(I,MPOS)

TABLE(I+100,MPOSAXIS

(1))

TABLE(I+200,MPOSAXIS

(2))

ENDIF

ENDIF

NEXTI

MOVEABS(0,0,0)

FORI=0TO99

MA(TABLE(I),TABLE(I+100),TABLE(I+200))

NEXTI

范例二:

PROGRAM4子程序

新建程序,敲入以下代码:

WHILETRUE

IFIN(0)=ONTHEN

GOSUBmessage

ENDIF

WEND

STOP

message:

PRINT"Input0ison"

RETURN

置in(0)为on,单步运行程序,结合手册,写出GOSUB指令的功能。

范例三:

回复:

PROGRAM4子程序

新建程序,敲入以下代码:

WHILETRUE

IFIN(0)=ONTHEN

GOSUBmessage

ENDIF

WEND

STOP

message:

IFIN

(1)=OFFTHEN

RETURN

ELSE

PRINT"Input0ison"

ENDIF

RETURN1):

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)=0THEN

WA(20)

IFIN(32)=1THEN

RUN"PROGRAM1"

ENDIF

ENDIF

IFIN(33)=0THEN

WA(20)

IFIN(33)=1THEN

STOP"PROGRAM1"

ENDIF

ENDIF

GOTOLOOP

以上程序你可以通过下载HITECH的免费软件在电脑上试试.

如果是机器在运行状态你想暂停,可以用FEEDHOLDINPUT(FH_IN)输入来实现,当想停时把FH_IN设成ON,当要从新从原来状态继续运行,则把FH_IN设为OFF就OK了.

范例五:

PROGRAM3IFTHENELSEConditionalTests

1)新建程序,键入以下代码:

IFIN(0)=OFFTHEN

PRINT"Input0isoff"

ENDIF

打开终端0,in(0)置为off,运行程序,观察结果

2)in(0)置为on,重新运行程序,观察结果。

3)更改程序如下:

IFIN(0)=OFFTHEN

PRINT"Input0isoff"

ELSE

PRINT"Input(0)ison"

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:

IFIN(0)THEN'e_stop

RUN"JRJ_CAMBOX",13

ELSE

STOP"JRJ_CAMBOX"

ENDIF

GOTOloop

运行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指令后面不指定任务号时,系统会自动将程序在最大任务号下启动,此时请注意程序和任务的区别!

每个控制器都有其最多执行的任务数量,当到达这个限制值时,系统已经没有更多的任务空间来执行这个程序时,同样会报错,并将报错的程序退出。

 

范例八:

(接范例七)

程序结构例子

Initialisationofvariables

'-----------------------------------------------

GOSUBinit_vars

'Initialisationofserialports

'-----------------------------------------------

GOSUBinit_serial

'Stopsallmovementsandprograms

'-----------------------------------------------

GOSUBstop_all

'Initialisationaxisparameters

'-----------------------------------------------

RUN"STARTUP",3

WAITUNTILPROC_STATUSPROC(3)=1

'Waituntilprocessisstopped

WAITUNTILPROC_STATUSPROC(3)=0

While(true)

'Waitthestartsignal

While(in(start_0)=0)

'Checkformotionerror

IFMOTION_ERRORorIN(emerg_stop_1)=0THEN

'...

GoSube_stop

ENDIF

Wend

'Starttheapplicationprograms

wdog=On

wa(100)

run"app1",4

run"app2",5

'------------------------------------------

'Mainloop

'------------------------------------------

runflag=1

While(runflag=1)

'Checkformotionerror

IFMOTION_ERRORTHEN

'...

GoSubm_error

runflag=0

ENDIF

'Checkforemergencystop

IFIN(emerg_stop_1)=0THEN

'...

GoSube_stop

runflag=0

ENDIF

Wend

Wend

m_error:

'Stopallmovements

GOSUBstop_all

Return

e_stop:

'EmergencyStop

GoSubStop_all

Return

stop_all:

'Stopsallprograms

STOP"app1"

STOP"app2"

'Stopsallpossiblemoves

RAPIDSTOP

WA(20)

FORi=0TO2

BASE(i)

CANCEL

(1)

WA

(1)

CANCEL

(1)

WA

(1)

CANCEL

WAITIDLE

DATUM(0)'Resetthepossiblefollowingerror

SERVO=OFF

NEXTi

BASE(0)

'Disableallaxis

WDOG=OFF

RETURN

init_vars:

Return

init_serial:

setcom(38400,8,1,2,1,4)

Return

范例九:

问:

程序结构的问题

建立了两个程序,名称分别为:

MAIN、JRJ_CAMBOX。

目的是想在MAIN程序里将JRJ_CAMBOX做为任务运行。

在MAIN程序内写如下程序:

loop:

IFIN(0)THEN'e_stop

RUN"JRJ_CAMBOX",13

ELSE

STOP"JRJ_CAMBOX"

ENDIF

GOTOloop

运行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:

IFIN(0)THENSTOP"JRJ_CAMBOX"

GOTOloop

主要是用习惯了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

'-----------------------------------------------

GOSUBinit_vars

'Initialisationofserialports

'-----------------------------------------------

GOSUBinit_serial

'Stopsallmovementsandprograms

'-----------------------------------------------

GOSUBstop_all

'Initialisationaxisparameters

'-----------------------------------------------

RUN"STARTUP",3

WAITUNTILPROC_STATUSPROC(3)=1

'Waituntilprocessisstopped

WAITUNTILPROC_STATUSPROC(3)=0

While(true)

'Waitthestartsignal

While(in(start_0)=0)

'Checkformotionerror

IFMOTION_ERRORorIN(emerg_stop_1)=0THEN

'...

GoSube_stop

ENDIF

Wend

'Starttheapplicationprograms

wdog=On

wa(100)

run"app1",4

run"app2",5

'------------------------------------------

'Mainloop

'------------------------------------------

runflag=1

While(runflag=1)

'Checkformotionerror

IFMOTION_ERRORTHEN

'...

GoSubm_error

runflag=0

ENDIF

'Checkforemergencystop

IFIN(emerg_stop_1)=0THEN

'...

GoSube_stop

runflag=0

ENDIF

Wend

Wend

m_error:

'Stopallmovements

GOSUBstop_all

Return

e_stop:

'EmergencyStop

GoSubStop_all

Return

stop_all:

'Stopsallprograms

STOP"app1"

STOP"app2"

'Stopsallpossiblemoves

RAPIDSTOP

WA(20)

FORi=0TO2

BASE(i)

CANCEL

(1)

WA

(1)

CANCEL

(1)

WA

(1)

CANCEL

WAITIDLE

DATUM(0)'Resetthepossiblefollowingerror

SERVO=OFF

NEXTi

BASE(0)

'Disableallaxis

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]播客博客引用加为好友发送留言  2007-5-2417:

13:

00[tr][td=3,1]

[tr][td]It'sveryeasytodo,justlikethis:

base(0)

whiletrue

Ifin(a)=1anda_flag=0then

ifmtype=idlethen

move(10)

endif

a_flag=1

endif

ifin(a)=0thena_flag=0

Ifin(b)=1andb_flag=0then

ifmtype=idlethen

move(-10)

endif

b_flag=1

endif

ifin(b)=0thenb_flag=0

wend

范例十:

逻辑判断例子

在一个进程(任务)中,想要实现对上位机(触摸屏)上一个按扭的上升沿动作,比如触摸屏内设置两个按扭分别为A和B,那么要求按下A(即使是不松开),那么轴0前进10个用户单位,然后只有松开A再按下(即有一个上升沿动作)才会再前进10个用户单位.即相当于“点动”功能了。

当然还得要求对这个进程是实时监控的,就是无论什么时候A有一个上升沿,那么前进10,B有一个上升沿,那么后退10...这中间还可以随时响应其他的命令。

有什么好的办法吗?

base(0)

whiletrue

Ifin(a)=1anda_flag=0then

ifmtype=idlethen

move(10)

endif

a_flag=1

endif

ifin(a)=0thena_flag=0

Ifin(b)=1andb_flag=0then

ifmtype=idlethen

move(-10)

endif

b_flag=1

endif

ifin(b)=0thenb_flag=0

wend

 

范例十一:

问:

回原点,为什么回原点信号就停了呢?

请TRIO师傅帮忙一下了

[tr][td]loop:

IFIN

(1)=1ANDg_run_flag=0ANDg_zero_flag=0THEN

g_zero_flag=1

ENDIF

IFg_zero_flag=1ANDIN

(1)=1THEN

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)

WAITIDLE

DEFPOS(0)

IFIN(0)=0ANDg_zero_flag=1THEN

g_zero_flag=0

ENDIFVR(cur_couts)=108

ENDIF

GOTOloop

答:

回原点是一次性行为,没必要做一个循环。

需要再次回原点,也只需再调用该程序一次。

FEEDHOLD_IN(FH_IN)设定一个进给保持(暂停)输入,就可以实现你想要的功能。

该输入有效,机器就暂停,该输入又复位,机器就继续运行。

范例十二:

『原创』

'InitData'-----------------------------------------------

GOSUBinit_data

'Initialisationofserialports-----------------------------------------------

GOSUBinit_serial

'Stopsallmovementsandprograms'-----------------------------------------------

GOSUBstop_all

'Initialisationaxisparameters'-----------------------------------------------

RUN"STARTUP",3

'Waituntilprocessisstopped

WAITUNTILPROC_STATUSPROC(3)=0

WA(200)

WDOG=ON

WA(10)

'ReturnMachineHomeWhenPowerOn

GOSUBzero_m4

'---------------------------MainCycleStart----------------------------------'

WHILE(TRUE)

'Starttheapplicationprograms

WDOG=ON

IFIN(safety_gate)=0ANDIN(emg_stop)=0ANDIN(line_cut)=0THEN

TABLE(display_alarm,0)

RUN"app1",5

WAITUNTILPROC_STATUSPROC(5)=1

RUN"app2",6

WAITUNTILPROC_STATUSPROC(6)=1

CLEAR_BIT(4,1)

runflag=1

ENDIF

IFIN(safety_gate)=1THEN'SafetyGateAlarm

TABLE(display_ala

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2