|
1 /**************************************************************** |
|
2 * |
|
3 * e c _ s l a v e . c |
|
4 * |
|
5 * Methoden für einen EtherCAT-Slave. |
|
6 * |
|
7 * $Date$ |
|
8 * $Author$ |
|
9 * |
|
10 ***************************************************************/ |
|
11 |
|
12 #include <linux/kernel.h> |
|
13 |
|
14 #include "ec_globals.h" |
|
15 #include "ec_slave.h" |
|
16 #include "ec_dbg.h" |
|
17 |
|
18 /***************************************************************/ |
|
19 |
|
20 /** |
|
21 EtherCAT-Slave-Konstruktor. |
|
22 |
|
23 Initialisiert einen EtherCAT-Slave. |
|
24 |
|
25 @param slave Zeiger auf den zu initialisierenden Slave |
|
26 */ |
|
27 |
|
28 void EtherCAT_slave_init(EtherCAT_slave_t *slave) |
|
29 { |
|
30 slave->type = 0; |
|
31 slave->revision = 0; |
|
32 slave->build = 0; |
|
33 |
|
34 slave->ring_position = 0; |
|
35 slave->station_address = 0; |
|
36 |
|
37 slave->vendor_id = 0; |
|
38 slave->product_code = 0; |
|
39 slave->revision_number = 0; |
|
40 |
|
41 slave->desc = 0; |
|
42 |
|
43 slave->logical_address0 = 0; |
|
44 |
|
45 slave->current_state = ECAT_STATE_UNKNOWN; |
|
46 slave->requested_state = ECAT_STATE_UNKNOWN; |
|
47 } |
|
48 |
|
49 /***************************************************************/ |
|
50 |
|
51 /** |
|
52 EtherCAT-Slave-Destruktor. |
|
53 |
|
54 Im Moment ohne Funktionalität. |
|
55 |
|
56 @param slave Zeiger auf den zu zerstörenden Slave |
|
57 */ |
|
58 |
|
59 void EtherCAT_slave_clear(EtherCAT_slave_t *slave) |
|
60 { |
|
61 // Nothing yet... |
|
62 } |
|
63 |
|
64 /***************************************************************/ |
|
65 |
|
66 /** |
|
67 Liest einen bestimmten Kanal des Slaves als Integer-Wert. |
|
68 |
|
69 Prüft zuerst, ob der entsprechende Slave eine |
|
70 bekannte Beschreibung besitzt, ob dort eine |
|
71 read()-Funktion hinterlegt ist und ob die angegebene |
|
72 Kanalnummer gültig ist. Wenn ja, wird der dekodierte |
|
73 Wert zurückgegeben, sonst ist der Wert 0. |
|
74 |
|
75 @param slave EtherCAT-Slave |
|
76 @param channel Kanalnummer |
|
77 |
|
78 @return Gelesener Wert bzw. 0 |
|
79 */ |
|
80 |
|
81 int EtherCAT_read_value(EtherCAT_slave_t *slave, |
|
82 unsigned int channel) |
|
83 { |
|
84 if (!slave->desc) |
|
85 { |
|
86 EC_DBG(KERN_WARNING "EtherCAT: Reading failed - " |
|
87 "Slave %04X (at %0X) has no description.\n", |
|
88 slave->station_address, (unsigned int) slave); |
|
89 return 0; |
|
90 } |
|
91 |
|
92 if (!slave->desc->read) |
|
93 { |
|
94 EC_DBG(KERN_WARNING "EtherCAT: Reading failed - " |
|
95 "Slave type (%s %s) has no read method.\n", |
|
96 slave->desc->vendor_name, slave->desc->product_name); |
|
97 return 0; |
|
98 } |
|
99 |
|
100 if (channel >= slave->desc->channels) |
|
101 { |
|
102 EC_DBG(KERN_WARNING "EtherCAT: Reading failed - " |
|
103 "Slave %4X (%s %s) has no channel %i.\n", |
|
104 slave->station_address, slave->desc->vendor_name, |
|
105 slave->desc->product_name, channel); |
|
106 return 0; |
|
107 } |
|
108 |
|
109 return slave->desc->read(slave->process_data, channel); |
|
110 } |
|
111 |
|
112 /***************************************************************/ |
|
113 |
|
114 /** |
|
115 Schreibt einen bestimmten Kanal des Slaves als Integer-Wert . |
|
116 |
|
117 Prüft zuerst, ob der entsprechende Slave eine |
|
118 bekannte Beschreibung besitzt, ob dort eine |
|
119 write()-Funktion hinterlegt ist und ob die angegebene |
|
120 Kanalnummer gültig ist. Wenn ja, wird der Wert entsprechend |
|
121 kodiert und geschrieben. |
|
122 |
|
123 @param slave EtherCAT-Slave |
|
124 @param channel Kanalnummer |
|
125 @param value Zu schreibender Wert |
|
126 */ |
|
127 |
|
128 void EtherCAT_write_value(EtherCAT_slave_t *slave, |
|
129 unsigned int channel, |
|
130 int value) |
|
131 { |
|
132 if (!slave->desc) |
|
133 { |
|
134 EC_DBG(KERN_WARNING "EtherCAT: Writing failed - " |
|
135 "Slave %04X (at %0X) has no description.\n", |
|
136 slave->station_address, (unsigned int) slave); |
|
137 return; |
|
138 } |
|
139 |
|
140 if (!slave->desc->write) |
|
141 { |
|
142 EC_DBG(KERN_WARNING "EtherCAT: Writing failed - " |
|
143 "Slave type (%s %s) has no write method.\n", |
|
144 slave->desc->vendor_name, slave->desc->product_name); |
|
145 return; |
|
146 } |
|
147 |
|
148 if (channel >= slave->desc->channels) |
|
149 { |
|
150 EC_DBG(KERN_WARNING "EtherCAT: Writing failed - " |
|
151 "Slave %4X (%s %s) has no channel %i.\n", |
|
152 slave->station_address, slave->desc->vendor_name, |
|
153 slave->desc->product_name, channel); |
|
154 return; |
|
155 } |
|
156 |
|
157 slave->desc->write(slave->process_data, channel, value); |
|
158 } |
|
159 |
|
160 /***************************************************************/ |