|
1 /**************************************************************** |
|
2 * |
|
3 * e c _ c o m m a n d . h |
|
4 * |
|
5 * Struktur für ein EtherCAT-Kommando. |
|
6 * |
|
7 * $Date$ |
|
8 * $Author$ |
|
9 * |
|
10 ***************************************************************/ |
|
11 |
|
12 #ifndef _EC_COMMAND_H_ |
|
13 #define _EC_COMMAND_H_ |
|
14 |
|
15 #include "ec_globals.h" |
|
16 |
|
17 /** |
|
18 Status eines EtherCAT-Kommandos. |
|
19 */ |
|
20 |
|
21 typedef enum |
|
22 { |
|
23 ECAT_CS_READY, ECAT_CS_SENT, ECAT_CS_RECEIVED |
|
24 } |
|
25 EtherCAT_command_state_t; |
|
26 |
|
27 /** |
|
28 EtherCAT-Adresse. |
|
29 |
|
30 Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die |
|
31 ja nach Kommandoty eine andere bedeutung haben: Bei Autoinkrement- |
|
32 befehlen sind die ersten zwei Bytes die (negative) |
|
33 Autoinkrement-Adresse, bei Knoten-adressierten Befehlen entsprechen |
|
34 sie der Knotenadresse. Das dritte und vierte Byte entspricht in |
|
35 diesen Fällen der physikalischen Speicheradresse auf dem Slave. |
|
36 Bei einer logischen Adressierung entsprechen alle vier Bytes |
|
37 der logischen Adresse. |
|
38 */ |
|
39 |
|
40 typedef union |
|
41 { |
|
42 struct |
|
43 { |
|
44 union |
|
45 { |
|
46 short pos; /**< (Negative) Ring-Position des Slaves */ |
|
47 unsigned short node; /**< Konfigurierte Knotenadresse */ |
|
48 } |
|
49 dev; |
|
50 |
|
51 unsigned short mem; /**< Physikalische Speicheradresse im Slave */ |
|
52 } |
|
53 phy; |
|
54 |
|
55 unsigned long logical; /**< Logische Adresse */ |
|
56 unsigned char raw[4]; /**< Rohdaten für die generierung des Frames */ |
|
57 } |
|
58 EtherCAT_address_t; |
|
59 |
|
60 /***************************************************************/ |
|
61 |
|
62 /** |
|
63 EtherCAT-Kommando. |
|
64 */ |
|
65 |
|
66 typedef struct EtherCAT_command |
|
67 { |
|
68 EtherCAT_cmd_type_t type; /**< Typ des Kommandos (APRD, NPWR, etc...) */ |
|
69 EtherCAT_address_t address; /**< Adresse des/der Empfänger */ |
|
70 unsigned int data_length; /**< Länge der zu sendenden und/oder empfangenen Daten */ |
|
71 |
|
72 struct EtherCAT_command *next; /**< (Für den Master) Zeiger auf nächstes Kommando |
|
73 in der Liste */ |
|
74 |
|
75 EtherCAT_command_state_t state; /**< Zustand des Kommandos (bereit, gesendet, etc...) */ |
|
76 unsigned char index; /**< Kommando-Index, mit der das Kommando gesendet wurde (wird |
|
77 vom Master beim Senden gesetzt. */ |
|
78 unsigned int working_counter; /**< Working-Counter bei Empfang (wird vom Master gesetzt) */ |
|
79 |
|
80 unsigned char data[ECAT_FRAME_BUFFER_SIZE]; /**< Kommandodaten */ |
|
81 |
|
82 unsigned char reserved; /**< Markiert, das das Kommando gerade benutzt wird */ |
|
83 } |
|
84 EtherCAT_command_t; |
|
85 |
|
86 /***************************************************************/ |
|
87 |
|
88 void EtherCAT_command_init(EtherCAT_command_t *); |
|
89 void EtherCAT_command_clear(EtherCAT_command_t *); |
|
90 |
|
91 /***************************************************************/ |
|
92 |
|
93 #endif |