1 /****************************************************************************** |
|
2 * |
|
3 * e c _ s l a v e . c |
|
4 * |
|
5 * Methoden für einen EtherCAT-Slave. |
|
6 * |
|
7 * $Id$ |
|
8 * |
|
9 *****************************************************************************/ |
|
10 |
|
11 #include <linux/module.h> |
|
12 |
|
13 #include "ec_globals.h" |
|
14 #include "ec_slave.h" |
|
15 |
|
16 /*****************************************************************************/ |
|
17 |
|
18 /** |
|
19 EtherCAT-Slave-Konstruktor. |
|
20 |
|
21 Initialisiert einen EtherCAT-Slave. |
|
22 |
|
23 ACHTUNG! Dieser Konstruktor wird quasi nie aufgerufen. Bitte immer das |
|
24 Makro ECAT_INIT_SLAVE() in ec_slave.h anpassen! |
|
25 |
|
26 @param slave Zeiger auf den zu initialisierenden Slave |
|
27 */ |
|
28 |
|
29 void EtherCAT_slave_init(EtherCAT_slave_t *slave) |
|
30 { |
|
31 slave->type = 0; |
|
32 slave->revision = 0; |
|
33 slave->build = 0; |
|
34 slave->ring_position = 0; |
|
35 slave->station_address = 0; |
|
36 slave->vendor_id = 0; |
|
37 slave->product_code = 0; |
|
38 slave->revision_number = 0; |
|
39 slave->serial_number = 0; |
|
40 slave->desc = NULL; |
|
41 slave->logical_address = 0; |
|
42 slave->current_state = ECAT_STATE_UNKNOWN; |
|
43 slave->requested_state = ECAT_STATE_UNKNOWN; |
|
44 slave->process_data = NULL; |
|
45 slave->domain = 0; |
|
46 slave->error_reported = 0; |
|
47 } |
|
48 |
|
49 /*****************************************************************************/ |
|
50 |
|
51 /** |
|
52 Liest einen bestimmten Kanal des Slaves als Integer-Wert. |
|
53 |
|
54 Prüft zuerst, ob der entsprechende Slave eine |
|
55 bekannte Beschreibung besitzt, ob dort eine |
|
56 read()-Funktion hinterlegt ist und ob die angegebene |
|
57 Kanalnummer gültig ist. Wenn ja, wird der dekodierte |
|
58 Wert zurückgegeben, sonst ist der Wert 0. |
|
59 |
|
60 @param slave EtherCAT-Slave |
|
61 @param channel Kanalnummer |
|
62 |
|
63 @return Gelesener Wert bzw. 0 |
|
64 */ |
|
65 |
|
66 int EtherCAT_read_value(EtherCAT_slave_t *slave, |
|
67 unsigned int channel) |
|
68 { |
|
69 if (unlikely(!slave->desc)) { |
|
70 if (likely(slave->error_reported)) { |
|
71 printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" |
|
72 " - Slave has no description.\n", |
|
73 slave->station_address, (unsigned int) slave); |
|
74 slave->error_reported = 1; |
|
75 } |
|
76 return 0; |
|
77 } |
|
78 |
|
79 if (unlikely(!slave->desc->read)) { |
|
80 if (likely(slave->error_reported)) { |
|
81 printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" |
|
82 " - Slave type (%s %s) has no read method.\n", |
|
83 slave->station_address, (unsigned int) slave, |
|
84 slave->desc->vendor_name, slave->desc->product_name); |
|
85 slave->error_reported = 1; |
|
86 } |
|
87 return 0; |
|
88 } |
|
89 |
|
90 if (unlikely(channel >= slave->desc->channel_count)) { |
|
91 if (likely(slave->error_reported)) { |
|
92 printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)" |
|
93 " - Type (%s %s) has no channel %i.\n", |
|
94 slave->station_address, (unsigned int) slave, |
|
95 slave->desc->vendor_name, slave->desc->product_name, |
|
96 channel); |
|
97 slave->error_reported = 1; |
|
98 } |
|
99 return 0; |
|
100 } |
|
101 |
|
102 if (unlikely(!slave->process_data)) { |
|
103 if (likely(slave->error_reported)) { |
|
104 printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)" |
|
105 " - Slave does not belong to any process data object!\n", |
|
106 slave->station_address, (unsigned int) slave); |
|
107 slave->error_reported = 1; |
|
108 } |
|
109 return 0; |
|
110 } |
|
111 |
|
112 if (unlikely(slave->error_reported)) |
|
113 slave->error_reported = 0; |
|
114 |
|
115 return slave->desc->read(slave->process_data, channel); |
|
116 } |
|
117 |
|
118 /*****************************************************************************/ |
|
119 |
|
120 /** |
|
121 Schreibt einen bestimmten Kanal des Slaves als Integer-Wert . |
|
122 |
|
123 Prüft zuerst, ob der entsprechende Slave eine |
|
124 bekannte Beschreibung besitzt, ob dort eine |
|
125 write()-Funktion hinterlegt ist und ob die angegebene |
|
126 Kanalnummer gültig ist. Wenn ja, wird der Wert entsprechend |
|
127 kodiert und geschrieben. |
|
128 |
|
129 @param slave EtherCAT-Slave |
|
130 @param channel Kanalnummer |
|
131 @param value Zu schreibender Wert |
|
132 */ |
|
133 |
|
134 void EtherCAT_write_value(EtherCAT_slave_t *slave, |
|
135 unsigned int channel, |
|
136 int value) |
|
137 { |
|
138 if (unlikely(!slave->desc)) { |
|
139 if (likely(slave->error_reported)) { |
|
140 printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" |
|
141 " - Slave has no description.\n", |
|
142 slave->station_address, (unsigned int) slave); |
|
143 slave->error_reported = 1; |
|
144 } |
|
145 return; |
|
146 } |
|
147 |
|
148 if (unlikely(!slave->desc->write)) { |
|
149 if (likely(slave->error_reported)) { |
|
150 printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" |
|
151 " - Type (%s %s) has no write method.\n", |
|
152 slave->station_address, (unsigned int) slave, |
|
153 slave->desc->vendor_name, slave->desc->product_name); |
|
154 slave->error_reported = 1; |
|
155 } |
|
156 return; |
|
157 } |
|
158 |
|
159 if (unlikely(channel >= slave->desc->channel_count)) { |
|
160 if (likely(slave->error_reported)) { |
|
161 printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)" |
|
162 " - Type (%s %s) has no channel %i.\n", |
|
163 slave->station_address, (unsigned int) slave, |
|
164 slave->desc->vendor_name, slave->desc->product_name, |
|
165 channel); |
|
166 slave->error_reported = 1; |
|
167 } |
|
168 return; |
|
169 } |
|
170 |
|
171 if (unlikely(!slave->process_data)) { |
|
172 if (likely(slave->error_reported)) { |
|
173 printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)" |
|
174 " - Slave does not belong to any process data object!\n", |
|
175 slave->station_address, (unsigned int) slave); |
|
176 slave->error_reported = 1; |
|
177 } |
|
178 return; |
|
179 } |
|
180 |
|
181 if (unlikely(slave->error_reported)) |
|
182 slave->error_reported = 0; |
|
183 |
|
184 slave->desc->write(slave->process_data, channel, value); |
|
185 } |
|
186 |
|
187 /*****************************************************************************/ |
|
188 |
|
189 EXPORT_SYMBOL(EtherCAT_write_value); |
|
190 EXPORT_SYMBOL(EtherCAT_read_value); |
|
191 |
|
192 /*****************************************************************************/ |
|
193 |
|
194 /* Emacs-Konfiguration |
|
195 ;;; Local Variables: *** |
|
196 ;;; c-basic-offset:2 *** |
|
197 ;;; End: *** |
|
198 */ |
|