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 /** |
|
20 EtherCAT-Rahmen-Typ |
|
21 */ |
|
22 |
|
23 typedef enum |
|
24 { |
|
25 ec_frame_type_none = 0x00, /**< Dummy */ |
|
26 ec_frame_type_aprd = 0x01, /**< Auto-increment physical read */ |
|
27 ec_frame_type_apwr = 0x02, /**< Auto-increment physical write */ |
|
28 ec_frame_type_nprd = 0x04, /**< Node-addressed physical read */ |
|
29 ec_frame_type_npwr = 0x05, /**< Node-addressed physical write */ |
|
30 ec_frame_type_brd = 0x07, /**< Broadcast read */ |
|
31 ec_frame_type_bwr = 0x08, /**< Broadcast write */ |
|
32 ec_frame_type_lrw = 0x0C /**< Logical read/write */ |
|
33 } |
|
34 ec_frame_type_t; |
|
35 |
|
36 /*****************************************************************************/ |
|
37 |
|
38 /** |
|
39 EtherCAT-Adresse. |
|
40 |
|
41 Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die je nach |
|
42 Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen |
|
43 sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten- |
|
44 adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und |
|
45 vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse |
|
46 auf dem Slave. Bei einer logischen Adressierung entsprechen alle vier Bytes |
|
47 der logischen Adresse. |
|
48 */ |
|
49 |
|
50 typedef union |
|
51 { |
|
52 struct |
|
53 { |
|
54 uint16_t slave; /**< Adresse des Slaves (Ringposition oder Knoten) */ |
|
55 uint16_t mem; /**< Physikalische Speicheradresse im Slave */ |
|
56 } |
|
57 physical; /**< Physikalische Adresse */ |
|
58 |
|
59 uint32_t logical; /**< Logische Adresse */ |
|
60 } |
|
61 ec_address_t; |
|
62 |
|
63 /*****************************************************************************/ |
|
64 |
|
65 /** |
|
66 EtherCAT-Frame. |
|
67 */ |
|
68 |
|
69 typedef struct |
|
70 { |
|
71 ec_master_t *master; /**< EtherCAT-Master */ |
|
72 ec_frame_type_t type; /**< Typ des Frames (APRD, NPWR, etc) */ |
|
73 ec_address_t address; /**< Adresse des/der Empfänger */ |
|
74 unsigned int data_length; /**< Länge der zu sendenden und/oder empfangenen |
|
75 Daten */ |
|
76 uint8_t index; /**< Kommando-Index, mit dem der Frame gesendet wurde |
|
77 (wird vom Master beim Senden gesetzt). */ |
|
78 uint16_t working_counter; /**< Working-Counter */ |
|
79 uint8_t data[EC_MAX_FRAME_SIZE]; /**< Rahmendaten */ |
|
80 } |
|
81 ec_frame_t; |
|
82 |
|
83 /*****************************************************************************/ |
|
84 |
|
85 void ec_frame_init_nprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, |
|
86 unsigned int); |
|
87 void ec_frame_init_npwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, |
|
88 unsigned int, const unsigned char *); |
|
89 void ec_frame_init_aprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, |
|
90 unsigned int); |
|
91 void ec_frame_init_apwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, |
|
92 unsigned int, const unsigned char *); |
|
93 void ec_frame_init_brd(ec_frame_t *, ec_master_t *, uint16_t, unsigned int); |
|
94 void ec_frame_init_bwr(ec_frame_t *, ec_master_t *, uint16_t, unsigned int, |
|
95 const unsigned char *); |
|
96 void ec_frame_init_lrw(ec_frame_t *, ec_master_t *, uint32_t, unsigned int, |
|
97 unsigned char *); |
|
98 |
|
99 int ec_frame_send(ec_frame_t *); |
|
100 int ec_frame_receive(ec_frame_t *); |
|
101 int ec_frame_send_receive(ec_frame_t *); |
|
102 |
|
103 /*****************************************************************************/ |
|
104 |
|
105 #endif |
|
106 |
|
107 /* Emacs-Konfiguration |
|
108 ;;; Local Variables: *** |
|
109 ;;; c-basic-offset:4 *** |
|
110 ;;; End: *** |
|
111 */ |
|