fp@98: /****************************************************************************** fp@98: * fp@98: * c o m m a n d . h fp@98: * fp@98: * Struktur für ein EtherCAT-Kommando. fp@98: * fp@98: * $Id$ fp@98: * fp@98: *****************************************************************************/ fp@98: fp@98: #ifndef _EC_COMMAND_H_ fp@98: #define _EC_COMMAND_H_ fp@98: fp@98: #include fp@98: fp@98: #include "globals.h" fp@98: fp@98: /*****************************************************************************/ fp@98: fp@98: /** fp@98: EtherCAT-Kommando-Typ. fp@98: */ fp@98: fp@98: typedef enum fp@98: { fp@98: EC_CMD_NONE = 0x00, /**< Dummy */ fp@98: EC_CMD_APRD = 0x01, /**< Auto-increment physical read */ fp@98: EC_CMD_APWR = 0x02, /**< Auto-increment physical write */ fp@98: EC_CMD_NPRD = 0x04, /**< Node-addressed physical read */ fp@98: EC_CMD_NPWR = 0x05, /**< Node-addressed physical write */ fp@98: EC_CMD_BRD = 0x07, /**< Broadcast read */ fp@98: EC_CMD_BWR = 0x08, /**< Broadcast write */ fp@98: EC_CMD_LRW = 0x0C /**< Logical read/write */ fp@98: } fp@98: ec_command_type_t; fp@98: fp@98: /** fp@98: EtherCAT-Kommando-Zustand. fp@98: */ fp@98: fp@98: typedef enum fp@98: { fp@98: EC_CMD_INIT, /**< Neues Kommando */ fp@98: EC_CMD_QUEUED, /**< Kommando in Warteschlange */ fp@98: EC_CMD_SENT, /**< Kommando gesendet */ fp@98: EC_CMD_RECEIVED, /**< Kommando empfangen */ fp@98: EC_CMD_TIMEOUT, /**< Zeitgrenze überschritten */ fp@98: EC_CMD_ERROR /**< Fehler beim Senden oder Empfangen */ fp@98: } fp@98: ec_command_state_t; fp@98: fp@98: /*****************************************************************************/ fp@98: fp@98: /** fp@98: EtherCAT-Adresse. fp@98: fp@98: Im EtherCAT-Kommando sind 4 Bytes für die Adresse reserviert, die je nach fp@98: Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen fp@98: sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten- fp@98: adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und fp@98: vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse fp@98: auf dem Slave. Bei einer logischen Adressierung entsprechen alle vier Bytes fp@98: der logischen Adresse. fp@98: */ fp@98: fp@98: typedef union fp@98: { fp@98: struct fp@98: { fp@98: uint16_t slave; /**< Adresse des Slaves (Ringposition oder Knoten) */ fp@98: uint16_t mem; /**< Physikalische Speicheradresse im Slave */ fp@98: } fp@98: physical; /**< Physikalische Adresse */ fp@98: fp@98: uint32_t logical; /**< Logische Adresse */ fp@98: } fp@98: ec_address_t; fp@98: fp@98: /*****************************************************************************/ fp@98: fp@98: /** fp@98: EtherCAT-Kommando. fp@98: */ fp@98: fp@98: typedef struct fp@98: { fp@98: struct list_head list; /**< Nötig für Liste */ fp@98: ec_command_type_t type; /**< Typ des Kommandos (APRD, NPWR, etc) */ fp@98: ec_address_t address; /**< Adresse des/der Empfänger */ fp@98: uint8_t data[EC_MAX_DATA_SIZE]; /**< Kommandodaten */ fp@98: size_t data_size; /**< Länge der zu sendenden und/oder empfangenen Daten */ fp@98: uint8_t index; /**< Kommando-Index, wird vom Master beim Senden gesetzt. */ fp@98: uint16_t working_counter; /**< Working-Counter */ fp@98: ec_command_state_t state; /**< Zustand */ fp@98: } fp@98: ec_command_t; fp@98: fp@98: /*****************************************************************************/ fp@98: fp@98: void ec_command_init_nprd(ec_command_t *, uint16_t, uint16_t, size_t); fp@98: void ec_command_init_npwr(ec_command_t *, uint16_t, uint16_t, size_t, fp@98: const uint8_t *); fp@98: void ec_command_init_aprd(ec_command_t *, uint16_t, uint16_t, size_t); fp@98: void ec_command_init_apwr(ec_command_t *, uint16_t, uint16_t, size_t, fp@98: const uint8_t *); fp@98: void ec_command_init_brd(ec_command_t *, uint16_t, size_t); fp@98: void ec_command_init_bwr(ec_command_t *, uint16_t, size_t, const uint8_t *); fp@98: void ec_command_init_lrw(ec_command_t *, uint32_t, size_t, uint8_t *); fp@98: fp@98: /*****************************************************************************/ fp@98: fp@98: #endif fp@98: fp@98: /* Emacs-Konfiguration fp@98: ;;; Local Variables: *** fp@98: ;;; c-basic-offset:4 *** fp@98: ;;; End: *** fp@98: */