From 95e6dc8d2b773c5684519324692d77b55e5d53d5 Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Thu, 28 Feb 2008 10:58:43 +0000 Subject: [PATCH] Evaluate CoE details from general category; moved current consumption into general category info. --- master/fsm_pdo_config.c | 10 ++++++++++ master/fsm_pdo_mapping.c | 10 ++++++++++ master/slave.c | 41 +++++++++++++++++++++++++++++++--------- master/slave.h | 17 ++++++++++++++++- script/lsec | 5 +++-- 5 files changed, 71 insertions(+), 12 deletions(-) diff --git a/master/fsm_pdo_config.c b/master/fsm_pdo_config.c index b4b8ee2f..35dfb50a 100644 --- a/master/fsm_pdo_config.c +++ b/master/fsm_pdo_config.c @@ -189,6 +189,16 @@ void ec_fsm_pdo_config_next_pdo( return; } + // Pdo configuration has to be changed. Does the slave support this? + if (fsm->slave->sii.mailbox_protocols & EC_MBOX_COE + || (fsm->slave->sii.has_general + && !fsm->slave->sii.coe_details.enable_pdo_configuration)) { + EC_ERR("Slave %u does not support changing the Pdo configuration!\n", + fsm->slave->ring_position); + fsm->state = ec_fsm_pdo_config_state_error; + return; + } + if (fsm->slave->master->debug_level) { EC_DBG("Changing configuration of Pdo 0x%04X of slave %u.\n", fsm->pdo->index, fsm->slave->ring_position); diff --git a/master/fsm_pdo_mapping.c b/master/fsm_pdo_mapping.c index 7c753db3..cf60ff04 100644 --- a/master/fsm_pdo_mapping.c +++ b/master/fsm_pdo_mapping.c @@ -180,6 +180,16 @@ void ec_fsm_pdo_mapping_next_dir( if (ec_pdo_mapping_equal(&fsm->sync->mapping, fsm->mapping)) continue; + // Pdo mapping has to be changed. Does the slave support this? + if (!fsm->slave->sii.mailbox_protocols & EC_MBOX_COE + || (fsm->slave->sii.has_general + && !fsm->slave->sii.coe_details.enable_pdo_assign)) { + EC_ERR("Slave %u does not support changing the Pdo mapping!\n", + fsm->slave->ring_position); + fsm->state = ec_fsm_pdo_mapping_state_error; + return; + } + if (fsm->slave->master->debug_level) { EC_DBG("Changing Pdo mapping for SM%u of slave %u.\n", fsm->sync->index, fsm->slave->ring_position); diff --git a/master/slave.c b/master/slave.c index b9051af0..c8353065 100644 --- a/master/slave.c +++ b/master/slave.c @@ -140,17 +140,23 @@ int ec_slave_init(ec_slave_t *slave, /**< EtherCAT slave */ slave->sii.tx_mailbox_offset = 0; slave->sii.tx_mailbox_size = 0; slave->sii.mailbox_protocols = 0; + + slave->sii.strings = NULL; + slave->sii.string_count = 0; + + slave->sii.has_general = 0; slave->sii.group = NULL; slave->sii.image = NULL; slave->sii.order = NULL; slave->sii.name = NULL; + memset(&slave->sii.coe_details, 0x00, sizeof(ec_sii_coe_details_t)); slave->sii.current_on_ebus = 0; - slave->sii.strings = NULL; - slave->sii.string_count = 0; slave->sii.syncs = NULL; slave->sii.sync_count = 0; + INIT_LIST_HEAD(&slave->sii.pdos); + INIT_LIST_HEAD(&slave->sdo_dictionary); slave->sdo_dictionary_fetched = 0; @@ -434,8 +440,9 @@ int ec_slave_fetch_sii_general( slave->sii.physical_layer[i] = (data[4] & (0x03 << (i * 2))) >> (i * 2); + memcpy(&slave->sii.coe_details, data + 5, 1); slave->sii.current_on_ebus = EC_READ_S16(data + 0x0C); - + slave->sii.has_general = 1; return 0; } @@ -701,11 +708,7 @@ ssize_t ec_slave_info(const ec_slave_t *slave, /**< EtherCAT slave */ buf += sprintf(buf, "\n\n"); } - buf += sprintf(buf, "Current consumption: %i mA\n\n", - slave->sii.current_on_ebus); - - if (slave->sii.group || slave->sii.image || slave->sii.order - || slave->sii.name) { + if (slave->sii.has_general) { buf += sprintf(buf, "General:\n"); if (slave->sii.group) @@ -717,7 +720,27 @@ ssize_t ec_slave_info(const ec_slave_t *slave, /**< EtherCAT slave */ slave->sii.order); if (slave->sii.name) buf += sprintf(buf, " Name: %s\n", slave->sii.name); - buf += sprintf(buf, "\n"); + if (slave->sii.mailbox_protocols & EC_MBOX_COE) { + buf += sprintf(buf, " CoE details:\n"); + buf += sprintf(buf, " Enable Sdo: %s\n", + slave->sii.coe_details.enable_sdo ? "yes" : "no"); + buf += sprintf(buf, " Enable Sdo Info: %s\n", + slave->sii.coe_details.enable_sdo_info ? "yes" : "no"); + buf += sprintf(buf, " Enable Pdo Assign: %s\n", + slave->sii.coe_details.enable_pdo_assign ? "yes" : "no"); + buf += sprintf(buf, " Enable Pdo Configuration: %s\n", + slave->sii.coe_details.enable_pdo_configuration ? + "yes" : "no"); + buf += sprintf(buf, " Enable Upload at startup: %s\n", + slave->sii.coe_details.enable_upload_at_startup ? + "yes" : "no"); + buf += sprintf(buf, " Enable Sdo complete access: %s\n", + slave->sii.coe_details.enable_sdo_complete_access + ? "yes" : "no"); + } + + buf += sprintf(buf, " Current consumption: %i mA\n\n", + slave->sii.current_on_ebus); } if (slave->sii.sync_count) { diff --git a/master/slave.h b/master/slave.h index 211236f5..2c6b89b8 100644 --- a/master/slave.h +++ b/master/slave.h @@ -103,6 +103,19 @@ enum { /*****************************************************************************/ +/** Slave information interface CAnopen-over-EtherCAT details flags. + */ +typedef struct { + uint8_t enable_sdo : 1; /**< Enable Sdo access. */ + uint8_t enable_sdo_info : 1; /**< SDO information service available. */ + uint8_t enable_pdo_assign : 1; /**< Pdo mapping configurable. */ + uint8_t enable_pdo_configuration : 1; /**< Pdo configuration possible. */ + uint8_t enable_upload_at_startup : 1; /**< ? */ + uint8_t enable_sdo_complete_access : 1; /**< Complete access possible. */ +} ec_sii_coe_details_t; + +/*****************************************************************************/ + /** Slave information interface data. */ typedef struct { @@ -123,11 +136,13 @@ typedef struct { unsigned int string_count; /**< number of EEPROM strings */ // General - uint8_t physical_layer[4]; /**< port media */ + unsigned int has_general; /**< General category present. */ char *group; /**< slave group acc. to EEPROM */ char *image; /**< slave image name acc. to EEPROM */ char *order; /**< slave order number acc. to EEPROM */ char *name; /**< slave name acc. to EEPROM */ + uint8_t physical_layer[4]; /**< port media */ + ec_sii_coe_details_t coe_details; /**< CoE detail flags. */ int16_t current_on_ebus; /**< power consumption */ // SyncM diff --git a/script/lsec b/script/lsec index c9dfda39..848c750b 100755 --- a/script/lsec +++ b/script/lsec @@ -83,6 +83,7 @@ sub query next unless $entry =~ /^slave(\d+)$/; $slave = {}; + $slave->{'current'} = 0; $slave_info_file = "$master_dir/$entry/info"; open INFO, $slave_info_file or die "ERROR: Failed to open $slave_info_file."; @@ -103,8 +104,6 @@ sub query $slave->{'state'} = $1; } elsif ($line =~ /^Configured station alias: .* \((\d+)\)$/) { $slave->{'alias'} = $1; - } elsif ($line =~ /^Current consumption: (-?\d+) mA$/) { - $slave->{'current'} = $1; } } elsif ($category eq "Identity") { if ($line =~ /Vendor ID: .* \((\d+)\)$/) { @@ -115,6 +114,8 @@ sub query } elsif ($category eq "General") { if ($line =~ /Name: (.*)$/) { $slave->{'name'} = $1; + } elsif ($line =~ /Current consumption: (-?\d+) mA$/) { + $slave->{'current'} = $1; } } }