master/domain.c
changeset 104 052bc82d5442
parent 101 b0c19892145a
child 105 fad6709a526f
equal deleted inserted replaced
103:d2a8adde27c4 104:052bc82d5442
    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 
   370 
   362 
   371 /**
   363 /**
   372    Verarbeitet empfangene Prozessdaten.
   364    Verarbeitet empfangene Prozessdaten.
   373 */
   365 */
   374 
   366 
   375 void EtherCAT_rt_domain_process(ec_domain_t *domain /**< Domäne */)
   367 void ecrt_domain_process(ec_domain_t *domain /**< Domäne */)
   376 {
   368 {
   377     unsigned int working_counter_sum, i;
   369     unsigned int working_counter_sum, i;
   378     ec_command_t *command;
   370     ec_command_t *command;
   379     size_t size;
   371     size_t size;
   380     off_t offset;
   372     off_t offset;
   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: ***