// $Source: /usr/local/SimSoft/Sfx3D/template/Modell.cpp,v $
// $Revision: 1.13 $
// $Author: baum $
// $Date: 2001/11/29 15:18:10 $
//
// Login name of the user who locked the revision
// $Locker:  $
// Tag name used to checkout the file
// $Name: Release-14 $
// State assigned to revision
// $State: Exp $
//
//
// $Log: Modell.cpp,v $
// Revision 1.13  2001/11/29 15:18:10  baum
// -Realzeitsteuerung eingebaut
// -Handsteuerung eingebaut
//
//  

// Beispiel einer Datei der SIMFLEX/3D C++-Schnittstelle

// Die Makrodefinition '_impexp' dient zur Exportierung
// der Funktionen, Klassen und Variablen innerhalb der Library, 
// wird aber eigentlich nur fuer Windows benoetigt :-(

#ifdef WIN32
  #undef _impexp
  #define _impexp __declspec(dllexport)
#else
  #undef _impexp
  #define _impexp
#endif

#include <stdio.h>

#include "sfxprg.h"     // enthaelt die Funktionen der C-Schnittstelle

// Konstanten f. Programme
// Konstanten f. Bausteine
const int aBst    = 1;
const int BdeBst        = 0;
const int BdeSchreiben  = 999;
const int Fraesen07   = 7;
const int Fraesen10   = 10;
const int Fraesen28   = 28;

// benutzerdefinierbare Baustein-Daten-Struktur (vormals Bausteinsignale)

// Initialisierung der Baustein-Daten-Struktur

//Baustein-Programm mit Programmnummer 103 aus Modell.TAS

// Event-Funktion des Bausteins aBst. Der Funktionsname ist beliebig und
// wird in der Funktion installEvent einem Ereignis zugeordnet.
float SumVorgaenge[10];

FILE *BdeDatei = NULL;
Ustring BdeDatName("PTA43.bde");

void _impexp prog_999 () {             // BDE-Programm auf Baustein 10
  BdeDatei = fopen (BdeDatName.str(), "a");
  fprintf (BdeDatei, " %5.2f ; ",  Modellzeit ().inHours ());
  for (int m = 1; m <= 6; m++)
    fprintf (BdeDatei, " %5.2f ; ", MitAuslastung (m));
  float MitFraes =     MitAuslastung (7) +  MitAuslastung (10) +  MitAuslastung (28);
  fprintf (BdeDatei, " %5.2f ; %5.2f ; %5.2f ;", MitFraes, MitAuslastung(8), MitAuslastung(9));
  for (int a = 1; a <= 9; a++)
       fprintf (BdeDatei, " %5.2f ; ", 
            MitDurchlaufzeit (a).inMinutes () / SumVorgaenge [a]);
  fprintf(BdeDatei, "\n");
  fclose (BdeDatei);

  if (Modellzeit () < Modellende ())
    planeDelta (SimTime(60 * 15.0), ETprogramm, BdeBst, BdeSchreiben);
  else
    simAbbruch ();
}
void _impexp ETaarbeiten_aBst () {
 cout << "ETaarbeiten_aBst = " << aBst << "TEVar = " << TEVariante(aBst) << "\n";
     fprintf (stdout, "Neues Teil %2i, auf %2i\n", TEVariante(aBst), aBst);
}

// Diese Funktion wird automatisch nach der Modellinitialisierung gestartet,
// sofern sie vorhanden ist.
// In diese Funktion muessen auch alle Events eingetragen werden, damit sie 
// Initialisiert werden koennen. Fehlende Events in dieser Funktion werden
// nicht aufgerufen.

void _impexp init_prog () {
  DateiMitModellPfad(BdeDatName);
  BdeDatei = fopen (BdeDatName.str(), "w");
  fprintf(BdeDatei, 
  "Zeit[h] ; Aufsp ; Drehen ; Bohren ; Aufbohr ; Gewinde ; Umspan ; Fraesen ; Schleif ; Abspan ; ArbPlan1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 ; 8 ; 9\n");
  fclose (BdeDatei);
  installProg (BdeSchreiben);
  planeEin (SimTime (60 * 15.0), ETprogramm, BdeBst, BdeSchreiben);
  installEvent (ETaarbeiten, aBst, "ETaarbeiten_aBst");
  for (int a = 1; a <= 9; a++)
     SumVorgaenge[a] = SummeVorgangszeiten (a).inMinutes();
}
// Diese Funktion wird automatisch beim Simulatorabbruch gestartet,
// sofern sie vorhanden ist.
void _impexp exit_prog () {
}



