|
1 /****************************************************************************** |
|
2 * |
|
3 * f r a m e . h |
|
4 * |
|
5 * Struktur für einen EtherCAT-Rahmen. |
|
6 * |
|
7 * $Id$ |
|
8 * |
|
9 *****************************************************************************/ |
|
10 |
|
11 #ifndef _EC_FRAME_H_ |
|
12 #define _EC_FRAME_H_ |
|
13 |
|
14 #include "globals.h" |
|
15 #include "../include/EtherCAT_rt.h" |
|
16 |
|
17 /*****************************************************************************/ |
|
18 |
|
19 #define EC_MAX_DATA_SIZE (EC_MAX_FRAME_SIZE - EC_FRAME_HEADER_SIZE \ |
|
20 - EC_COMMAND_HEADER_SIZE \ |
|
21 - EC_COMMAND_FOOTER_SIZE) |
|
22 |
|
23 /*****************************************************************************/ |
|
24 |
|
25 /** |
|
26 Status eines EtherCAT-Rahmens. |
|
27 */ |
|
28 |
|
29 typedef enum { |
|
30 ec_frame_ready, ec_frame_sent, ec_frame_received |
|
31 } |
|
32 ec_frame_state_t; |
|
33 |
|
34 /*****************************************************************************/ |
|
35 |
|
36 /** |
|
37 EtherCAT-Rahmen-Typ |
|
38 */ |
|
39 |
|
40 typedef enum |
|
41 { |
|
42 ec_frame_type_none = 0x00, /**< Dummy */ |
|
43 ec_frame_type_aprd = 0x01, /**< Auto-increment physical read */ |
|
44 ec_frame_type_apwr = 0x02, /**< Auto-increment physical write */ |
|
45 ec_frame_type_nprd = 0x04, /**< Node-addressed physical read */ |
|
46 ec_frame_type_npwr = 0x05, /**< Node-addressed physical write */ |
|
47 ec_frame_type_brd = 0x07, /**< Broadcast read */ |
|
48 ec_frame_type_bwr = 0x08, /**< Broadcast write */ |
|
49 ec_frame_type_lrw = 0x0C /**< Logical read/write */ |
|
50 } |
|
51 ec_frame_type_t; |
|
52 |
|
53 /*****************************************************************************/ |
|
54 |
|
55 /** |
|
56 EtherCAT-Adresse. |
|
57 |
|
58 Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die je nach |
|
59 Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen |
|
60 sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten- |
|
61 adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und |
|
62 vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse |
|
63 auf dem Slave. Bei einer logischen Adressierung entsprechen alle vier Bytes |
|
64 der logischen Adresse. |
|
65 */ |
|
66 |
|
67 typedef union |
|
68 { |
|
69 struct |
|
70 { |
|
71 uint16_t slave; /**< Adresse des Slaves */ |
|
72 uint16_t mem; /**< Physikalische Speicheradresse im Slave */ |
|
73 } |
|
74 physical; /**< Physikalische Adresse */ |
|
75 |
|
76 uint32_t logical; /**< Logische Adresse */ |
|
77 uint8_t raw[4]; /**< Rohdaten für die Generierung des Frames */ |
|
78 } |
|
79 ec_address_t; |
|
80 |
|
81 /*****************************************************************************/ |
|
82 |
|
83 /** |
|
84 EtherCAT-Frame. |
|
85 */ |
|
86 |
|
87 typedef struct |
|
88 { |
|
89 ec_master_t *master; /**< EtherCAT-Master */ |
|
90 ec_frame_type_t type; /**< Typ des Frames (APRD, NPWR, etc) */ |
|
91 ec_address_t address; /**< Adresse des/der Empfänger */ |
|
92 unsigned int data_length; /**< Länge der zu sendenden und/oder empfangenen |
|
93 Daten */ |
|
94 ec_frame_state_t state; /**< Zustand des Kommandos */ |
|
95 uint8_t index; /**< Kommando-Index, mit dem der Frame gesendet wurde |
|
96 (wird vom Master beim Senden gesetzt). */ |
|
97 uint16_t working_counter; /**< Working-Counter */ |
|
98 uint8_t data[EC_MAX_FRAME_SIZE]; /**< Rahmendaten */ |
|
99 } |
|
100 ec_frame_t; |
|
101 |
|
102 /*****************************************************************************/ |
|
103 |
|
104 void ec_frame_init_nprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, |
|
105 unsigned int); |
|
106 void ec_frame_init_npwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, |
|
107 unsigned int, const unsigned char *); |
|
108 void ec_frame_init_aprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, |
|
109 unsigned int); |
|
110 void ec_frame_init_apwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, |
|
111 unsigned int, const unsigned char *); |
|
112 void ec_frame_init_brd(ec_frame_t *, ec_master_t *, uint16_t, unsigned int); |
|
113 void ec_frame_init_bwr(ec_frame_t *, ec_master_t *, uint16_t, unsigned int, |
|
114 const unsigned char *); |
|
115 void ec_frame_init_lrw(ec_frame_t *, ec_master_t *, uint32_t, unsigned int, |
|
116 unsigned char *); |
|
117 |
|
118 int ec_frame_send(ec_frame_t *); |
|
119 int ec_frame_receive(ec_frame_t *); |
|
120 int ec_frame_send_receive(ec_frame_t *); |
|
121 |
|
122 void ec_frame_print(const ec_frame_t *); |
|
123 |
|
124 /*****************************************************************************/ |
|
125 |
|
126 #endif |
|
127 |
|
128 /* Emacs-Konfiguration |
|
129 ;;; Local Variables: *** |
|
130 ;;; c-basic-offset:4 *** |
|
131 ;;; End: *** |
|
132 */ |