# Automatico EXT Kuka

Gestione Automatico Esterno Kuka, senza PLC esterni, ma con modulo esterno IO Beckhoff.

# Automatico EXT con IO esterno

### Modulo IO Esterno

Il sistema utilizza un modulo di I/O esterno Beckhoff per la gestione dei segnali del robot KUKA.

[ ![IO Beckhoff](https://automation-doc.it/uploads/images/gallery/2026-01/scaled-1680-/io-beckhoff.jpeg) ](https://automation-doc.it/uploads/images/gallery/2026-01/io-beckhoff.jpeg)

### Logica dei ponticelli

I segnali di ingresso richiesti dal controllore KUKA vengono ottenuti tramite ponticellatura delle uscite selezionate sul modulo di I/O esterno. La numerazione degli I/O segue lo schema illustrato nell’immagine seguente.

[ ![Numerazione IO](https://automation-doc.it/uploads/images/gallery/2026-01/scaled-1680-/io-number.png) ](https://automation-doc.it/uploads/images/gallery/2026-01/io-number.png)

### Configurazione dei segnali di sistema

Come primo passo, è necessario configurare il file:

**STEU → Mada → `$machine.dat`**

Andando ad assegnare ai vari segnali, gli ingressi EtherCAT:

```bash
SIGNAL $EXT_START $IN[209] ;EXTERNER START
SIGNAL $MOVE_ENABLE $IN[210] ;FAHRFREIGABE GESAMT
SIGNAL $CONF_MESS $IN[211] ;EXTERNE QUITTUNG
SIGNAL $DRIVES_ON $IN[212] ;ANTRIEBE EIN
```

### Configurazione delle uscite

Le uscite utilizzate per la gestione dei segnali EXT devono essere definite nel file `IO.dat`, come mostrato di seguito.

**File `IO.dat`:**

```bash
GLOBAL SIGNAL out_SYS_ExtStart         $OUT[213]
GLOBAL SIGNAL out_SYS_MoveEnable       $OUT[214]
GLOBAL SIGNAL out_SYS_ConfMess         $OUT[215]
GLOBAL SIGNAL out_SYS_DrivesOn         $OUT[216]
```

A questo punto, la configurazione degli ingressi e delle uscite risulta completata.

### Gestione SPS e modalità EXT

All’interno del controllore KUKA è presente un programma SPS che gestisce, tramite interrupt, i segnali di *Start*, *Stop* e le altre funzioni di controllo in modalità EXT.

Questo programma è denominato `<strong>ExtManager.sub</strong>` e contiene il seguente codice:

```vbscript
&ACCESS RVP
&COMMENT USER specified PLC program
DEF  ExtManager ( )
;FOLD DECLARATIONS
  ;FOLD USER DECL
  ; Please insert user defined declarations

  ;ENDFOLD (USER DECL)
;ENDFOLD (DECLARATIONS)
;FOLD INI
  ;FOLD USER INIT
  ; Please insert user defined initialization commands
      INTERRUPT DECL nStopBtn WHEN inStopRobot DO EXT_STOP() ;Nel caso in cui l'ingresso del pulsante di stop sia negato, basta mettere NOT
      INTERRUPT ON nStopBtn
      INTERRUPT DECL nStartBtn WHEN inStartRobot DO EXT_START()
      INTERRUPT ON nStartBtn      
      INTERRUPT DECL nIntExtSelect WHEN $EXT DO EXT_SELECT()
      INTERRUPT ON nIntExtSelect
  ;ENDFOLD (USER INIT)
;ENDFOLD (INI)

LOOP
   IF NOT out_SYS_MoveEnable THEN
      out_SYS_MoveEnable = TRUE
   ENDIF
ENDLOOP
END

DEF EXT_INI ()
   out_SYS_ExtStart = FALSE
   out_SYS_ConfMess = FALSE
   out_SYS_DrivesOn = FALSE
END

DEF EXT_STOP()
   DECL STATE_T STAT
   DECL MODUS_T MODE
   
   INTERRUPT OFF nStartBtn
   
   MODE=#SYNC
   
   IF $PRO_STATE1 <> #P_FREE THEN
      CWRITE($CMD,STAT,MODE,"STOP 1")
   ENDIF
   
   INTERRUPT ON nStartBtn
END

DEF EXT_START()
   INTERRUPT OFF nStartBtn
   IF (NOT $PRO_ACT)THEN
      EXT_INI()
      
      $TIMER[nTimeOutExt] = - tTimeOutExt
      $TIMER_STOP[nTimeOutExt] = FALSE
      nExtState = 0
      
      WHILE NOT $TIMER_FLAG[nTimeOutExt]
         SWITCH nExtState
            CASE 0
               IF NOT $PERI_RDY THEN
                  out_SYS_DrivesOn = TRUE
                  nExtState = 0
               ELSE
                  out_SYS_DrivesOn = FALSE
                  nExtState = 1
               ENDIF
               
            CASE 1
               IF $STOPMESS THEN
                  out_SYS_ConfMess = TRUE
                  nExtState = 1
               ELSE
                  out_SYS_ConfMess = FALSE
                  nExtState = 2
               ENDIF
               
            CASE 2
               IF NOT $PRO_ACT THEN
                  out_SYS_ExtStart = TRUE
                  nExtState = 2
               ELSE
                  out_SYS_ExtStart = FALSE
                  nExtState = 3
               ENDIF
               
            CASE 3
               $TIMER_STOP[nTimeOutExt] = TRUE
               nExtState = 0
               EXIT
         ENDSWITCH
      ENDWHILE
      EXT_INI ()
   ENDIF
    
   INTERRUPT ON nStartBtn
END

DEF EXT_SELECT ()
   DECL STATE_T STAT
   DECL MODUS_T MODE
   
   INTERRUPT OFF nIntExtSelect
   
   MODE=#SYNC
   
   IF $PRO_STATE1 == #P_FREE THEN
      CWRITE($CMD,STAT,MODE,"RUN /R1/MAIN()")
      CWRITE($CMD,STAT,MODE,"STOP 1")
      CWRITE($CMD,STAT,MODE,"RESET 1")
   ENDIF
   
   INTERRUPT ON nIntExtSelect
END
```

In questo contesto, il timer utilizzato per la gestione dello Start fa riferimento alla variabile **nTimeOutExt**, definita nel file `Globals.dat`.

# Automatico EXT con PLC Siemens

test 2