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