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.
|
|
|
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;
-
|
|
SPS Service Installation
|
|
Der SPS-Service kann über das Kommandozeilenfenster installiert oder deinstalliert werden:
|
|
-
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.
|