Neste momento é já capaz de criar uma simulação completa com vários robôs/controladores, mas considerando um único fio de execução, pré-programado pelo utilizador graficamente. Como será de esperar, nem sempre é desejável ou sequer possível que assim seja, sendo útil em determinadas situações ter sistemas com execução mais complexas. Estas sequências de operação, implementados diretamente em código, podem ser baseados em variáveis internas ou nos valores das entradas/saídas do robô. No caso particular dos robôs da ABB, a linguagem utilizada denomina- se de linguagem RAPID. No menu de ajuda do RobotStudio encontra uma ligação para RAPID
RAPID Instructions, Functions and Data types, onde encontra uma descrição de todas as funções
que podem ser utilizadas em linguagem RAPID.
Nesta secção terá oportunidade de interagir diretamente com o código RAPID e ficar a conhecer as principais funções deste. Para informação mais detalhada dessas e outras funções deverá consultar a ajuda RAPID indicada acima.
Com os próximos passos pretende-se perceber como é feito o acesso ao código RAPID. O código será ainda alterado para que o robô esteja a operar continuamente, sem que para tal seja necessário alterar a configuração da simulação ou forçar manualmente uma entrada do robô.
1. Abra o ambiente criado na secção anterior, caso não esteja aberto;
2. Vá a Simulation Simulation Setup e confirme que a opção Single Cycle está selecionada para ambos os controladores;
3. No I/O Simulator verifique que todas as entradas e saídas que foram adicionadas a ambos os controladores estão a 0.
4. Arranque a simulação, situação em que os robôs deverão ficar parados à espera da entrada digital a 1, como mostra a Figura 94;
5. Clique no menu RAPID, surgindo o ambiente ilustrado na Figura 94;
6. Selecione o menu Controller e faça duplo clique em IRB1600_6kg_1.2m_1 RAPID
T_ROB1 Module1, surgindo o programa em código RAPID associado ao módulo Module1
do controlador (ver Figura 95);
Figura 94 – Acesso ao menu RAPID. Figura 95 – Código RAPID.
7. Observando o novo separador T_ROB1/Module1, pode confirmar que já existe um programa no controlador. Esse código existe no controlador devido à sincronização efetuada anteriormente. Todos os caminhos que foram selecionados, bem como as posturas utilizadas por esses caminhos, foram adicionados ao código RAPID. Pode ainda verificar a instrução de código atualmente a ser executada, marcada por uma seta amarela, e a instrução atual de movimento (entretanto já concluída), marcada por um pequeno robô. Como se pode confirmar, o robô está à espera da ativação duma entrada. Verifique que o mesmo se passa para o outro robô;
Um programa em RAPID pode ser separado em vários módulos, correspondendo cada módulo a um ficheiro, tal como acontece, por exemplo, em linguagem C. Aqui usar-se-á sempre apenas um módulo.
O módulo gerado automaticamente pelo RobotStudio com base nas posturas e caminhos criados tem tipicamente atribuído o nome Module1. A linha de código MODULE Module1 no início do ficheiro identifica isso mesmo, isto é, o início do módulo denominado Module1. Pode igualmente verificar que o módulo é terminado com a instrução ENDMODULE.
Imediatamente após o início do módulo encontra a definição das posturas definidas no ambiente gráfico do RobotStudio, sendo estas constantes (CONST) do tipo robtarget. Estes valores não deverão ser editados diretamente em código.
De seguida encontra procedimentos (funções), cujo início e fim estão identificados pelas instruções
PROC função() e ENDPROC, respetivamente. Estes procedimentos são o equivalente às funções
em linguagem C, podendo também ter argumentos. A função main, tal como em linguagem C, corresponde à função principal, sendo esta a função chamada quando o código arranca. Quando esta função terminar o programa termina a sua execução. Neste momento esta função não existe, pois não foi ainda definida, dado que foi definida a função Path_Part_surf como sendo a função de arranque (caso nada seja feito, por omissão a função main é a função principal, de arranque).
8. No código gerado pode confirmar que existem uma função, Path_Part_surf(), a qual corresponde exatamente aos caminhos criados anteriormente no ambiente gráfico;
9. Para resolver o problema de ser necessário ativar uma entrada para o sistema arrancar, basta agora adicionar essa instrução diretamente no código RAPID. De facto, para ter maiores garantias no arranque, devem sempre confirmar o estado inicial do sistema e
garantir as condições iniciais, tal como em automação. Assim, adicione a função main() de modo a que fique como mostra a Figura 96 e a Figura 97, para os robôs IRB1600_6kg_1.2m e IRB1600_6kg_1.2m_1, respetivamente. Note que ao começar a escrever uma dada instrução de código, automaticamente lhe é sugerido como terminar a mesma. Este auxílio à programação é tipo de qualquer editor de código recente, sendo bastante útil para evitar erros. As instruções iniciadas com “!” são comentários e deverão ser incluídos no código sempre que necessários. Deverá também utiliza-los na documentação das funções. De salientar ainda que o ciclo WHILE TRUE DO, que termina na instrução ENDWHILE, serve para ter um ciclo de funcionamento infinito, e que as várias variáveis utilizadas foram definidas no início do programa. Pode, no entanto, definir variáveis em cada função, tal como acontece noutras linguagens de programação. As funções serão explicadas em mais pormenor mais à frente neste tutorial.
PROC main()
! Ir para a postura base
MoveJ Home,v1000,z50,MyTool\WObj:=wobj0;
! Garantir condições iniciais
SetDO doOperationEnded,0;
WaitDI diStartOperation,0;
! Entrar no ciclo infinito WHILE TRUE DO
Path_Part_surf;
ENDWHILE ENDPROC
Figura 96 – Função main() para o robô IRB1600_6kg_1.2m.
PROC main()
! Ir para a postura base
MoveJ Home,v1000,z50,MyTool\WObj:=wobj0;
! Garantir condições iniciais
SetDO doOperationEnded,0;
WaitDI diStartOperation,0;
! Dar ordem de arranque ao outro robô
SetDO doOperationEnded,1;
! Entrar no ciclo infinito
WHILE TRUE DO
Path_Part_surf;
ENDWHILE
ENDPROC
Figura 97 – Função main()para o robô IRB1600_6kg_1.2m_1.
10. Apague a instrução inicial para movimentar para a postura Home da função Path_Part_surf em ambos os controladores, dado que essa instrução foi incluída na função main;
11. Neste momento efetuou as alterações propostas, mas as mesmas não foram ainda aplicadas ao controlador. Para tal deverá clicar em RAPID Apply (All Changes), atualizando assim o código em ambos os controladores;
12. Aceda a Simulation Simulation Setup e altere em T_ROB1, para ambos os controladores, a opção Entry point para main. Desta forma os controladores volta ao funcionamento padrão, isto é, em que a função main é a função principal, com a qual o controlador inicia. Clique em
Close;
13. Corra novamente a simulação clicando em Simulation Play e verifique que corre como esperado. Confirme que os robôs executam os caminhos ao longo das arestas, mas um de cada vez;
As alterações agora efetuadas ocorreram diretamente no código RAPID e foram aplicadas ao controlador, no entanto não estão disponíveis ainda no ambiente de trabalho gráfico.
14. Aceda ao menu Home e abra o separador Paths&Targets. Verificando os caminhos, pode confirmar que não contêm as alterações efetuadas diretamente no RAPID. Para sincronizar a informação no ambiente gráfico com a informação no controlador (virtual), escolha um dos controladores e aceda a RAPID Synchronize Synchronize to Station…. Na janela que aparece escolha apenas o que foi modificado, isto é, o caminho que alterou e a função main, tal como mostra a Figura 99, e clique em OK. Repita o processo para o outro controlador;
Figura 99 – Aplicação das alterações introduzidas no código.
15. Aceda novamente ao separador Paths&Targets do menu Home e confirme que os caminhos estão coerentes com a informação submetida diretamente em código RAPID (ver Figura 98);
Como pode constatar pelo exemplo anterior, no caso particular da função main(), a informação disponibilizada no ambiente gráfico (ver Figura 98) não corresponde
exatamente à informação introduzida anteriormente no código RAPID (ver Figura 96) em termos visuais. Tal deve-se ao facto de no ambiente gráfico apenas poder incluir instruções de movimento e ações, não podendo incluir instruções como declaração de variáveis ou lógica de programação (ciclos, testes de valor, etc.). Por esta razão é importante que apenas use o ambiente gráfico para criar posturas e caminhos, deixando o resto da programação para o código RAPID, tendo atenção à informação que sincroniza entre ambos.
A conjugação da criação de caminhos no ambiente gráfico, com a edição direta do código RAPID, permite criar simulações mais complexas, aliando uma fácil e prática criação de caminhos com a utilização de um conjunto vasto de instruções disponibilizadas pela linguagem RAPID, à semelhança de uma outra qualquer linguagem de programação (por exemplo, C). É assim possível criar execuções alternativas com base em, por exemplo, informação de sensores ou ordens externas.