// Modelldatei fuer dmc610 (Deckel-Maho) 1998 - 99

// A. Reinhardt / J. Bernhard

// Projekt DMC-60



#include <stdio.h>

#include "sfxprg.h"



#ifdef WIN32

  #define WIN32_LEAN_AND_MEAN

  #include <windows.h>

  #undef _impexp

  #define _impexp __declspec(dllexport)

#else

  #undef _impexp

  #define _impexp

#endif



//-----------------------------------------------------

//   globale Konstanten

//-----------------------------------------------------



bool VolleLast = true;



unsigned TagSchicht        =     1;

double   Tagschichtdauer   = 960.0; // in Minuten ( 8 h)

double   Nachtschichtdauer = 480.0; // in Minuten (16 h)

double   Nachtvorlauf      =  60.0;

double   Nachtnachlauf     =  60.0;



//const float EndZeit        = 30.0;

const int TagFuellung      = 60;

const int NachtFuellung    = 56;

 int MaxFuellung           = TagFuellung;

 int AktFuellung           =  0;



const int Quelle           =  1;

const int Senke            =  2;



const RuestVerwalter        = 80;

const AufruestPlatz        = 20;

const AbruestPlatz         = 21;



const int NcVerwalter      = 81;

const int RegalVerwalter   = 77;



const int NcVorgang        = 4;

const int RuestVorgang     = 6;



//-----------------------------------------------------

//   Funktionen fuer SchichtSteuerung

//-----------------------------------------------------

void _impexp setMaxFuellung(int fuell){

  MaxFuellung = fuell;

  setAnzIndAvisSoll(Senke, MaxFuellung);

}



// NachtSchicht vorbereiten

void _impexp prog_1000 () {

  setMaxFuellung(NachtFuellung);

  planeDelta (Nachtvorlauf * SimTime::SecondsPerMinute (), ETprogramm, 0, 1100);

  clog << "NACHTSCHICHT Vorlauf " << Modellzeit().inMinutes() << endl;

  cout << "NACHTSCHICHT Vorlauf " << Modellzeit().inMinutes() << endl;



}

// NachtSchicht setzten!!!

void _impexp prog_1100 () {

  TagSchicht = 0;

  planeSofort(ETasperrung, Quelle, 0, 0);

  clog << "NACHTSCHICHT" << Modellzeit().inMinutes() << endl;

  cout << "NACHTSCHICHT" << Modellzeit().inMinutes() << endl;

  planeDelta (Nachtschichtdauer * SimTime::SecondsPerMinute (), ETprogramm, 0, 1200);

}



// NachtSchicht nachbereiten

void _impexp prog_1300 () {

  setMaxFuellung(TagFuellung);

  clog << "NACHTSCHICHT Nachlauf " << Modellzeit().inMinutes() << endl;

  cout << "NACHTSCHICHT Nachlauf " << Modellzeit().inMinutes() << endl;

}

// TagSchicht setzten!!!

void _impexp prog_1200 () {

  TagSchicht = 1;

  setMaxFuellung(TagFuellung - 2);

  planeDelta (Nachtnachlauf * SimTime::SecondsPerMinute (), ETprogramm, 0, 1300);

  clog << "TAGSCHICHT" << Modellzeit().inMinutes() << endl;

  cout << "TAGSCHICHT" << Modellzeit().inMinutes() << endl;

  planeSofort(ETesperrung, Quelle, 0, 0);

  aktivieren (AufruestPlatz);

  aktivieren (AbruestPlatz);

  planeDelta ((Tagschichtdauer - Nachtvorlauf) * SimTime::SecondsPerMinute (), ETprogramm, 0, 1000);

}

//-----------------------------------------------------

//   Funktionen der Bauste0ine

//-----------------------------------------------------

void _impexp prog_110 () {

 //if (AktFuellung < MaxFuellung){

  aufnehmen ();

  arbeiten (zufallszahl (ArbeitsplanNr (This) + 10, 1) * SimTime::SecondsPerMinute ());

  AktFuellung++;

  if (VolleLast)

    bestelleArbeitsplan (ArbeitsplanNr (This), Quelle, 1);

  else

    planeDelta (zufallszahl (ArbeitsplanNr (This), 1) * SimTime::SecondsPerMinute (), ETexplerzeugen, ArbeitsplanNr (This), 1);

  //setIoStrategie();

  if (AnzDirAvisIst (NcVerwalter) < AnzDirAvisSoll (NcVerwalter))

    abgeben (NcVorgang);

  else

    abgeben (0);

 /*

 } else {

     planeDelta(0.1 * SimTime::SecondsPerMinute (), ETaktivieren, This, 0);

     warten();

   }

 */

}



void _impexp prog_120 () {

  aufnehmen ();

  arbeiten (zufallszahl (ArbeitsplanNr (This) + 10, 2) * SimTime::SecondsPerMinute ());

  setTEVariante (This, 2);



  if (TagSchicht && (AnzDirAvisIst (RuestVerwalter) < AnzDirAvisSoll(RuestVerwalter)))

    abgeben (RuestVorgang);

  else

    abgeben (0);

}



void _impexp prog_130 () {

  aufnehmen ();

  arbeiten (zufallszahl (ArbeitsplanNr (This) + 10, 1) * SimTime::SecondsPerMinute ());

  AktFuellung--;

  while (!TagSchicht) warten ();

  abgeben (0);

  /*

  aktivieren (AufruestPlatz);

  aktivieren (AbruestPlatz);

  */

}



//-----------------------------------------------------

//   Initialisierung

//-----------------------------------------------------



void _impexp init_prog () {

  cout.precision(2);

  setMaxFuellung(TagFuellung);

  planeDelta ((Tagschichtdauer - Nachtvorlauf) * SimTime::SecondsPerMinute (), ETprogramm, 0, 1000);

  bestelleArbeitsplan (1, Quelle, 1);

  bestelleArbeitsplan (2, Quelle, 1);

}

