Implementierung über PLC

In der SPS wird das Dynamische Koordinatensystem (DK) aktiviert, sobald transition_w.command := 1 gesetzt ist. Dabei wechselt der Zustand des DK von 0 nach 1 und dann 2 (s. Abb. „Zustand des dynamischen Koordinatensystems“ in Kapitel „PLC als Master“). Entsprechend müssen die gewünschten Parameter davor gesetzt sein.

Achtung

attention

Um das DK zu aktivieren wird hier eine M-Funktion (M100) verwendet werden, da eine Aktivierung über #TRACK CS ON das DK ein zweites Mal aktiviert und zu abnormalem Verhalten führen kann.

Programmierbeispiel

prg_example

SPS

PROGRAM DynCsPLC_M

VAR

  Init : BOOL;

  KbCs : HLI_COORDINATE_SYSTEM_INT;

  pDynCs : POINTER TO MC_CONTROL_DYN_CS_UNIT;

END_VAR

IF NOT      Init

THEN

  pDynCs^.enable_w   := TRUE;

(*Verschiebung zum Drehtischmittelpunkt*)

  kb_cs.translation[0]               := DINT#-13059200;

  kb_cs.translation[1]               := DINT#0;

  kb_cs.translation[2]               := DINT#800000;

  kb_cs.rotation[0]                  := DINT#0;

  kb_cs.rotation[1]                  := DINT#0;

  kb_cs.rotation[2]                  := DINT#0;

(*Setzten der konfig. Parameter*)

  pDynCs^.transition_w.f_kin_base        := TRUE;

  pDynCs^.transition_w.f_set_zero        := FALSE;

  pDynCs^.transition_w.f_rot_trans       := FALSE;

  pDynCs^.transition_w.filter_max_ticks  := UDINT#0;

  pDynCs^.transition_w.option            := UDINT#1;

  pDynCs^.transition_w.kinematic_base_cs := kb_cs;

  pDynCs^.transition_w.f_wait            := TRUE;

  Init := TRUE;

END_IF;

(* Wurde mit M100 das DK aktiviert*)

(*IF M100.ACTIVE THEN *)

  pDynCs^.transition_w.command := DINT#1;

  (*M100.ACTIVE := FALSE     Trigger zurücksetzen *)

(* END_IF *)

(* Wurde mit M101 das DK deaktiviert*)

(*IF M101.ACTIVE THEN *)

  pDynCs^.transition_w.command := DINT#-1;

  (*M101.ACTIVE := FALSE      Trigger zurücksetzen *)

(* END_IF *)

(* Rotation um den in KbCs gesetzten Nullpunkt, *)

(* um Z-Achse mit Winkel der Drehachse des Tisches*)

IF pDynCs^.state_r.actual_state = UDINT#2 AND
   pDynCs^.command_semaphor_rw = FALSE

THEN

  pDynCs^.command_w.rotation[2]:=     gpAx[6]^.lr_state.current_position_acs_r;

  pDynCs^.command_semaphor_rw    := TRUE;

END_IF;

Programmierbeispiel

prg_example

Slave

N200 X1305.92 Y0

N210 M100
N230 G92 X1305.92
N240 Z90

; Roboter auf Drehachse positioniert um Sprünge
; zu verhindern

; Drehtisch (X1) wird unabhängig vom Roboter gedreht
N250 X0 Y0 X1[INDP_ASYN POS=-90 G01 F500 G90]
N260 Z80
N270 X-60
N280 X60
N290 X0
N300 Y-60
N310 Y60
N320 Z90

N480 #WAIT INDP ALL

; Roboter zum Drehtisch Mittelpunkt um Sprünge
; zu verhindern

N490 G01 X0 Y0
N500 M101

Programmierbeispiel

prg_example

SDA

m_synch[100]       MVS_SVS     ( Activate dynamic CS)

m_synch[101]       MVS_SVS     ( Deactivate dynamic CS)