Some more documentation...

This commit is contained in:
Florian Pose 2008-08-14 15:49:00 +00:00
parent 78014e6510
commit 9d60587c6b
11 changed files with 209 additions and 363 deletions

View File

@ -603,7 +603,7 @@ section~\ref{sec:cyclic}).
\begin{figure}[htbp]
\centering
\includegraphics[width=.8\textwidth]{images/app-config}
\caption{Master configuration structures}
\caption{Master Configuration}
\label{fig:app-config}
\end{figure}
@ -658,26 +658,12 @@ Section~\ref{sec:concurrency} gives an example, of how to implement this.
\chapter{Ethernet Devices}
\label{sec:devices}
% Device Interface
% Device Modules
% Network Driver Basics
% EtherCAT Network Drivers
% Device Selection
% The Device Interface
% Patching Network Drivers
The EtherCAT protocol is based on the Ethernet standard, so the master relies
on standard Ethernet hardware to communicate with the bus.
The EtherCAT protocol is based on the Ethernet standard, so a master relies on
standard Ethernet hardware to communicate with the bus.
The term \textit{device} is used as a synonym for Ethernet network interface
hardware. There are device driver modules that handle Ethernet hardware, which
the master can use to connect to an EtherCAT bus.
Section~\ref{sec:networkdrivers} offers an overview of general Linux
network driver modules, while section~\ref{sec:requirements} will show
the requirements to an EtherCAT-enabled network driver. Finally,
sections~\ref{sec:seldev} to~\ref{sec:patching} show how to fulfill
these requirements and implement such a driver module.
a master can use to connect to an EtherCAT bus.
%------------------------------------------------------------------------------
@ -725,7 +711,7 @@ by reading the device's interrupt register. For example, if the flag
for received frames is set, frame data has to be copied from hardware
to kernel memory and passed to the network stack.
\paragraph{The \lstinline+net_device+ structure}
\paragraph{The \lstinline+net_device+ Structure}
\index{net\_device}
The driver registers a \lstinline+net_device+ structure for each device to
@ -770,7 +756,7 @@ error happened, the appropriate counter in this structure has to be increased.
The actual registration is done with the \lstinline+register_netdev()+ call,
unregistering is done with \lstinline+unregister_netdev()+.
\paragraph{The netif Interface}
\paragraph{The \lstinline+netif+ Interface}
\index{netif}
All other communication in the direction interface $\to$ network stack is done
@ -814,7 +800,7 @@ network driver.
%------------------------------------------------------------------------------
\section{EtherCAT Device Drivers}
\label{sec:requirements}
\label{sec:ethercatdrivers}
There are a few requirements for Ethernet network devices to function as
EtherCAT devices, when connected to an EtherCAT bus.
@ -915,7 +901,7 @@ sysconfig file (see section~\ref{sec:sysconfig}).
%------------------------------------------------------------------------------
\section{The Device Interface}
\section{EtherCAT Device Interface}
\label{sec:ecdev}
\index{Device interface}
@ -1370,8 +1356,8 @@ monitored. If a slave is not in the state it supposed to be, the slave is
(re-)configured.
\item[Request handling] Requests (either originating from the application or
from external sources) are handled. This can be SII accesses, Sdo accesses,
etc.
from external sources) are handled. A request is a job that the master shall
process asynchronously, for example an SII access, Sdo access, or similar.
\end{description}
@ -1415,23 +1401,14 @@ image memory.
State change FSM (see section~\ref{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 FSM (see
section~\ref{sec:fsm-pdo}). If this is successful, the Pdo information from
the SII (if any) is overwritten.
\item[Pdos] The Pdos are read via CoE (if supported) using the Pdo Reading FSM
(see section~\ref{sec:fsm-pdo}). If this is successful, the Pdo information
from the SII (if any) is overwritten.
\end{description}
%------------------------------------------------------------------------------
% SII
% Pdo assign/mapping
% Slave configuration
% State change
% Pdo assign/mapping
% CoE upload/download/information
%------------------------------------------------------------------------------
\section{The Slave Configuration State Machine}
\label{sec:fsm-conf}
\index{FSM!Slave Configuration}
@ -1499,68 +1476,41 @@ in \cite[section~6.4.1]{alspec}.
\begin{figure}[htbp]
\centering
\includegraphics[width=.9\textwidth]{images/fsm-change} % FIXME
\includegraphics[width=.6\textwidth]{graphs/fsm_change}
\caption{Transition Diagram of the State Change State Machine}
\label{fig:fsm-change}
\end{figure}
% FIXME
\begin{description}
\item[START] The beginning state, where a datagram with the state
change command is written to the slave's ``AL Control Request''
attribute. Nothing can fail. $\rightarrow$~CHECK
\item[CHECK] After the state change datagram has been sent, the ``AL
Control Response'' attribute is queried with a second datagram.
$\rightarrow$~STATUS
\item[Start] The new application-layer state is requested via the ``AL Control
Request'' register (see ~\cite[section 5.3.1]{alspec}).
\item[STATUS] The read memory contents are evaluated: While the
parameter \textit{State} still contains the old slave state, the
slave is busy with reacting on the state change command. In this
case, the attribute has to be queried again.
$\rightarrow$~STATUS
\item[Check for Response] Some slave need some time to respond to an AL state
change command, and do not respond for some time. For this case, the command
is issued again, until it is acknowledged.
In case of success, the \textit{State} parameter contains the new
state and the \textit{Change} bit is cleared. The slave is in the
requested state. $\rightarrow$~END
\item[Check AL Status] If the AL State change datagram was acknowledged, the
``AL Control Response'' register (see~\cite[section 5.3.2]{alspec}) must be
read out until the slave changes the AL state.
If the slave can not process the state change, the \textit{Change}
bit is set: Now the master tries to get the reason for this by
querying the \textit{AL Status Code} parameter.
$\rightarrow$~CODE
\item[AL Status Code] If the slave refused the state change command, the
reason can be read from the ``AL Status Code'' field in the ``AL State
Changed'' registers (see~\cite[section 5.3.3]{alspec}).
\item[END] If the state machine ends in this state, the slave's state
change has been successful.
\item[Acknowledge State] If the state change was not successful, the master
has to acknowledge the old state by writing to the ``AL Control request''
register again.
\item[CODE] The status code query has been sent. Reading the
\textit{AL Status Code} might fail, because not all slaves support
this parameter. Anyway, the master has to acknowledge the state
change error by writing the current slave state to the ``AL Control
Request'' attribute with the \textit{Acknowledge} bit set.
$\rightarrow$~ACK
\item[ACK] After that, the ``AL Control Response'' attribute is
queried for the state of the acknowledgement.
$\rightarrow$~CHECK ACK
\item[CHECK ACK] If the acknowledgement has been accepted by the
slave, the old state is kept. Still, the state change was
unsuccessful. $\rightarrow$~ERROR
If the acknowledgement is ignored by the slave, a timeout happens.
In any case, the overall state change was unsuccessful.
$\rightarrow$~ERROR
If there is still now response from the slave, but the timer did not
run out yet, the slave's ``AL Control Response'' attribute is
queried again. $\rightarrow$~CHECK ACK
\item[ERROR] If the state machine ends in this state, the slave's
state change was unsuccessful.
\item[Check Acknowledge] After sending the acknowledge command, it has to read
out the ``AL Control Response'' register again.
\end{description}
The ``start\_ack'' state is a shortcut in the state machine for the case, that
the master wants to acknowledge a spontaneous AL state change, that was not
requested.
%------------------------------------------------------------------------------
\section{The SII State Machine}
@ -1573,65 +1523,106 @@ Slave Information Interface described in \cite[section~6.4]{dlspec}.
\begin{figure}[htbp]
\centering
\includegraphics[width=.9\textwidth]{images/fsm-sii} % FIXME
\includegraphics[width=.5\textwidth]{graphs/fsm_sii}
\caption{Transition Diagram of the SII State Machine}
\label{fig:fsm-sii}
\end{figure}
% FIXME
This is how the reading part of the state machine works:
\begin{description}
\item[READ\_START] The beginning state for reading access, where the
read request and the requested address are written to the SII
attribute. Nothing can fail up to now.
$\rightarrow$~READ\_CHECK
\item[READ\_CHECK] When the SII read request has been sent
successfully, a timer is started. A check/fetch datagram is issued,
that reads out the SII attribute for state and data.
$\rightarrow$~READ\_FETCH
\item[Start Reading] The read request and the requested word address are
written to the SII attribute.
\item[READ\_FETCH] Upon reception of the check/fetch datagram, the
\textit{Read Operation} and \textit{Busy} parameters are checked:
\begin{itemize}
\item If the slave is still busy with fetching E$^2$PROM data into
the interface, the timer is checked. If it timed out, the reading
is aborted ($\rightarrow$~ERROR), if not, the check/fetch datagram
is issued again. $\rightarrow$~READ\_FETCH
\item[Check Read Command] If the SII read request command has been
acknowledged, a timer is started. A datagram is issued, that reads out the SII
attribute for state and data.
\item[Fetch Data] If the read operation is still busy (the SII is usually
implemented as an E$^2$PROM), the state is read again. Otherwise the data are
copied from the datagram.
\item If the slave is ready with reading data, these are copied from
the datagram and the read cycle is completed.
$\rightarrow$~END
\end{itemize}
\end{description}
The write access states behave nearly the same:
The writing part works nearly similar:
\begin{description}
\item[WRITE\_START] The beginning state for writing access,
respectively. A write request, the target address and the data word
are written to the SII attribute. Nothing can fail.
$\rightarrow$~WRITE\_CHECK
\item[WRITE\_CHECK] When the SII write request has been sent
successfully, the timer is started. A check datagram is issued, that
reads out the SII attribute for the state of the write operation.
$\rightarrow$~WRITE\_CHECK2
\item[Start Writing] A write request, the target address and the data word are
written to the SII attribute.
\item[Check Write Command] If the SII write request command has been
acknowledged, a timer is started. A datagram is issued, that reads out the SII
attribute for the state of the write operation.
\item[Wait while Busy] If the write operation is still busy (determined by a
minimum wait time and the state of the busy flag), the state machine remains in
this state to avoid that another write operation is issued too early.
\item[WRITE\_CHECK2] Upon reception of the check datagram, the
\textit{Write Operation} and \textit{Busy} parameters are checked:
\begin{itemize}
\item If the slave is still busy with writing E$^2$PROM data, the
timer is checked. If it timed out, the operation is aborted
($\rightarrow$~ERROR), if not, the check datagram is issued again.
$\rightarrow$~WRITE\_CHECK2
\item If the slave is ready with writing data, the write cycle is
completed. $\rightarrow$~END
\end{itemize}
\end{description}
%------------------------------------------------------------------------------
\section{The Pdo State Machines}
\label{sec:fsm-pdo}
\index{FSM!Pdo}
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[section 5.6.7.4]{alspec}. For the object access, the
CANopen-over-EtherCAT access primitives are used (see
section~\ref{sec:coeimp}), so the slave must support the CoE mailbox protocol.
\paragraph{Pdo Reading FSM} This state machine (fig.~\ref{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.
\begin{figure}[htbp]
\centering
\includegraphics[width=.4\textwidth]{graphs/fsm_pdo_read}
\caption{Transition Diagram of the Pdo Reading State Machine}
\label{fig:fsm-pdo-read}
\end{figure}
Basically it reads the every Sync manager's Pdo assignment Sdo's
(\lstinline+0x1C1x+) number of elements to determine the number of assigned
Pdos for this sync manager and then reads out the subindices of the Sdo to get
the assigned Pdo's indices. When a Pdo index is read, the Pdo Entry Reading
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_reading}) 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
number of mapped Pdo entries. After that, each subindex is read to get the
mapped Pdo entry index, subindex and bit size.
\begin{figure}[htbp]
\centering
\includegraphics[width=.4\textwidth]{graphs/fsm_pdo_entry_read}
\caption{Transition Diagram of the Pdo Entry Reading State Machine}
\label{fig:fsm-pdo-read}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[width=.9\textwidth]{graphs/fsm_pdo_conf}
\caption{Transition Diagram of the Pdo Configuration State Machine}
\label{fig:fsm-pdo-read}
\end{figure}
\begin{figure}[htbp]
\centering
\includegraphics[width=.4\textwidth]{graphs/fsm_pdo_entry_conf}
\caption{Transition Diagram of the Pdo Entry Configuration State Machine}
\label{fig:fsm-pdo-read}
\end{figure}
%------------------------------------------------------------------------------
\chapter{Mailbox Protocol Implementations}
\index{Mailbox}
@ -1807,6 +1798,14 @@ The CANopen-over-EtherCAT protocol \cite[section~5.6]{alspec} is used to
configure slaves and exchange data objects on application level.
% FIXME
%
% Download / Upload
% Expedited / Normal
% Segmentung
% Sdo Info Services
%
\ldots
\paragraph{Sdo Download State Machine}
@ -1874,28 +1873,27 @@ in figure~\ref{fig:fsm-coedown}.
% FIXME
For the master runs as a kernel module, accessing it is natively
limited to analyzing Syslog messages and controlling using modutils.
For the master runs as a kernel module, accessing it is natively limited to
analyzing Syslog messages and controlling using modutils.
It is necessary to implement further interfaces, that make it easier
to access the master from user space and allow a finer influence. It
should be possible to view and to change special parameters at runtime.
It is necessary to implement further interfaces, that make it easier to access
the master from user space and allow a finer influence. It should be possible
to view and to change special parameters at runtime.
Bus visualization is a second point: For development and debugging
purposes it would be nice, if one could show the connected slaves with
a single command.
Bus visualization is a second point: For development and debugging purposes it
would be nice, if one could show the connected slaves with a single command.
Another aspect is automatic startup and configuration. If the master
is to be integrated into a running system, it must be able to
automatically start with a persistent configuration.
Another aspect is automatic startup and configuration. If the master is to be
integrated into a running system, it must be able to automatically start with
a persistent configuration.
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.
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.
This section covers all those points and introduces the interfaces and
tools to make all that possible.
This section covers all those points and introduces the interfaces and tools
to make all that possible.
%------------------------------------------------------------------------------

View File

@ -5,11 +5,13 @@
#-----------------------------------------------------------------------------
GRAPHS := \
fsm_change \
fsm_master \
fsm_pdo_conf \
fsm_pdo_read \
fsm_pdo_entry_conf \
fsm_pdo_entry_read \
fsm_pdo_read \
fsm_sii \
fsm_slave_conf \
fsm_slave_scan

View File

@ -0,0 +1,34 @@
/* $Id$ */
digraph change {
start [fontname="Helvetica"]
start -> check [weight=5]
check [fontname="Helvetica"]
check -> status [weight=5]
check -> error [fontname="Helvetica", label="Response\ntimeout"]
status [fontname="Helvetica"]
status -> end [fontname="Helvetica", label="Success", weight=5]
status -> code [fontname="Helvetica", label="Refuse", weight=5]
status -> error [fontname="Helvetica", label="Change\ntimeout"]
code [fontname="Helvetica"]
code -> ack [weight=2]
start_ack [fontname="Helvetica"]
start_ack -> ack [fontname="Helvetica", label="Ack only"]
ack [fontname="Helvetica"]
ack -> check_ack [weight=2]
check_ack [fontname="Helvetica"]
check_ack -> end [fontname="Helvetica", label="Ack only"]
check_ack -> error [weight=2]
end [fontname="Helvetica"]
error [fontname="Helvetica"]
}

View File

@ -2,9 +2,6 @@
/* $Id$ */
digraph pdo_conf {
size="7,9"
center=1
ratio=fill
start [fontname="Helvetica"]
start -> action_next_sync [fontname="Helvetica",label="First SM",weight=10]

View File

@ -2,9 +2,6 @@
/* $Id$ */
digraph pdo_entry_conf {
size="7,9"
center=1
ratio=fill
start [fontname="Helvetica"]
start -> zero_entry_count [weight=10]

View File

@ -2,9 +2,6 @@
/* $Id$ */
digraph pdo_entry_read {
size="7,9"
center=1
ratio=fill
start [fontname="Helvetica"]
start -> count [weight=5]

View File

@ -2,9 +2,6 @@
/* $Id$ */
digraph pdo_read {
size="7,9"
center=1
ratio=fill
start [fontname="Helvetica"]
start -> action_next_sync [fontname="Helvetica", label="First SM", weight=5]

View File

@ -0,0 +1,33 @@
/* $Id$ */
digraph sii {
start_reading [fontname="Helvetica"]
start_reading -> read_check [weight=5]
read_check [fontname="Helvetica"]
read_check -> error
read_check -> read_fetch [weight=5]
read_fetch [fontname="Helvetica"]
read_fetch -> error
read_fetch -> end [weight=5]
read_fetch -> read_fetch
start_writing [fontname="Helvetica"]
start_writing -> write_check [weight=5]
write_check [fontname="Helvetica"]
write_check -> error
write_check -> write_check2 [weight=5]
write_check2 [fontname="Helvetica"]
write_check2 -> error
write_check2 -> end [weight=5]
write_check2 -> write_check2
end [fontname="Helvetica"]
error [fontname="Helvetica"]
}

View File

@ -8,10 +8,8 @@ FIGS := \
app-config.fig \
architecture.fig \
fmmus.fig \
fsm-change.fig \
fsm-coedown.fig \
fsm-eoe.fig \
fsm-sii.fig \
interrupt.fig \
master-locks.fig \
masters.fig \

View File

@ -1,101 +0,0 @@
#FIG 3.2
Portrait
Center
Metric
A4
100.00
Single
-2
1200 2
0 32 #8e8e8e
6 398 2378 2122 3112
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1260 2745 855 360 405 2385 2115 3105
4 1 0 50 -1 16 12 0.0000 4 120 960 1260 2790 CODE\001
-6
6 2513 2378 4237 3112
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 2745 855 360 2520 2385 4230 3105
4 1 0 50 -1 16 12 0.0000 4 120 690 3375 2790 ACK\001
-6
6 4523 2378 6458 3112
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5490 2745 855 360 4635 2385 6345 3105
4 1 0 50 -1 16 12 0.0000 4 120 1935 5490 2790 CHECK ACK\001
-6
6 6705 2340 8505 3150
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 2745 855 360 6750 2385 8460 3105
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 2738 765 322 6840 2416 8370 3060
4 1 0 50 -1 16 12 0.0000 4 120 1200 7605 2790 ERROR\001
-6
6 2513 893 4237 1627
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 1260 855 360 2520 900 4230 1620
4 1 0 50 -1 16 12 0.0000 4 120 1170 3375 1305 CHECK\001
-6
6 4628 893 6352 1627
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5490 1260 855 360 4635 900 6345 1620
4 1 0 50 -1 16 12 0.0000 4 120 1305 5490 1305 STATUS\001
-6
6 6705 855 8505 1665
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 1260 855 360 6750 900 8460 1620
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 1261 748 315 6857 946 8353 1576
4 1 0 50 -1 16 12 0.0000 4 120 705 7605 1305 END\001
-6
6 360 855 2160 1665
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1260 1260 855 360 405 900 2115 1620
4 1 0 50 -1 16 12 0.0000 4 120 1080 1260 1305 START\001
-6
1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 495 675 101 101 495 675 585 720
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
1 1 1.00 60.00 120.00
2115 1260 2520 1260
0.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
1 1 1.00 60.00 120.00
4230 1260 4635 1260
0.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
1 1 1.00 60.00 120.00
6345 1260 6750 1260
0.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
1 1 1.00 60.00 120.00
5670 900 5670 540 5400 540 5355 900
0.000 -1.000 -1.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
1 1 1.00 60.00 120.00
2115 2745 2520 2745
0.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
1 1 1.00 60.00 120.00
4230 2745 4635 2745
0.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
1 1 1.00 60.00 120.00
6345 2745 6750 2745
0.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
1 1 1.00 60.00 120.00
4905 1530 4365 1980 2610 2115 1755 2430
0.000 -1.000 -1.000 0.000
3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
1 1 1.00 60.00 120.00
540 765 675 990
0.000 0.000
3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 4
1 1 1.00 60.00 120.00
4050 1485 4500 1620 6120 1980 6930 2520
0.000 -1.000 -1.000 0.000
3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
1 1 1.00 60.00 120.00
6165 1485 6750 1935 7110 2430
0.000 -1.000 0.000
3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
1 1 1.00 60.00 120.00
3915 3060 5490 3285 6795 2925
0.000 -1.000 0.000
3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
1 1 1.00 60.00 120.00
1890 3015 5355 3510 6975 3015
0.000 -1.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
1 1 1.00 60.00 120.00
5670 2386 5670 2026 5400 2026 5355 2386
0.000 -1.000 -1.000 0.000

View File

@ -1,106 +0,0 @@
#FIG 3.2
Portrait
Center
Metric
A4
100.00
Single
-2
1200 2
0 32 #8e8e8e
6 2235 893 4515 1627
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 1260 855 360 2520 900 4230 1620
4 1 0 50 -1 16 12 0.0000 4 150 2280 3375 1305 READ_CHECK\001
-6
6 4388 893 6593 1627
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5490 1260 855 360 4635 900 6345 1620
4 1 0 50 -1 16 12 0.0000 4 150 2205 5490 1305 READ_FETCH\001
-6
6 165 893 2355 1627
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1260 1260 855 360 405 900 2115 1620
4 1 0 50 -1 16 12 0.0000 4 150 2190 1260 1305 READ_START\001
-6
6 6705 1710 8505 2520
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 2115 855 360 6750 1755 8460 2475
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 2116 748 315 6857 1801 8353 2431
4 1 0 50 -1 16 12 0.0000 4 120 705 7605 2160 END\001
-6
6 113 2648 2408 3382
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1260 3015 855 360 405 2655 2115 3375
4 1 0 50 -1 16 12 0.0000 4 150 2295 1260 3060 WRITE_START\001
-6
6 2183 2648 4568 3382
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 3015 855 360 2520 2655 4230 3375
4 1 0 50 -1 16 12 0.0000 4 150 2385 3375 3060 WRITE_CHECK\001
-6
6 4208 2648 6773 3382
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5490 3015 855 360 4635 2655 6345 3375
4 1 0 50 -1 16 12 0.0000 4 150 2565 5490 3060 WRITE_CHECK2\001
-6
6 3555 1710 5355 2520
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4455 2115 855 360 3600 1755 5310 2475
1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4455 2108 765 322 3690 1786 5220 2430
4 1 0 50 -1 16 12 0.0000 4 120 1200 4455 2160 ERROR\001
-6
6 360 540 675 990
1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 495 675 101 101 495 675 585 720
3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
1 1 1.00 60.00 120.00
540 765 675 990
0.000 0.000
-6
6 360 2295 675 2745
1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 495 2430 101 101 495 2430 585 2475
3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
1 1 1.00 60.00 120.00
540 2520 675 2745
0.000 0.000
-6
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
1 1 1.00 60.00 120.00
2115 1260 2520 1260
0.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
1 1 1.00 60.00 120.00
4230 1260 4635 1260
0.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
1 1 1.00 60.00 120.00
2115 3015 2520 3015
0.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
1 1 1.00 60.00 120.00
4230 3015 4635 3015
0.000 0.000
3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
1 1 1.00 60.00 120.00
3375 1620 3465 1845 3735 1935
0.000 -1.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
1 1 1.00 60.00 120.00
5490 1620 5445 1845 5220 1935
0.000 -1.000 0.000
3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
1 1 1.00 60.00 120.00
3375 2610 3465 2385 3735 2295
0.000 -1.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
1 1 1.00 60.00 120.00
5490 2610 5445 2385 5220 2295
0.000 -1.000 0.000
3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
1 1 1.00 60.00 120.00
6255 1440 6750 1620 7020 1845
0.000 -1.000 0.000
3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
1 1 1.00 60.00 120.00
6210 2835 6750 2700 7020 2385
0.000 -1.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
1 1 1.00 60.00 120.00
5670 900 5670 630 5400 630 5400 900
0.000 -1.000 -1.000 0.000
3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
1 1 1.00 60.00 120.00
5670 3375 5670 3690 5310 3690 5310 3375
0.000 -1.000 -1.000 0.000