fp@0: /**************************************************************** fp@0: * fp@0: * e c _ c o m m a n d . h fp@0: * fp@0: * Struktur für ein EtherCAT-Kommando. fp@0: * fp@0: * $Date$ fp@0: * $Author$ fp@0: * fp@0: ***************************************************************/ fp@0: fp@0: #ifndef _EC_COMMAND_H_ fp@0: #define _EC_COMMAND_H_ fp@0: fp@0: #include "ec_globals.h" fp@0: fp@0: /** fp@0: Status eines EtherCAT-Kommandos. fp@0: */ fp@0: fp@0: typedef enum fp@0: { fp@0: ECAT_CS_READY, ECAT_CS_SENT, ECAT_CS_RECEIVED fp@0: } fp@0: EtherCAT_command_state_t; fp@0: fp@0: /** fp@0: EtherCAT-Adresse. fp@0: fp@0: Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die fp@0: ja nach Kommandoty eine andere bedeutung haben: Bei Autoinkrement- fp@0: befehlen sind die ersten zwei Bytes die (negative) fp@0: Autoinkrement-Adresse, bei Knoten-adressierten Befehlen entsprechen fp@0: sie der Knotenadresse. Das dritte und vierte Byte entspricht in fp@0: diesen Fällen der physikalischen Speicheradresse auf dem Slave. fp@0: Bei einer logischen Adressierung entsprechen alle vier Bytes fp@0: der logischen Adresse. fp@0: */ fp@0: fp@0: typedef union fp@0: { fp@0: struct fp@0: { fp@0: union fp@0: { fp@0: short pos; /**< (Negative) Ring-Position des Slaves */ fp@0: unsigned short node; /**< Konfigurierte Knotenadresse */ fp@0: } fp@0: dev; fp@0: fp@0: unsigned short mem; /**< Physikalische Speicheradresse im Slave */ fp@0: } fp@0: phy; fp@0: fp@0: unsigned long logical; /**< Logische Adresse */ fp@13: unsigned char raw[4]; /**< Rohdaten für die Generierung des Frames */ fp@0: } fp@0: EtherCAT_address_t; fp@0: fp@0: /***************************************************************/ fp@0: fp@0: /** fp@0: EtherCAT-Kommando. fp@0: */ fp@0: fp@0: typedef struct EtherCAT_command fp@0: { fp@0: EtherCAT_cmd_type_t type; /**< Typ des Kommandos (APRD, NPWR, etc...) */ fp@0: EtherCAT_address_t address; /**< Adresse des/der Empfänger */ fp@0: unsigned int data_length; /**< Länge der zu sendenden und/oder empfangenen Daten */ fp@0: fp@0: EtherCAT_command_state_t state; /**< Zustand des Kommandos (bereit, gesendet, etc...) */ fp@0: unsigned char index; /**< Kommando-Index, mit der das Kommando gesendet wurde (wird fp@25: vom Master beim Senden gesetzt. */ fp@0: unsigned int working_counter; /**< Working-Counter bei Empfang (wird vom Master gesetzt) */ fp@0: fp@0: unsigned char data[ECAT_FRAME_BUFFER_SIZE]; /**< Kommandodaten */ fp@0: } fp@0: EtherCAT_command_t; fp@0: fp@0: /***************************************************************/ fp@0: fp@0: void EtherCAT_command_init(EtherCAT_command_t *); fp@0: void EtherCAT_command_clear(EtherCAT_command_t *); fp@0: fp@13: void EtherCAT_command_read(EtherCAT_command_t *, fp@13: unsigned short, fp@13: unsigned short, fp@13: unsigned int); fp@13: void EtherCAT_command_write(EtherCAT_command_t *, fp@13: unsigned short, fp@13: unsigned short, fp@13: unsigned int, fp@13: const unsigned char *); fp@13: void EtherCAT_command_position_read(EtherCAT_command_t *, fp@13: short, fp@13: unsigned short, fp@13: unsigned int); fp@13: void EtherCAT_command_position_write(EtherCAT_command_t *, fp@13: short, fp@13: unsigned short, fp@13: unsigned int, fp@13: const unsigned char *); fp@13: void EtherCAT_command_broadcast_read(EtherCAT_command_t *, fp@13: unsigned short, fp@13: unsigned int); fp@13: void EtherCAT_command_broadcast_write(EtherCAT_command_t *, fp@13: unsigned short, fp@13: unsigned int, fp@13: const unsigned char *); fp@13: void EtherCAT_command_logical_read_write(EtherCAT_command_t *, fp@13: unsigned int, fp@13: unsigned int, fp@13: unsigned char *); fp@13: fp@0: /***************************************************************/ fp@0: fp@0: #endif