master/command.h
changeset 54 7506e67dd122
parent 41 42c66194c0c8
child 68 a452700db994
equal deleted inserted replaced
53:6b3b8acb71b5 54:7506e67dd122
       
     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
       
    34    ja nach Kommandoty eine andere bedeutung haben: Bei Autoinkrement-
       
    35    befehlen sind die ersten zwei Bytes die (negative)
       
    36    Autoinkrement-Adresse, bei Knoten-adressierten Befehlen entsprechen
       
    37    sie der Knotenadresse. Das dritte und vierte Byte entspricht in
       
    38    diesen Fällen der physikalischen Speicheradresse auf dem Slave.
       
    39    Bei einer logischen Adressierung entsprechen alle vier Bytes
       
    40    der logischen Adresse.
       
    41 */
       
    42 
       
    43 typedef union
       
    44 {
       
    45   struct
       
    46   {
       
    47     union
       
    48     {
       
    49       short pos; /**< (Negative) Ring-Position des Slaves */
       
    50       unsigned short node; /**< Konfigurierte Knotenadresse */
       
    51     }
       
    52     dev;
       
    53 
       
    54     unsigned short mem; /**< Physikalische Speicheradresse im Slave */
       
    55   }
       
    56   phy;
       
    57 
       
    58   unsigned long logical; /**< Logische Adresse */
       
    59   unsigned char raw[4]; /**< Rohdaten für die Generierung des Frames */
       
    60 }
       
    61 ec_address_t;
       
    62 
       
    63 /*****************************************************************************/
       
    64 
       
    65 /**
       
    66    EtherCAT-Kommando.
       
    67 */
       
    68 
       
    69 typedef struct ec_command
       
    70 {
       
    71   ec_command_type_t type; /**< Typ des Kommandos (APRD, NPWR, etc...) */
       
    72   ec_address_t address; /**< Adresse des/der Empfänger */
       
    73   unsigned int data_length; /**< Länge der zu sendenden und/oder
       
    74                                empfangenen Daten */
       
    75   ec_command_state_t state; /**< Zustand des Kommandos
       
    76                            (bereit, gesendet, etc...) */
       
    77   unsigned char index; /**< Kommando-Index, mit der das Kommando gesendet
       
    78                           wurde (wird vom Master beim Senden gesetzt. */
       
    79   unsigned int working_counter; /**< Working-Counter bei Empfang (wird
       
    80                                    vom Master gesetzt) */
       
    81   unsigned char data[EC_FRAME_SIZE]; /**< Kommandodaten */
       
    82 }
       
    83 ec_command_t;
       
    84 
       
    85 /*****************************************************************************/
       
    86 
       
    87 void ec_command_read(ec_command_t *, unsigned short, unsigned short,
       
    88                      unsigned int);
       
    89 void ec_command_write(ec_command_t *, unsigned short, unsigned short,
       
    90                       unsigned int, const unsigned char *);
       
    91 void ec_command_position_read(ec_command_t *, short, unsigned short,
       
    92                               unsigned int);
       
    93 void ec_command_position_write(ec_command_t *, short, unsigned short,
       
    94                                unsigned int, const unsigned char *);
       
    95 void ec_command_broadcast_read(ec_command_t *, unsigned short, unsigned int);
       
    96 void ec_command_broadcast_write(ec_command_t *, unsigned short, unsigned int,
       
    97                                 const unsigned char *);
       
    98 void ec_command_logical_read_write(ec_command_t *, unsigned int, unsigned int,
       
    99                                    unsigned char *);
       
   100 
       
   101 /*****************************************************************************/
       
   102 
       
   103 #endif