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 je nach |
|
34 Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen |
|
35 sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten- |
|
36 adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und |
|
37 vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse |
|
38 auf dem Slave. Bei einer logischen Adressierung entsprechen alle vier Bytes |
|
39 der logischen Adresse. |
|
40 */ |
|
41 |
|
42 typedef union |
|
43 { |
|
44 struct |
|
45 { |
|
46 union |
|
47 { |
|
48 short pos; /**< (Negative) Ring-Position des Slaves */ |
|
49 unsigned short node; /**< Konfigurierte Knotenadresse */ |
|
50 } |
|
51 dev; |
|
52 |
|
53 unsigned short mem; /**< Physikalische Speicheradresse im Slave */ |
|
54 } |
|
55 phy; /**< Physikalische Adresse */ |
|
56 |
|
57 unsigned long logical; /**< Logische Adresse */ |
|
58 unsigned char raw[4]; /**< Rohdaten für die Generierung des Frames */ |
|
59 } |
|
60 ec_address_t; |
|
61 |
|
62 /*****************************************************************************/ |
|
63 |
|
64 /** |
|
65 EtherCAT-Kommando. |
|
66 */ |
|
67 |
|
68 typedef struct ec_command |
|
69 { |
|
70 ec_command_type_t type; /**< Typ des Kommandos (APRD, NPWR, etc) */ |
|
71 ec_address_t address; /**< Adresse des/der Empfänger */ |
|
72 unsigned int data_length; /**< Länge der zu sendenden und/oder |
|
73 empfangenen Daten */ |
|
74 ec_command_state_t state; /**< Zustand des Kommandos |
|
75 (bereit, gesendet, etc) */ |
|
76 unsigned char index; /**< Kommando-Index, mit der das Kommando gesendet |
|
77 wurde (wird vom Master beim Senden gesetzt. */ |
|
78 unsigned int working_counter; /**< Working-Counter bei Empfang (wird |
|
79 vom Master gesetzt) */ |
|
80 unsigned char data[EC_FRAME_SIZE]; /**< Kommandodaten */ |
|
81 } |
|
82 ec_command_t; |
|
83 |
|
84 /*****************************************************************************/ |
|
85 |
|
86 void ec_command_read(ec_command_t *, unsigned short, unsigned short, |
|
87 unsigned int); |
|
88 void ec_command_write(ec_command_t *, unsigned short, unsigned short, |
|
89 unsigned int, const unsigned char *); |
|
90 void ec_command_position_read(ec_command_t *, short, unsigned short, |
|
91 unsigned int); |
|
92 void ec_command_position_write(ec_command_t *, short, unsigned short, |
|
93 unsigned int, const unsigned char *); |
|
94 void ec_command_broadcast_read(ec_command_t *, unsigned short, unsigned int); |
|
95 void ec_command_broadcast_write(ec_command_t *, unsigned short, unsigned int, |
|
96 const unsigned char *); |
|
97 void ec_command_logical_read_write(ec_command_t *, unsigned int, unsigned int, |
|
98 unsigned char *); |
|
99 |
|
100 /*****************************************************************************/ |
|
101 |
|
102 #endif |
|