mirror of
https://gitlab.com/etherlab.org/ethercat.git
synced 2026-02-05 19:39:50 +08:00
Included list of common SoE error messages.
This commit is contained in:
1
TODO
1
TODO
@@ -41,7 +41,6 @@ Version 1.5.0:
|
||||
- Implement 0xXXXX:YY format for specifying SDOs.
|
||||
- Implement reading from stream for soe_write.
|
||||
* recompile tool/CommandVersion.cpp if revision changes.
|
||||
* Include SoE error codes.
|
||||
* Log SoE IDNs with real name ([SP]-x-yyyy).
|
||||
* Output SoE IDN configurations in 'ethercat config'.
|
||||
|
||||
|
||||
@@ -62,6 +62,7 @@ ec_master-objs := \
|
||||
sdo_request.o \
|
||||
slave.o \
|
||||
slave_config.o \
|
||||
soe_errors.o \
|
||||
soe_request.o \
|
||||
sync.o \
|
||||
sync_config.o \
|
||||
|
||||
@@ -63,6 +63,7 @@ noinst_HEADERS = \
|
||||
sdo_request.c sdo_request.h \
|
||||
slave.c slave.h \
|
||||
slave_config.c slave_config.h \
|
||||
soe_errors.c \
|
||||
soe_request.c soe_request.h \
|
||||
sync.c sync.h \
|
||||
sync_config.c sync_config.h \
|
||||
|
||||
@@ -74,6 +74,29 @@ void ec_fsm_soe_error(ec_fsm_soe_t *);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
extern const ec_code_msg_t soe_error_codes[];
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Outputs an SoE error code.
|
||||
*/
|
||||
void ec_print_soe_error(uint16_t error_code)
|
||||
{
|
||||
const ec_code_msg_t *error_msg;
|
||||
|
||||
for (error_msg = soe_error_codes; error_msg->code; error_msg++) {
|
||||
if (error_msg->code == error_code) {
|
||||
EC_ERR("SoE error 0x%04X: \"%s\".\n",
|
||||
error_msg->code, error_msg->message);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
EC_ERR("Unknown SoE error 0x%04X.\n", error_code);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Constructor.
|
||||
*/
|
||||
void ec_fsm_soe_init(
|
||||
@@ -353,8 +376,8 @@ void ec_fsm_soe_read_response(ec_fsm_soe_t *fsm /**< finite state machine */)
|
||||
|
||||
if (error_flag) {
|
||||
req->error_code = EC_READ_U16(data + rec_size - 2);
|
||||
EC_ERR("Received error response: 0x%04x.\n",
|
||||
req->error_code);
|
||||
EC_ERR("Received error response:\n");
|
||||
ec_print_soe_error(req->error_code);
|
||||
fsm->state = ec_fsm_soe_error;
|
||||
return;
|
||||
} else {
|
||||
@@ -658,8 +681,8 @@ void ec_fsm_soe_write_response(ec_fsm_soe_t *fsm /**< finite state machine */)
|
||||
" but received size is %zu.\n", rec_size);
|
||||
} else {
|
||||
req->error_code = EC_READ_U16(data + EC_SOE_WRITE_RESPONSE_SIZE);
|
||||
EC_ERR("Received error response: 0x%04x.\n",
|
||||
req->error_code);
|
||||
EC_ERR("Received error response:\n");
|
||||
ec_print_soe_error(req->error_code);
|
||||
}
|
||||
ec_print_data(data, rec_size);
|
||||
fsm->state = ec_fsm_soe_error;
|
||||
|
||||
96
master/soe_errors.c
Normal file
96
master/soe_errors.c
Normal file
@@ -0,0 +1,96 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH
|
||||
*
|
||||
* This file is part of the IgH EtherCAT Master.
|
||||
*
|
||||
* The IgH EtherCAT Master is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* The IgH EtherCAT Master is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with the IgH EtherCAT Master; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* ---
|
||||
*
|
||||
* The license mentioned above concerns the source code only. Using the
|
||||
* EtherCAT technology and brand is only permitted in compliance with the
|
||||
* industrial property and similar rights of Beckhoff Automation GmbH.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/**
|
||||
\file
|
||||
EtherCAT SoE errors.
|
||||
*/
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#include "globals.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** SoE error codes.
|
||||
*/
|
||||
const ec_code_msg_t soe_error_codes[] = {
|
||||
{0x1001, "No IDN"},
|
||||
{0x1009, "Invalid access to element 1"},
|
||||
{0x2001, "No name"},
|
||||
{0x2002, "Name transmission too short"},
|
||||
{0x2003, "Name transmission too long"},
|
||||
{0x2004, "Name cannot be changed, read only"},
|
||||
{0x2005, "Name is write protected at this time"},
|
||||
{0x3002, "Attribute transmission too short"},
|
||||
{0x3003, "Attribute transmission too long"},
|
||||
{0x3004, "Attribute cannot be changed, read only"},
|
||||
{0x3005, "Attribute is write protected at this time"},
|
||||
{0x4001, "No unit"},
|
||||
{0x4002, "Unit transmission too short"},
|
||||
{0x4003, "Unit transmission too long"},
|
||||
{0x4004, "Unit cannot be changed, read only"},
|
||||
{0x4005, "Unit is write proteced at this time"},
|
||||
{0x5001, "No minimum input value"},
|
||||
{0x5002, "Minimum input value transmission too short"},
|
||||
{0x5003, "Minimum input value transmission too long"},
|
||||
{0x5004, "Minimum input value cannot be changed, read only"},
|
||||
{0x5005, "Minimum input value is write protected at this time"},
|
||||
{0x6001, "No maximum input value"},
|
||||
{0x6002, "Maximum input value transmission too short"},
|
||||
{0x6003, "Maximum input value transmission too long"},
|
||||
{0x6004, "Maximum input value cannot be changed, read only"},
|
||||
{0x6005, "Maximum input value is write protected at this time"},
|
||||
{0x7002, "Operation data value transmission too short"},
|
||||
{0x7003, "Operation data value transmission too long"},
|
||||
{0x7004, "Operation data value cannot be changed, read only"},
|
||||
{0x7005, "Operation data value is write protected at this time"},
|
||||
{0x7006, "Operation data value is smaller than the minimum input value"},
|
||||
{0x7007, "Operation data value is greater than the minimum input value"},
|
||||
{0x7008, "Invalid operation data"},
|
||||
{0x7009, "Operation data is write protected by a password"},
|
||||
{0x700A, "Operation data is write protected"},
|
||||
{0x700B, "Invalid indirect addressing"},
|
||||
{0x700C, "Operation data is write protected due to other settings"},
|
||||
{0x700D, "Reserved"},
|
||||
{0x7010, "Procedure command already active"},
|
||||
{0x7011, "Procedure command not interruptible"},
|
||||
{0x7012, "Procedure command is at this time not executable"},
|
||||
{0x7013, "Procedure command not executable"},
|
||||
{0x7014, "No data state"},
|
||||
{0x8001, "No default value"},
|
||||
{0x8002, "Default value transmission too long"},
|
||||
{0x8004, "Default value cannot be changed, read only"},
|
||||
{0x800A, "Invalid drive number"},
|
||||
{0x800B, "General error"},
|
||||
{0x800C, "No element addressed"},
|
||||
{}
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -28,7 +28,6 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
using namespace std;
|
||||
|
||||
#include "CommandSoeRead.h"
|
||||
@@ -127,8 +126,7 @@ void CommandSoeRead::execute(const StringVector &args)
|
||||
m.readSoe(&ioctl);
|
||||
} catch (MasterDeviceSoeException &e) {
|
||||
delete [] ioctl.data;
|
||||
err << "SoE read command aborted with code 0x"
|
||||
<< setfill('0') << hex << setw(4) << e.errorCode;
|
||||
err << "SoE read command failed with code " << errorMsg(e.errorCode);
|
||||
throwCommandException(err);
|
||||
} catch (MasterDeviceException &e) {
|
||||
delete [] ioctl.data;
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
using namespace std;
|
||||
|
||||
#include "CommandSoeWrite.h"
|
||||
@@ -148,8 +147,7 @@ void CommandSoeWrite::execute(const StringVector &args)
|
||||
m.writeSoe(&ioctl);
|
||||
} catch (MasterDeviceSoeException &e) {
|
||||
delete [] ioctl.data;
|
||||
err << "SoE write command aborted with code 0x"
|
||||
<< setfill('0') << hex << setw(4) << e.errorCode << ".";
|
||||
err << "SoE write command failed with code " << errorMsg(e.errorCode);
|
||||
throwCommandException(err);
|
||||
} catch (MasterDeviceException &e) {
|
||||
delete [] ioctl.data;
|
||||
|
||||
@@ -36,6 +36,7 @@ EXTRA_DIST =
|
||||
bin_PROGRAMS = ethercat
|
||||
|
||||
ethercat_SOURCES = \
|
||||
../master/soe_errors.c \
|
||||
Command.cpp \
|
||||
CommandAlias.cpp \
|
||||
CommandCStruct.cpp \
|
||||
|
||||
@@ -32,6 +32,8 @@ using namespace std;
|
||||
|
||||
#include "SoeCommand.h"
|
||||
|
||||
extern const ec_code_msg_t soe_error_codes[];
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
SoeCommand::SoeCommand(const string &name, const string &briefDesc):
|
||||
@@ -105,4 +107,26 @@ uint16_t SoeCommand::parseIdn(const string &str)
|
||||
return idn;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Outputs an SoE error code.
|
||||
*/
|
||||
std::string SoeCommand::errorMsg(uint16_t code)
|
||||
{
|
||||
const ec_code_msg_t *error_msg;
|
||||
stringstream str;
|
||||
|
||||
str << "0x" << hex << setfill('0') << setw(4) << code << ": ";
|
||||
|
||||
for (error_msg = soe_error_codes; error_msg->code; error_msg++) {
|
||||
if (error_msg->code == code) {
|
||||
str << error_msg->message;
|
||||
return str.str();
|
||||
}
|
||||
}
|
||||
|
||||
str << "(Unknown)";
|
||||
return str.str();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
* EtherCAT technology and brand is only permitted in compliance with the
|
||||
* industrial property and similar rights of Beckhoff Automation GmbH.
|
||||
*
|
||||
* vim: expandtab
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __SOECOMMAND_H__
|
||||
@@ -44,6 +46,7 @@ class SoeCommand:
|
||||
|
||||
protected:
|
||||
static uint16_t parseIdn(const string &);
|
||||
static std::string errorMsg(uint16_t);
|
||||
};
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
Reference in New Issue
Block a user