<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;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
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;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Courier New";}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:Consolas;
mso-fareast-language:EN-US;}
span.EmailStyle19
{mso-style-type:personal;
font-family:"Calibri",sans-serif;
color:windowtext;}
p.PreformattatoHTML, li.PreformattatoHTML, div.PreformattatoHTML
{mso-style-name:"Preformattato HTML";
mso-style-link:"Preformattato HTML Carattere";
margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
span.PreformattatoHTMLCarattere
{mso-style-name:"Preformattato HTML Carattere";
mso-style-priority:99;
mso-style-link:"Preformattato HTML";
font-family:"Courier New";
mso-fareast-language:IT;}
span.EmailStyle22
{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:612.0pt 792.0pt;
margin:70.85pt 2.0cm 2.0cm 2.0cm;}
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-NZ link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal><span style='color:#1F497D'>Anything not defined in “ecrt.h” or “ioctl.h” are opaque structures that live in kernel space, and you cannot (or should not) play with their internals.<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'>If you want to get information about the master, call the functions defined in ecrt.h. Don’t try to play with it directly.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=EN-US style='mso-fareast-language:EN-NZ'>From:</span></b><span lang=EN-US style='mso-fareast-language:EN-NZ'> etherlab-users [mailto:etherlab-users-bounces@etherlab.org] <b>On Behalf Of </b>Tommaso<br><b>Sent:</b> Wednesday, 27 April 2016 02:29<br><b>To:</b> etherlab-users@etherlab.org<br><b>Subject:</b> [etherlab-users] EtherCAT master fields access issue<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span lang=EN-GB>Good evening,<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>In order to understand properly each possible data value, I’m trying to access to the EtherCAT master data fields using it like a structure (struct ec_master). My code, attached at the end of this message, is a reworking of the “user” example provided in the master documentation.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>The issue that I have encountered is that when I try to include the file “master.h” the compiler gives a missing “list.h” file to include but, when I include its path, I found some errors of conflicting type (fd_set, dev_t, nlink_t, etc.).<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>Could you give me any hints in order to solve this? Anyone has already tried to access the EtherCAT master fields in this way before and can send the code?<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB style='mso-fareast-language:IT'>Thank you for your help.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>Tommaso<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#include <errno.h><o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#include <signal.h><o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#include <stdio.h><o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#include <string.h><o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#include <sys/resource.h><o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#include <sys/time.h><o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#include <sys/types.h><o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#include <unistd.h><o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#include "ecrt.h"<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define FREQUENCY 1000<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define PRIORITY 1 <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define CONFIGURE_PDOS 1 <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define SDO_ACCESS 0 <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>// EtherCAT<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_master_t *master = NULL;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_master_state_t master_state = {};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_domain_t *domain1 = NULL;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_domain_state_t domain1_state = {};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_slave_config_t *sc_ana_in = NULL;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_slave_config_state_t sc_ana_in_state = {};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_slave_config_t *sc_ana_out = NULL;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_slave_config_state_t sc_ana_out_state = {};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_slave_config_t *sc_dig_in = NULL;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_slave_config_state_t sc_dig_in_state = {};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_slave_config_t *sc_dig_out = NULL;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_slave_config_state_t sc_dig_out_state = {};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>static unsigned int sig_alarms = 0;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static unsigned int user_alarms = 0;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static unsigned int counter = 0;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static unsigned int blink = 0;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>// process data<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>static uint8_t *domain1_pd = NULL;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define BusCouplerPos 0, 0<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define DigOutSlavePos 0, 1<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define DigInSlavePos 0, 3<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define AnaInSlavePos 0, 5<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define AnaOutSlavePos 0, 6<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define Beckhoff_EK1100 0x00000002, 0x044c2c52<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define Beckhoff_EL2004 0x00000002, 0x07D43052<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define Beckhoff_EL1014 0x00000002, 0x03f63052<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define Beckhoff_EL3062 0x00000002, 0x0bf63052<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#define Beckhoff_EL4002 0x00000002, 0x0fa23052<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>// offsets for PDO entries<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static unsigned int off_ana_in;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static unsigned int off_ana_out;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static unsigned int off_dig_in;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static unsigned int off_dig_out;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>const static ec_pdo_entry_reg_t domain1_regs[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {AnaInSlavePos, Beckhoff_EL3062, 0x6000, 0x11, &off_ana_in},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {AnaOutSlavePos, Beckhoff_EL4002, 0x7000, 1, &off_ana_out},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {DigInSlavePos, Beckhoff_EL1014, 0x6000, 1, &off_dig_in},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {DigOutSlavePos, Beckhoff_EL2004, 0x7000, 1, &off_dig_out},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#if CONFIGURE_PDOS<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>// Analog in -------------------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>ec_pdo_entry_info_t el3062_pdo_entries[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6000, 0x01, 1}, /* Underrange */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6000, 0x02, 1}, /* Overrange */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6000, 0x03, 2}, /* Limit 1 */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6000, 0x05, 2}, /* Limit 2 */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6000, 0x07, 1}, /* Error */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x0000, 0x00, 1}, /* Gap */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x0000, 0x00, 6}, /* Gap */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6000, 0x0f, 1}, /* TxPDO State */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6000, 0x10, 1}, /* TxPDO Toggle */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6000, 0x11, 16}, /* Value */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6010, 0x01, 1}, /* Underrange */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6010, 0x02, 1}, /* Overrange */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6010, 0x03, 2}, /* Limit 1 */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6010, 0x05, 2}, /* Limit 2 */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6010, 0x07, 1}, /* Error */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x0000, 0x00, 1}, /* Gap */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x0000, 0x00, 6}, /* Gap */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6010, 0x0f, 1}, /* TxPDO State */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6010, 0x10, 1}, /* TxPDO Toggle */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6010, 0x11, 16}, /* Value */<o:p></o:p></span></p><p class=MsoNormal><span lang=IT>};<o:p></o:p></span></p><p class=MsoNormal><span lang=IT><o:p> </o:p></span></p><p class=MsoNormal><span lang=IT>ec_pdo_info_t el3062_pdos[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1a00, 10, el3062_pdo_entries + 0}, /* AI TxPDO-Map Standard Ch.1 */<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1a02, 10, el3062_pdo_entries + 10}, /* AI TxPDO-Map Standard Ch.2 */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>ec_sync_info_t el3062_syncs[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {2, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {3, EC_DIR_INPUT, 1, el3062_pdos + 0, EC_WD_DISABLE},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0xff}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>// Analog out -------------------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>ec_pdo_entry_info_t el4002_pdo_entries[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x7000, 0x01, 16}, /* Analog output */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x7010, 0x01, 16}, /* Analog output */<o:p></o:p></span></p><p class=MsoNormal><span lang=IT>};<o:p></o:p></span></p><p class=MsoNormal><span lang=IT><o:p> </o:p></span></p><p class=MsoNormal><span lang=IT>ec_pdo_info_t el4002_pdos[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1600, 1, el4002_pdo_entries + 0}, /* RxPDO-Map OutputsCh.1 */<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1601, 1, el4002_pdo_entries + 1}, /* RxPDO-Map OutputsCh.2 */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>ec_sync_info_t el4002_syncs[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {2, EC_DIR_OUTPUT, 2, el4002_pdos + 0, EC_WD_DISABLE},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {3, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0xff}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>// Digital in -------------------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>ec_pdo_entry_info_t el1014_pdo_entries[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6000, 0x01, 1}, /* Input */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6010, 0x01, 1}, /* Input */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6020, 0x01, 1}, /* Input */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x6030, 0x01, 1}, /* Input */<o:p></o:p></span></p><p class=MsoNormal><span lang=IT>};<o:p></o:p></span></p><p class=MsoNormal><span lang=IT><o:p> </o:p></span></p><p class=MsoNormal><span lang=IT>ec_pdo_info_t el1014_pdos[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1a00, 1, el1014_pdo_entries + 0}, /* Channel 1 */<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1a01, 1, el1014_pdo_entries + 1}, /* Channel 2 */<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1a02, 1, el1014_pdo_entries + 2}, /* Channel 3 */<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1a03, 1, el1014_pdo_entries + 3}, /* Channel 4 */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>ec_sync_info_t el1014_syncs[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {1, EC_DIR_OUTPUT},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0, EC_DIR_INPUT, 4, el1014_pdos + 0, EC_WD_DISABLE},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0xff}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>// Digital out -------------------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>ec_pdo_entry_info_t el2004_channels[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x7000, 0x01, 1}, /* Output */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x7010, 0x01, 1}, /* Output */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x7020, 0x01, 1}, /* Output */<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0x7030, 0x01, 1}, /* Output */<o:p></o:p></span></p><p class=MsoNormal><span lang=IT>};<o:p></o:p></span></p><p class=MsoNormal><span lang=IT><o:p> </o:p></span></p><p class=MsoNormal><span lang=IT>ec_pdo_info_t el2004_pdos[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1600, 1, &el2004_channels[0]},<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1601, 1, &el2004_channels[1]},<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1602, 1, &el2004_channels[2]},<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> {0x1603, 1, &el2004_channels[3]}<o:p></o:p></span></p><p class=MsoNormal><span lang=IT>};<o:p></o:p></span></p><p class=MsoNormal><span lang=IT><o:p> </o:p></span></p><p class=MsoNormal><span lang=IT>ec_sync_info_t el2004_syncs[] = {<o:p></o:p></span></p><p class=MsoNormal><span lang=IT> </span><span lang=EN-GB>{0, EC_DIR_OUTPUT, 4, el2004_pdos + 0, EC_WD_ENABLE},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {1, EC_DIR_INPUT},<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> {0xff}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>};<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#endif<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/*****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#if SDO_ACCESS<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>static ec_sdo_request_t *sdo;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#endif<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/*****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>void check_domain1_state(void)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>{<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ec_domain_state_t ds;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_domain_state(domain1, &ds);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (ds.working_counter != domain1_state.working_counter)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("Domain1: WC %u.\n", ds.working_counter);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (ds.wc_state != domain1_state.wc_state)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("Domain1: State %u.\n", ds.wc_state);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> domain1_state = ds;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/*****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>void check_master_state(void)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>{<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ec_master_state_t ms;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_master_state(master, &ms);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (ms.slaves_responding != master_state.slaves_responding)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("%u slave(s).\n", ms.slaves_responding);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (ms.al_states != master_state.al_states)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("AL states: 0x%02X.\n", ms.al_states);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (ms.link_up != master_state.link_up)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("Link is %s.\n", ms.link_up ? "up" : "down");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> master_state = ms;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/*****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>void check_slave_config_states(void)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>{<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ec_slave_config_state_t s;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // Analog in --------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_slave_config_state(sc_ana_in, &s);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.al_state != sc_ana_in_state.al_state)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("AnaIn: State 0x%02X.\n", s.al_state);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.online != sc_ana_in_state.online)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("AnaIn: %s.\n", s.online ? "online" : "offline");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.operational != sc_ana_in_state.operational)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("AnaIn: %soperational.\n", s.operational ? "" : "Not ");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> sc_ana_in_state = s;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // Analog out --------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_slave_config_state(sc_ana_out, &s);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.al_state != sc_ana_out_state.al_state)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("AnaOut: State 0x%02X.\n", s.al_state);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.online != sc_ana_out_state.online)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("AnaOut: %s.\n", s.online ? "online" : "offline");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.operational != sc_ana_out_state.operational)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("AnaOut: %soperational.\n", s.operational ? "" : "Not ");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> sc_ana_out_state = s;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // Digital in --------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_slave_config_state(sc_dig_in, &s);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.al_state != sc_dig_in_state.al_state)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("DigIn: State 0x%02X.\n", s.al_state);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.online != sc_dig_in_state.online)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("DigIn: %s.\n", s.online ? "online" : "offline");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.operational != sc_dig_in_state.operational)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("DigIn: %soperational.\n", s.operational ? "" : "Not ");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> sc_dig_in_state = s;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // Digital out --------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_slave_config_state(sc_dig_out, &s);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.al_state != sc_dig_out_state.al_state)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("DigOut: State 0x%02X.\n", s.al_state);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.online != sc_dig_out_state.online)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("DigOut: %s.\n", s.online ? "online" : "offline");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (s.operational != sc_dig_out_state.operational)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("DigOut: %soperational.\n", s.operational ? "" : "Not ");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> sc_dig_out_state = s;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/*****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#if SDO_ACCESS<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>void read_sdo(void)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>{<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("Reading sdo request state..\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> switch (ecrt_sdo_request_state(sdo)) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> case EC_REQUEST_UNUSED: // request was not used yet<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_sdo_request_read(sdo); // trigger first read<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> break;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> case EC_REQUEST_BUSY:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Still busy...\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> break;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> case EC_REQUEST_SUCCESS:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "SDO value: 0x%04X\n",EC_READ_U16(ecrt_sdo_request_data(sdo)));<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_sdo_request_read(sdo); // trigger next read<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> break;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> case EC_REQUEST_ERROR:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to read SDO!\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_sdo_request_read(sdo); // retry reading<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> break;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#endif<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>int initialize(void){<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> ec_slave_config_t *sc; <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> master = ecrt_request_master(0);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (!master)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> domain1 = ecrt_master_create_domain(master);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (!domain1)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#if CONFIGURE_PDOS<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // Analog in --------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (!(sc_ana_in = ecrt_master_slave_config(master, AnaInSlavePos, Beckhoff_EL3062))) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to get analog input slave configuration.\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("Configuring PDOs...\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (ecrt_slave_config_pdos(sc_ana_in, EC_END, el3062_syncs)) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to configure analog input slave PDOs.\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // Analog out --------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (!(sc_ana_out = ecrt_master_slave_config(master, AnaOutSlavePos, Beckhoff_EL4002))) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to get analog output slave configuration.\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (ecrt_slave_config_pdos(sc_ana_out, EC_END, el4002_syncs)) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to configure analog output slave PDOs.\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // Digital in --------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (!(sc_dig_in = ecrt_master_slave_config(master, DigInSlavePos, Beckhoff_EL1014))) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to get digital input slave configuration.\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (ecrt_slave_config_pdos(sc_dig_in, EC_END, el1014_syncs)) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to configure digital input slave PDOs.\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // Digital out --------------------------------------------------------------<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (!(sc_dig_out = ecrt_master_slave_config(master, DigOutSlavePos, Beckhoff_EL2004))) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to get digital output slave configuration.\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (ecrt_slave_config_pdos(sc_dig_out, EC_END, el2004_syncs)) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to configure digital output slave PDOs.\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#endif<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#if SDO_ACCESS<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Creating SDO requests...\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (!(sdo = ecrt_slave_config_create_sdo_request(sc_ana_in, 0x6000, 0x11, 2))) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to create SDO request.\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_sdo_request_timeout(sdo, 500); // ms<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#endif<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // Create configuration for bus coupler<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> sc = ecrt_master_slave_config(master, BusCouplerPos, Beckhoff_EK1100);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (!sc)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (ecrt_domain_reg_pdo_entry_list(domain1, domain1_regs)) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "PDO entry registration failed!\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("Activating master...\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (ecrt_master_activate(master))<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (!(domain1_pd = ecrt_domain_data(domain1))) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> return 0;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>void clean() {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("Stopping master...\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (master) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("Releasing master...\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_release_master(master);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("Unloading.\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>void signal_handler(int signum) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> switch (signum) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> case SIGALRM:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> sig_alarms++;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> break;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>void cyclic_task()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>{<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> // receive process data<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_master_receive(master);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_domain_process(domain1);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // check process data state (optional)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> check_domain1_state();<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (counter) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> counter--;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> } else {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> counter = FREQUENCY;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // calculate new process data<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> blink = !blink;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // check for master state (optional)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> check_master_state();<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // check for islave configuration state(s) (optional)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> check_slave_config_states();<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#if SDO_ACCESS<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> // read process data SDO<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> read_sdo();<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#endif<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#if 1 <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> // write process data<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> EC_WRITE_U8(domain1_pd + off_dig_out, blink ? 0x06 : 0x09);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#endif<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#if 0 <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> // write process data<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> EC_WRITE_U8(domain1_pd + off_dig_out, EC_READ_U8(domain1_pd + off_dig_in) & 0x0F);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#endif<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> // send process data<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_domain_queue(domain1);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> ecrt_master_send(master);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>/****************************************************************************/<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>int main(void)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>{<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> struct sigaction sa;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> struct itimerval tv;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> initialize();<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#if PRIORITY<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> pid_t pid = getpid();<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (setpriority(PRIO_PROCESS, pid, -20))<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Warning: Failed to set priority: %s\n", strerror(errno));<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#endif<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> sa.sa_handler = signal_handler;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> sigemptyset(&sa.sa_mask);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> sa.sa_flags = 0;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (sigaction(SIGALRM, &sa, 0)) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to install signal handler!\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return -1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("Starting timer...\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> tv.it_interval.tv_sec = 0;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> tv.it_interval.tv_usec = 1000000 / FREQUENCY; <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> tv.it_value.tv_sec = 0;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> tv.it_value.tv_usec = 1000;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> if (setitimer(ITIMER_REAL, &tv, NULL)) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> fprintf(stderr, "Failed to start timer: %s\n", strerror(errno));<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> return 1;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("Started.\n");<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> while (1) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> pause();<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB>#if 0<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> struct timeval t;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> gettimeofday(&t, NULL);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> printf("%u.%06u\n", t.tv_sec, t.tv_usec);<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>#endif<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> while (sig_alarms != user_alarms) { <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> cyclic_task();<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> user_alarms++;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB> }<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> clean(); <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-GB> return 0;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB>}<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p></div></div></body></html>