fp@39: /****************************************************************************** fp@0: * fp@54: * c o m m a n d . h fp@0: * fp@0: * Struktur für ein EtherCAT-Kommando. fp@0: * fp@39: * $Id$ fp@0: * fp@39: *****************************************************************************/ fp@0: fp@0: #ifndef _EC_COMMAND_H_ fp@0: #define _EC_COMMAND_H_ fp@0: fp@54: #include "globals.h" fp@0: fp@41: /*****************************************************************************/ fp@41: fp@0: /** fp@0: Status eines EtherCAT-Kommandos. fp@0: */ fp@0: fp@0: typedef enum fp@0: { fp@54: EC_COMMAND_STATE_READY, EC_COMMAND_STATE_SENT, EC_COMMAND_STATE_RECEIVED fp@0: } fp@54: ec_command_state_t; fp@0: fp@41: /*****************************************************************************/ fp@41: fp@0: /** fp@0: EtherCAT-Adresse. fp@0: fp@68: Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die je nach fp@68: Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen fp@68: sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten- fp@68: adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und fp@68: vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse fp@68: auf dem Slave. 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@68: phy; /**< Physikalische Adresse */ 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@54: ec_address_t; fp@0: fp@39: /*****************************************************************************/ fp@0: fp@0: /** fp@0: EtherCAT-Kommando. fp@0: */ fp@0: fp@54: typedef struct ec_command fp@0: { fp@68: ec_command_type_t type; /**< Typ des Kommandos (APRD, NPWR, etc) */ fp@54: ec_address_t address; /**< Adresse des/der Empfänger */ fp@39: unsigned int data_length; /**< Länge der zu sendenden und/oder fp@39: empfangenen Daten */ fp@54: ec_command_state_t state; /**< Zustand des Kommandos fp@68: (bereit, gesendet, etc) */ fp@39: unsigned char index; /**< Kommando-Index, mit der das Kommando gesendet fp@39: wurde (wird vom Master beim Senden gesetzt. */ fp@39: unsigned int working_counter; /**< Working-Counter bei Empfang (wird fp@39: vom Master gesetzt) */ fp@54: unsigned char data[EC_FRAME_SIZE]; /**< Kommandodaten */ fp@0: } fp@54: ec_command_t; fp@0: fp@39: /*****************************************************************************/ fp@0: fp@54: void ec_command_read(ec_command_t *, unsigned short, unsigned short, fp@54: unsigned int); fp@54: void ec_command_write(ec_command_t *, unsigned short, unsigned short, fp@54: unsigned int, const unsigned char *); fp@54: void ec_command_position_read(ec_command_t *, short, unsigned short, fp@54: unsigned int); fp@54: void ec_command_position_write(ec_command_t *, short, unsigned short, fp@54: unsigned int, const unsigned char *); fp@54: void ec_command_broadcast_read(ec_command_t *, unsigned short, unsigned int); fp@54: void ec_command_broadcast_write(ec_command_t *, unsigned short, unsigned int, fp@54: const unsigned char *); fp@54: void ec_command_logical_read_write(ec_command_t *, unsigned int, unsigned int, fp@54: unsigned char *); fp@13: fp@39: /*****************************************************************************/ fp@0: fp@0: #endif