19 /** |
19 /** |
20 Konstruktor einer EtherCAT-Domäne. |
20 Konstruktor einer EtherCAT-Domäne. |
21 */ |
21 */ |
22 |
22 |
23 void ec_domain_init(ec_domain_t *domain, /**< Domäne */ |
23 void ec_domain_init(ec_domain_t *domain, /**< Domäne */ |
24 ec_master_t *master, /**< Zugehöriger Master */ |
24 ec_master_t *master /**< Zugehöriger Master */ |
25 ec_domain_mode_t mode, /**< Synchron/Asynchron */ |
|
26 unsigned int timeout_us /**< Timeout in Mikrosekunden */ |
|
27 ) |
25 ) |
28 { |
26 { |
29 domain->master = master; |
27 domain->master = master; |
30 domain->mode = mode; |
|
31 domain->timeout_us = timeout_us; |
|
32 |
|
33 domain->data = NULL; |
28 domain->data = NULL; |
34 domain->data_size = 0; |
29 domain->data_size = 0; |
35 domain->commands = NULL; |
30 domain->commands = NULL; |
36 domain->command_count = 0; |
31 domain->command_count = 0; |
37 domain->base_address = 0; |
32 domain->base_address = 0; |
230 Registriert ein Datenfeld innerhalb einer Domäne. |
225 Registriert ein Datenfeld innerhalb einer Domäne. |
231 |
226 |
232 \return Zeiger auf den Slave bei Erfolg, sonst NULL |
227 \return Zeiger auf den Slave bei Erfolg, sonst NULL |
233 */ |
228 */ |
234 |
229 |
235 ec_slave_t *EtherCAT_rt_register_slave_field(ec_domain_t *domain, |
230 ec_slave_t *ecrt_domain_register_field(ec_domain_t *domain, |
236 /**< Domäne */ |
231 /**< Domäne */ |
237 const char *address, |
232 const char *address, |
238 /**< ASCII-Addresse des Slaves, |
233 /**< ASCII-Addresse des Slaves, |
239 siehe ec_master_slave_address() |
234 siehe ec_master_slave_address() */ |
240 */ |
235 const char *vendor_name, |
241 const char *vendor_name, |
236 /**< Herstellername */ |
242 /**< Herstellername */ |
237 const char *product_name, |
243 const char *product_name, |
238 /**< Produktname */ |
244 /**< Produktname */ |
239 void **data_ptr, |
245 void **data_ptr, |
240 /**< Adresse des Zeigers auf die |
246 /**< Adresse des Zeigers auf die |
241 Prozessdaten */ |
247 Prozessdaten */ |
242 const char *field_name, |
248 ec_field_type_t field_type, |
243 /**< Name des Datenfeldes */ |
249 /**< Typ des Datenfeldes */ |
244 unsigned int field_index, |
250 unsigned int field_index, |
245 /**< Gibt an, ab welchem Feld mit |
251 /**< Gibt an, ab welchem Feld mit |
246 Typ \a field_type gezählt |
252 Typ \a field_type gezählt |
247 werden soll. */ |
253 werden soll. */ |
248 unsigned int field_count |
254 unsigned int field_count |
249 /**< Anzahl Felder selben Typs */ |
255 /**< Anzahl Felder selben Typs */ |
250 ) |
256 ) |
|
257 { |
251 { |
258 ec_slave_t *slave; |
252 ec_slave_t *slave; |
259 const ec_slave_type_t *type; |
253 const ec_slave_type_t *type; |
260 ec_master_t *master; |
254 ec_master_t *master; |
261 const ec_sync_t *sync; |
255 const ec_sync_t *sync; |
291 for (i = 0; type->sync_managers[i]; i++) { |
285 for (i = 0; type->sync_managers[i]; i++) { |
292 sync = type->sync_managers[i]; |
286 sync = type->sync_managers[i]; |
293 field_offset = 0; |
287 field_offset = 0; |
294 for (j = 0; sync->fields[j]; j++) { |
288 for (j = 0; sync->fields[j]; j++) { |
295 field = sync->fields[j]; |
289 field = sync->fields[j]; |
296 if (field->type == field_type) { |
290 if (!strcmp(field->name, field_name)) { |
297 if (field_idx == field_index) { |
291 if (field_idx == field_index) { |
298 ec_domain_reg_field(domain, slave, sync, field_offset, |
292 ec_domain_reg_field(domain, slave, sync, field_offset, |
299 data_ptr++); |
293 data_ptr++); |
300 if (!(--field_count)) return slave; |
294 if (!(--field_count)) return slave; |
301 } |
295 } |
303 } |
297 } |
304 field_offset += field->size; |
298 field_offset += field->size; |
305 } |
299 } |
306 } |
300 } |
307 |
301 |
308 EC_ERR("Slave %i (\"%s %s\") registration mismatch: Type %i, index %i," |
302 EC_ERR("Slave %i (\"%s %s\") registration mismatch: Field \"%s\"," |
309 " count %i.\n", slave->ring_position, vendor_name, product_name, |
303 " index %i, count %i.\n", slave->ring_position, vendor_name, |
310 field_type, field_index, field_count); |
304 product_name, field_name, field_index, field_count); |
311 return NULL; |
305 return NULL; |
312 } |
306 } |
313 |
307 |
314 /*****************************************************************************/ |
308 /*****************************************************************************/ |
315 |
309 |
319 Achtung: Die Liste muss mit einer NULL-Struktur ({}) abgeschlossen sein! |
313 Achtung: Die Liste muss mit einer NULL-Struktur ({}) abgeschlossen sein! |
320 |
314 |
321 \return 0 bei Erfolg, sonst < 0 |
315 \return 0 bei Erfolg, sonst < 0 |
322 */ |
316 */ |
323 |
317 |
324 int EtherCAT_rt_register_domain_fields(ec_domain_t *domain, |
318 int ecrt_domain_register_field_list(ec_domain_t *domain, |
325 /**< Domäne */ |
319 /**< Domäne */ |
326 ec_field_init_t *fields |
320 ec_field_init_t *fields |
327 /**< Array mit Datenfeldern */ |
321 /**< Array mit Datenfeldern */ |
328 ) |
322 ) |
329 { |
323 { |
330 ec_field_init_t *field; |
324 ec_field_init_t *field; |
331 |
325 |
332 for (field = fields; field->data; field++) { |
326 for (field = fields; field->data_ptr; field++) |
333 if (!EtherCAT_rt_register_slave_field(domain, field->address, |
327 if (!ecrt_domain_register_field(domain, field->slave_address, |
334 field->vendor, field->product, |
328 field->vendor_name, |
335 field->data, field->field_type, |
329 field->product_name, field->data_ptr, |
336 field->field_index, |
330 field->field_name, field->field_index, |
337 field->field_count)) { |
331 field->field_count)) |
338 return -1; |
332 return -1; |
339 } |
|
340 } |
|
341 |
333 |
342 return 0; |
334 return 0; |
343 } |
335 } |
344 |
336 |
345 /*****************************************************************************/ |
337 /*****************************************************************************/ |
346 |
338 |
347 /** |
339 /** |
348 Setzt Prozessdaten-Kommandos in die Warteschlange des Masters. |
340 Setzt Prozessdaten-Kommandos in die Warteschlange des Masters. |
349 */ |
341 */ |
350 |
342 |
351 void EtherCAT_rt_domain_queue(ec_domain_t *domain /**< Domäne */) |
343 void ecrt_domain_queue(ec_domain_t *domain /**< Domäne */) |
352 { |
344 { |
353 unsigned int i; |
345 unsigned int i; |
354 size_t size; |
346 size_t size; |
355 off_t offset; |
347 off_t offset; |
356 |
348 |
400 ec_domain_response_count(domain, working_counter_sum); |
392 ec_domain_response_count(domain, working_counter_sum); |
401 } |
393 } |
402 |
394 |
403 /*****************************************************************************/ |
395 /*****************************************************************************/ |
404 |
396 |
405 EXPORT_SYMBOL(EtherCAT_rt_register_slave_field); |
397 EXPORT_SYMBOL(ecrt_domain_register_field); |
406 EXPORT_SYMBOL(EtherCAT_rt_register_domain_fields); |
398 EXPORT_SYMBOL(ecrt_domain_register_field_list); |
407 EXPORT_SYMBOL(EtherCAT_rt_domain_queue); |
399 EXPORT_SYMBOL(ecrt_domain_queue); |
408 EXPORT_SYMBOL(EtherCAT_rt_domain_process); |
400 EXPORT_SYMBOL(ecrt_domain_process); |
409 |
401 |
410 /*****************************************************************************/ |
402 /*****************************************************************************/ |
411 |
403 |
412 /* Emacs-Konfiguration |
404 /* Emacs-Konfiguration |
413 ;;; Local Variables: *** |
405 ;;; Local Variables: *** |