Documented redundancy, RTDM interface and systemd usage.
--- a/TODO Fri Feb 08 20:02:34 2013 +0100
+++ b/TODO Fri Feb 08 20:03:37 2013 +0100
@@ -8,13 +8,9 @@
-------------------------------------------------------------------------------
-Version 1.5.2:
-
-• Document --with-devices.
-• Document RTDM interface.
-
Future issues:
+• Remove fprintf() calls from user-space library (define return codes).
• Move SII request to slave FSM.
• Move SDO request to slave FSM.
• Simplify slave FSM by introducing a common request state to handle external
--- a/documentation/ethercat_doc.tex Fri Feb 08 20:02:34 2013 +0100
+++ b/documentation/ethercat_doc.tex Fri Feb 08 20:03:37 2013 +0100
@@ -36,7 +36,7 @@
}{}
\lstset{basicstyle=\ttfamily\small,numberstyle=\tiny,aboveskip=4mm,
- belowskip=2mm,escapechar=`}
+ belowskip=2mm,escapechar=`,breaklines=true}
\renewcommand\lstlistlistingname{List of Listings}
% Workaround for lstlistoflistings bug
@@ -65,7 +65,7 @@
\rcsInfo $RCSId$
-\newcommand{\masterversion}{1.5.0}
+\newcommand{\masterversion}{1.5.2}
\newcommand{\linenum}[1]{\normalfont\textcircled{\tiny #1}}
\makeindex
@@ -174,7 +174,7 @@
\begin{itemize}
-\item Designed as a kernel module for Linux 2.6.
+\item Designed as a kernel module for Linux 2.6 / 3.x.
\item Implemented according to IEC 61158-12 \cite{dlspec} \cite{alspec}.
@@ -187,7 +187,7 @@
\item The native drivers operate the hardware without interrupts.
\item Native drivers for additional Ethernet hardware can easily be
- implemented using the common device interface (see sec.~\ref{sec:ecdev})
+ implemented using the common device interface (see~\autoref{sec:ecdev})
provided by the master module.
\item For any other hardware, the generic driver can be used. It uses the
@@ -203,16 +203,17 @@
\begin{itemize}
- \item RTAI\nomenclature{RTAI}{Realtime Application Interface} \cite{rtai},
- ADEOS\nomenclature{ADEOS}{Adaptive Domain Environment for Operating
- Systems}, RT-Preempt \cite{rt-preempt}, etc.
+ \item RTAI\nomenclature{RTAI}{Realtime Application Interface} \cite{rtai}
+ (including LXRT via RTDM), ADEOS\nomenclature{ADEOS}{Adaptive Domain
+ Environment for Operating Systems}, RT-Preempt \cite{rt-preempt}, Xenomai
+ (including RTDM), etc.
\item It runs well even without realtime extensions.
\end{itemize}
\item Common ``Application Interface'' for applications, that want to use
-EtherCAT functionality (see chap.~\ref{chap:api}).
+EtherCAT functionality (see \autoref{chap:api}).
\item \textit{Domains} are introduced, to allow grouping of process
data transfers with different slave groups and task periods.
@@ -239,7 +240,7 @@
\end{itemize}
-\item Distributed Clocks support (see sec.~\ref{sec:dc}).
+\item Distributed Clocks support (see \autoref{sec:dc}).
\begin{itemize}
@@ -249,7 +250,8 @@
\item Synchronization (offset and drift compensation) of the distributed
slave clocks to the reference clock.
- \item Optional synchronization of the reference clock to the master clock.
+ \item Optional synchronization of the reference clock to the master clock or
+ the other way round.
\end{itemize}
@@ -309,7 +311,7 @@
\end{itemize}
-\item Userspace command-line-tool ``ethercat'' (see sec.~\ref{sec:tool})
+\item Userspace command-line-tool ``ethercat'' (see \autoref{sec:tool})
\begin{itemize}
@@ -338,6 +340,8 @@
\item Init script for master control.
+ \item Service file for systemd.
+
\end{itemize}
\item Virtual read-only network interface for monitoring and debugging
@@ -356,8 +360,8 @@
even participate on development.
To allow static linking of userspace application against the master's
-application interface (see chap.~\ref{chap:api}), the userspace library (see
-sec.~\ref{sec:userlib}) is licensed under the terms and conditions of the GNU
+application interface (see \autoref{chap:api}), the userspace library (see
+\autoref{sec:userlib}) is licensed under the terms and conditions of the GNU
Lesser General Public License (LGPL \cite{lgpl})\index{LGPL}, version 2.1.
%------------------------------------------------------------------------------
@@ -366,8 +370,8 @@
\label{chap:arch}
\index{Master!Architecture}
-The EtherCAT master is integrated into the Linux 2.6 kernel. This was
-an early design decision, which has been made for several reasons:
+The EtherCAT master is integrated into the Linux kernel. This was an early
+design decision, which has been made for several reasons:
\begin{itemize}
@@ -385,7 +389,7 @@
\end{itemize}
-Figure~\ref{fig:arch} gives a general overview of the master architecture.
+\autoref{fig:arch} gives a general overview of the master architecture.
\begin{figure}[htbp]
\centering
@@ -399,13 +403,13 @@
\begin{description}
\item[Master Module]\index{Master Module} Kernel module containing one or more
-EtherCAT master instances (see sec.~\ref{sec:mastermod}), the ``Device
-Interface'' (see sec.~\ref{sec:ecdev}) and the ``Application Interface'' (see
-chap.~\ref{chap:api}).
+EtherCAT master instances (see \autoref{sec:mastermod}), the ``Device
+Interface'' (see \autoref{sec:ecdev}) and the ``Application Interface'' (see
+\autoref{chap:api}).
\item[Device Modules]\index{Device modules} EtherCAT-capable Ethernet device
driver modules\index{Device modules}, that offer their devices to the EtherCAT
-master via the device interface (see sec.~\ref{sec:ecdev}). These modified
+master via the device interface (see \autoref{sec:ecdev}). These modified
network drivers can handle network devices used for EtherCAT operation and
``normal'' Ethernet devices in parallel. A master can accept a certain device
and then is able to send and receive EtherCAT frames. Ethernet devices
@@ -416,13 +420,13 @@
(usually for cyclic exchange of process data with EtherCAT slaves). These
programs are not part of the EtherCAT master code\footnote{Although there are
some examples provided in the \textit{examples/} directory.}, but have to be
-generated or written by the user. An application can ``request'' a master
-through the application interface (see chap.~\ref{chap:api}). If this
-succeeds, it has the control over the master: It can provide a bus
-configuration and exchange process data. Applications can be kernel modules
-(that use the kernel application interface directly) or userspace programs,
-that use the application interface via the EtherCAT library (see
-sec.~\ref{sec:userlib}).
+generated or written by the user. An application can request a master through
+the application interface (see \autoref{chap:api}). If this succeeds, it has
+the control over the master: It can provide a bus configuration and exchange
+process data. Applications can be kernel modules (that use the kernel
+application interface directly) or userspace programs, that use the
+application interface via the EtherCAT library (see \autoref{sec:userlib}), or
+the RTDM library (see~\autoref{sec:rtdm}).
\end{description}
@@ -433,14 +437,14 @@
\index{Master module}
The EtherCAT master kernel module \textit{ec\_master} can contain multiple
-master instances. Each master waits for a certain Ethernet device identified
-by its MAC address\index{MAC address}. These addresses have to be specified on
-module loading via the \textit{main\_devices} module parameter. The number of
-master instances to initialize is taken from the number of MAC addresses
-given.
+master instances. Each master waits for certain Ethernet device(s) identified
+by its MAC address(es)\index{MAC address}. These addresses have to be
+specified on module loading via the \textit{main\_devices} (and optional:
+\textit{backup\_devices}) module parameter. The number of master instances to
+initialize is taken from the number of MAC addresses given.
The below command loads the master module with a single master instance that
-waits for the Ethernet device with the MAC address
+waits for one Ethernet device with the MAC address
\lstinline+00:0E:0C:DA:A2:20+. The master will be accessible via index $0$.
\begin{lstlisting}
@@ -454,10 +458,10 @@
\end{lstlisting}
The two masters can be addressed by their indices 0 and 1 respectively (see
-figure~\ref{fig:masters}). The master index is needed for the
+\autoref{fig:masters}). The master index is needed for the
\lstinline+ecrt_master_request()+ function of the application interface (see
-chap.~\ref{chap:api}) and the \lstinline+--master+ option of the
-\textit{ethercat} command-line tool (see sec.~\ref{sec:tool}), which defaults
+\autoref{chap:api}) and the \lstinline+--master+ option of the
+\textit{ethercat} command-line tool (see \autoref{sec:tool}), which defaults
to $0$.
\begin{figure}[htbp]
@@ -469,19 +473,20 @@
\paragraph{Debug Level} The master module also has a parameter
\textit{debug\_level} to set the initial debug level for all masters (see
-also~\ref{sec:ethercat-debug}).
+also~\autoref{sec:ethercat-debug}).
\paragraph{Init Script}
\index{Init script}
In most cases it is not necessary to load the master module and the Ethernet
driver modules manually. There is an init script available, so the master can
-be started as a service (see sec.~\ref{sec:system}).
+be started as a service (see \autoref{sec:system}). For systems that are
+managed by systemd \cite{systemd}, there is also a service file available.
\paragraph{Syslog}
The master module outputs information about its state and events to the kernel
-ring buffer. These also end up in the system logs. The above module loading
+ring buffer. These also end up in the system logs. The above module loading
command should result in the messages below:
\begin{lstlisting}
@@ -495,8 +500,8 @@
for devices.
\end{lstlisting}
-All EtherCAT master output is prefixed with \lstinline+EtherCAT+ which makes
-searching the logs easier.
+Master output is prefixed with \lstinline+EtherCAT+ which makes searching the
+logs easier.
%------------------------------------------------------------------------------
@@ -504,8 +509,8 @@
\index{Master phases}
Every EtherCAT master provided by the master module (see
-sec.~\ref{sec:mastermod}) runs through several phases (see
-fig.~\ref{fig:phases}):
+\autoref{sec:mastermod}) runs through several phases (see
+\autoref{fig:phases}):
\begin{figure}[htbp]
\centering
@@ -517,16 +522,16 @@
\begin{description}
\item[Orphaned phase]\index{Orphaned phase} This mode takes effect, when the
-master still waits for its Ethernet device to connect. No bus communication is
-possible until then.
+master still waits for its Ethernet device(s) to connect. No bus communication
+is possible until then.
\item[Idle phase]\index{Idle phase} takes effect when the master has accepted
-an Ethernet device, but is not requested by any application yet. The master
-runs its state machine (see sec.~\ref{sec:fsm-master}), that automatically
-scans the bus for slaves and executes pending operations from the userspace
-interface (for example SDO access). The command-line tool can be used to
-access the bus, but there is no process data exchange because of the missing
-bus configuration.
+all required Ethernet devices, but is not requested by any application yet.
+The master runs its state machine (see \autoref{sec:fsm-master}), that
+automatically scans the bus for slaves and executes pending operations from
+the userspace interface (for example SDO access). The command-line tool can be
+used to access the bus, but there is no process data exchange because of the
+missing bus configuration.
\item[Operation phase]\index{Operation phase} The master is requested by an
application that can provide a bus configuration and exchange process data.
@@ -546,9 +551,9 @@
Slaves offer their inputs and outputs by presenting the master so-called
``Process Data Objects'' (PDOs\index{PDO}). The available PDOs can be either
-determined by reading out the slave's TXPDO and RXPDO SII categories from the
+determined by reading out the slave's TxPDO and RxPDO SII categories from the
E$^2$PROM (in case of fixed PDOs) or by reading out the appropriate CoE
-objects (see sec.~\ref{sec:coe}), if available. The application can register
+objects (see \autoref{sec:coe}), if available. The application can register
the PDOs' entries for exchange during cyclic operation. The sum of all
registered PDO entries defines the ``process data image'', which is exchanged
via datagrams with ``logical'' memory access (like LWR, LRD or LRW) introduced
@@ -605,7 +610,7 @@
second PDO entry would belong to another sync-manager-protected area, this
complete area would also be included into the domains process data image.
-Figure~\ref{fig:fmmus} gives an overview, how FMMUs are configured to map
+\autoref{fig:fmmus} gives an overview, how FMMUs are configured to map
physical memory to logical process data images.
\begin{figure}[htbp]
@@ -639,7 +644,7 @@
interface is included as Doxygen~\cite{doxygen} comments in the header file
\textit{include/ecrt.h}. It can either be read directly from the file
comments, or as a more comfortable HTML documentation. The HTML generation is
-described in sec.~\ref{sec:gendoc}.
+described in \autoref{sec:gendoc}.
The following sections cover a general description of the application
interface.
@@ -650,10 +655,10 @@
\item[Configuration] The master is requested and the configuration is applied.
For example, domains are created, slaves are configured and PDO entries are
-registered (see sec.~\ref{sec:masterconfig}).
+registered (see \autoref{sec:masterconfig}).
\item[Operation] Cyclic code is run and process data are exchanged (see
-sec.~\ref{sec:cyclic}).
+\autoref{sec:cyclic}).
\end{description}
@@ -667,7 +672,7 @@
\label{sec:masterconfig}
The bus configuration is supplied via the application interface.
-Figure~\ref{fig:app-config} gives an overview of the objects, that can be
+\autoref{fig:app-config} gives an overview of the objects, that can be
configured by the application.
\begin{figure}[htbp]
@@ -690,14 +695,14 @@
and the slave is configured according to the settings provided by the
application. The state of a slave configuration can either be queried via the
application interface or via the command-line tool (see
-sec.~\ref{sec:ethercat-config}).
+\autoref{sec:ethercat-config}).
\paragraph{Slave Position} The slave position has to be specified as a tuple
of ``alias'' and ``position''. This allows addressing slaves either via an
absolute bus position, or a stored identifier called ``alias'', or a mixture
of both. The alias is a 16-bit value stored in the slave's E$^2$PROM. It can
-be modified via the command-line tool (see sec.~\ref{sec:ethercat-alias}).
-Table~\ref{tab:slaveposition} shows, how the values are interpreted.
+be modified via the command-line tool (see \autoref{sec:ethercat-alias}).
+\autoref{tab:slaveposition} shows, how the values are interpreted.
\begin{table}[htbp]
\centering
@@ -721,7 +726,7 @@
\end{tabular}
\end{table}
-Figure~\ref{fig:attach} shows an example of how slave configurations are
+\autoref{fig:attach} shows an example of how slave configurations are
attached. Some of the configurations were attached, while others remain
detached. The below lists gives the reasons beginning with the top slave
configuration.
@@ -753,6 +758,9 @@
\end{enumerate}
+If the master sources are configured with \lstinline+--enable-wildcards+, then
+\lstinline+0xffffffff+ matches every vendor ID and/or product code.
+
%------------------------------------------------------------------------------
\section{Cyclic Operation}
@@ -762,7 +770,7 @@
To enter cyclic operation mode, the master has to be ``activated'' to
calculate the process data image and apply the bus configuration for the first
time. After activation, the application is in charge to send and receive
-frames.
+frames. The configuration can not be changed after activation.
% TODO
%
@@ -775,7 +783,7 @@
\label{sec:api-voe}
During the configuration phase, the application can create handlers for the
-VoE mailbox protocol described in sec.~\ref{sec:voe}. One VoE handler always
+VoE mailbox protocol described in \autoref{sec:voe}. One VoE handler always
belongs to a certain slave configuration, so the creation function is a method
of the slave configuration.
@@ -807,7 +815,7 @@
In some cases, one master is used by several instances, for example when an
application does cyclic process data exchange, and there are EoE-capable
slaves that require to exchange Ethernet data with the kernel (see
-sec.~\ref{sec:eoe}). For this reason, the master is a shared resource, and
+\autoref{sec:eoe}). For this reason, the master is a shared resource, and
access to it has to be sequentialized. This is usually done by locking with
semaphores, or other methods to protect critical sections.
@@ -829,14 +837,14 @@
\label{fig:locks}
\end{figure}
-Figure~\ref{fig:locks} exemplary shows, how two processes share one master:
+\autoref{fig:locks} exemplary shows, how two processes share one master:
The application's cyclic task uses the master for process data exchange, while
the master-internal EoE process uses it to communicate with EoE-capable
slaves. Both have to access the bus from time to time, but the EoE process
does this by ``asking'' the application to do the bus access for it. In this
way, the application can use the appropriate locking mechanism to avoid
accessing the bus at the same time. See the application interface
-documentation (chap.~\ref{chap:api}) for how to use these callbacks.
+documentation (\autoref{chap:api}) for how to use these callbacks.
%------------------------------------------------------------------------------
@@ -849,7 +857,7 @@
``reference clock'' (which is the local clock of the first slave with DC
support) and to synchronize the reference clock to the ``master clock'' (which
is the local clock of the master). All other clocks on the bus (after the
-reference clock) are considered as ``slave clocks'' (see fig.~\ref{fig:dc}).
+reference clock) are considered as ``slave clocks'' (see \autoref{fig:dc}).
\begin{figure}[htbp]
\centering
@@ -935,7 +943,7 @@
broadcast-reading all system time difference registers on the bus to get an
upper approximation}. To check for bus synchrony, the system time difference
registers can also be cyclically read via the command-line-tool (see
-sec.~\ref{sec:regaccess}):
+\autoref{sec:regaccess}):
\begin{lstlisting}
$ `\textbf{watch -n0 "ethercat reg\_read -p4 -tsm32 0x92c"}`
@@ -965,10 +973,10 @@
hardware.
\paragraph{Native Ethernet Device Drivers} There are native device driver
-modules (see sec.~\ref{sec:native-drivers}) that handle Ethernet hardware,
+modules (see \autoref{sec:native-drivers}) that handle Ethernet hardware,
which a master can use to connect to an EtherCAT bus. They offer their
Ethernet hardware to the master module via the device interface (see
-sec.~\ref{sec:ecdev}) and must be capable to prepare Ethernet devices either
+\autoref{sec:ecdev}) and must be capable to prepare Ethernet devices either
for EtherCAT (realtime) operation or for ``normal'' operation using the
kernel's network stack. The advantage of this approach is that the master can
operate nearly directly on the hardware, which allows a high performance. The
@@ -976,7 +984,7 @@
original Ethernet driver.
\paragraph{Generic Ethernet Device Driver} From master version 1.5, there is a
-generic Ethernet device driver module (see sec.~\ref{sec:generic-driver}),
+generic Ethernet device driver module (see \autoref{sec:generic-driver}),
that uses the lower layers of the network stack to connect to the hardware.
The advantage is, that arbitrary Ethernet hardware can be used for EtherCAT
operation, independently of the actual hardware driver (so all Linux Ethernet
@@ -1126,7 +1134,7 @@
frame reception: The master can instead query the hardware for received
frames, if it expects them to be already received.
-Figure~\ref{fig:interrupt} shows two workflows for cyclic frame transmission
+\autoref{fig:interrupt} shows two workflows for cyclic frame transmission
and reception with and without interrupts.
\begin{figure}[htbp]
@@ -1199,7 +1207,7 @@
Since there are approaches to enable the complete Linux kernel for realtime
operation \cite{rt-preempt}, it is possible to operate without native
implementations of EtherCAT-capable Ethernet device drivers and use the Linux
-network stack instead. Fig.~\ref{fig:arch} shows the ``Generic Ethernet Driver
+network stack instead. \autoref{fig:arch} shows the ``Generic Ethernet Driver
Module'', that connects to local Ethernet devices via the network stack. The
kernel module is named \lstinline+ec_generic+ and can be loaded after the
master module like a native EtherCAT-capable Ethernet driver.
@@ -1209,7 +1217,7 @@
the EtherCAT master. If the master accepts a device, the generic driver
creates a packet socket (see \lstinline+man 7 packet+) with
\lstinline+socket_type+ set to \lstinline+SOCK_RAW+, bound to that device. All
-functions of the device interface (see sec.~\ref{sec:ecdev}) will then operate
+functions of the device interface (see \autoref{sec:ecdev}) will then operate
on that socket.
Below are the advantages of this solution:
@@ -1237,29 +1245,57 @@
\label{sec:providing-devices}
After loading the master module, additional module(s) have to be loaded to
-offer devices to the master(s) (see sec.~\ref{sec:ecdev}). The master module
+offer devices to the master(s) (see \autoref{sec:ecdev}). The master module
knows the devices to choose from the module parameters (see
-sec.~\ref{sec:mastermod}). If the init script is used to start the master, the
+\autoref{sec:mastermod}). If the init script is used to start the master, the
drivers and devices to use can be specified in the sysconfig file (see
-sec.~\ref{sec:sysconfig}).
+\autoref{sec:sysconfig}).
Modules offering Ethernet devices can be
\begin{itemize}
\item native EtherCAT-capable network driver modules (see
-sec.~\ref{sec:native-drivers}) or
+\autoref{sec:native-drivers}) or
\item the generic EtherCAT device driver module (see
-sec.~\ref{sec:generic-driver}).
+\autoref{sec:generic-driver}).
\end{itemize}
%------------------------------------------------------------------------------
+\section{Redundancy}
+\label{sec:redundancy}
+\index{Redundancy}
+
+Redundant bus operation means, that there is more than one Ethernet connection
+from the master to the slaves. Process data exchange datagrams are sent out on
+every master link, so that the exchange is still complete, even if the bus is
+disconnected somewhere in between.
+
+Prerequisite for fully redundant bus operation is, that every slave can be
+reached by at least one master link. In this case a single connection failure
+(i.\,e.~cable break) will never lead to incomplete process data. Double-faults
+can not be handled with two Ethernet devices.
+
+Redundancy is configured with the \lstinline+--with-devices+ switch at
+configure time (see \autoref{sec:installation}) and using the
+\lstinline+backup_devices+ parameter of the \lstinline+ec_master+ kernel
+module (see \autoref{sec:mastermod}) or the appropriate variable
+\lstinline+MASTERx_BACKUP+ in the (sys-)config file (see
+\autoref{sec:sysconfig}).
+
+Bus scanning is done after a topology change on any Ethernet link. The
+application interface (see \autoref{chap:api}) and the command-line tool (see
+\autoref{sec:tool}) both have methods to query the status of the redundant
+operation.
+
+%------------------------------------------------------------------------------
+
\section{EtherCAT Device Interface}
\label{sec:ecdev}
\index{Device interface}
An anticipation to the section about the master module
-(sec.~\ref{sec:mastermod}) has to be made in order to understand the way, a
+(\autoref{sec:mastermod}) has to be made in order to understand the way, a
network device driver module can connect a device to a specific EtherCAT
master.
@@ -1272,7 +1308,7 @@
The documentation of the device interface can be found in the header file or
in the appropriate module of the interface documentation (see
-sec.~\ref{sec:gendoc} for generation instructions).
+\autoref{sec:gendoc} for generation instructions).
% TODO general description of the device interface
@@ -1284,7 +1320,7 @@
This section will describe, how to make a standard Ethernet driver
EtherCAT-capable, using the native approach (see
-sec.~\ref{sec:native-drivers}). Unfortunately, there is no standard procedure
+\autoref{sec:native-drivers}). Unfortunately, there is no standard procedure
to enable an Ethernet driver for use with the EtherCAT master, but there are a
few common techniques.
@@ -1313,7 +1349,7 @@
Ethernet devices and the ones used by EtherCAT masters, the private data
structure used by the driver could be extended by a pointer, that points to an
\lstinline+ec_device_t+ object returned by \lstinline+ecdev_offer()+ (see
-sec.~\ref{sec:ecdev}) if the device is used by a master and otherwise is zero.
+\autoref{sec:ecdev}) if the device is used by a master and otherwise is zero.
The RealTek RTL-8139 Fast Ethernet driver is a ``simple'' Ethernet driver and
can be taken as an example to patch new drivers. The interesting sections can
@@ -1354,7 +1390,7 @@
for datagram reception. There is no difficulty when only one instance is using
the master, but if more instances want to (synchronously\footnote{At this
time, synchronous master access will be adequate to show the advantages of an
-FSM. The asynchronous approach will be discussed in sec.~\ref{sec:eoe}}) use
+FSM. The asynchronous approach will be discussed in \autoref{sec:eoe}}) use
the master, it is inevitable to think about an alternative to the sequential
model.
@@ -1375,7 +1411,7 @@
This approach results in all instances having to retain their state,
when giving the control back to the higher instance. It is quite
obvious to use a \textit{finite state machine} model in this case.
-Section~\ref{sec:fsmtheory} will introduce some of the theory used,
+\autoref{sec:fsmtheory} will introduce some of the theory used,
while the listings below show the basic approach by coding the example
from above as a state machine:
@@ -1401,7 +1437,7 @@
// state processing finished.
\end{lstlisting}
-See sec.~\ref{sec:statemodel} for an introduction to the state machine
+See \autoref{sec:statemodel} for an introduction to the state machine
programming concept used in the master code.
%------------------------------------------------------------------------------
@@ -1432,7 +1468,7 @@
The state transition function $\delta$ is often specified by a
\textit{state transition table}, or by a \textit{state transition
diagram}. The transition table offers a matrix view of the state
-machine behavior (see table~\ref{tab:statetrans}). The matrix rows
+machine behavior (see \autoref{tab:statetrans}). The matrix rows
correspond to the states ($S = \{s_0, s_1, s_2\}$) and the columns
correspond to the input symbols ($\Gamma = \{a, b, \varepsilon\}$).
The table contents in a certain row $i$ and column $j$ then represent
@@ -1453,7 +1489,7 @@
\end{table}
The state diagram for the same example looks like the one in
-figure~\ref{fig:statetrans}. The states are represented as circles or
+\autoref{fig:statetrans}. The states are represented as circles or
ellipses and the transitions are drawn as arrows between them. Close
to a transition arrow can be the condition that must be fulfilled to
allow the transition. The initial state is marked by a filled black
@@ -1580,7 +1616,7 @@
If a closer look is taken to the above listing, it can be seen that the
actions executed (the ``outputs'' of the state machine) only depend on the
current state. This accords to the ``Moore'' model introduced in
-sec.~\ref{sec:fsmtheory}. As mentioned, the ``Mealy'' model offers a higher
+\autoref{sec:fsmtheory}. As mentioned, the ``Mealy'' model offers a higher
flexibility, which can be seen in the listing below:
\begin{lstlisting}[gobble=2,language=C,numbers=left]
@@ -1629,7 +1665,7 @@
To avoid having too much states, certain functions of the EtherCAT master
state machine have been sourced out into sub state machines. This helps to
encapsulate the related workflows and moreover avoids the ``state explosion''
-phenomenon described in sec.~\ref{sec:fsmtheory}. If the master would instead
+phenomenon described in \autoref{sec:fsmtheory}. If the master would instead
use one big state machine, the number of states would be a multiple of the
actual number. This would increase the level of complexity to a non-manageable
grade.
@@ -1689,7 +1725,7 @@
\index{FSM!Master}
The master state machine is executed in the context of the master thread.
-Figure~\ref{fig:fsm-master} shows its transition diagram. Its purposes are:
+\autoref{fig:fsm-master} shows its transition diagram. Its purposes are:
\begin{figure}[htbp]
\centering
@@ -1720,7 +1756,7 @@
\index{FSM!Slave Scan}
The slave scan state machine, which can be seen in
-figure~\ref{fig:fsm-slavescan}, leads through the process of reading desired
+\autoref{fig:fsm-slavescan}, leads through the process of reading desired
slave information.
\begin{figure}[htbp]
@@ -1750,11 +1786,11 @@
\item[SII Data] The SII contents are read into the master's image.
\item[PREOP] If the slave supports CoE, it is set to PREOP state using the
-State change FSM (see sec.~\ref{sec:fsm-change}) to enable mailbox
+State change FSM (see \autoref{sec:fsm-change}) to enable mailbox
communication and read the PDO configuration via CoE.
\item[PDOs] The PDOs are read via CoE (if supported) using the PDO Reading FSM
-(see sec.~\ref{sec:fsm-pdo}). If this is successful, the PDO information from
+(see \autoref{sec:fsm-pdo}). If this is successful, the PDO information from
the SII (if any) is overwritten.
\end{description}
@@ -1766,7 +1802,7 @@
\index{FSM!Slave Configuration}
The slave configuration state machine, which can be seen in
-figure~\ref{fig:fsm-slaveconf}, leads through the process of configuring a
+\autoref{fig:fsm-slaveconf}, leads through the process of configuring a
slave and bringing it to a certain application-layer state.
\begin{figure}[htbp]
@@ -1794,7 +1830,7 @@
If this is the requested state, the state machine is finished.
\item[SDO Configuration] If there is a slave configuration attached (see
-sec.~\ref{sec:masterconfig}), and there are any SDO configurations are
+\autoref{sec:masterconfig}), and there are any SDO configurations are
provided by the application, these are sent to the slave.
\item[PDO Configuration] The PDO configuration state machine is executed to
@@ -1822,7 +1858,7 @@
\index{FSM!State Change}
The state change state machine, which can be seen in
-figure~\ref{fig:fsm-change}, leads through the process of changing a slave's
+\autoref{fig:fsm-change}, leads through the process of changing a slave's
application-layer state. This implements the states and transitions described
in \cite[sec.~6.4.1]{alspec}.
@@ -1869,7 +1905,7 @@
\label{sec:fsm-sii}
\index{FSM!SII}
-The SII\index{SII} state machine (shown in figure~\ref{fig:fsm-sii})
+The SII\index{SII} state machine (shown in \autoref{fig:fsm-sii})
implements the process of reading or writing SII data via the Slave
Information Interface described in \cite[sec.~6.4]{dlspec}.
@@ -1923,13 +1959,13 @@
The PDO state machines are a set of state machines that read or write the PDO
assignment and the PDO mapping via the ``CoE Communication Area'' described in
\cite[sec. 5.6.7.4]{alspec}. For the object access, the CANopen over EtherCAT
-access primitives are used (see sec.~\ref{sec:coe}), so the slave must support
+access primitives are used (see \autoref{sec:coe}), so the slave must support
the CoE mailbox protocol.
-\paragraph{PDO Reading FSM} This state machine (fig.~\ref{fig:fsm-pdo-read})
+\paragraph{PDO Reading FSM} This state machine (\autoref{fig:fsm-pdo-read})
has the purpose to read the complete PDO configuration of a slave. It reads
the PDO assignment for each Sync Manager and uses the PDO Entry Reading FSM
-(fig.~\ref{fig:fsm-pdo-entry-read}) to read the mapping for each assigned PDO.
+(\autoref{fig:fsm-pdo-entry-read}) to read the mapping for each assigned PDO.
\begin{figure}[htbp]
\centering
@@ -1945,7 +1981,7 @@
FSM is executed to read the PDO's mapped PDO entries.
\paragraph{PDO Entry Reading FSM} This state machine
-(fig.~\ref{fig:fsm-pdo-entry-read}) reads the PDO mapping (the PDO entries) of
+(\autoref{fig:fsm-pdo-entry-read}) reads the PDO mapping (the PDO entries) of
a PDO. It reads the respective mapping SDO (\lstinline+0x1600+ --
\lstinline+0x17ff+, or \lstinline+0x1a00+ -- \lstinline+0x1bff+) for the given
PDO by reading first the subindex zero (number of elements) to determine the
@@ -2003,7 +2039,7 @@
\begin{description}
\item[eoeXsY] for a slave without an alias address (see
-sec.~\ref{sec:ethercat-alias}), where X is the master index and Y is the
+\autoref{sec:ethercat-alias}), where X is the master index and Y is the
slave's ring position, or
\item[eoeXaY] for a slave with a non-zero alias address, where X is the master
@@ -2050,7 +2086,7 @@
\paragraph{Creation of EoE Handlers}
-During bus scanning (see sec.~\ref{sec:fsm-scan}), the master determines the
+During bus scanning (see \autoref{sec:fsm-scan}), the master determines the
supported mailbox protocols foe each slave. This is done by examining the
``Supported Mailbox Protocols'' mask field at word address 0x001C of the
SII\index{SII}. If bit 1 is set, the slave supports the EoE protocol. In this
@@ -2062,7 +2098,7 @@
Every EoE handler owns an EoE state machine, that is used to send frames to
the corresponding slave and receive frames from the it via the EoE
communication primitives. This state machine is showed in
-figure~\ref{fig:fsm-eoe}.
+\autoref{fig:fsm-eoe}.
\begin{figure}[htbp]
\centering
@@ -2123,7 +2159,7 @@
To execute the EoE state machine of every active EoE handler, there must be a
cyclic process. The easiest solution would be to execute the EoE state
machines synchronously with the master state machine (see
-sec.~\ref{sec:fsm-master}). This approach has the following disadvantage:
+\autoref{sec:fsm-master}). This approach has the following disadvantage:
Only one EoE fragment could be sent or received every few cycles. This
causes the data rate to be very low, because the EoE state machines are not
@@ -2134,7 +2170,7 @@
execute the EoE state machines. For that, the master owns a kernel timer, that
is executed each timer interrupt. This guarantees a constant bandwidth, but
poses the new problem of concurrent access to the master. The locking
-mechanisms needed for this are introduced in sec.~\ref{sec:concurr}.
+mechanisms needed for this are introduced in \autoref{sec:concurr}.
\paragraph{Automatic Configuration}
@@ -2166,13 +2202,13 @@
because mailbox communication is already possible and slave's application will
start with updating input data in the succeeding SAFEOP state. Therefore the
SDO configuration has to be part of the slave configuration state machine (see
-sec.~\ref{sec:fsm-conf}): It is implemented via an SDO download state machine,
+\autoref{sec:fsm-conf}): It is implemented via an SDO download state machine,
that is executed just before entering the slave's SAFEOP state. In this way,
it is guaranteed that the SDO configurations are applied each time, the slave
is reconfigured.
The transition diagram of the SDO Download state machine can be seen
-in figure~\ref{fig:fsm-coedown}.
+in \autoref{fig:fsm-coedown}.
\begin{figure}[htbp]
\centering
@@ -2229,10 +2265,10 @@
constraints regarding this protocol.
The EtherCAT master allows to create multiple VoE handlers per slave
-configuration via the application interface (see chap.~\ref{chap:api}). These
+configuration via the application interface (see \autoref{chap:api}). These
handlers contain the state machine necessary for the communication via VoE.
-For more information about using VoE handlers, see sec.~\ref{sec:api-voe} or
+For more information about using VoE handlers, see \autoref{sec:api-voe} or
the example applications provided in the \textit{examples/} subdirectory.
%------------------------------------------------------------------------------
@@ -2245,7 +2281,7 @@
61800-7 \cite{soespec} via EtherCAT mailboxes.
The SoE protocol is quite similar to the CoE protocol (see
-sec.~\ref{sec:coe}). Instead of SDO indices and subindices, so-called
+\autoref{sec:coe}). Instead of SDO indices and subindices, so-called
identification numbers (IDNs) identify parameters.
The implementation covers the ``SCC Read'' and ``SCC Write'' primitives, each
@@ -2256,14 +2292,14 @@
\begin{itemize}
\item Reading and writing IDNs via the command-line tool (see
-sec.~\ref{sec:soeaccess}).
+\autoref{sec:soeaccess}).
\item Storing configurations for arbitrary IDNs via the application interface
-(see chap.~\ref{chap:api}, i.\,e.~\lstinline+ecrt_slave_config_idn()+). These
+(see \autoref{chap:api}, i.\,e.~\lstinline+ecrt_slave_config_idn()+). These
configurations are written to the slave during configuration in PREOP state,
before going to SAFEOP.
-\item The user-space library (see sec.~\ref{sec:userlib}), offers functions to
+\item The user-space library (see \autoref{sec:userlib}), offers functions to
read/write IDNs in blocking mode (\lstinline+ecrt_master_read_idn()+,
\lstinline+ecrt_master_write_idn()+).
@@ -2284,20 +2320,20 @@
Bus visualization is another point: For development and debugging purposes it
is necessary to show the connected slaves with a single command, for instance
-(see sec.~\ref{sec:tool}).
+(see \autoref{sec:tool}).
The application interface has to be available in userspace, to allow userspace
programs to use EtherCAT master functionality. This was implemented via a
-character device and a userspace library (see sec.~\ref{sec:userlib}).
+character device and a userspace library (see \autoref{sec:userlib}).
Another aspect is automatic startup and configuration. The master must be able
to automatically start up with a persistent configuration (see
-sec.~\ref{sec:system}).
+\autoref{sec:system}).
A last thing is monitoring EtherCAT communication. For debugging purposes,
there had to be a way to analyze EtherCAT datagrams. The best way would be
-with a popular network analyzer, like Wireshark \cite{wireshark} (the former
-Ethereal) or others (see sec.~\ref{sec:debug}).
+with a popular network analyzer, like Wireshark \cite{wireshark} or others
+(see \autoref{sec:debug}).
This chapter covers all these points and introduces the interfaces and tools
to make all that possible.
@@ -2318,7 +2354,7 @@
\paragraph{Device Node Creation} The character device nodes are automatically
created, if the \lstinline+udev+ Package is installed. See
-sec.~\ref{sec:autonode} for how to install and configure it.
+\autoref{sec:autonode} for how to install and configure it.
%------------------------------------------------------------------------------
@@ -2458,7 +2494,7 @@
\end{lstlisting}
To download SII contents to a slave, writing access to the master's character
-device is necessary (see sec.~\ref{sec:cdev}).
+device is necessary (see \autoref{sec:cdev}).
\lstinputlisting[basicstyle=\ttfamily\footnotesize]{external/ethercat_sii_write}
@@ -2519,7 +2555,7 @@
\section{Userspace Library}
\label{sec:userlib}
-The native application interface (see chap.~\ref{chap:api}) resides in
+The native application interface (see \autoref{chap:api}) resides in
kernelspace and hence is only accessible from inside the kernel. To make the
application interface available from userspace programs, a userspace library
has been created, that can be linked to programs under the terms and
@@ -2559,7 +2595,8 @@
The program can be compiled and dynamically linked to the library with the
below command:
-\begin{lstlisting}
+\begin{lstlisting}[caption=Linker command for using the userspace library,
+label=lst:linker-user]
gcc ethercat.c -o ectest -I/opt/etherlab/include \
-L/opt/etherlab/lib -lethercat \
-Wl,--rpath -Wl,/opt/etherlab/lib
@@ -2576,17 +2613,17 @@
\label{sec:userimp}
Basically the kernel API was transferred into userspace via the master
-character device (see chap.~\ref{chap:arch}, fig.~\ref{fig:arch} and
-sec.~\ref{sec:cdev}).
+character device (see \autoref{chap:arch}, \autoref{fig:arch} and
+\autoref{sec:cdev}).
The function calls of the kernel API are mapped to the userspace via an
\lstinline+ioctl()+ interface. The userspace API functions share a set of
generic \lstinline+ioctl()+ calls. The kernel part of the interface calls the
according API functions directly, what results in a minimum additional delay
-(see sec.~\ref{sec:usertiming}).
+(see \autoref{sec:usertiming}).
For performance reasons, the actual domain process data (see
-sec.~\ref{sec:processdata}) are not copied between kernel and user memory on
+\autoref{sec:processdata}) are not copied between kernel and user memory on
every access: Instead, the data are memory-mapped to the userspace
application. Once the master is configured and activated, the master module
creates one process data memory area spanning all domains and maps it to
@@ -2604,7 +2641,7 @@
\label{sec:usertiming}
An interesting aspect is the timing of the userspace library calls compared to
-those of the kernel API. Table~\ref{tab:usertiming} shows the call times and
+those of the kernel API. \autoref{tab:usertiming} shows the call times and
standard deviancies of typical (and time-critical) API functions measured on
an Intel Pentium 4 M CPU with \unit{2.2}{\giga\hertz} and a standard 2.6.26
kernel.
@@ -2660,11 +2697,41 @@
%------------------------------------------------------------------------------
+\section{RTDM Interface}
+\label{sec:rtdm}
+
+When using the userspace interfaces of realtime extensions like Xenomai or
+RTAI, the use of \textit{ioctl()} is not recommended, because it may disturb
+realtime operation. To accomplish this, the Real-Time Device Model (RTDM)
+\cite{rtdm} has been developed. The master module provides an RTDM interface
+(see \autoref{fig:arch}) in addition to the normal character device, if the
+master sources were configured with \lstinline+--enable-rtdm+ (see
+\autoref{sec:installation}).
+
+To force an application to use the RTDM interface instead of the normal
+character device, it has to be linked with the \textit{libethercat\_rtdm}
+library instead of \textit{libethercat}. The use of the
+\textit{libethercat\_rtdm} is transparent, so the EtherCAT header
+\textit{ecrt.h} with the complete API can be used as usual.
+
+To make the example in \autoref{lst:linker-user} use the RTDM library, the
+linker command has to be altered as follows:
+
+\begin{lstlisting}
+gcc ethercat-with-rtdm.c -o ectest -I/opt/etherlab/include \
+ -L/opt/etherlab/lib -lethercat_rtdm \
+ -Wl,--rpath -Wl,/opt/etherlab/lib
+\end{lstlisting}
+
+%------------------------------------------------------------------------------
+
\section{System Integration}
\label{sec:system}
To integrate the EtherCAT master as a service into a running system, it comes
-with an init script and a sysconfig file, that are described below.
+with an init script and a sysconfig file, that are described below. Modern
+systems may be managed by systemd \cite{systemd}. Integration of the master
+with systemd is described in \autoref{sec:systemd}.
\subsection{Init Script}
\label{sec:init}
@@ -2674,7 +2741,7 @@
Standard Base'' (LSB\index{LSB}, \cite{lsb}). The script is installed to
\textit{etc/init.d/ethercat} below the installation prefix and has to be
copied (or better: linked) to the appropriate location (see
-sec.~\ref{sec:installation}), before the master can be inserted as a service.
+\autoref{sec:installation}), before the master can be inserted as a service.
Please note, that the init script depends on the sysconfig file described
below.
@@ -2699,6 +2766,10 @@
\lstinputlisting[numbers=left,firstline=9,basicstyle=\ttfamily\scriptsize]
{../script/sysconfig/ethercat}
+For systems managed by systemd (see \autoref{sec:systemd}), the sysconfig file
+has moved to \lstinline+/etc/ethercat.conf+. Both versions are part of the
+master sources and are meant to used alternatively.
+
\subsection{Starting the Master as a Service}
\label{sec:service}
\index{Service}
@@ -2723,6 +2794,29 @@
Starting EtherCAT master done
\end{lstlisting}
+\subsection{Integration with systemd}
+\label{sec:systemd}
+\index{systemd}
+
+Distributions using \textit{systemd} instead of the SysV init system are using service files to describe how a service is to be maintained. \autoref{lst:service} lists the master's service file:
+
+\lstinputlisting[basicstyle=\ttfamily\footnotesize,caption=Service file,
+label=lst:service]{../script/ethercat.service}
+
+The \textit{ethercatctl} command is used to load and unload the master and
+network driver modules in a similar way to the former init script
+(\autoref{sec:init}). Because it is installed into the \textit{sbin/}
+directory, it can also be used separately:
+
+\begin{lstlisting}[gobble=2]
+ # `\textbf{ethercatctl start}`
+\end{lstlisting}
+
+When using systemd and/or the \textit{ethercatctl} command, the master
+configuration must be in \texttt{/etc/ethercat.conf} instead of
+\texttt{/etc/sysconfig/ethercat}! The latter is ignored. The configuration
+options are exactly the same.
+
%------------------------------------------------------------------------------
\section{Debug Interfaces}
@@ -2733,11 +2827,11 @@
and slaves. This allows to connect another PC with a network monitor like
Wireshark~\cite{wireshark}, for example. It is also possible to listen to
local network interfaces on the machine running the EtherCAT master directly.
-If the generic Ethernet driver (see sec.~\ref{sec:generic-driver}) is used,
+If the generic Ethernet driver (see \autoref{sec:generic-driver}) is used,
the network monitor can directly listen on the network interface connected to
the EtherCAT bus.
-When using native Ethernet drivers (see sec.~\ref{sec:native-drivers}), there
+When using native Ethernet drivers (see \autoref{sec:native-drivers}), there
are no local network interfaces to listen to, because the Ethernet devices
used for EtherCAT are not registered at the network stack. For that case,
so-called ``debug interfaces'' are supported, which are virtual network
@@ -2745,13 +2839,13 @@
Wireshark or tcpdump) running on the master machine without using external
hardware. To use this functionality, the master sources have to be configured
with the \lstinline+--enable-debug-if+ switch (see
-sec.~\ref{sec:installation}).
+\autoref{sec:installation}).
Every EtherCAT master registers a read-only network interface per attached
physical Ethernet device. The network interfaces are named \textit{ecdbgmX}
-for the main device, and \textit{ecdbgbX} for the backup device (for future
-use), where X is the master index. The below listing shows a debug interface
-among some standard network interfaces:
+for the main device, and \textit{ecdbgbX} for the backup device, where X is
+the master index. The below listing shows a debug interface among some
+standard network interfaces:
\begin{lstlisting}
# `\textbf{ip link}`
@@ -2820,7 +2914,7 @@
For the actual measuring, a system with a \unit{2.0}{\giga\hertz} CPU was used,
that ran the above code in an RTAI thread with a period of
\unit{100}{\micro\second}. The measuring was repeated $n = 100$ times and the
-results were averaged. These can be seen in table~\ref{tab:profile}.
+results were averaged. These can be seen in \autoref{tab:profile}.
\begin{table}[htpb]
\centering
@@ -2866,7 +2960,7 @@
\item The EtherCAT frame must be sent and received, before the next realtime
cycle begins. The determination of the bus cycle time is difficult and covered
-in sec.~\ref{sec:timing-bus}.
+in \autoref{sec:timing-bus}.
\end{enumerate}
@@ -2957,7 +3051,7 @@
\section{Building the Software}
After downloading a tarball or cloning the repository as described in
-sec.~\ref{sec:getting}, the sources have to be prepared and configured for the
+\autoref{sec:getting}, the sources have to be prepared and configured for the
build process.
When a tarball was downloaded, it has to be extracted with the following
@@ -2986,7 +3080,7 @@
$ `\textbf{make modules}`
\end{lstlisting}
-Table~\ref{tab:config} lists important configuration switches and options.
+\autoref{tab:config} lists important configuration switches and options.
\begin{longtable}{l|p{.4\textwidth}|l}
\caption{Configuration options}\rule[-5ex]{0mm}{0mm}
@@ -3008,7 +3102,7 @@
\hline
\lstinline+--enable-generic+ & Build the generic Ethernet driver (see
-sec.~\ref{sec:generic-driver}). & yes\\
+\autoref{sec:generic-driver}). & yes\\
\lstinline+--enable-8139too+ & Build the 8139too driver & yes\\
@@ -3032,7 +3126,17 @@
\hline
-\lstinline+--with-rtai-dir+ & RTAI path (only for RTAI example) & \\
+\lstinline+--enable-rtdm+ & Create the RTDM interface (RTAI or Xenomai
+directory needed, see below) & no\\
+
+\lstinline+--with-rtai-dir+ & RTAI path (for RTAI examples and RTDM interface)
+& \\
+
+\lstinline+--with-xenomai-dir+ & Xenomai path (for Xenomai examples and RTDM
+interface) & \\
+
+\lstinline+--with-devices+ & Number of Ethernet devices for redundant
+operation ($>1$ switches redundancy on) & 1\\
\lstinline+--enable-debug-if+ & Create a debug interface for each master & no\\
@@ -3049,7 +3153,7 @@
\lstinline+--enable-regalias+ & Read alias address from register. & no\\
\lstinline+--enable-tool+ & Build the command-line tool ``ethercat'' (see
-sec.~\ref{sec:tool}). & yes\\
+\autoref{sec:tool}). & yes\\
\lstinline+--enable-userlib+ & Build the userspace library. & yes\\
@@ -3058,6 +3162,9 @@
\lstinline+--enable-wildcards+ & Enable \textit{0xffffffff} to be wildcards
for vendor ID and product code. & no\\
+\lstinline+--enable-sii-assign+ & Enable assigning SII access to the PDI layer
+during slave configuration. & no\\
+
\hline
\end{longtable}
@@ -3097,7 +3204,6 @@
\begin{lstlisting}
# `\textbf{make install}`
# `\textbf{make modules\_install}`
-# `\textbf{depmod}`
\end{lstlisting}
If the target kernel's modules directory is not under \textit{/lib/modules}, a
@@ -3113,10 +3219,10 @@
If the EtherCAT master shall be run as a service\footnote{Even if the EtherCAT
master shall not be loaded on system startup, the use of the init script is
-recommended for manual (un-)loading.} (see sec.~\ref{sec:system}), the init
-script and the sysconfig file have to be copied (or linked) to the appropriate
-locations. The below example is suitable for SUSE Linux. It may vary for other
-distributions.
+recommended for manual (un-)loading.} (see \autoref{sec:system}), the init
+script and the sysconfig file (or the systemd service file, respectively) have
+to be copied (or linked) to the appropriate locations. The below example is
+suitable for SUSE Linux. It may vary for other distributions.
% FIXME relative ln -s?
\begin{lstlisting}
@@ -3127,10 +3233,11 @@
\end{lstlisting}
Now the sysconfig file \texttt{/etc/sysconfig/ethercat} (see
-sec.~\ref{sec:sysconfig}) has to be customized. The minimal customization is
-to set the \lstinline+MASTER0_DEVICE+ variable to the MAC address of the
-Ethernet device to use (or \lstinline+ff:ff:ff:ff:ff:ff+ to use the first
-device offered) and selecting the driver(s) to load via the
+\autoref{sec:sysconfig}), or the configuration file
+\textit{/etc/ethercat.conf}, if using systemd, has to be customized. The
+minimal customization is to set the \lstinline+MASTER0_DEVICE+ variable to the
+MAC address of the Ethernet device to use (or \lstinline+ff:ff:ff:ff:ff:ff+ to
+use the first device offered) and selecting the driver(s) to load via the
\lstinline+DEVICE_MODULES+ variable.
After the basic configuration is done, the master can be started with the
@@ -3140,6 +3247,12 @@
# `\textbf{/etc/init.d/ethercat start}`
\end{lstlisting}
+When using systemd, the following command can be used alternatively:
+
+\begin{lstlisting}
+# `\textbf{ethercatctl start}`
+\end{lstlisting}
+
At this time, the operation of the master can be observed by viewing the
Syslog\index{Syslog} messages, which should look like the ones below. If
EtherCAT slaves are connected to the master's EtherCAT device, the activity
@@ -3183,7 +3296,7 @@
\section{Automatic Device Node Creation}
\label{sec:autonode}
-The \lstinline+ethercat+ command-line tool (see sec.~\ref{sec:tool})
+The \lstinline+ethercat+ command-line tool (see \autoref{sec:tool})
communicates with the master via a character device. The corresponding device
nodes are created automatically, if the udev daemon is running. Note, that on
some distributions, the \lstinline+udev+ package is not installed by default.
@@ -3206,7 +3319,7 @@
crw-rw-r-- 1 root root 252, 0 2008-09-03 16:19 /dev/EtherCAT0
\end{lstlisting}
-Now, the \lstinline+ethercat+ tool can be used (see sec.~\ref{sec:tool}) even
+Now, the \lstinline+ethercat+ tool can be used (see \autoref{sec:tool}) even
as a non-root user.
If non-root users shall have writing access, the following udev rule can be
@@ -3240,6 +3353,9 @@
\bibitem{lsb} Linux Standard Base.
\url{http://www.linuxfoundation.org/en/LSB}. August~9, 2006.
+\bibitem{systemd} systemd System and Service Manager
+\url{http://freedesktop.org/wiki/Software/systemd}. January~18, 2013.
+
\bibitem{wireshark} Wireshark. \url{http://www.wireshark.org}. 2008.
\bibitem{automata} {\it Hopcroft, J.\,E.\ / Ullman, J.\,D.}: Introduction to
@@ -3269,6 +3385,11 @@
systems - Mapping of profiles to network technologies. International
Electrotechnical Commission (IEC), 2007.
+\bibitem{rtdm} {\it J. Kiszka}: The Real-Time Driver Model and First
+Applications.
+\url{http://svn.gna.org/svn/xenomai/tags/v2.4.0/doc/nodist/pdf/RTDM-and-Applications.pdf},
+2013.
+
\end{thebibliography}
\printnomenclature
--- a/documentation/images/architecture.svg Fri Feb 08 20:02:34 2013 +0100
+++ b/documentation/images/architecture.svg Fri Feb 08 20:03:37 2013 +0100
@@ -1,7 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Creator: fig2dev Version 3.2 Patchlevel 5 -->
+
<!-- CreationDate: Mon Jan 4 12:21:21 2010 -->
+
<!-- Magnification: 1.050 -->
+
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
@@ -10,12 +13,12 @@
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="875.73413"
- height="994.51697"
- viewBox="1640 672 6544 9311"
+ width="827.59711"
+ height="1139.8276"
+ viewBox="1640 672 6184.2919 10671.447"
id="svg2"
sodipodi:version="0.32"
- inkscape:version="0.46"
+ inkscape:version="0.47 r22583"
sodipodi:docname="architecture.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.0">
@@ -40,6 +43,27 @@
inkscape:vp_z="644.98529 : 367.84955 : 1"
inkscape:persp3d-origin="322.49265 : 245.23303 : 1"
id="perspective161" />
+ <inkscape:perspective
+ id="perspective2974"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3815"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3851"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
inkscape:window-height="1000"
@@ -54,11 +78,11 @@
pagecolor="#ffffff"
id="base"
showgrid="false"
- inkscape:zoom="0.89892561"
- inkscape:cx="414.38143"
- inkscape:cy="658.79847"
- inkscape:window-x="135"
- inkscape:window-y="70"
+ inkscape:zoom="0.66238085"
+ inkscape:cx="413.79855"
+ inkscape:cy="569.91382"
+ inkscape:window-x="128"
+ inkscape:window-y="45"
inkscape:current-layer="svg2"
inkscape:object-paths="true"
inkscape:object-nodes="true"
@@ -67,33 +91,37 @@
showborder="true"
inkscape:window-maximized="0" />
<rect
+ id="rect94"
+ style="fill:#fff1cb;fill-opacity:1;stroke:#000000;stroke-width:7.99999952;stroke-linecap:butt;stroke-linejoin:miter"
+ rx="110"
+ height="1322"
+ width="2844.3892"
+ y="8454.4668"
+ x="3904.7581"
+ ry="110" />
+ <path
+ style="color:#000000;fill:none;stroke:#a0d72f;stroke-width:21.28297615;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 2222.579,3357.0291 2020.5151,0 0,2270.4758"
+ id="path3841" />
+ <rect
id="rect116"
style="fill:#e7f5ff;fill-opacity:1;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
rx="125"
height="2456"
width="2645"
- y="3934.2466"
- x="3519.4934"
+ y="5619.4668"
+ x="3273.541"
ry="125" />
- <rect
- id="rect94"
- style="fill:#fff1cb;fill-opacity:1;stroke:#000000;stroke-width:7.99999952;stroke-linecap:butt;stroke-linejoin:miter"
- rx="110"
- height="1322"
- width="2844.3892"
- y="6769.2471"
- x="4150.7104"
- ry="110" />
<path
- style="fill:none;stroke:#2988e6;stroke-width:21.28297615;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 4860.2219,8470.2466 L 4860.2219,5376.4053 L 2290.3936,5376.4053"
+ style="fill:none;stroke:#2988e6;stroke-width:21.28297615;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 4614.2694,10155.467 0,-3093.8415 -2569.8283,0"
id="polyline86"
sodipodi:nodetypes="csc" />
<g
id="g3632"
- transform="translate(-855.77813,108.24668)">
+ transform="translate(-1101.7306,1793.4669)">
<polygon
- points="5433,8362 6047,8362 6047,9212 5433,9212 5433,8834 5338,8834 5338,8362 5433,8362 "
+ points="5433,9212 5433,8834 5338,8834 5338,8362 5433,8362 5433,8362 6047,8362 6047,9212 "
style="fill:none;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
id="polygon6" />
<rect
@@ -167,7 +195,7 @@
</g>
<g
id="g3544"
- transform="translate(-855.77863,108.24668)">
+ transform="translate(-1101.7311,1793.4669)">
<polyline
points="6850,8456 6755,8456 "
style="stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
@@ -201,7 +229,7 @@
style="stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
id="polyline54" />
<polygon
- points="6850,8362 7464,8362 7464,9212 6850,9212 6850,8834 6755,8834 6755,8362 6850,8362 "
+ points="6850,9212 6850,8834 6755,8834 6755,8362 6850,8362 6850,8362 7464,8362 7464,9212 "
style="fill:none;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
id="polygon32" />
<rect
@@ -242,8 +270,8 @@
id="rect90" />
</g>
<path
- style="stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:47.96906081,47.96906081;opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="M 1062.4922,8281.2467 L 8802.7378,8281.2467"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:47.96906081, 47.96906081;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 816.53972,9966.4669 7740.24558,0"
id="polyline108"
sodipodi:nodetypes="cc" />
<rect
@@ -252,32 +280,32 @@
rx="141"
height="2456"
width="1795"
- y="3934.2466"
- x="1251.4921"
+ y="5619.4668"
+ x="1005.5396"
ry="141" />
<polyline
id="polyline112"
- style="stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:47.96906081,47.96906081;opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:47.96906081, 47.96906081;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
points="8173,8692 8173,2314 "
- transform="translate(629.73724,108.24668)" />
+ transform="translate(383.78476,1793.4669)" />
<polyline
id="polyline114"
- style="stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:47.96906081,47.96906081;fill:none;stroke-miterlimit:4;stroke-dashoffset:0"
+ style="fill:none;stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:47.96906081, 47.96906081;stroke-dashoffset:0"
points="1653,8692 1653,2314 "
- transform="translate(-590.50768,108.24668)" />
+ transform="translate(-836.46016,1793.4669)" />
<path
- style="stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:47.96906081,47.96906081;opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="M 8802.7378,2895.2467 L 1062.4922,2895.2467"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:47.96906081, 47.96906081;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 8556.7853,4580.4669 -7740.24558,0"
id="polyline118"
sodipodi:nodetypes="cc" />
<text
- style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:end;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Courier"
+ style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:end;fill:#000000;stroke:none;font-family:Courier"
id="text138"
font-size="126"
font-weight="normal"
font-style="normal"
- y="6547.6665"
- x="4783.7314"
+ y="8232.8867"
+ x="4537.7788"
xml:space="preserve">ecdev_*()</text>
<text
style="font-size:126px;font-style:normal;font-weight:normal;text-align:start;line-height:100%;text-anchor:start;fill:#000000;stroke:none;font-family:Sans"
@@ -285,59 +313,59 @@
font-size="152"
font-weight="normal"
font-style="normal"
- y="4170.2471"
- x="3613.4937"
+ y="5855.4673"
+ x="3367.5413"
xml:space="preserve"
sodipodi:linespacing="100%">EtherCAT Master Module</text>
<text
- style="font-size:152px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:end;opacity:1;fill:#2988e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.02500001in;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ style="font-size:152px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:end;fill:#2988e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.02500001in;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="text150"
font-size="152"
font-weight="normal"
font-style="normal"
- y="9648.541"
- x="5212.2598"
+ y="11333.761"
+ x="4966.3071"
xml:space="preserve">EtherCAT</text>
<text
- style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:end;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:end;fill:#000000;stroke:none;font-family:Sans"
id="text152"
font-size="152"
font-weight="normal"
font-style="normal"
- y="9656.4453"
- x="6582.5713"
+ y="11341.665"
+ x="6336.6187"
xml:space="preserve">Ethernet</text>
<text
- style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:end;fill:#2988e6;fill-opacity:1;stroke:none;stroke-width:0.025in;stroke-opacity:1;font-family:Sans"
+ style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:end;fill:#2988e6;fill-opacity:1;stroke:none;font-family:Sans"
id="text154"
font-size="152"
font-weight="normal"
font-style="normal"
- y="8611.2471"
- x="4388.2222"
+ y="10296.467"
+ x="4142.2695"
xml:space="preserve">NIC</text>
<text
- style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:end;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:end;fill:#000000;stroke:none;font-family:Sans"
id="text156"
font-size="152"
font-weight="normal"
font-style="normal"
- y="8611.2471"
- x="5805.2222"
+ y="10296.467"
+ x="5559.2695"
xml:space="preserve">NIC</text>
<text
- style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:start;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:start;fill:#000000;stroke:none;font-family:Sans"
id="text158"
font-size="152"
font-weight="normal"
font-style="normal"
- y="8517.2471"
- x="1157.4919"
+ y="10202.467"
+ x="911.53949"
xml:space="preserve">Hardware</text>
<g
- style="stroke:none;stroke-width:0.025in"
+ style="stroke:none"
id="g160"
- transform="matrix(1.101966e-5,1,-1,1.101966e-5,3355.623,5236.4294)">
+ transform="matrix(1.101966e-5,1,-1,1.101966e-5,3109.6705,6921.6496)">
<text
style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:end;fill:#000000;stroke:none;font-family:Courier"
id="text162"
@@ -349,23 +377,23 @@
xml:space="preserve">ecrt_*()</text>
</g>
<text
- style="font-size:132.14363098px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ style="font-size:132.14363098px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke:none;font-family:Sans"
id="text164"
font-size="152"
font-weight="normal"
font-style="normal"
- y="4170.2471"
- x="1346.4922"
+ y="5855.4673"
+ x="1100.5397"
xml:space="preserve"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan3492"
- x="1346.4922"
- y="4170.2471"
- style="font-size:132.14363098px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;stroke:none;stroke-width:2.25;font-family:Sans">Application Module</tspan></text>
+ x="1100.5397"
+ y="5855.4673"
+ style="font-size:132.14363098px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;stroke:none;font-family:Sans">Application Module</tspan></text>
<g
id="g3351"
- transform="translate(-44.46203,331.40336)">
+ transform="translate(-290.41451,2016.6236)">
<circle
transform="translate(-546.04563,-79)"
cx="2607"
@@ -386,31 +414,31 @@
font-weight="normal"
font-size="152"
id="text168"
- style="font-size:132.14363098px;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;text-indent:0;text-align:center;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:middle;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans"
+ style="font-size:132.14363098px;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;text-indent:0;text-align:center;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.25;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans"
sodipodi:linespacing="100%">Task</text>
</g>
<text
- style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:start;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:start;fill:#000000;stroke:none;font-family:Sans"
id="text170"
font-size="152"
font-weight="normal"
font-style="normal"
- y="3131.2466"
- x="1157.4919"
+ y="4816.4668"
+ x="911.53949"
xml:space="preserve">Kernelspace</text>
<text
- style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:start;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:start;fill:#000000;stroke:none;font-family:Sans"
id="text172"
font-size="152"
font-weight="normal"
font-style="normal"
- y="2800.2466"
- x="1157.4919"
+ y="4485.4668"
+ x="911.53949"
xml:space="preserve">Userspace</text>
<g
- style="stroke:none;stroke-width:0.025in"
+ style="stroke:none"
id="g178"
- transform="matrix(1.101966e-5,1,-1,1.101966e-5,3235.4925,1572.2467)">
+ transform="matrix(1.101966e-5,1,-1,1.101966e-5,2746.1195,3257.4669)">
<text
style="font-size:120.13056946px;font-style:normal;font-weight:normal;text-anchor:end;fill:#000000;stroke:none;font-family:Courier"
id="text180"
@@ -422,25 +450,25 @@
xml:space="preserve">ecrt_*()</text>
</g>
<text
- style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:end;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Courier"
+ style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:end;fill:#000000;stroke:none;font-family:Courier"
id="text182"
font-size="126"
font-weight="normal"
font-style="normal"
- y="6547.6665"
- x="8061.1538"
+ y="8232.8867"
+ x="7815.2012"
xml:space="preserve">netif_*()</text>
<g
id="g3355"
- transform="translate(-44.46203,187.24668)">
+ transform="translate(-290.41451,1872.4669)">
<path
style="text-align:center;text-anchor:middle;fill:#ffffff;stroke:#000000;stroke-width:8;stroke-linecap:butt"
- d="M 3563.9543,4456 C 3758.9776,4441.1691 3945.8786,4536.8144 4047.9255,4703.6691 C 4149.9724,4870.5238 4149.9724,5080.4762 4047.9255,5247.3309 C 3945.8786,5414.1856 3758.9776,5509.8309 3563.9543,5495 L 3563.9543,4456 z"
+ d="m 3563.9543,4456 c 195.0233,-14.8309 381.9243,80.8144 483.9712,247.6691 102.0469,166.8547 102.0469,376.8071 0,543.6618 -102.0469,166.8547 -288.9479,262.5 -483.9712,247.6691 l 0,-1039 z"
id="path64" />
<text
transform="matrix(1.101966e-5,1,-1,1.101966e-5,0,0)"
id="text3482"
- style="font-size:126px;font-style:normal;font-weight:normal;line-height:100%;text-anchor:middle;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ style="font-size:126px;font-style:normal;font-weight:normal;line-height:100%;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans"
font-size="126"
font-weight="normal"
font-style="normal"
@@ -448,29 +476,29 @@
x="4979.6079"
xml:space="preserve"
sodipodi:linespacing="100%"><tspan
- style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans"
y="-3836.0801"
x="4979.6079"
id="tspan3484"
sodipodi:role="line">Application</tspan><tspan
- style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans"
y="-3710.0801"
x="4979.6079"
id="tspan3486"
sodipodi:role="line">Interface</tspan></text>
</g>
<rect
- style="opacity:1;fill:#e2ffe8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="fill:#e2ffe8;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect3560"
width="1238.0494"
height="2456.2253"
- x="6368.5278"
- y="3934.1538"
+ x="6122.5752"
+ y="5619.374"
rx="110.00001"
ry="110.00001" />
<g
id="g3580"
- transform="translate(548.92606,108.24163)">
+ transform="translate(302.97358,1793.4618)">
<g
transform="matrix(-3.6732199e-6,-1,1,-3.6732199e-6,7653,5055)"
id="g3586"
@@ -478,58 +506,58 @@
</g>
<text
xml:space="preserve"
- style="font-size:126px;font-style:normal;font-weight:normal;text-align:start;line-height:100%;text-anchor:start;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
- x="6491.4546"
- y="4117.1338"
+ style="font-size:126px;font-style:normal;font-weight:normal;text-align:start;line-height:100%;text-anchor:start;fill:#000000;stroke:none;font-family:Sans"
+ x="6245.502"
+ y="5802.354"
id="text3606"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan3610"
- x="6491.4546"
- y="4117.1338"
- style="font-size:132.14363098px;text-align:start;text-anchor:start;stroke:none;stroke-width:2.25000358">Generic</tspan><tspan
+ x="6245.502"
+ y="5802.354"
+ style="font-size:132.14363098px;text-align:start;text-anchor:start;stroke:none">Generic</tspan><tspan
sodipodi:role="line"
id="tspan3612"
- x="6491.4546"
- y="4249.2773"
- style="font-size:132.14363098px;text-align:start;text-anchor:start;stroke:none;stroke-width:2.25000358">Ethernet</tspan><tspan
+ x="6245.502"
+ y="5934.4976"
+ style="font-size:132.14363098px;text-align:start;text-anchor:start;stroke:none">Ethernet</tspan><tspan
sodipodi:role="line"
id="tspan3614"
- x="6491.4546"
- y="4381.4209"
- style="font-size:132.14363098px;text-align:start;text-anchor:start;stroke:none;stroke-width:2.25000358">Driver Module</tspan></text>
+ x="6245.502"
+ y="6066.6411"
+ style="font-size:132.14363098px;text-align:start;text-anchor:start;stroke:none">Driver Module</tspan></text>
<rect
id="rect3618"
style="fill:none;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
rx="110.00002"
height="1322"
width="1438.59"
- y="6769.2471"
- x="7142.6431"
+ y="8454.4668"
+ x="6896.6904"
ry="110" />
<text
- style="font-size:132.14363098px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ style="font-size:132.14363098px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke:none;font-family:Sans"
id="text3620"
font-size="152"
font-weight="normal"
font-style="normal"
- y="7005.2471"
- x="7291.0054"
+ y="8690.4668"
+ x="7045.0527"
xml:space="preserve"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3652"
- x="7291.0054"
- y="7005.2471"
- style="font-size:132.14363098px;stroke:none;stroke-width:2.25">Standard</tspan><tspan
+ x="7045.0527"
+ y="8690.4668"
+ style="font-size:132.14363098px;stroke:none">Standard</tspan><tspan
sodipodi:role="line"
id="tspan3654"
- x="7291.0054"
- y="7170.4268"
- style="font-size:132.14363098px;stroke:none;stroke-width:2.25">Ethernet Driver</tspan></text>
+ x="7045.0527"
+ y="8855.6465"
+ style="font-size:132.14363098px;stroke:none">Ethernet Driver</tspan></text>
<g
id="g3662"
- transform="translate(735.84514,108.24668)">
+ transform="translate(489.89266,1793.4669)">
<polyline
points="6850,8456 6755,8456 "
style="stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
@@ -563,7 +591,7 @@
style="stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
id="polyline3678" />
<polygon
- points="6850,8362 7464,8362 7464,9212 6850,9212 6850,8834 6755,8834 6755,8362 6850,8362 "
+ points="6850,9212 6850,8834 6755,8834 6755,8362 6850,8362 6850,8362 7464,8362 7464,9212 "
style="fill:none;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
id="polygon3680" />
<rect
@@ -604,116 +632,55 @@
id="rect3690" />
</g>
<text
- style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:end;fill:#d7842f;fill-opacity:1;stroke:none;stroke-width:0.025in;stroke-opacity:1;font-family:Sans"
+ style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:end;fill:#d7842f;fill-opacity:1;stroke:none;font-family:Sans"
id="text3694"
font-size="152"
font-weight="normal"
font-style="normal"
- y="8611.2471"
- x="7396.8452"
+ y="10296.467"
+ x="7150.8926"
xml:space="preserve">NIC</text>
+ <g
+ id="g3369-8"
+ transform="translate(-1638.5904,1872.4669)">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:8;stroke-linecap:butt"
+ d="m 6247.9543,2708 c 0,365.3364 -296.1636,661.5 -661.5,661.5 -365.3364,0 -661.5,-296.1636 -661.5,-661.5"
+ id="path66-4" />
+ <text
+ sodipodi:linespacing="125%"
+ xml:space="preserve"
+ x="5582.3096"
+ y="2946.9563"
+ font-style="normal"
+ font-weight="normal"
+ font-size="152"
+ id="text70-5"
+ style="font-size:132.6353302px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans"><tspan
+ style="stroke:none"
+ y="2946.9563"
+ x="5582.3096"
+ id="tspan3467-0"
+ sodipodi:role="line">RTDM</tspan><tspan
+ style="stroke:none"
+ y="3112.7505"
+ x="5582.3096"
+ id="tspan3469-3"
+ sodipodi:role="line">Device</tspan></text>
+ </g>
<path
- style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#d7842f;stroke-width:21.28297615;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="M 7872.6931,8470.2466 L 7868.8456,7288.0988 L 8265.1137,7288.0988 L 8265.1137,5867.8297 L 6863.0311,5867.8297 L 6863.0311,6525.8099 L 5332.4291,6525.8099 L 5332.4291,5520.389 L 5332.4291,1670.4938 L 2799.8817,1670.4938"
+ style="fill:none;stroke:#d7842f;stroke-width:21.28297615;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 7626.7406,10155.467 -3.8475,-1182.148 396.2681,0 0,-1420.2691 -1402.0826,0 0,657.9802 -1530.602,0 0,-1005.4209 0,-5724.6 -2532.5474,0"
id="path3698"
sodipodi:nodetypes="cccccccccc" />
- <g
- id="g3399"
- transform="translate(-44.46203,187.24668)">
- <circle
- transform="translate(-523.27342,-76.596732)"
- cx="2929"
- cy="1559"
- r="614"
- style="fill:#ffffff;stroke:#000000;stroke-width:8"
- id="circle72"
- sodipodi:cx="2929"
- sodipodi:cy="1559"
- sodipodi:rx="614"
- sodipodi:ry="614"
- d="m 3543,1559 c 0,339.1028 -274.8972,614 -614,614 -339.1028,0 -614,-274.8972 -614,-614 0,-339.1028 274.8972,-614 614,-614 339.1028,0 614,274.8972 614,614 z" />
- <text
- sodipodi:linespacing="100%"
- xml:space="preserve"
- x="2409.6025"
- y="1450.2573"
- font-style="normal"
- font-weight="normal"
- font-size="152"
- id="text202"
- style="font-size:123.86800385px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:center;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:middle;opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.02500001in;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"><tspan
- y="1450.2573"
- x="2409.6025"
- id="tspan3488"
- sodipodi:role="line">Userspace</tspan><tspan
- y="1574.1254"
- x="2409.6025"
- id="tspan3490"
- sodipodi:role="line">Application</tspan></text>
- </g>
- <g
- id="g3389"
- transform="translate(-44.46203,187.24668)">
- <rect
- ry="110"
- x="3563.9546"
- y="676"
- width="1181"
- height="1606"
- rx="110"
- style="fill:#feeaff;fill-opacity:1;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
- id="rect124" />
- <g
- transform="matrix(1.101966e-5,1,-1,1.101966e-5,4319.9543,1527)"
- id="g174"
- style="stroke:#000000;stroke-width:0.025in">
- <text
- xml:space="preserve"
- x="-52.580063"
- y="-52.831627"
- font-style="normal"
- font-weight="normal"
- font-size="152"
- id="text176"
- style="font-size:132.14363098px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;stroke-width:2.25;font-family:Sans">libethercat</text>
- </g>
- <g
- id="g3383">
- <path
- id="path198"
- d="M 3563.9543,960 C 3758.9776,945.1691 3945.8786,1040.8144 4047.9255,1207.6691 C 4149.9724,1374.5238 4149.9724,1584.4762 4047.9255,1751.3309 C 3945.8786,1918.1856 3758.9776,2013.8309 3563.9543,1999 L 3563.9543,960 z"
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:7.99791002;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none" />
- <text
- xml:space="preserve"
- x="1474.2281"
- y="-3836.1189"
- font-style="normal"
- font-weight="normal"
- font-size="126"
- id="text206"
- style="font-size:120.13056946px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
- transform="matrix(1.101966e-5,1,-1,1.101966e-5,0,0)"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan3478"
- x="1474.2281"
- y="-3836.1189"
- style="font-size:120.13056946px;stroke:none;stroke-width:2.25">Application</tspan><tspan
- sodipodi:role="line"
- id="tspan3480"
- x="1474.2281"
- y="-3685.9556"
- style="font-size:120.13056946px;stroke:none;stroke-width:2.25">Interface</tspan></text>
- </g>
- </g>
<path
- style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:8.00239849;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 6353.8719,1844.4653 C 6353.8719,1844.4653 6037.3171,1909.1337 5856.8104,2229.688 C 5670.9667,2559.7199 5707.6919,3934.2468 5707.6919,3934.2468"
+ style="fill:none;stroke:#000000;stroke-width:8.00239849;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 6107.9194,3529.6855 c 0,0 -316.5548,64.6684 -497.0615,385.2227 -185.8437,330.0319 -149.1185,1704.5588 -149.1185,1704.5588"
id="path3375"
sodipodi:nodetypes="czc" />
<g
id="g3377"
- transform="translate(-44.46203,187.24668)">
+ transform="translate(-290.41451,1872.4669)">
<circle
transform="translate(-546.04563,-79)"
cx="7409"
@@ -729,58 +696,58 @@
<text
sodipodi:linespacing="125%"
xml:space="preserve"
- x="6863.0659"
- y="1620.1797"
+ x="6863.2144"
+ y="1619.5117"
font-style="normal"
font-weight="normal"
font-size="152"
id="text188"
- style="font-size:152px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"><tspan
- style="stroke:none;stroke-width:2.25"
- y="1620.1797"
- x="6863.0659"
+ style="font-size:152px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans"><tspan
+ style="stroke:none"
+ y="1619.5117"
+ x="6863.2144"
id="tspan3471"
sodipodi:role="line">'ethercat'</tspan><tspan
- style="stroke:none;stroke-width:2.25"
- y="1810.1797"
- x="6863.0659"
+ style="stroke:none"
+ y="1809.5117"
+ x="6863.2144"
id="tspan3473"
sodipodi:role="line">Tool</tspan></text>
</g>
<g
id="g3369"
- transform="translate(-44.46203,187.24668)">
+ transform="translate(-215.51584,1872.4669)">
<path
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:8;stroke-linecap:butt"
- d="M 6247.9543,2708 C 6247.9543,3073.3364 5951.7907,3369.5 5586.4543,3369.5 C 5221.1179,3369.5 4924.9543,3073.3364 4924.9543,2708"
+ d="m 6247.9543,2708 c 0,365.3364 -296.1636,661.5 -661.5,661.5 -365.3364,0 -661.5,-296.1636 -661.5,-661.5"
id="path66" />
<text
sodipodi:linespacing="125%"
xml:space="preserve"
- x="5582.8276"
- y="3003.1301"
+ x="5582.3096"
+ y="2946.9563"
font-style="normal"
font-weight="normal"
font-size="152"
id="text70"
- style="font-size:132.6353302px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"><tspan
- style="stroke:none;stroke-width:2.25"
- y="3003.1301"
- x="5582.8276"
+ style="font-size:132.6353302px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans"><tspan
+ style="stroke:none"
+ y="2946.9563"
+ x="5582.3096"
id="tspan3467"
sodipodi:role="line">Character</tspan><tspan
- style="stroke:none;stroke-width:2.25"
- y="3168.9243"
- x="5582.8276"
+ style="stroke:none"
+ y="3112.7505"
+ x="5582.3096"
id="tspan3469"
sodipodi:role="line">Device</tspan></text>
</g>
<g
id="g3345"
- transform="translate(-44.46203,187.24668)">
+ transform="translate(-290.41451,1872.4669)">
<path
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none"
- d="M 4649.9543,6204 C 4649.9543,5916.8119 4882.7662,5684 5169.9543,5684 C 5457.1424,5684 5689.9543,5916.8119 5689.9543,6204 L 4649.9543,6204 z"
+ d="m 4649.9543,6204 c 0,-287.1881 232.8119,-520 520,-520 287.1881,0 520,232.8119 520,520 l -1040,0 z"
id="path58" />
<text
sodipodi:linespacing="125%"
@@ -791,7 +758,7 @@
font-weight="normal"
font-size="126"
id="text60"
- style="font-size:126px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"><tspan
+ style="font-size:126px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans"><tspan
id="tspan3341"
sodipodi:role="line"
x="5169.9546"
@@ -803,10 +770,10 @@
</g>
<g
id="g3516"
- transform="translate(603.21026,108.24163)">
+ transform="translate(357.25778,1793.4618)">
<path
style="fill:none;stroke:#000000;stroke-width:7.99999666;stroke-linecap:butt"
- d="M 7322,6283 C 7322,6126.4273 7448.9273,5999.5 7605.5,5999.5 C 7762.0727,5999.5 7889,6126.4273 7889,6283"
+ d="m 7322,6283 c 0,-156.5727 126.9273,-283.5 283.5,-283.5 156.5727,0 283.5,126.9273 283.5,283.5"
id="path74" />
<rect
x="7228"
@@ -829,12 +796,12 @@
font-weight="normal"
font-size="152"
id="text148"
- style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;stroke-width:2.24999905;font-family:Sans">Network Stack</text>
+ style="font-size:152px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans">Network Stack</text>
</g>
</g>
<g
id="g3656"
- transform="translate(735.84554,108.24668)">
+ transform="translate(489.89306,1793.4669)">
<rect
x="6736.9302"
y="7313.9893"
@@ -852,11 +819,11 @@
font-weight="normal"
font-size="126"
id="text3660"
- style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans">net_device</text>
+ style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans">net_device</text>
</g>
<g
id="g3522"
- transform="translate(-855.77813,108.24668)"
+ transform="translate(-1101.7306,1793.4669)"
style="stroke:#000000;stroke-opacity:1">
<rect
x="5314.6245"
@@ -875,44 +842,44 @@
font-weight="normal"
font-size="126"
id="text134"
- style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;stroke-width:0.02500000000000000in;font-family:Sans;stroke-opacity:1">net_device</text>
+ style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans">net_device</text>
</g>
<path
- style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="M 6271.9418,8470.2466 L 6271.9418,6649.2935 L 8116.176,6649.2936 L 8116.1764,6390.2468"
+ style="fill:none;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 6025.9893,10155.467 0,-1820.9533 1844.2342,1e-4 4e-4,-259.0468"
id="path3764"
sodipodi:nodetypes="cccc" />
<rect
- style="opacity:1;fill:#fff1cb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1872962;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="fill:#fff1cb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1872962;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect3335"
width="2522.5874"
height="192.61136"
- x="4222.7207"
- y="6871.001" />
- <text
- style="font-size:132.14363098px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ x="3976.7683"
+ y="8556.2207" />
+ <text
+ style="font-size:132.14363098px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke:none;font-family:Sans"
id="text140"
font-size="152"
font-weight="normal"
font-style="normal"
- y="7005.2471"
- x="4279.7266"
+ y="8690.4668"
+ x="4033.7742"
xml:space="preserve"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3463"
- x="4279.7266"
- y="7005.2471"
- style="font-size:132.14363098px;stroke:none;stroke-width:2.25">Native EtherCAT-capable Ethernet Driver</tspan></text>
+ x="4033.7742"
+ y="8690.4668"
+ style="font-size:132.14363098px;stroke:none">Native EtherCAT-capable Ethernet Driver</tspan></text>
<g
id="g3526"
- transform="translate(-855.77823,108.24668)">
+ transform="translate(-1101.7307,1793.4669)">
<rect
x="6733.9658"
y="7312.4976"
width="797.06891"
height="397.00394"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect98"
ry="198.50197"
rx="199.09135" />
@@ -924,20 +891,20 @@
font-weight="normal"
font-size="126"
id="text136"
- style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans">net_device</text>
- </g>
- <text
- style="font-size:152px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:end;opacity:1;fill:#d7842f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.02500001in;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ style="font-size:126px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans">net_device</text>
+ </g>
+ <text
+ style="font-size:152px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:end;fill:#d7842f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.02500001in;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="text3291"
font-size="152"
font-weight="normal"
font-style="normal"
- y="9648.541"
- x="8220.8818"
+ y="11333.761"
+ x="7974.9292"
xml:space="preserve">EtherCAT</text>
<g
id="g3315"
- transform="translate(-164.59259,187.24668)">
+ transform="translate(-410.54507,1872.4669)">
<rect
ry="306.34152"
y="5365.6782"
@@ -945,13 +912,13 @@
height="612.68304"
width="843.54913"
id="rect3301"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:8.00239849;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:8.00239849;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
rx="306.34152" />
<text
id="text3303"
y="5564.6763"
x="7042.9937"
- style="font-size:120.13056946px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ style="font-size:120.13056946px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan
style="font-size:120.13056946px;text-align:center;text-anchor:middle"
y="5564.6763"
@@ -971,22 +938,23 @@
</g>
<text
xml:space="preserve"
- style="font-size:96.10446167px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
- x="-5836.0796"
- y="7408.0576"
+ style="font-size:96.10446167px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-7521.2998"
+ y="7162.105"
id="text3311"
transform="matrix(0,-1,1,0,0,0)"><tspan
sodipodi:role="line"
id="tspan3313"
- x="-5836.0796"
- y="7408.0576"
+ x="-7521.2998"
+ y="7162.105"
style="font-size:96.10446167px">Packet Socket</tspan></text>
<path
- style="fill:#d7842f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="M 7293.8713,5777.4673 C 7246.566,5782.1256 7209.78,5820.8944 7209.7799,5867.9407 C 7209.7799,5913.3576 7244.0471,5950.9172 7288.991,5957.6632 C 7299.3854,5926.8045 7305.1335,5893.7579 7305.1335,5859.3063 C 7305.1335,5830.9654 7301.0093,5803.4808 7293.8713,5777.4673 z"
+ style="fill:#d7842f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 7047.9188,7462.6875 c -47.3053,4.6583 -84.0913,43.4271 -84.0914,90.4734 0,45.4169 34.2672,82.9765 79.2111,89.7225 10.3944,-30.8587 16.1425,-63.9053 16.1425,-98.3569 0,-28.3409 -4.1242,-55.8255 -11.2622,-81.839 z"
id="path3300" />
<g
- id="g3337">
+ id="g3337"
+ transform="translate(-245.95248,1685.2202)">
<rect
ry="141.73228"
rx="141.73228"
@@ -995,7 +963,7 @@
height="489.50626"
width="833.20209"
id="rect3328"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<text
sodipodi:linespacing="100%"
xml:space="preserve"
@@ -1005,10 +973,11 @@
font-weight="normal"
font-size="152"
id="text184"
- style="font-size:126px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.02500001in;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Bitstream Vera Sans">Master 0</text>
- </g>
- <g
- id="g3332">
+ style="font-size:126px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.02500001in;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Bitstream Vera Sans">Master 0</text>
+ </g>
+ <g
+ id="g3332"
+ transform="translate(-245.95248,1685.2202)">
<rect
ry="141.73228"
rx="141.73228"
@@ -1017,7 +986,7 @@
height="489.50626"
width="833.20209"
id="rect3330"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:7.99484348;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<text
xml:space="preserve"
x="5318.4526"
@@ -1026,11 +995,207 @@
font-weight="normal"
font-size="152"
id="text3365"
- style="font-size:126px;font-style:normal;font-weight:normal;line-height:100%;text-anchor:middle;fill:#000000;stroke:none;stroke-width:0.025in;font-family:Sans"
+ style="font-size:126px;font-style:normal;font-weight:normal;line-height:100%;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan3367"
x="5318.4526"
y="4865.9692">Master 1</tspan></text>
</g>
+ <g
+ style="stroke:none"
+ id="g178-9"
+ transform="matrix(1.101966e-5,0.99999997,-0.99999997,1.101966e-5,3120.6129,1384.9999)">
+ <text
+ style="font-size:120.13056946px;font-style:normal;font-weight:normal;text-anchor:end;fill:#000000;stroke:none;font-family:Courier"
+ id="text180-2"
+ font-size="126"
+ font-weight="normal"
+ font-style="normal"
+ y="0"
+ x="0"
+ xml:space="preserve">ecrt_*()</text>
+ </g>
+ <g
+ id="g3399-2"
+ transform="translate(-290.41452,0)">
+ <circle
+ transform="translate(-523.27342,-76.596732)"
+ cx="2929"
+ cy="1559"
+ r="614"
+ style="fill:#ffffff;stroke:#000000;stroke-width:8"
+ id="circle72-8"
+ sodipodi:cx="2929"
+ sodipodi:cy="1559"
+ sodipodi:rx="614"
+ sodipodi:ry="614"
+ d="m 3543,1559 c 0,339.1028 -274.8972,614 -614,614 -339.1028,0 -614,-274.8972 -614,-614 0,-339.1028 274.8972,-614 614,-614 339.1028,0 614,274.8972 614,614 z" />
+ <text
+ sodipodi:linespacing="100%"
+ xml:space="preserve"
+ x="2410.1116"
+ y="1452.4948"
+ font-style="normal"
+ font-weight="normal"
+ font-size="152"
+ id="text202-9"
+ style="font-size:123.86800385px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:center;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.02500001in;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"><tspan
+ y="1452.4948"
+ x="2410.1116"
+ id="tspan3488-7"
+ sodipodi:role="line">Userspace</tspan><tspan
+ y="1576.3628"
+ x="2410.1116"
+ id="tspan3490-3"
+ sodipodi:role="line">Application</tspan></text>
+ </g>
+ <g
+ id="g3389-6"
+ transform="translate(-290.41452,0)">
+ <rect
+ ry="110"
+ x="3563.9546"
+ y="676"
+ width="1181"
+ height="1606"
+ rx="110"
+ style="fill:#feeaff;fill-opacity:1;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
+ id="rect124-1" />
+ <g
+ transform="matrix(1.101966e-5,1,-1,1.101966e-5,4319.9543,1527)"
+ id="g174-2"
+ style="stroke:#000000;stroke-width:0.025in">
+ <text
+ xml:space="preserve"
+ x="-52.580063"
+ y="-52.831627"
+ font-style="normal"
+ font-weight="normal"
+ font-size="152"
+ id="text176-9"
+ style="font-size:132.14363098px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans">libethercat</text>
+ </g>
+ <g
+ id="g3383-3">
+ <path
+ id="path198-1"
+ d="m 3563.9543,960 c 195.0233,-14.8309 381.9243,80.8144 483.9712,247.6691 102.0469,166.8547 102.0469,376.8071 0,543.6618 -102.0469,166.8547 -288.9479,262.5 -483.9712,247.6691 l 0,-1039 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:7.99791002;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ x="1474.2281"
+ y="-3836.1189"
+ font-style="normal"
+ font-weight="normal"
+ font-size="126"
+ id="text206-9"
+ style="font-size:120.13056946px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans"
+ transform="matrix(1.101966e-5,1,-1,1.101966e-5,0,0)"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3478-4"
+ x="1474.2281"
+ y="-3836.1189"
+ style="font-size:120.13056946px;stroke:none">Application</tspan><tspan
+ sodipodi:role="line"
+ id="tspan3480-7"
+ x="1474.2281"
+ y="-3685.9556"
+ style="font-size:120.13056946px;stroke:none">Interface</tspan></text>
+ </g>
+ </g>
+ <g
+ id="g3399"
+ transform="translate(-664.90787,1872.4669)">
+ <circle
+ transform="translate(-523.27342,-76.596732)"
+ cx="2929"
+ cy="1559"
+ r="614"
+ style="fill:#ffffff;stroke:#000000;stroke-width:8"
+ id="circle72"
+ sodipodi:cx="2929"
+ sodipodi:cy="1559"
+ sodipodi:rx="614"
+ sodipodi:ry="614"
+ d="m 3543,1559 c 0,339.1028 -274.8972,614 -614,614 -339.1028,0 -614,-274.8972 -614,-614 0,-339.1028 274.8972,-614 614,-614 339.1028,0 614,274.8972 614,614 z" />
+ <text
+ sodipodi:linespacing="100%"
+ xml:space="preserve"
+ x="2405.4241"
+ y="1391.3168"
+ font-style="normal"
+ font-weight="normal"
+ font-size="152"
+ id="text202"
+ style="font-size:123.86800385px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:center;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.02500001in;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"><tspan
+ y="1391.3168"
+ x="2405.4241"
+ id="tspan3488"
+ sodipodi:role="line">LXRT / Xenomai</tspan><tspan
+ y="1515.1848"
+ x="2405.4241"
+ sodipodi:role="line"
+ id="tspan3033">Userspace</tspan><tspan
+ y="1639.0527"
+ x="2405.4241"
+ id="tspan3490"
+ sodipodi:role="line">Application</tspan></text>
+ </g>
+ <g
+ id="g3389"
+ transform="translate(-664.90787,1872.4669)">
+ <rect
+ ry="110"
+ x="3563.9546"
+ y="676"
+ width="1181"
+ height="1606"
+ rx="110"
+ style="fill:#ffeaf0;fill-opacity:1;stroke:#000000;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter"
+ id="rect124" />
+ <g
+ transform="matrix(1.101966e-5,1,-1,1.101966e-5,4319.9543,1527)"
+ id="g174"
+ style="stroke:#000000;stroke-width:0.025in">
+ <text
+ xml:space="preserve"
+ x="-52.580063"
+ y="-52.831627"
+ font-style="normal"
+ font-weight="normal"
+ font-size="152"
+ id="text176"
+ style="font-size:132.14363098px;font-style:normal;font-weight:normal;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans">libethercat_rtdm</text>
+ </g>
+ <g
+ id="g3383">
+ <path
+ id="path198"
+ d="m 3563.9543,960 c 195.0233,-14.8309 381.9243,80.8144 483.9712,247.6691 102.0469,166.8547 102.0469,376.8071 0,543.6618 -102.0469,166.8547 -288.9479,262.5 -483.9712,247.6691 l 0,-1039 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:7.99791002;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ x="1474.2281"
+ y="-3836.1189"
+ font-style="normal"
+ font-weight="normal"
+ font-size="126"
+ id="text206"
+ style="font-size:120.13056946px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;stroke:none;font-family:Sans"
+ transform="matrix(1.101966e-5,1,-1,1.101966e-5,0,0)"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3478"
+ x="1474.2281"
+ y="-3836.1189"
+ style="font-size:120.13056946px;stroke:none">Application</tspan><tspan
+ sodipodi:role="line"
+ id="tspan3480"
+ x="1474.2281"
+ y="-3685.9556"
+ style="font-size:120.13056946px;stroke:none">Interface</tspan></text>
+ </g>
+ </g>
</svg>