Capítulo 5 CONCLUSÃO
A.5. Configurando e Utilizando Objetos
A.5.2. Configurando um Objeto
A m aioria dos objetos utilizados no robô também são configurados no arquivo
ROBAllBoot.Config enviado ao microprocessador no momento em que o sistema é ligado.
Os objetos configurados devem ser uma extensão de Objects definido no módulo Base apresentado a seguir:
TYPE
Object*=POINTER TO ObjDesc; ObjDesc*=R EC O RD (O bjects.O bjD esc)
PROCEDURE (obj : Object; name: A R R A Y OF C H A R ): BOOLEAN; END;
Ao fazermos com que este objeto seja uma extensão de Objects. ObjDesc,
podemos também utilizar suas propriedades que são:
• retirar e colocar objetos no banco de dados;
• possibilidade de inspeção dos dados.
Para criar um objeto necessitamos obrigatoriamente dos procedimentos
DefObject, NewObject e do método Assign.
M ostraremos a seguir como escrever estes procedimentos, criando o objeto
CarthKin, usado na determinação dos parâmetros cinemáticos do robô.
Iniciamos com a definição do tipo CarthKin.
TYPE
CarthKin* = POINTER TO CarthKinDesc; CarthKinDesc* = RECORD (Base.O bjD esc)
zO*, 11*, 12*, 1111*, 1212*, 1112*, rM in*, rMax* : LONGREAL; d* : A R R A Y 4 OF Drive.Drive;
m inq-, maxq- :ARRAY 4 OF REAL; END;
CarthKin é um ponteiro para CarthKinDesc que por sua vez é extensão de
A - A Linguagem XOberon 116
Dos novos campos introduzidos, alguns são do tipo LONGREAL, outros são vetores de quatro elementos reais e outro é um vetor de quatro elementos do tipo
Drive.
Este tipo Drive é um objeto previamente definido e que será visto em maiores detalhes em capítulo posterior.
Feita a definição do tipo CarthKin, prosseguimos escrevendo o procedimento básico para configurar o objeto.
PROCEDURE DefCarthKinematic*; V A R k : CarthKin; ok :=BOOLEAN; BEGIN NewCarthKinematic; k:=O.NewObj(CarthKin); ok := Parser.Parse(k); END; EN D DefCarthKinematic;
Esta estrutura se repete toda vez que formos configurar um objeto. É importante identificar corretamente o nome do objeto que neste caso é CarthKin e que deve concordar com o nome do tipo anteriormente definido.
N a prim eira linha do corpo é chamado o procedimento NewCarthKinematic,
cuja estrutura é apresentada a seguir.
PROCEDURE NewCarthKinematic*; V A R k : CarthKin; BEG IN NEW (k); k.handle:=Handler; O.NewObj:=k; EN D NewCarthKinematic;
Este comando gera um novo objeto, alocando um espaço na memória. A variável k tem de ser do tipo CarthKin. Esta é a versão mais breve possível de um comando para gerar um objeto.
A - A Linguagem XOberon 117
Concluído o procedimento NewCarthKinematic, retom am os ao procedimento
DefCarthKinematic que executa o comando Parser.Parse(k). Este comando chama o método Assign apresentado a seguir, já enviando os parâmetros formais necessários.
PROCEDURE (k : CarthKin) A ssign* (o : Base.Object; nam e : A R R A Y OF CHAR) : BOOLEAN;
V A R value : Base.Value; a : LONGINT; BEGIN
IF (o=N IL ) TH EN RETURN FALSE
ELSIF (o IS Base.V alue) THEN value:=o(B ase.V alue); IF name = 'ZO' THEN
k.zO:=value.x; ELSIF name = 'LI' THEN
k.ll:=valu e.x; ELSIF name = 'L2' THEN
k.l2:=value.x;
ELSE R ETURN k .A ssign A(o, name); END
ELSIF o IS D rive.D rive THEN
IF name = 'driveO' THEN k.d[0]:=o(D rive.D rive) ELSIF name = 'drivel' THEN k .d [l]:= o(D rive.D rive) ELSIF name = 'drive2' TH EN k.d[2] :=o(D rive.D rive) ELSIF name = 'drive3' THEN k.d[3]:=o(D rive.D rive) END;
ELSE RETUR N k .A ssign A (o, name) END; R ETURN TRUE;
EN D A ssign;
O método Assign estabelece a correspondência entre o nome fornecido na configuração e a variável que deve assumir o valor atribuído a este nome.
Veremos como é a linha referente a configuração deste objeto, pertencente ao arquivo ROBAllBoot.Config.
SCARACarthKin.DefCarthKinematics SCCKin (Z 0= 0.665, L l= 0 .2 5 , 12=0.25, drive0=D rive0, drive l= D r iv e l, drive2=Drive2, drive3=Drive3);
Nesta configuração o comando DefCarthKinematics é chamado e toda a seqüência apresentada é executada, inclusive o método Assign. O método Assign lê cada nome e seu valor correspondente escritos dentro dos parêntesis e faz com que a campo desejado de Carthkin assuma este valor.
Nas linhas
A - A Linguagem XOberon 118
k.z0:=value.x; a variável k.zO assume o valor 0.665.
Se todo método Assign pode ser executado sem nenhum tipo de conflito, o comando Parser.Parse assume o valor booleano TRUE e a configuração foi completada.
Ao final deste processo temos um objeto do tipo CarthKin de nome SCCKin e com os campos: • z0 = 0.665; • 11 = 0.25; • 12 = 0.25; • d[0] = DriveO; • d [l] = D riv e l; • d[2] = Drive2; • d[3] = Drive3;
Estes dados estão numa biblioteca e ainda não podem ser utilizados por outros módulos. Mostraremos como ter acesso a estes dados, apresentando o módulo a seguir.
M O DU LE Get;
(* utilizar dados do objeto SCCKin *) IMPORT
SCK := SCARACarthKin, O :=Objects, Base; V A R
k i n : SCK. CarthKin;
PROCEDURE GetScaraCarthKin (name : A R R A Y OF CHAR; V A R k: SCK.CarthKin) : BOOLEAN;
V A R
obj: Base.Object; BEGIN
Base.GetObj( name, obj);
IF (obj = NIL) OR ~(obj IS SCK.CarthKin) THEN R ETUR N FALSE; ELSE k := obj(SCK.CarthKin); R ETURN TRUE; END; EN D GetScaraCarthKin; PROCEDURE Init; V A R
A - A Linguagem XOberon 119 m u lt i: REAL; BEGIN k in .llll :=kin.ll * k in .ll: kin.1212 := kin.l2*kin,12; kin.1112 := k in .ll *kin.l2; multi := k in.ll*k in .l2/kin .z0 EN D Init;
PROCEDURE Confíguration; V A R
k inC onfigurated: BOOLEAN; BEGIN
kinConfigurated := GetScaraCarthKin(‘SCC K in’, kin); IF kinConfigurated THEN Init
ELSE HALT(120); END; E N D Confíguration; BEG IN Confíguration; EN D Get.
No momento que este módulo é carregado, o procedimento Confíguration é
automaticamente executado. Este procedimento chama o procedimento
GetScaraCarthKin que busca da biblioteca o objeto de nome SCCKin do tipo
CarthKin. Inicialmente é feita a conferência se existe um objeto na biblioteca de nome
SCCKin e se este objeto é do tipo SCK. CarthKin. Se estiver correto, a variável kin
assume os valores de SCCKin. Na verdade, estamos criando um ponteiro de nome kin
que aponta para este objeto SCCKin. Para utilizar os vários campos deste objeto devemos utilizar agora o nome do ponteiro. No procedimento Init por exemplo, alguns campos do objeto SCCKin são utilizados com o nome do ponteiro kin para o cálculo
A configuração de objetos na linguagem XOberon não é muito simples e infelizmente não temos informações precisas sobre o que cada linha destes procedimentos faz exatamente. O que normalmente fazemos quando queremos criar um novo objeto é utilizar uma configuração de um objeto já existente e adequar esta configuração a este novo objeto.
Desta forma concluímos o exemplo sobre configuração de objetos. Existem variações de acordo com o tipo de objeto a ser configurado, mas a idéia básica permanece a mesma.
APÊNDICE B
O ROBÔ EM FUNCIONAMENTO
B .l Introdução
Este capítulo descreve as ações necessárias para colocar o robô em funcionamento, abrangendo desde o estabelecimento da comunicação entre o microcomputador ( H o s t) e o microprocessador ( T a rg e t) até os comandos utilizados para movimentá-lo.