fp@73: /****************************************************************************** fp@73: * fp@73: * f r a m e . h fp@73: * fp@73: * Struktur für einen EtherCAT-Rahmen. fp@73: * fp@73: * $Id$ fp@73: * fp@73: *****************************************************************************/ fp@73: fp@73: #ifndef _EC_FRAME_H_ fp@73: #define _EC_FRAME_H_ fp@73: fp@73: #include "globals.h" fp@73: #include "../include/EtherCAT_rt.h" fp@73: fp@73: /*****************************************************************************/ fp@73: fp@73: #define EC_MAX_DATA_SIZE (EC_MAX_FRAME_SIZE - EC_FRAME_HEADER_SIZE \ fp@73: - EC_COMMAND_HEADER_SIZE \ fp@73: - EC_COMMAND_FOOTER_SIZE) fp@73: fp@73: /*****************************************************************************/ fp@73: fp@73: /** fp@73: Status eines EtherCAT-Rahmens. fp@73: */ fp@73: fp@73: typedef enum { fp@73: ec_frame_ready, ec_frame_sent, ec_frame_received fp@73: } fp@73: ec_frame_state_t; fp@73: fp@73: /*****************************************************************************/ fp@73: fp@73: /** fp@73: EtherCAT-Rahmen-Typ fp@73: */ fp@73: fp@73: typedef enum fp@73: { fp@73: ec_frame_type_none = 0x00, /**< Dummy */ fp@73: ec_frame_type_aprd = 0x01, /**< Auto-increment physical read */ fp@73: ec_frame_type_apwr = 0x02, /**< Auto-increment physical write */ fp@73: ec_frame_type_nprd = 0x04, /**< Node-addressed physical read */ fp@73: ec_frame_type_npwr = 0x05, /**< Node-addressed physical write */ fp@73: ec_frame_type_brd = 0x07, /**< Broadcast read */ fp@73: ec_frame_type_bwr = 0x08, /**< Broadcast write */ fp@73: ec_frame_type_lrw = 0x0C /**< Logical read/write */ fp@73: } fp@73: ec_frame_type_t; fp@73: fp@73: /*****************************************************************************/ fp@73: fp@73: /** fp@73: EtherCAT-Adresse. fp@73: fp@73: Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die je nach fp@73: Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen fp@73: sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten- fp@73: adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und fp@73: vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse fp@73: auf dem Slave. Bei einer logischen Adressierung entsprechen alle vier Bytes fp@73: der logischen Adresse. fp@73: */ fp@73: fp@73: typedef union fp@73: { fp@73: struct fp@73: { fp@73: uint16_t slave; /**< Adresse des Slaves */ fp@73: uint16_t mem; /**< Physikalische Speicheradresse im Slave */ fp@73: } fp@73: physical; /**< Physikalische Adresse */ fp@73: fp@73: uint32_t logical; /**< Logische Adresse */ fp@73: uint8_t raw[4]; /**< Rohdaten für die Generierung des Frames */ fp@73: } fp@73: ec_address_t; fp@73: fp@73: /*****************************************************************************/ fp@73: fp@73: /** fp@73: EtherCAT-Frame. fp@73: */ fp@73: fp@73: typedef struct fp@73: { fp@73: ec_master_t *master; /**< EtherCAT-Master */ fp@73: ec_frame_type_t type; /**< Typ des Frames (APRD, NPWR, etc) */ fp@73: ec_address_t address; /**< Adresse des/der Empfänger */ fp@73: unsigned int data_length; /**< Länge der zu sendenden und/oder empfangenen fp@73: Daten */ fp@73: ec_frame_state_t state; /**< Zustand des Kommandos */ fp@73: uint8_t index; /**< Kommando-Index, mit dem der Frame gesendet wurde fp@73: (wird vom Master beim Senden gesetzt). */ fp@73: uint16_t working_counter; /**< Working-Counter */ fp@73: uint8_t data[EC_MAX_FRAME_SIZE]; /**< Rahmendaten */ fp@73: } fp@73: ec_frame_t; fp@73: fp@73: /*****************************************************************************/ fp@73: fp@73: void ec_frame_init_nprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, fp@73: unsigned int); fp@73: void ec_frame_init_npwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, fp@73: unsigned int, const unsigned char *); fp@73: void ec_frame_init_aprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, fp@73: unsigned int); fp@73: void ec_frame_init_apwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, fp@73: unsigned int, const unsigned char *); fp@73: void ec_frame_init_brd(ec_frame_t *, ec_master_t *, uint16_t, unsigned int); fp@73: void ec_frame_init_bwr(ec_frame_t *, ec_master_t *, uint16_t, unsigned int, fp@73: const unsigned char *); fp@73: void ec_frame_init_lrw(ec_frame_t *, ec_master_t *, uint32_t, unsigned int, fp@73: unsigned char *); fp@73: fp@73: int ec_frame_send(ec_frame_t *); fp@73: int ec_frame_receive(ec_frame_t *); fp@73: int ec_frame_send_receive(ec_frame_t *); fp@73: fp@73: void ec_frame_print(const ec_frame_t *); fp@73: fp@73: /*****************************************************************************/ fp@73: fp@73: #endif fp@73: fp@73: /* Emacs-Konfiguration fp@73: ;;; Local Variables: *** fp@73: ;;; c-basic-offset:4 *** fp@73: ;;; End: *** fp@73: */