EtherCAT SPS Service für Windows

 
zurück

Autonomer EtherCAT Service entkoppelt Payload-Daten

Der Sybera EtherCAT Windows Service ermöglicht die unkomplizierte Anbindung eines EtherCAT-Masters an bestehende Windows-Applikationen. Als eigenständiger Hintergrunddienst übernimmt er die gesamte Echtzeitkommunikation mit den EtherCAT-Slaves und stellt einen zentralen Prozessdaten-Pool bereit, auf den Ihre Anwendung direkt zugreifen kann. So lassen sich EtherCAT-Funktionalitäten ohne komplexe Echtzeitprogrammierung oder tiefgehende Master-Integration in Ihre Software einbinden. Entwickler profitieren von einer schnellen Implementierung, zuverlässiger Datenübertragung und klar strukturierter Architektur – ideal für industrielle Automatisierungslösungen unter Windows, bei minimalem Entwicklungsaufwand.

EtherCAT Master Coding

Mit dem EtherCAT Master von Sybera wird das Senden und Empfangen von EtherCAT Datagrammen, sowie deren Bearbeitung in Echtzeit realisiert. Die Schnittstelle ermöglicht die funktionale Bearbeitung der EtherCAT Nutzdaten in einer, in die Windows Applikation eingebauten Echtzeit Task. Somit besteht der Binärcode der Windows Applikation aus einem Windows Code-Bereich und einem Echtzeit Code-Bereich. Daten können über globale Variablen zwischen den Bereichen ausgetauscht werden.

Darstellung des Sybera EtherCAT Windows Services mit Echtzeit-Task und Datenkommunikation

Dieses Prinzip erfordert jedoch einen nativen Compiler (z.B. Visual Studio C++) um die Bereiche zu trennen und den Binärcode der Echtzeittask an den separierten SPS Prozessor-Kern zu übertragen. Mit C# ist dies nicht möglich und es muss vom Anwender neben der eigentlichen Applikation ein zweiter Echtzeit-Prozess mit einem Daten-Interface entwickelt werden. Ebenfalls ist ein Mischbetrieb zwischen dem Windows 64-Bit Betriebssystem und einem 32-Bit Applikationscode nur über eine solche Entkopplung möglich.

EtherCAT SPS Service

Sybera bietet nun ein SPS Dienstprogramm für EtherCAT, das einen generischen Echtzeit-Code beinhaltet, als Service installiert wird und im Hintergrund abläuft. Dieser SPS Service arbeitet als EtherCAT Master und allokiert selbstständig einen globalen Daten-Pool, mit dem zyklisch Daten ausgetauscht werden. An diesen Daten-Pool kann sich eine User-Applikation über ein einfaches Interface anbinden und ebenfalls Daten austauschen. Dabei ist das Pool-Interface vorgegeben:

#define MAX_STATION_NUM       1000
#define MAX_IMAGE_SIZE        0x10000
 
 
typedef struct _SPS_POOL
{
       BOOL    bError;              //OUT : stack error flag
       BOOL    bRun;                //OUT : stack run flag
       BOOL    bLock;               //IN  : Pool lock flag
       BOOL    bBusy;               //OUT : Pool busy flag
 
       USHORT  StationNum;          //OUT : station number
       PVOID   pStationList;        //OUT : station information
 
       USHORT  ImageSize[MAX_IMAGE_DIR];                   //OUT    : image size
       UCHAR   ImageData[MAX_IMAGE_DIR][MAX_IMAGE_SIZE];   //IN/OUT : image data
 
} SPS_POOL, *PSPS_POOL;
 
Übersicht des Sybera EtherCAT SPS Service Layouts mit Daten-Pool und Prozesskommunikation

SPS Service Installation

Der SPS-Service kann über das Kommandozeilenfenster installiert oder deinstalliert werden:

Installation des Sybera SPS Services über die Windows-Kommandozeile
Kommandozeilen Parameter:
 
                        -install                         Installiert den Service
                        -remove                       Deinstalliert den Service
                        -period:x                      Sampling Periode
                        -cycles                        SyncCycles
 
 SPS Service Interface
 
Für die Anbindung an den SPS Poll stellt Sybera eine eigene Bibliothek bereit, die auch von gemanagtem Code (z.B. C#, CVI LabWindows) ausgeführt werden kann.
 
__Sha64/32DllNoRt.LIB
__Sha64/32DllNoRt.DLL

z.B. C#

DllImport("__Sha64DllNoRt.dll")
public extern static System.UInt32 __Sha64AttachMemWithTag(
System.UInt32 PoolTag,            //Pool Tag 0x8180
ref System.UInt32 PoolSize,       //Pool Size
ref IntPtr userPool,              //Pool Ptr (Windows Use)
ref IntPtr sysPool,               //Ignored NULL
ref System.UInt64 physAddress,    //Ignored NULL
ref System.UInt64 PoolHandle);    //Pool Handle
 
[DllImport("__Sha64DllNoRt.dll")]
public extern static System.UInt32 __Sha64DetachMem(System.UInt64 PoolHandle);   //Pool Handle
 

z.B. C++

__declspec(dllimport) ULONG SHAAPI Sha64AttachMemWithTag(
ULONG PoolTag,        //Pool Tag 0x8180
PULONG PoolSize,      //Pool Size
PVOID* ppUserPool,    //Pool Ptr (Windows Use)
PVOID*, ppSystemPool, //Ignored NULL
ULONG64* PhysAddr,    //Ignored NULL
HANDLE* phPool);      //Pool Handle
 
__declspec(dllimport) ULONG SHAAPI Sha64DetachMem(HANDLE hPool);  //Pool Handle

Beispiel UserAPP (C++)

//Define image offsets
#define EL1008_DI_OFFSET      0
#define EL2008_DO_OFFSET      0
#define SPSPOOL_TAG           0x8180
 
 
void main(void)
{
       HANDLE hPool = NULL;
       PSPS_POOL pPool;
       ULONG PoolSize;
       UCHAR c;
       DWORD Error;
 
       //Try to attach to BOOT memory
       Error = __Sha64AttachMemWithTag(
                              SPSPOOL_TAG,          //Memory tag
                              &PoolSize,            //Memory size
                              (void**)&pPool,       //Pointer to memory for Windows access
                              NULL,                 //Ignored :  Pointer to memory for Realtime access
                              NULL,                 //Ignored : Physical memory address
                              &hPool);              //Handle to memory device
 
       if (Error == ERROR_SUCCESS)
       {
               //Get device RX pointer
               //Get device TX pointer
               PUCHAR  pEL1008_DI = (PUCHAR)&pPool->ImageData[RX_IMAGE][EL1008_DI_OFFSET];
               PUCHAR  pEL2008_DO = (PUCHAR)&pPool->ImageData[TX_IMAGE][EL2008_DO_OFFSET];
 
               do
               {
                      //Set output values
                      (*pEL2008_DO)++;
                     
                      Sleep(100);
               }
               while (!kbhit());
 
               //Detach from BOOT memory
               __Sha64DetachMem(hPool);
       }
}

Der neue SPS Service erleichtert den Umgang mit gemanagtem Code (z.B. C# und CVI LabWindows) und bietet eine ideale Plattform für den zyklischen Datenaustausch. Mit einem einfachen Interface können nun die zyklischen SPS-Daten mit der eigenen Applikation ausgetauscht und bearbeitet werden, ohne dazu eine Echtzeit-Task zu implementieren.