Projekt: PR_0002_32 - SIEB & MEYER AG

Die Seite wird erstellt Niko-Veit Specht
 
WEITER LESEN


      

                     Projekt: PR_0002_32

                                    Titel:

                        SD3-Drive-Direkt-Kommunikation

                                 Version: V1

Lüneburg, den 22. Oktober 2020
Erstelldatum              Letzte Änderung                  Erstellt von                        Reversion
                                              15.10.2020                22.10.20                     HP                                  V1
                                         Projekt: PR_0002_32                   Titel : SD3-Drive-Direkt-Kommunikation

      Kapitel :   Allgemein

Inhaltsverzeichnis

1. Allgemein................................................................................................................3

2. Einbinden des ‚CNetDirect‘ PlugIns .....................................................................3
     2.1.           Die Schnittstelle...............................................................................................................4
     2.1.1.         ‘setDeviceName’ .............................................................................................................5
     2.1.2.         ‘configure’ ........................................................................................................................5
     2.1.3.         ‚findSlaves‘ ......................................................................................................................6
     2.1.4.         ‚readObject‘ .....................................................................................................................7
     2.1.5.         ‚writeObject‘ .....................................................................................................................7
     2.1.6.         ‘writeMasterObject’ ..........................................................................................................8
     2.1.7.         ‘getSlaveSet’ ...................................................................................................................8
     2.1.8.         ‘getNoOfSlavesSet’ .........................................................................................................8
     2.1.9.         ‘getDeviceName’ .............................................................................................................8
     2.1.10.        ‘installCallBackFunction’ .................................................................................................9

3. Datenaustausch .....................................................................................................9

4. Beispiel-PlugIn ..................................................................................................... 14

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                                                       Seite 2 von 15
Erstelldatum           Letzte Änderung                Erstellt von                Reversion
                                      15.10.2020             22.10.20                   HP                          V1
                                  Projekt: PR_0002_32                  Titel : SD3-Drive-Direkt-Kommunikation

    Kapitel :   Allgemein

1. Allgemein
  Zur direkten Kommunikation zwischen den Drives der Generation SD3 hat SIEB & MEYER ein
  Firmware-PlugIn entwickelt das

           das direkte Lesen,
           das direkte Scheiben
           und den zyklischen Austausch

  von Datenobjekten des SD3 ermöglicht.

  Hierbei fungiert ein SD3-Drive als Master, die anderen als Slaves. Der Master kann auf alle
  Objekte im Shared-Memory der gekoppelten SD3-Drives lesend und schreibend zugreifen.

  Die Kommunikation erfolgt über die Ethernet-Schnittstelle. Die Netzwerkschnittstelle muss hierfür
  konfiguriert werden und jedes Drive eine eindeutige IP-Adresse erhalten. Dieses kann durch feste
  IP-Adressen oder durch DHCP sichergestellt werden. Das konfigurieren der Netzwerkschnittstelle
  ist in der DRIVEMASTER-3 Dokumentation beschrieben.

                                       SWITCH

                                                         SD3-Slave-n

                                           SD3-Slave-1
                                 SD3-Slave-0

                    SD3-Master

2. Einbinden des ‚CNetDirect‘ PlugIns
  Um die Funktionalität nutzen zu können ist das PlugIn einzubinden. Dieses erfolgt im Edit-Menu
  des DRIVEMASTER-3. Das PlugIn heißt ‚CNetDirect‘. Die Priorität sollte höher als die des OEM-
  PlugIns gesetzt werden.

  Laden sie dann die veränderte Konfiguration in den Antrieb und erstellen sie das Objektverzeichnis
  neu. Es sollten nun folgende Objekte im Objektbrowser sichtbar sein.

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                                     Seite 3 von 15
Erstelldatum          Letzte Änderung         Erstellt von                Reversion
                                    15.10.2020            22.10.20            HP                          V1
                                Projekt: PR_0002_32          Titel : SD3-Drive-Direkt-Kommunikation

    Kapitel :   Einbinden des ‚CNetDirect‘ PlugIns

2.1. Die Schnittstelle
  Um die Funktionalität des PlugIns nutzen zu können ist dieses mittels der ‚#include‘ Anweisung
  zu importieren.

        #include ‚CNetDirect.h‘

  Das PlugIn stellt nun folgende Funktionen zur Verfügung:

  //-- configure network.
  NT::u32 configure(
      const QStringList & aDeviceList = QStringList(),
      const NT::u16 aCycleTime = 0,
      const QString aMulticastGroupIP = QString(""),
      NT::u16 aMulticastGroupPort = 0,
      const NT::u8 aDevice = 0);

  //-- search for available slave drives, returns 0 if all drives configured
  NT::u32 findSlaves(
      NT::u32 aMasterTxObjId,
      NT::u32 aTxObjSize,
      NT::u32 aMasterRxObjId,
      NT::u32 aRxObjSize,
      NT::u32 aSlaveTxObjId,
      NT::u32 aSlaveRxObjId);

  //-- returns set of connected slave drives
  NT::u8 getSlaveSet();

  //-- returns no of connected slave drives
  NT::u8 getNoOfSlaves();

  //-- sets device name
  NT::u32 setDeviceName(
      const QString aName);

  //-- gets device name

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                           Seite 4 von 15
Erstelldatum          Letzte Änderung            Erstellt von                Reversion
                                     15.10.2020            22.10.20               HP                          V1
                                 Projekt: PR_0002_32            Titel : SD3-Drive-Direkt-Kommunikation

     Kapitel :   Einbinden des ‚CNetDirect‘ PlugIns

   QString getDeviceName();

   //-- reads object
   NT::u32 readObject(
       const NT::i32 aId,
       const NT::u32 aObjId,
       const NT::u32 aIndex,
       NT::i32 & aSize,
       void * apData,
       const NT::u32 aSubId=0,
       const int aTimeOut=0);

   //-- writes object
   NT::u32 writeObject(
       const NT::i32 aId,
       const NT::u32 aObjId,
       const NT::u32 aIndex,
       NT::i32 & aSize,
       void * apData,
       const NT::u32 aSubId=0,
       const int aTimeOut=0,
       const NT::u16 aPort=0);

   //-- write master object
   NT::u32 writeMasterObject();

   //-- installs callback function
   NT::u32 installCallBackFunction(void (*apFcta)());

2.1.1.      ‘setDeviceName’
Die Funktion ermöglicht die Festlegung eines Gerätenamens. Dieses überschreibt die Voreinstellung
aus dem Parameter-File. Wird kein Gerätename festgelegt, bildet die Software diesen aus der IP-
Adresse.

Beschreibung der Parameter:

    Name                         Type                  Beschreibung
    aName                        QString               Gerätename.

Beispiel:
         piCNetDirect->setDeviceName(„MyDevice“);

2.1.2.      ‘configure’
Die Funktion dient der Konfiguration der Schnittstelle und muss sowohl in der Master- als auch der
Slave-/Software aufgerufen werden. Bevor diese Funktion nicht aufgerufen wurde, kann keine
Kommunikation stattfinden. Die Funktion kann nur einmal aufgerufen werden.

Beschreibung der Parameter:

    Name                         Type                  Beschreibung
    aDeviceList                  QStringList           Hier muss eine Liste der zu koppelnden Slave Name übergeben
                                                       werden. Anhand der Liste werden die IP-Adressen der Drives
                                                       ermittelt. Die Reihenfolge bestimmt hierbei auch die Reihenfolge
                                                       im Master Datentelegramm. Bei Slave-Drives wird eine leere
                                                       Liste übergeben.
    aCycleTime                   U16                   Legt die Zykluszeit für den Datenaustausch zwischen Master und
                                                       Slaves fest (ms). Bei Vorgabe von 0 erfolgt kein automatischer

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                              Seite 5 von 15
Erstelldatum          Letzte Änderung            Erstellt von                Reversion
                                     15.10.2020            22.10.20               HP                          V1
                                 Projekt: PR_0002_32            Titel : SD3-Drive-Direkt-Kommunikation

     Kapitel :   Einbinden des ‚CNetDirect‘ PlugIns

                                                       zyklischer Betrieb. Dann muss die Übertragung mit der Funktion ‚
                                                       writeMasterObject‘ manuell angestoßen werden.
    aMulticastGroupIP            QString               Legt die Multicast IP-Adresse fest. Bei „“ wird die Default
                                                       Gruppen-IP verwendet. Falls sich mehrere
                                                       Kommunikationsgruppen im selben Netzwerk befinden ist diese
                                                       hier festzulegen.
    aMulticastGroupPort          U16                   Legt die Portnummer für die Kommunikation fest. Diese muss bei
                                                       Master und Slave identisch sein. Bei 0 wird die Default-Nummer
                                                       gewählt
    aDevice                      U8                    Legt die Schnittstelle fest.
                                                       0: default
                                                       1: eth0
                                                       2: eth1

Beispiel:

         QStringList MyDevices;

         MyDevices += „Slave-0“;
         MyDevices += „Slave-1“;

         piCNetDirect->configure(MyDevices, 100); //-- 100 ms zyklus

2.1.3.      ‚findSlaves‘
Die Funktion sucht die in der Konfigurationsliste definierten Drives im Netzwerk und ermittelt ihre IP-
Adressen. Zusätzlich werden noch die Objektbeschreibungen für den zyklischen Datenaustausch
definiert.

Diese Funktion ist nur im Master aufzurufen. Die ‚Slaves‘ werden vom Master automatisch konfiguriert.

Beschreibung der Parameter:

    Name                         Type                  Beschreibung
    aMasterTxObjId               u32                   Objektnummer des zu sendenden Master-Objekts.
    aTxObjSize                   u32                   Größe der zum Slave zu übertragenden Datenstruktur
    aMasterRxObjId               u32                   Objektnummer des empfangenen Master-Objekts.
    aRxObjSize                   u32                   Größe der vom Slave empfangen Datenstruktur
    aSlaveTxObjId                u32                   Objektnummer des zu sendenden Slave-Objekts.
    aSlaveRxObjId                u32                   Objektnummer des empfangen Slave-Objekts.

Beispiel:

         //-- define object ids
         typedef enum
         {
           eID_MasterTxId = OID::eOID_OE_Base,
           eID_MasterRxId ,
           eID_SlaveTxId ,
           eID_SlaveRxId ,
           eID_last
         } teOemObjIds;

         //-- result
         NT::u32 result;

         //-- wait slaves available
         do
         {
            //-- sleep a while

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                              Seite 6 von 15
Erstelldatum         Letzte Änderung            Erstellt von                  Reversion
                                     15.10.2020           22.10.20               HP                            V1
                                Projekt: PR_0002_32            Titel : SD3-Drive-Direkt-Kommunikation

    Kapitel :   Einbinden des ‚CNetDirect‘ PlugIns

             piCRealTime->RT_sleepms(500);

             //-- check slaves
             result = piCNetDirect->findSlaves(
                           eID_MasterTxId, sizeof(tsTxObject),
                           eID_MasterRxId, sizeof(tsRxObject),
                           eID_SlaveTxId, eID_SlaveRxId);

         } while(result != 0);

2.1.4.      ‚readObject‘
Die Funktion ermöglicht das Lesen eines Objekts aus einem Antrieb. Die Funktion ist sowohl im
Master als auch im Slave nutzbar. Im Slave muss die IP-Adresse des angesprochenen Antriebs
bekannt sein. Im Master wird diese aus der Liste der gekoppelten Antriebe entnommen.

Beschreibung der Parameter:

    Name                        Type                  Beschreibung
    aId                         i32                   Gerätenadresse
                                                      0..n: Index in Geräteliste oder
                                                      0xyyyy: IP-Adresse. 172.16.5.84 = 0xAC100554
    aObjId                      u32                   Nummer des zu lesenden Objekts
    aIndex                      u32                   Index innerhalb des zu lesenden Objekts
    aSize                       i32 &                 Aufruf: Anzahl der zu lesenden Bytes
                                                      Return: Anzahl der gelesenen Bytes
    apData                      void *                Speicheradresse der gelesenen Daten
    aSubId                      u32                   SubID des zu lesenden Objekts
    aTimeOut                    i32                   Maximale Antwortzeit in ns. Bei 0 wird der Defaultwert
                                                      genommen.

Beispiel:
         NT::u32 result;
         NT::u8 buffer[32];
         NT::u32 length;

         length = 1;
         result = piCNetDirect->readObject(SlaveId,OID::eOID_UT_Inputs08,0,length,&buffer,0);

         pr(LI,"\nThe inputs of drive: %d are: %02x”, SlaveId,buffer[0]);

2.1.5.      ‚writeObject‘
Die Funktion ermöglicht das Schreiben eines Objekts eines Antrieb. Die Funktion ist sowohl im Master
als auch im Slave nutzbar. Im Slave muss die IP-Adresse des angesprochenen Antriebs bekannt sein.
Im Master wird diese aus der Liste der gekoppelten Antriebe entnommen.

Beschreibung der Parameter:

    Name                        Type                  Beschreibung
    aId                         i32                   Gerätenadresse
                                                      0..n: Index in Geräteliste oder
                                                      0xyyyy: IP-Adresse. 172.16.5.84 = 0xAC100554
    aObjId                      u32                   Nummer des zu schreibenden Objekts
    aIndex                      u32                   Index innerhalb des zu schreibenden Objekts
    aSize                       i32 &                 Aufruf: Anzahl der zu schreibenden Bytes
                                                      Return: Anzahl der geschriebenen Bytes
    apData                      void *                Speicheradresse der zu schreibenden Daten
    aSubId                      u32                   SubID des zu schreibenden Objekts

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                              Seite 7 von 15
Erstelldatum          Letzte Änderung          Erstellt von                Reversion
                                     15.10.2020            22.10.20             HP                          V1
                                 Projekt: PR_0002_32           Titel : SD3-Drive-Direkt-Kommunikation

     Kapitel :   Einbinden des ‚CNetDirect‘ PlugIns

    aTimeOut                     i32                   Maximale Antwortzeit in ns. Bei 0 wird der Defaultwert
                                                       genommen.
    aPort                        u32                   Portnummer zu dem die Daten geschrieben werden sollen.
                                                       Hier sollte immer 0 übergeben werden.

Beispiel:
         NT::u32 result;
         NT::u8 buffer[32];
         NT::u32 length;

         length    = 1;
         buffer[0] = 0x3;

         result = piCNetDirect->writeObject(SlaveId,OID::eOID_UT_Outputs08,0,length,&buffer,0);

         pr(LI,"\nWriting %02x to the outputs of drive: %d” ,buffer[0], SlaveId);

2.1.6.      ‘writeMasterObject’
Die Funktion löst einen Datenaustausch zwischen Master und den gekoppelten Slaves aus. Die
Funktion wird nur im Master ausgeführt und überträgt das Master-Tx-Objekt zu den gekoppelten
Antrieben. Die Slaves antworten daraufhin mit ihren Slave-Tx-Objekten. Die Funktion sollte nur
aufgerufen werden, wenn der Master nicht in den zyklischen Betrieb geschaltet wurde.

Beispiel:
         piCNetDirect-> writeMasterObject();

2.1.7.      ‘getSlaveSet’
Die Funktion ermittelt ein Bitset der aktiven Slaves. Bit-n entspricht dem Index aus der Antriebsliste

Beispiel:
         NT::u8 slave_set = piCNetDirect->getSlaveSet();

2.1.8.      ‘getNoOfSlavesSet’
Die Funktion ermittelt Anzahl der aktiven Slaves. Diese sollte nach der Konfiguration der Größe der
Antriebsliste entsprechen.

Beispiel:
         NT::u8 no_of_slave = piCNetDirect->getNoOfSlaves();

2.1.9.      ‘getDeviceName’
Die Funktion mittelt den Gerätenamen.

Beispiel:
         QString name;

         Name = piCNetDirect->getDeviceNameObject();

         pr(LI,"\nDevice Name: %”,qPrintable(Name));

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                             Seite 8 von 15
Erstelldatum          Letzte Änderung         Erstellt von                Reversion
                                     15.10.2020            22.10.20            HP                          V1
                                 Projekt: PR_0002_32          Titel : SD3-Drive-Direkt-Kommunikation

    Kapitel :   Datenaustausch

2.1.10. ‘installCallBackFunction’
Die Funktion ermöglicht die Installation eines Event-Handlers. Dieser wird zwischen dem Empfang des
Master-Datentelegramms und dem Senden des Slave-Datentelegramms aufgerufen.

Beispiel:
        void myEventHandler()
        {
          //-- handle new data
          . . .
          //-- set output data
          . . .
        }

        result = piCNetDirect-> installCallBackFunction(myEventHandler);

3. Datenaustausch
   Beim zyklischen Datenaustausch sendet der Master-Antrieb den Inhalt des Master_Tx_Objekts
   per Multicast-IP an alle Slave-Antriebe. Diese entnehmen den für sie bestimmten Teil, kopieren
   diesen in das Slave_Rx_Objekt und antworten mit dem Slave_Tx_Objekt. Der Master empfängt
   dieses und überträgt die Daten an die entsprechende Position im Master_Rx_Objekt. Die
   Positionen werden durch die Reihenfolge in der Antriebsliste definiert

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                            Seite 9 von 15
Erstelldatum         Letzte Änderung                       Erstellt von                     Reversion
                                             15.10.2020           22.10.20                          HP                               V1
                                        Projekt: PR_0002_32              Titel : SD3-Drive-Direkt-Kommunikation

    Kapitel :   Datenaustausch

                SD3-MASTER                                                         SD3-SLAVE-n
                shared-memory                                                                                 shared-memory
                struct                                                       struct
                {      struct                                                {      struct                     struct
                      {                                                            {                           {
                        U8 Wdog;                                                     U8 Wdog;                    U8 Wdog;
                        U8 buffer[n]                                                 U8 buffer[n]                U8 buffer[n]
                      };                                                           };                          } slave_rx;
                      struct                                                       struct
                      {                                                            {
                        U8 Wdog;                                                     U8 Wdog;
                        U8 buffer[n]                                                 U8 buffer[n]
                      };                                                           };

                      struct                                                       struct
                      {                                                            {
                        U8 Wdog;                                                     U8 Wdog;

                      };
                        U8 buffer[n]                           NETWORK             };
                                                                                     U8 buffer[n]

                 } master_tx;                                                 } master_tx;

                struct
                {      struct             struct                                                               struct
                      {                   {                                                                    {
                        U8 Wdog;            U8 Wdog;                                                             U8 Wdog;
                        U8 buffer[n]        U8 buffer[n]                                                         U8 buffer[n]
                      };                  } slave_tx;                                                          } slave_tx;
                      struct
                      {
                        U8 Wdog;
                        U8 buffer[n]
                      };

                      struct
                      {
                        U8 Wdog;
                        U8 buffer[n]
                      };
                 } master_rx;

  Der Datenaustausch kann mit einer festen Zykluszeit oder manuell über die Funktion
  writeMasterObject() ausgelöst werden.

  Die Datenobjekte müssen in allen Antrieben im shared-memory angelegt sein und dieselbe ID
  haben.

  Das erste Byte jeder Struktur ist als WatchDog vorgesehen, dieses es wird bei jedem Zyklus
  inkrementiert vom Master inkrementiert. Der Slave kopiert dieses in seine Antwort. Hierdurch kann
  die Aktivität kontrolliert werden.

  Im Master ist das Anlegen der Slave-Datenobjekt nicht erforderlich. Ebenfalls müssen die Master-
  Datenobjekte nicht im Slave angelegt werden. Dieses hat aber den Vorteil, dass der Kode sowohl
  im Master als auch im Slave verwendet werden kann

  In der Testphase hat dieses zusätzlich den Vorteil das der Master mit sich ‚selbst‘ kommunizieren
  kann. So kann Master- und Slave-Funktionalität in einem Drive getestet werden.

  Beispiel: Definition der Datenstrukturen

    #define cBufferSize                32
    #define cMemorySize                1024

    typedef struct
    {
      union

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                                                     Seite 10 von 15
Erstelldatum          Letzte Änderung         Erstellt von                 Reversion
                                     15.10.2020            22.10.20            HP                           V1
                                 Projekt: PR_0002_32          Titel : SD3-Drive-Direkt-Kommunikation

    Kapitel :   Datenaustausch

       {
        NT::u8 buffer[cBufferSize];
        struct
        {
          NT::u8 watchDog;
          NT::u8 cmd;
        };
      };
    } tsTxObject;

    typedef tsTxObject tsTxObjects[CNetDirect::cNoOfSlaves];

    typedef struct
    {
      union
      {
        NT::u8 buffer[cBufferSize];
        struct
        {
          NT::u8 watchDog;
          NT::u8 state;
        };
      };
    } tsRxObject;

    typedef tsRxObject tsRxObjects[CNetDirect::cNoOfSlaves];

    //!
Erstelldatum          Letzte Änderung         Erstellt von                 Reversion
                                     15.10.2020            22.10.20            HP                           V1
                                 Projekt: PR_0002_32          Titel : SD3-Drive-Direkt-Kommunikation

    Kapitel :   Datenaustausch

//-------------------------------------------------------------------
//-- master-out. tsTxObjects[CNetDirect::cNoOfSlaves]
//-------------------------------------------------------------------

//-- Group
apODict->writeStartElement("Group");
apODict->writeTextElement("Name","MA_TX");

apODict->writeStartElement("Dimension");
apODict->writeAttribute("elementsize", QString("%1").arg(sizeof(NT::u32)));
apODict->writeAttribute("count", QString("%1").arg(CNetDirect::cNoOfSlaves));

//-- first element is watchdog counter
result += apODict->writeObject("CNE_MA_TX_WatchDog",Id++, "UNIT_U8",
               aOffset+offsetof(tsCNetDirectExample_ACT, TxObjects[0].watchDog),0);

//-- second element is command byte
sEnum.clear();
sEnum.insert(0, "cmd_0");
sEnum.insert(1, "cmd_1");
sEnum.insert(2, "cmd_2");
result += apODict->writeObject("CNE_MA_TX_Cmd",     Id++, "UNIT_U8",
               aOffset+offsetof(tsCNetDirectExample_ACT, TxObjects[0].cmd),0, NULL, &sEnum);

//-- fill in own objects
//-- ...

//-- show full object as array of byte
result += apODict->writeObject("CNE_MA_TX_Buffer", eID_MasterTxId, "UNIT_U8",
               aOffset+offsetof(tsCNetDirectExample_ACT, TxObjects[0].buffer),cBufferSize);

apODict->writeEndElement(); // Dimension

//-- End Group
apODict->writeEndElement(); // Group MA_TX

//-------------------------------------------------------------------
//-- master-in object. tsRxObjects[CNetDirect::cNoOfSlaves]
//-------------------------------------------------------------------

//-- Group
apODict->writeStartElement("Group");
apODict->writeTextElement("Name","MA_RX");

apODict->writeStartElement("Dimension");
apODict->writeAttribute("elementsize", QString("%1").arg(sizeof(NT::u32)));
apODict->writeAttribute("count", QString("%1").arg(CNetDirect::cNoOfSlaves));

//-- first element is watchdog counter
result += apODict->writeObject("CNE_MA_RX_WatchDog",Id++, "UNIT_U8",
               aOffset+offsetof(tsCNetDirectExample_ACT, RxObjects[0].watchDog),0);

//-- second element is command byte
sBitSet.clear();
sBitSet.insert( 0, NGen3Config::SBit(QString("flag_0"), false));
sBitSet.insert( 1, NGen3Config::SBit(QString("flag_1"), false));
sBitSet.insert( 2, NGen3Config::SBit(QString("flag_2"), false));
result += apODict->writeObject("CNE_MA_RX_State",   Id++, "UNIT_U8",
               aOffset+offsetof(tsCNetDirectExample_ACT, RxObjects[0].state),0, &sBitSet);

//-- fill in ouwn objects
//-- ...

//-- show full object as array of byte
result += apODict->writeObject("CNE_MA_RX_Buffer", eID_MasterRxId, "UNIT_U8",
               aOffset+offsetof(tsCNetDirectExample_ACT, RxObjects[0].buffer),cBufferSize);

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                            Seite 12 von 15
Erstelldatum          Letzte Änderung         Erstellt von                 Reversion
                                     15.10.2020            22.10.20            HP                           V1
                                 Projekt: PR_0002_32          Titel : SD3-Drive-Direkt-Kommunikation

    Kapitel :   Datenaustausch

apODict->writeEndElement(); // Dimension

//-- End Group
apODict->writeEndElement(); // Group MA_RX

//-------------------------------------------------------------------
//-- slave-out. tsTxObject
//-------------------------------------------------------------------

//-- Group
apODict->writeStartElement("Group");
apODict->writeTextElement("Name","SL_TX");

//-- first element is watchdog counter
result += apODict->writeObject("CNE_SL_TX_WatchDog",Id++, "UNIT_U8",
               aOffset+offsetof(tsCNetDirectExample_ACT, TxObject.watchDog),0);

//-- second element is command byte
sEnum.clear();
sEnum.insert(0, "cmd_0");
sEnum.insert(1, "cmd_1");
sEnum.insert(2, "cmd_2");
result += apODict->writeObject("CNE_SL_TX_Cmd",     Id++, "UNIT_U8",
aOffset+offsetof(tsCNetDirectExample_ACT, TxObject.cmd),0, NULL, &sEnum);

//-- fill in own objects
//-- ...

//-- show full object as array of byte
result += apODict->writeObject("CNE_SL_TX_Buffer", eID_SlaveTxId,
       "UNIT_U8",aOffset+offsetof(tsCNetDirectExample_ACT, TxObject.buffer),cBufferSize);

//-- End Group
apODict->writeEndElement(); // Group SL_TX

//-------------------------------------------------------------------
//-- slave-in object. tsRxObject
//-------------------------------------------------------------------

//-- Group
apODict->writeStartElement("Group");
apODict->writeTextElement("Name","SL_RX");

//-- first element is watchdog counter
result += apODict->writeObject("CNE_SL_RX_WatchDog",Id++, "UNIT_U8",
               aOffset+offsetof(tsCNetDirectExample_ACT, RxObject.watchDog),0);

//-- second element is command byte
sBitSet.clear();
sBitSet.insert( 0, NGen3Config::SBit(QString("flag_0"), false));
sBitSet.insert( 1, NGen3Config::SBit(QString("flag_1"), false));
sBitSet.insert( 2, NGen3Config::SBit(QString("flag_2"), false));
result += apODict->writeObject("CNE_SL_RX_State",   Id++, "UNIT_U8",
               aOffset+offsetof(tsCNetDirectExample_ACT, RxObject.state),0, &sBitSet);

//-- fill in own objects
//-- ...

//-- show full object as array of byte
result += apODict->writeObject("CNE_SL_RX_Buffer", eID_SlaveRxId, "UNIT_U8",
               aOffset+offsetof(tsCNetDirectExample_ACT, RxObject.buffer),cBufferSize);

//-- End Group
apODict->writeEndElement(); // Group SL_RX

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                            Seite 13 von 15
Erstelldatum          Letzte Änderung         Erstellt von                 Reversion
                                       15.10.2020            22.10.20            HP                           V1
                                   Projekt: PR_0002_32          Titel : SD3-Drive-Direkt-Kommunikation

     Kapitel :   Beispiel-PlugIn

//-- union array ----------------------------------------------------
result += apODict->writeObject("CNetDirectExample_ALL", Id++, "UNIT_U8",
               aOffset+offsetof(tsCNetDirectExample_ACT, AllData), cMemorySize);

Beispiel: Übergabe der Objektinformationen

//-- find slaves
result = piCNetDirect->findSlaves( eID_MasterTxId, sizeof(tsTxObject), eID_MasterRxId,
                sizeof(tsRxObject), eID_SlaveTxId, eID_SlaveRxId);

4. Beispiel-PlugIn
Für den einfachen Start existiert ein Beispiel-PlugIn. Dieses kann als Basis für ein eigenes PlugIn
verwendet werden. Dieses fungiert als Master-Antrieb und bindet sich selbst als Slave-Antrieb ein. So
kann einfach die Funktionsweise erforscht werden.

Hierfür muss dieses ‚geklont‘ werden.

   Nach dem kompilieren müssen sie noch ihr neues PlugIn in das Projekt aufnehmen und das
   Objektverzeichnis neu erstellen.

   Das Beispiel erzeugt eine eigene Parameterdatei. Diese sollte mit dem ‚DRIVEMASETER-3‘ in das
   Projekt aufgenommen werden. In diesem Fall würde die Datei ‚CMyNetTest‘ heißen.

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                              Seite 14 von 15
Erstelldatum          Letzte Änderung         Erstellt von                 Reversion
                                      15.10.2020            22.10.20            HP                           V1
                                  Projekt: PR_0002_32          Titel : SD3-Drive-Direkt-Kommunikation

    Kapitel :   Beispiel-PlugIn

  In diese Datei müssen der Gerätename und die Namen der zu koppelnden Drives eingetragen
  werden. Bei den Slaves bleibt die SLAVE-Liste leer.

  Eine Master-Konfiguration könnte folgendermaßen aussehen.

  Hier ist ein Master mit sich selbst als Slave und einem zusätzlichem Slave parametriert.

  Eine Slave-Konfiguration könnte folgendermaßen aussehen.

Dokument: PR_0002_32-Drive-Direct-Communication-V1_ger.docx                                             Seite 15 von 15
Sie können auch lesen