📄 sercans.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 + -