⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sercans.cpp

📁 SERCOSII卡驱动,通过该驱动程序可以在windowXp与RTX环境下运行自己编写的数控软件实现对数控设备的驱动。
💻 CPP
字号:
/* ***********************************************************************
* INDRAMAT GmbH, Bgm.-Dr.-Nebel-Str. 2, 97816 Lohr, Germany
* Copyright 1998 INDRAMAT
* ------------------------------------------------------------------------
*    Project: SoftSerc, SERCOS interface
* ------------------------------------------------------------------------
* Datei:   Sercans.cpp
*
* Autor:   W. Rau / J. Lorasch	Datum: 27.11.1998
*
* Aufgabe: SoftSercans.cpp: program code of CSoftSercans.
* Bemerkungen:
*
*
*	ACHTUNG: 
*	
*	bitte nur 'nacktes' C++ ohne MFC verwenden, da diese DLL auch f黵
*	Applikationen in ANSIC/Delphi oder Visual C++ verwendet werden kann
*
*
* Aenderungen:
* 27.11.98 JL  Start
* 31.05.00 JL Gemeinsame Funktion fuer Heap-Alloc/Free.
*              - SHeapAlloc()
*              - SHeapFree()
* 08.11.00 JL Die Funktion Write_Command() dekrmentierte die Ringnummer und
*             die Antriebsadresse um Eins. Jetzt nicht mehr.
* 24.06.02 JL In den einzelnen Parameterfunktionen sind Identnummern
*             wie P-7-0000 moeglich. Vorher Fehler.
* 26.06.02 JL In der Funktion Get_bad_Drives() wurden fuer den Ring 2
*             keine Antriebe mit Fehlern zurueck gegeben.
*************************************************************************/


//////////////////////////
// SOFT SERCANS	Start:	//
//////////////////////////


// Kommandostrings
#define RTSS_ARGUMENT		"RTSSrun "
#define RTSS_DLL				"SoftSercansRTX.rtss "			
#define	RTSS_KILL				"RTSSkill "	

// nur f黵 internen DLL-Gebrauch (f黵 Anwender nicht sichtbar!):
// IPC
#define USER_IPC				1
// Task-ID
#define USER_TASKID			1
// Y-Maske
#define Y_MASKBIT				0x8000



// f黵 den VOIDkannel MMI p. 10-4
#define MAX_DATALENGTH	65532


// includes:
// basic definitions e.g. USHORT etc.
#include <windows.h>	// via ACPH02.C
#include "Winreg.h"
//#include "ACPH_H.H"
////////////////////////////////////
// RTSS Quellen einbinden:				//
////////////////////////////////////
#include "ACPH.c"

// include Strukturen um SERCANS zu verwenden, Klassendefinition:
#include "..\include\SoftSercans.h"
#include "..\include\versions.h"
// Syntaxchecker von JL (etwas angepasst):
#include "Convert.h"

ULONG ulDLL_Error;
// for debugging
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif

//////////////////////////////////////////////////////////////////////////
// hier werden die Wrapper Kon- und Destruktoren f黵 Delphi/VisualBasic	//
// deklariert																														//
//////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus
extern "C" {
#endif

	
//=======================================================================
//	Funktion				:	SoftSercansInitObject
//	In-Parameter		:	none 
//					
//	Out-Parameter		:	CSoftSercans*	pCppPointer
//
//	Autor						:	WR from Indramat GmbH
//-----------------------------------------------------------------------
//	Function:
/*
	Wrapper Konstruktor f黵 ANSIC/Delphi
	
	erzeugt einen Zeiger f黵 Zugriffe auf alle public Members der Klasse 
	CSoftSercans

	wird von der Applikation aufgerufen, wenn die DLL dort installiert wird
	1. Aufruf in die DLL aus ANSIC/Pascal
	
	Funktionsablauf:
	
	1. erzeugt einen DLL-Zeiger f黵 die C++-Klasse
	2. allokiert daf黵 erforderlichen Speicher mittels des new Operators

	Anmerkung:

	dies ist ein unbedingt notwendiger Schritt, um mit der C++-DLL zu arbeiten
*/
//=======================================================================
ULONG CLASS_DECLSPEC CALLBACK SoftSercansInitObject(CSoftSercans* *pCppPointer)
{
	// dies ist DER Zeiger f黵 public Memberzugriffe der Klasse CSoftSercans
	// in ANSIC/Delphi/Borland C/C++
		
	// Speicher allokieren (the good old way), ruft CSoftSercans() auf:
	// pointer von Delphi/ANSIC -> class CSoftSercans
	CSoftSercans* p_CANSIC	=	new CSoftSercans;	
	// OK?
	if(p_CANSIC!=NULL)
	{
		*pCppPointer	=	p_CANSIC;
		return OK;
	}
	
	// sonst nichts:
	*pCppPointer		=	NULL;
	return NOT_OK;
}



//=======================================================================
//	Funktion			:	SoftSercansUnInitObject
//	In-Parameter	:	CSoftSercans*	pCppPointer
//
//	Out-Parameter	:	none 
//
//	Autor					:	WR from Indramat GmbH
//-----------------------------------------------------------------------
//	Funktion:
/*
	wrapper Destruktor f黵 ANSIC/Delphi

	wird zuletzt von der Applikation aufgerufen um die DLL zu schlie遝n

	Arbeitsweise:
	
	deallokiert den Speicher der Klasse CSoftSercans mittels delete Operator
	ruft also den Destruktor ~CSoftSercans() auf

	Anmerkung:
	letzter Aufruf der Applikation bei Termination derselben, um allokierten
	Speicher zu deallokieren
*/
//=======================================================================
ULONG CLASS_DECLSPEC CALLBACK SoftSercansUnInitObject(CSoftSercans* pCppPointer)
{	
	// calls destructor of class
	if(pCppPointer!=NULL)
	{
		// Speicher der Klasse freigeben:
		delete pCppPointer;
	}
	else
		return NOT_OK;		

	return OK;
}

#ifdef __cplusplus
}
#endif
//////////////////////////////////////////////////////////
// Ende der Delphi Konstruktor/Destructor-Deklaration		//
//////////////////////////////////////////////////////////


/*
	Allgemeines:

	alle Funktionen der DLL mit Ausnahme der Kon-/Destruktoren 
	liefern den Fehlercode ulDLL_Error zur點k
	
*/

//=============================================================
//	Funktion			:	CSoftSercans() Konstruktor
//	In-Parameter	:	keine
//	Out-Parameter	:	keine
//
//	Autor					:	WR, Indramat GmbH
//-------------------------------------------------------------
//	Funktion:
/*
	wird durch die Applikation bei der Klassendefinition durchlaufen
	1. Aufruf in dieser Klasse

	Funktionsweise:
	
	initialisiert alle Klassenvariablen <=> Basisinit der Klasse
*/
//=============================================================
CSoftSercans::CSoftSercans()
{
	// 躡erwachung Lifecounter durch SS
//	m_pSSoftSync					=	NULL;
}


////////////////////////////////	
// Programmkontrolle					//
////////////////////////////////

//////////////////////////////////////////////
// nur f黵 die Win32-DLL g黮tige Funktion		//
//////////////////////////////////////////////
//=============================================================
//	Funktion	  	:	Start_SoftSercans()
//	In-Parameter	:	void
//	Out-Parameter	:	ulDLL_Error
//
//	Autor			    :	WR, Indramat GmbH
//-------------------------------------------------------------
//	Funktion:
/*

  HINWEIS:  diese Funktion ist unter RTSS ung黮tig 
    
  wird von der Applikation aufgerufen, nachdem diese Klasse definiert wurde
	-> pro Applikation darf es nur eine solche Klasse geben!!!

 	folgendes wird hier ausgef黨rt:
	
	1. Startet den Echtzeitteil von SoftSERCANS ueber die Kartenadresse.
  2. f黨rt Statusabfrage von SoftSercans durch, diese wird im Fehlerfall 
  nach 4s abgebrochen und anschlie遝nd ein Timeoutfehler generiert

  Aufgabe der Statusabfrage:	
        
        GetSercansState liefert den aktuellen Zustand von SoftSercans
				w鋒rend der Initialisierungsphase unmittelbar nach dem Start 
				zur點k.( Nicht Diagnose ! )
				
	躡ergabewert:

	pulState:		3 SoftSercans wird initialisiert
			    		2 Fataler Initialisierungsfehler
					    1 Hardwarefehler, Einsteckkarte nicht gefunden
					    0 SoftSercans ist bereit

	dies setzt folgende DLL-Errorcodes (und liefert diese an die
	Applikation zur點k):


  in der Funktion SoftSercans_State:
  4 <=>   DLL_RTSS_INIT_TIMEOUT (nach 4s)
  3	<=>		DLL_RTSS_INIT_ERROR
	2	<=>		DLL_RTSS_SYSTEM_ERROR
	1	<=>		DLL_RTSS_HARDWARE_ERROR
  0 <=>   OK

 	躡ergabewert:

  void
 
	R點kgabewert:	ulDLL_Error:	wird hier behandelt*/
//=======================================================================
#ifndef _SERCRTSS
ULONG CSoftSercans::Start_SoftSercans(void)
{
	PROCESS_INFORMATION	SProcessinfo;
	STARTUPINFO			    SStartupinfo;
	char chCommand[50] = "RTSSrun C:\\Sercans2\\Bin\\SoftSercansRTX.rtss";  
	// processinfo
	SProcessinfo.hProcess			=	0;
	SProcessinfo.hThread			=	0;
	SProcessinfo.dwProcessId	=	0;
	SProcessinfo.dwThreadId		=	0;
  // startupinfo
	//////////////////////////////////////////////////////
	// wichtig f黵 CreateThread (sonst blue screents):	//
	//////////////////////////////////////////////////////
	// schneller Init der Struktur:
	memset(&SStartupinfo,0,sizeof(STARTUPINFO));
	SStartupinfo.cb			= sizeof(STARTUPINFO);

		////////////////////////////////
		// Aufruf erfolgreich?				//
		////////////////////////////////
    if(!CreateProcess( NULL,
				               chCommand,	// "RTSSrun C:\Sercans2\Bin\Sercans2.rtss 10 d0000 7"
				               NULL,
				               NULL,
				               FALSE,
				               0,          //  NORMAL_PRIORITY_CLASS,
				               NULL,
				               NULL,
				               &SStartupinfo,	// Speicher wird ben鰐igt
				               &SProcessinfo))	// Speicher wird ben鰐igt
			return NOT_OK;		
 		else
    {
		  // Wait for the utility to complete.
      ULONG	ulProcessSlot  = 0;
      // 1:1 von Beispiel RTX 黚ernommen
	  	if(WaitForSingleObject( SProcessinfo.hProcess, INFINITE)!=WAIT_OBJECT_0)
          ulDLL_Error	=	NOT_OK;
      else
        //
        // Get the exit code (RTSSrun returns the process slot) and close handles.
        //
        GetExitCodeProcess( SProcessinfo.hProcess, &ulProcessSlot);
        // check if 'SoftSercans' has been started
        if(ulProcessSlot==0)
          ulDLL_Error	=	NOT_OK;
    } 
		CloseHandle( SProcessinfo.hThread );
		// l鰏en des Holds auf den Proze

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -