ProfiNET SPS Service
Autonomer Realtime SPS Service entkoppelt Daten
ProfiNET Master Coding
Mit dem ProfiNET Master von Sybera wird das Senden und Empfangen von ProfiNET Datagrammen, sowie deren
Bearbeitung in Echtzeit realisiert. Die Schnittstelle ermöglicht die funktionale Bearbeitung der ProfiNET 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.
Windows User Application
Windows Source() Globals Realtime Source()
{ ... } { ... }
SHA Interface DLL
NT-Kernel
und
System-
Services SHA-DRV
Binary Binary
Windows Code Realtime Code
Windows CPU Cores Realtime CPU Core
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.
SYBERA GmbH, Geschäftsführer [Link], Hohenzollernstr.2, 71088 Holzgerlingen, Tel: 07031-744-608 (Fax: -609), Email: info@[Link]
ProfiNET SPS Service
Autonomer Realtime SPS Service entkoppelt Daten
ProfiNET SPS Service
Sybera bietet nun ein SPS Dienstprogramm für ProfiNET, das einen generischen Echtzeit-Code beinhaltet, als
Service installiert wird und im Hintergrund abläuft. Dieser SPS Service arbeitet als ProfiNET 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:
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
SYBERA GmbH, Geschäftsführer [Link], Hohenzollernstr.2, 71088 Holzgerlingen, Tel: 07031-744-608 (Fax: -609), Email: info@[Link]
ProfiNET SPS Service
Autonomer Realtime SPS Service entkoppelt Daten
Header file PLCCOMMON.H
#define MAX_UNIT_NUM 100
enum _SPS_CONTROL
{
SPS_CONTROL_NONE = 0,
SPS_CONTROL_START,
SPS_CONTROL_STOP,
SPS_CONTROL_SCAN
};
enum _SPS_STATUS
{
SPS_STATUS_STOPPED = 0,
SPS_STATUS_STARTED,
SPS_STATUS_SCANNED,
SPS_STATUS_WARNING,
SPS_STATUS_ERROR
};
#define MAX_STATION_NUM 1000
#define MAX_IMAGE_SIZE 0x10000
typedef struct _UNIT_INFO
{
UCHAR MacAddr[ETH_ADDRESS_LEN];
TYPE32 Ip;
USHORT InputFrameID;
USHORT InputLen;
UCHAR InputFrameData[MAX_FRAME_DATA];
USHORT OutputFrameID;
USHORT OutputLen;
UCHAR OutputFrameData[MAX_FRAME_DATA];
} UNIT_INFO, *PUNIT_INFO;
typedef struct _SPS_POOL
{
ULONG Control; //SPS service control
ULONG Status; //SPS service status
ULONG Period; //SPS period
BOOL bError; //stack error flag
BOOL bRun; //stack run flag
BOOL bLock; //Pool lock flag
BOOL bBusy; //Pool busy flag
ULONG UpdateCnt; //Station Update Counter
ULONG LoopCnt; //Realtime Cycle Counter
CHAR szStationFile[MAX_PATH]; //station configuration file
ULONG UnitNum;
UNIT_INFO UnitList[MAX_UNIT_NUM];
} SPS_POOL, *PSPS_POOL;
SYBERA GmbH, Geschäftsführer [Link], Hohenzollernstr.2, 71088 Holzgerlingen, Tel: 07031-744-608 (Fax: -609), Email: info@[Link]
ProfiNET SPS Service
Autonomer Realtime SPS Service entkoppelt Daten
SPS Service Pool Interface
Für die Anbindung an den SPS Pool stellt Sybera eine eigene Bibliothek bereit, die auch von gemanagtem Code
(z.B. C#, CVI LabWindows) ausgeführt werden kann.
Sha64DllNoRt32(64).LIB
Sha64DllNoRt32(64).DLL
z.B. C#
DllImport("[Link]")
public extern static System.UInt32 ShaAttachMemWithTag(
System.UInt32 PoolTag, //Pool Tag 0x8057
ref System.UInt32 PoolSize, //Pool Size
ref IntPtr userPool, //Pool Ptr (Windows Use)
ref System.UInt64 PoolHandle); //Pool Handle
public extern static System.UInt32 ShaDetachMem(System.UInt64 PoolHandle); //Pool Handle
public extern static System.UInt32 ShaWriteMem(
ref IntPtr BlockPtr,
UInt32 BlockLen,
UInt32 Offs);
public extern static System.UInt32 ShaReadMem(
ref IntPtr BlockPtr,
UInt32 BlockLen,
UInt32 Offs);
z.B. C++
__declspec(dllimport) ULONG SHAAPI ShaAttachMemWithTag(
ULONG PoolTag, //Pool Tag 0x8057
PULONG PoolSize, //Pool Size
PVOID* ppUserPool, //Pool Ptr (Windows Use)
HANDLE* phPool); //Pool Handle
__declspec(dllimport) ULONG SHAAPI ShaDetachMem(HANDLE hPool); //Pool Handle
__declspec(dllimport) ULONG SHAAPI ShaWriteMem(
PVOID pBlock,
ULONG BlockLen,
ULONG Offs)
__declspec(dllimport) ULONG SHAAPI ShaReadMem(
PVOID pBlock,
ULONG BlockLen,
ULONG Offs)
SYBERA GmbH, Geschäftsführer [Link], Hohenzollernstr.2, 71088 Holzgerlingen, Tel: 07031-744-608 (Fax: -609), Email: info@[Link]
ProfiNET SPS Service
Autonomer Realtime SPS Service entkoppelt Daten
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 = ShaAttachMemWithTag(
SPSPOOL_TAG, //Memory tag
&PoolSize, //Memory size
(void**)&pPool, //Pointer to memory for Windows access
&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
ShaDetachMem(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.
SYBERA GmbH, Geschäftsführer [Link], Hohenzollernstr.2, 71088 Holzgerlingen, Tel: 07031-744-608 (Fax: -609), Email: info@[Link]