<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span style="color:#1F497D">Oh, that worked. Thank you so much for the help, Graeme.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Dave M<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Graeme Foot <Graeme.Foot@touchcut.com> <br>
<b>Sent:</b> Wednesday, November 8, 2023 3:21 PM<br>
<b>To:</b> David Meehan <dmeehan@dekaresearch.com>; etherlab-users@etherlab.org<br>
<b>Subject:</b> [External]: RE: EL3204 Analog PDO Data Issue<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span lang="EN-NZ">Hi David,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-NZ"> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-NZ">In </span>cyclic_task() it looks like you are missing ecrt_domain_queue(domain1) just before ecrt_master_send().<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">I haven’t checked for any further problems.<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-NZ"> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-NZ">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-NZ">Graeme.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-NZ"> <o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Etherlab-users <<a href="mailto:etherlab-users-bounces@etherlab.org">etherlab-users-bounces@etherlab.org</a>>
<b>On Behalf Of </b>David Meehan<br>
<b>Sent:</b> Thursday, November 9, 2023 7:15 AM<br>
<b>To:</b> <a href="mailto:etherlab-users@etherlab.org">etherlab-users@etherlab.org</a><br>
<b>Subject:</b> [Etherlab-users] EL3204 Analog PDO Data Issue<span lang="EN-NZ"><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span lang="EN-NZ"> <o:p></o:p></span></p>
<p class="MsoNormal">Hi all,<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">I’m completely new to EtherCAT, so bear with me. I’m in the process of trying to bring up an EL3204 4-channel analog input terminal. I’m running into an issue where it doesn’t look like I’m getting any PDO data back. The working counter
 seems stuck at [0/1]. I have some code based on the dc_user example project (see code below). Our system has the following slave terminals.<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// Taken from:<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// > ethercat slaves<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 0  0:0  PREOP  +  EK1100 EtherCAT-Koppler (2A E-Bus)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 1  0:1  PREOP  +  EL1809 16K. Dig. Eingang 24V, 3ms<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 2  0:2  PREOP  +  EL2809 16K. Dig. Ausgang 24V, 0.5A<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 3  0:3  PREOP  +  EL6224 (IO Link Master)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 4  0:4  PREOP  +  EL7031 1K. Schrittmotor-Endstufe (24V, 1.5A)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 5  0:5  PREOP  +  EL3204-0200 4K. Ana. Ein. PT1000 (RTD)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">For right now I’m only interested in setting up the EL3204. I ran the “ethercat cstruct” command to get the sync manager and pdo listings for slave 5. Using those I was able to create a ec_pdo_entry_reg_t registration list containing the
 4 channel values. I pass the sync info objects through ecrt_slave_config_pdos, and pass the domain registration list through ecrt_domain_reg_pdo_entry_list. Everything seems to work and the slave node goes to OP state after activating the master.  I printed
 out the byte offset mappings and it looks like ec  master was able to allocate a data buffer and assign the PDOs. Everything looks good.<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">But I’m still not getting any PDO data. Everything is reporting back as 0 and the WC is not incrementing. I ran a little experiment and setup some SDO request objects and tried reading back the sensor values using SDOs instead of PDOs,
 and it worked! The readings I’m getting back from the SDOs match the values I was seeing in TwinCAT. So I know the comms are good.<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">Anyway, if anyone has any suggestions, it would be appreciated.<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">Thanks,<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">Dave M<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/*****************************************************************************<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  Copyright (C) 2007-2022  Florian Pose, Ingenieurgemeinschaft IgH<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  This file is part of the IgH EtherCAT Master.<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  The IgH EtherCAT Master is free software; you can redistribute it and/or<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  modify it under the terms of the GNU General Public License version 2, as<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  published by the Free Software Foundation.<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  The IgH EtherCAT Master is distributed in the hope that it will be useful,<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  but WITHOUT ANY WARRANTY; without even the implied warranty of<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  Public License for more details.<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  You should have received a copy of the GNU General Public License along<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  with the IgH EtherCAT Master; if not, write to the Free Software<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  ---<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  The license mentioned above concerns the source code only. Using the<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  EtherCAT technology and brand is only permitted in compliance with the<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*  industrial property and similar rights of Beckhoff Automation GmbH.<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">****************************************************************************/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <errno.h><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <signal.h><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <stdio.h><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <string.h><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <sys/resource.h><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <sys/time.h><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <sys/types.h><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <unistd.h><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <time.h><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <sys/mman.h><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <malloc.h><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include <sched.h> /* sched_setscheduler() */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#include "ecrt.h"<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/****************************************************************************/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// Application parameters<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define FREQUENCY 1000<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define CLOCK_TO_USE CLOCK_MONOTONIC<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define MEASURE_TIMING<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// Taken from ethercat slaves<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 0  0:0  PREOP  +  EK1100 EtherCAT-Koppler (2A E-Bus)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 1  0:1  PREOP  +  EL1809 16K. Dig. Eingang 24V, 3ms<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 2  0:2  PREOP  +  EL2809 16K. Dig. Ausgang 24V, 0.5A<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 3  0:3  PREOP  +  EL6224 (IO Link Master)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 4  0:4  PREOP  +  EL7031 1K. Schrittmotor-Endstufe (24V, 1.5A)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// 5  0:5  PREOP  +  EL3204-0200 4K. Ana. Ein. PT1000 (RTD)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// Taken from ethercat cstruct<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/* Master 0, Slave 5, "EL3204-0200"<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">* Vendor ID:       0x00000002<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">* Product code:    0x0c843052<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">* Revision number: 0x001200c8<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">*/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">ec_pdo_entry_info_t slave_5_pdo_entries[] = {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6000, 0x01, 1}, /* Underrange */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6000, 0x02, 1}, /* Overrange */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x0000, 0x00, 4}, /* Gap */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6000, 0x07, 1}, /* Error */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x0000, 0x00, 7}, /* Gap */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6000, 0x0f, 1}, /* TxPDO State */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6000, 0x10, 1}, /* TxPDO Toggle */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6000, 0x11, 16}, /* Value */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6010, 0x01, 1}, /* Underrange */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6010, 0x02, 1}, /* Overrange */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x0000, 0x00, 4}, /* Gap */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6010, 0x07, 1}, /* Error */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x0000, 0x00, 7}, /* Gap */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6010, 0x0f, 1}, /* TxPDO State */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6010, 0x10, 1}, /* TxPDO Toggle */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6010, 0x11, 16}, /* Value */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6020, 0x01, 1}, /* Underrange */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6020, 0x02, 1}, /* Overrange */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x0000, 0x00, 4}, /* Gap */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6020, 0x07, 1}, /* Error */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x0000, 0x00, 7}, /* Gap */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6020, 0x0f, 1}, /* TxPDO State */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6020, 0x10, 1}, /* TxPDO Toggle */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6020, 0x11, 16}, /* Value */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6030, 0x01, 1}, /* Underrange */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6030, 0x02, 1}, /* Overrange */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x0000, 0x00, 4}, /* Gap */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6030, 0x07, 1}, /* Error */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x0000, 0x00, 7}, /* Gap */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6030, 0x0f, 1}, /* TxPDO State */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6030, 0x10, 1}, /* TxPDO Toggle */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x6030, 0x11, 16}, /* Value */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">};<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">ec_pdo_info_t slave_5_pdos[] = {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x1a00, 8, slave_5_pdo_entries + 0}, /* RTD TxPDO-Map Ch.1 */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x1a01, 8, slave_5_pdo_entries + 8}, /* RTD TxPDO-Map Ch.2 */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x1a02, 8, slave_5_pdo_entries + 16}, /* RTD TxPDO-Map Ch.3 */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {0x1a03, 8, slave_5_pdo_entries + 24}, /* RTD TxPDO-Map Ch.4 */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">};</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR"> </span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">ec_sync_info_t slave_5_syncs[] = {</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">    </span>{0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {2, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {3, EC_DIR_INPUT, 4, slave_5_pdos + 0, EC_WD_DISABLE},<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    <span lang="FR">{0xff}</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">};</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR"> </span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">// typedef struct {</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">//     uint16_t alias;</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">//     uint16_t position;</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">//     uint32_t vendor_id;</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">//     uint32_t product_code;</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">//     uint16_t index;</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">//     uint8_t subindex;</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">//     unsigned int *offset;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">//     unsigned int *bit_position;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// } ec_pdo_entry_reg_t;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">unsigned int val1Offset = 0u;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">unsigned int val1bit = 0u;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">unsigned int val2Offset = 0u;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">unsigned int val2bit = 0u;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">unsigned int val3Offset = 0u;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">unsigned int val3bit = 0u;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">unsigned int val4Offset = 0u;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">unsigned int val4bit = 0u;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// Taken from ethercat cstruct<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">ec_pdo_entry_reg_t registrationList[] = {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    { 0, 5, 2, 0xc843052, 0x6000, 0x11, &val1Offset, &val1bit },<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    { 0, 5, 2, 0xc843052, 0x6010, 0x11, &val2Offset, &val2bit },<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    { 0, 5, 2, 0xc843052, 0x6020, 0x11, &val3Offset, &val3bit },<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    { 0, 5, 2, 0xc843052, 0x6030, 0x11, &val4Offset, &val4bit }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">};<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/****************************************************************************/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define NSEC_PER_SEC (1000000000L)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define PERIOD_NS (NSEC_PER_SEC / FREQUENCY)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define DIFF_NS(A, B) (((B).tv_sec - (A).tv_sec) * NSEC_PER_SEC + \<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        (B).tv_nsec - (A).tv_nsec)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define TIMESPEC2NS(T) ((uint64_t) (T).tv_sec * NSEC_PER_SEC + (T).tv_nsec)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/****************************************************************************/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// EtherCAT<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">static ec_master_t *master = NULL;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">static ec_master_state_t master_state = {};<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">static ec_domain_t *domain1 = NULL;</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">static ec_domain_state_t domain1_state = {};<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/****************************************************************************/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// process data<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">static uint8_t *domain1_pd = NULL;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define BusCouplerPos    0, 0<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define DigInSlavePos   0, 1<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define CounterSlavePos  0, 2<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define Beckhoff_EK1100 0x00000002, 0x044c2c52<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#define Beckhoff_EL3204 0x00000002, 0x0c843052 // TODO Set to the EL3204<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">// offsets for PDO entries<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">static int off_dig_out;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">static int off_counter_in;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">static int off_counter_out;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">static unsigned int counter = 0;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">static unsigned int blink = 0;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">static unsigned int sync_ref_counter = 0;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">const struct timespec cycletime = {0, PERIOD_NS};<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/****************************************************************************/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">struct timespec timespec_add(struct timespec time1, struct timespec time2)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">{<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    struct timespec result;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if ((time1.tv_nsec + time2.tv_nsec) >= NSEC_PER_SEC) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        result.tv_sec = time1.tv_sec + time2.tv_sec + 1;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        result.tv_nsec = time1.tv_nsec + time2.tv_nsec - NSEC_PER_SEC;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    } else {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        result.tv_sec = time1.tv_sec + time2.tv_sec;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        result.tv_nsec = time1.tv_nsec + time2.tv_nsec;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    return result;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">}<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/****************************************************************************/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">void check_domain1_state(void)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">{<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    ec_domain_state_t ds;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    ecrt_domain_state(domain1, &ds);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (ds.working_counter != domain1_state.working_counter)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        printf("Domain1: WC %u.\n", ds.working_counter);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (ds.wc_state != domain1_state.wc_state)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        printf("Domain1: State %u.\n", ds.wc_state);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    domain1_state = ds;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">}<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/****************************************************************************/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">void check_master_state(void)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">{<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    ec_master_state_t ms;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    ecrt_master_state(master, &ms);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (ms.slaves_responding != master_state.slaves_responding)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        printf("%u slave(s).\n", ms.slaves_responding);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (ms.al_states != master_state.al_states)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        printf("AL states: 0x%02X.\n", ms.al_states);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (ms.link_up != master_state.link_up)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        printf("Link is %s.\n", ms.link_up ? "up" : "down");<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    master_state = ms;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">}<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/****************************************************************************/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">void cyclic_task()<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">{<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    struct timespec wakeupTime, time;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#ifdef MEASURE_TIMING<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    struct timespec startTime, endTime, lastStartTime = {};<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    uint32_t period_ns = 0, exec_ns = 0, latency_ns = 0,<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">             latency_min_ns = 0, latency_max_ns = 0,<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">             period_min_ns = 0, period_max_ns = 0,<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">             <span lang="FR">exec_min_ns = 0, exec_max_ns = 0;</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#endif<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    // get current time<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    clock_gettime(CLOCK_TO_USE, &wakeupTime);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    while(1) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        wakeupTime = timespec_add(wakeupTime, cycletime);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        clock_nanosleep(CLOCK_TO_USE, TIMER_ABSTIME, &wakeupTime, NULL);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        // Write application time to master<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        //<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        // It is a good idea to use the target time (not the measured time) as<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        // application time, because it is more stable.<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        //<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        ecrt_master_application_time(master, TIMESPEC2NS(wakeupTime));<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#ifdef MEASURE_TIMING<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        clock_gettime(CLOCK_TO_USE, &startTime);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        latency_ns = DIFF_NS(wakeupTime, startTime);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        period_ns = DIFF_NS(lastStartTime, startTime);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        exec_ns = DIFF_NS(lastStartTime, endTime);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        lastStartTime = startTime;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        if (latency_ns > latency_max_ns) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            latency_max_ns = latency_ns;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        if (latency_ns < latency_min_ns) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            latency_min_ns = latency_ns;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        if (period_ns > period_max_ns) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            period_max_ns = period_ns;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        if (period_ns < period_min_ns) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            period_min_ns = period_ns;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        if (exec_ns > exec_max_ns) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            exec_max_ns = exec_ns;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        if (exec_ns < exec_min_ns) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            <span lang="FR">exec_min_ns = exec_ns;</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">        </span>}<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#endif<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        // receive process data<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        ecrt_master_receive(master);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        ecrt_domain_process(domain1);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        // check process data state (optional)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        check_domain1_state();<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        if (counter) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            counter--;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        } else { // do this at 1 Hz<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            counter = FREQUENCY;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            // check for master state (optional)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            check_master_state();<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#ifdef MEASURE_TIMING<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            // output timing stats<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            printf("period     %10u ... %10u\n",<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">                    period_min_ns, period_max_ns);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            printf("exec       %10u ... %10u\n",<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">                    exec_min_ns, exec_max_ns);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            printf("latency    %10u ... %10u\n",<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">                    latency_min_ns, latency_max_ns);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            period_max_ns = 0;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            period_min_ns = 0xffffffff;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            exec_max_ns = 0;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            exec_min_ns = 0xffffffff;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            latency_max_ns = 0;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            latency_min_ns = 0xffffffff;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#endif<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        // Read process data<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        int16_t val1 = EC_READ_S16(domain1_pd + val1Offset);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        int16_t val2 = EC_READ_S16(domain1_pd + val1Offset);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        int16_t val3 = EC_READ_S16(domain1_pd + val1Offset);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        int16_t val4 = EC_READ_S16(domain1_pd + val1Offset);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        <span lang="FR">printf("Val1: %d\nVal2: %d\nVal3: %d\nVal4: %d\n\n", val1, val2, val3, val4);</span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR"> </span><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR">        </span>if (sync_ref_counter) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            sync_ref_counter--;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        } else {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            sync_ref_counter = 1; // sync every cycle<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            clock_gettime(CLOCK_TO_USE, &time);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">            ecrt_master_sync_reference_clock_to(master, TIMESPEC2NS(time));<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        ecrt_master_sync_slave_clocks(master);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        ecrt_master_send(master);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#ifdef MEASURE_TIMING<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        clock_gettime(CLOCK_TO_USE, &endTime);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">#endif<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">}<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/****************************************************************************/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">int main(int argc, char **argv)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">{<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    ec_slave_config_t *sc;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        perror("mlockall failed");<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        return -1;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    master = ecrt_request_master(0);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (!master)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        return -1;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    domain1 = ecrt_master_create_domain(master);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (!domain1)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        return -1;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    // Create configuration for bus coupler<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    sc = ecrt_master_slave_config(master, BusCouplerPos, Beckhoff_EK1100);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (!sc)<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        return -1;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (!(sc = ecrt_master_slave_config(master,<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">                    DigInSlavePos, Beckhoff_EL3204))) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        fprintf(stderr, "Failed to get slave configuration.\n");<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        return -1;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if ( ecrt_slave_config_pdos(sc, 5, &slave_5_syncs[0] ) )<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        printf("Failed to set sync manager data\n");<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        return -1;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    printf("Registering PDO entries...\n");<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (ecrt_domain_reg_pdo_entry_list(domain1, &registrationList[0])) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        fprintf(stderr, "Failed to set slave pdos.\n");<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        return -1;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    // configure SYNC signals for this slave<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    // NOTE: EL3204 uses the same assignActivate value<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    ecrt_slave_config_dc(sc, 0x0700, PERIOD_NS, 4400000, 0, 0);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    printf("Activating master...\n");<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (ecrt_master_activate(master))<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        return -1;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (!(domain1_pd = ecrt_domain_data(domain1))) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        return -1;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    printf( "Domain Size Is %d bytes\n", ecrt_domain_size( domain1 ) );<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    printf( "   Domain Val1 Offset Is %d\n", val1Offset );<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    printf( "   Domain Val2 Offset Is %d\n", val2Offset );<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    printf( "   Domain Val3 Offset Is %d\n", val3Offset );<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    printf( "   Domain Val4 Offset Is %d\n", val4Offset );<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    /* Set priority */<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    struct sched_param param = {};<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    param.sched_priority = sched_get_priority_max(SCHED_FIFO);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    printf("Using priority %i.", param.sched_priority);<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    if (sched_setscheduler(0, SCHED_FIFO, &param) == -1) {<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">        perror("sched_setscheduler failed");<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    }<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    printf("Starting cyclic function.\n");<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    cyclic_task();<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">    return 0;<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">}<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal">/****************************************************************************/<span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">This e-mail and the information, including any attachments it contains, are intended to be a confidential communication only to the person or entity to whom it is addressed and may contain information that is
 privileged. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution or copying of this communication is strictly prohibited. If you have received this communication in error, please immediately
 notify the sender and destroy the original message. Thank you. Please consider the environment before printing this email.
<span lang="EN-NZ"><o:p></o:p></span></p>
<p align="center" style="text-align:center"><span style="color:black;background:white">This message has been scanned for malware by Websense.
</span><a href="http://www.websense.com/"><span style="color:black;background:white">www.websense.com</span></a><span lang="EN-NZ"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span lang="EN-NZ" style="font-size:12.0pt;font-family:"Times New Roman",serif;background:white"><o:p> </o:p></span></p>
<p align="center" style="text-align:center"><span lang="EN-NZ" style="background:white">On Behalf of DEKA IT - Click
<a href="https://www.mailcontrol.com/sr/MZbqvYs5QwJvpeaetUwhCQ==">here</a> to report this email as spam.<o:p></o:p></span></p>
</div>
This e-mail and the information, including any attachments it contains, are intended to be a confidential communication only to the person or entity to whom it is addressed and may contain information that is privileged. If the reader of this message is not
 the intended recipient, you are hereby notified that any dissemination, distribution or copying of this communication is strictly prohibited. If you have received this communication in error, please immediately notify the sender and destroy the original message.
 Thank you. Please consider the environment before printing this email.
</body>
</html>