master/command.h
changeset 73 9f4ea66d89a3
parent 72 7c986b717411
child 74 9bf603942791
equal deleted inserted replaced
72:7c986b717411 73:9f4ea66d89a3
     1 /******************************************************************************
       
     2  *
       
     3  *  c o m m a n d . h
       
     4  *
       
     5  *  Struktur für ein EtherCAT-Kommando.
       
     6  *
       
     7  *  $Id$
       
     8  *
       
     9  *****************************************************************************/
       
    10 
       
    11 #ifndef _EC_COMMAND_H_
       
    12 #define _EC_COMMAND_H_
       
    13 
       
    14 #include "globals.h"
       
    15 
       
    16 /*****************************************************************************/
       
    17 
       
    18 /**
       
    19    Status eines EtherCAT-Kommandos.
       
    20 */
       
    21 
       
    22 typedef enum
       
    23 {
       
    24   EC_COMMAND_STATE_READY, EC_COMMAND_STATE_SENT, EC_COMMAND_STATE_RECEIVED
       
    25 }
       
    26 ec_command_state_t;
       
    27 
       
    28 /*****************************************************************************/
       
    29 
       
    30 /**
       
    31    EtherCAT-Adresse.
       
    32 
       
    33    Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die je nach
       
    34    Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen
       
    35    sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten-
       
    36    adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und
       
    37    vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse
       
    38    auf dem Slave. Bei einer logischen Adressierung entsprechen alle vier Bytes
       
    39    der logischen Adresse.
       
    40 */
       
    41 
       
    42 typedef union
       
    43 {
       
    44   struct
       
    45   {
       
    46     union
       
    47     {
       
    48       short pos; /**< (Negative) Ring-Position des Slaves */
       
    49       unsigned short node; /**< Konfigurierte Knotenadresse */
       
    50     }
       
    51     dev;
       
    52 
       
    53     unsigned short mem; /**< Physikalische Speicheradresse im Slave */
       
    54   }
       
    55   phy; /**< Physikalische Adresse */
       
    56 
       
    57   unsigned long logical; /**< Logische Adresse */
       
    58   unsigned char raw[4]; /**< Rohdaten für die Generierung des Frames */
       
    59 }
       
    60 ec_address_t;
       
    61 
       
    62 /*****************************************************************************/
       
    63 
       
    64 /**
       
    65    EtherCAT-Kommando.
       
    66 */
       
    67 
       
    68 typedef struct ec_command
       
    69 {
       
    70   ec_command_type_t type; /**< Typ des Kommandos (APRD, NPWR, etc) */
       
    71   ec_address_t address; /**< Adresse des/der Empfänger */
       
    72   unsigned int data_length; /**< Länge der zu sendenden und/oder
       
    73                                empfangenen Daten */
       
    74   ec_command_state_t state; /**< Zustand des Kommandos
       
    75                            (bereit, gesendet, etc) */
       
    76   unsigned char index; /**< Kommando-Index, mit der das Kommando gesendet
       
    77                           wurde (wird vom Master beim Senden gesetzt. */
       
    78   unsigned int working_counter; /**< Working-Counter bei Empfang (wird
       
    79                                    vom Master gesetzt) */
       
    80   unsigned char data[EC_FRAME_SIZE]; /**< Kommandodaten */
       
    81 }
       
    82 ec_command_t;
       
    83 
       
    84 /*****************************************************************************/
       
    85 
       
    86 void ec_command_read(ec_command_t *, unsigned short, unsigned short,
       
    87                      unsigned int);
       
    88 void ec_command_write(ec_command_t *, unsigned short, unsigned short,
       
    89                       unsigned int, const unsigned char *);
       
    90 void ec_command_position_read(ec_command_t *, short, unsigned short,
       
    91                               unsigned int);
       
    92 void ec_command_position_write(ec_command_t *, short, unsigned short,
       
    93                                unsigned int, const unsigned char *);
       
    94 void ec_command_broadcast_read(ec_command_t *, unsigned short, unsigned int);
       
    95 void ec_command_broadcast_write(ec_command_t *, unsigned short, unsigned int,
       
    96                                 const unsigned char *);
       
    97 void ec_command_logical_read_write(ec_command_t *, unsigned int, unsigned int,
       
    98                                    unsigned char *);
       
    99 
       
   100 /*****************************************************************************/
       
   101 
       
   102 #endif