/*
 * Vytvoreno aplikací SharpDevelop.
 * Uživatel: Cudík
 * Datum: 28.2.2009
 * Cas: 16:44
 * 
 * Tento template mužete zmenit pomocí Nástroje | Možnosti | Psaní kódu | Upravit standardní hlavicky souboru.
 */

using S7PROSIMLib;
using System;
using System.Windows.Forms;


/****************************************************************************
 * 		Interfejs komunikujici s simulátorme S7-PLCSIM firmy Siemens		*
 * *************************************************************************/

public class PLCSIM{

	private S7ProSimClass Connection;
	private bool SpojeniInicializovano = false;
	
	// Vlastnost vracejici stav spojeni
	public bool SpojeniOK{
		get{return this.SpojeniInicializovano;}
	}
	
	// Funkce navazujici spojeni s programem S7-PLCSIM
	public void ConnectToPLCSIM(){
		
		this.Connection.Connect();
		this.Connection.SetScanMode( S7PROSIMLib.ScanModeConstants.ContinuousScan);
		this.Connection.Continue();
		this.SpojeniInicializovano = true;
	}
		
	// Funkce rusici spojeni s programem S7-PLCSIM
	public void DisconnectPLCSIM(){
		this.Connection.Disconnect();
		this.SpojeniInicializovano = false;
	}
	
	// Funkce pro cteni výstupního bitu z S7-PLCSIM
	public bool ReadOutputBit(int ByteIndex, int BitIndex){
		
		object data = new Boolean();
		Connection.ReadOutputPoint(ByteIndex, BitIndex, PointDataTypeConstants.S7_Bit, ref data);
		return (bool)data;
	}
	
	// Funkce pro čtení jednoho výstupního bytu z S7-PLCSIM
	public byte ReadOutputByte(int ByteIndex){
		
		object data = new Byte[1]{0};
		Connection.ReadOutputImage(ByteIndex, 1, ImageDataTypeConstants.S7Byte, ref data);
		byte[] pom = (byte[])data;
		return pom[0];
	}
	
	// Funkce pro načtení pole bytů z S7-PLCSIM
	public byte[] ReadOutputImageByte(int ByteIndex, int Pocet){
		
		object data = new Byte[Pocet];
		this.Connection.ReadOutputImage(ByteIndex, Pocet, ImageDataTypeConstants.S7Byte, ref data);
		
		return (byte[])data;
	}
	
	// Funkce pro načtení pole slow z S7-PLCSIM
	public Int16[] ReadOutputImageWort(int WortIndex, int Pocet){
		
		object data = new Int16[Pocet];
		this.Connection.ReadOutputImage(WortIndex, Pocet, ImageDataTypeConstants.S7Word, ref data);
		return (Int16[])data;
	}
	
	// Funkce pro přečtení jednoho výstupního sloba S7-PLCSIM
	public Int16 ReadOutputWord(int WordIndex){
		
		object data = new System.Int16[1]{0};
		Connection.ReadOutputImage(WordIndex, 1, ImageDataTypeConstants.S7Word, ref data);
		Int16[] pom = (Int16[])data;
		return pom[0];
	}
	
	// Funkce pro přečtení jednoho výstupního dvojitého slova S7-PLCSIM
	public Int32 ReadOutputDoubleWord(int DoubleWortIndex){
		
		object data = new System.Int32[1]{0};
		Connection.ReadOutputImage(DoubleWortIndex, 1, ImageDataTypeConstants.S7Word, ref data);
		Int32[] pom = (Int32[])data;
		
		return pom[0];
		
	}
	
	// Funkce pro zápis jednoho bitu do vstupního slova S7-PLCSIM
	public void WriteInputBit(int ByteIndex, int BitIndex, bool Data){
		
		object pom = new Boolean();
		pom = Data;
		Connection.WriteInputPoint(ByteIndex, BitIndex, ref pom);
	
	}
	
	// Funkce pro zápis bytu do vstupního slova S7-PLCSIM
	public void WriteInputByte(int ByteIndex, System.Byte Data){
		
		 object data = new System.Byte[1]{Data};
		 Connection.WriteInputImage(ByteIndex, ref data); 
	}
	
	// Funkce pro zápis pole bytů
	public void WriteInputByteImage(int StartByteIndex, System.Byte[] Data){
		
		object data = new System.Byte[Data.Length];
		data = Data;
		Connection.WriteInputImage(StartByteIndex, ref data);
	}
	
	// Funkce pro zápis pole slow
	public void WriteInputWortImage(int StartWortIndex, Int16[] Data){
		
		object data = new Int16[Data.Length];
		data = Data;
		Connection.WriteInputImage(StartWortIndex, ref data);
	}
	
	// Funkce pro zápis slova do vstupního slova S7-PLCSIM
	public void WriteInputWord(int WordIndex, Int16 Data){
		
		 object data = new Int16[1]{Data};
		 Connection.WriteInputImage(WordIndex, ref data); 
	}
		
	// Funkce pro zápis slova do vstupního slova S7-PLCSIM
	public void WriteInputDoubleWord(int DoubleWordIndex, Int32 Data){
		
		 object data = new Int32[1]{Data};
		 Connection.WriteInputImage(DoubleWordIndex, ref data); 
	}
	
	// Funkce volaná při chybě komunikace
	private void ErrorComunnicationEvent(string ControlEngine, int Error){
		
		this.SpojeniInicializovano = false;
		MessageBox.Show("Cyba komunikace s S7-PLCSIM, Error: " + ((uint)Error).ToString(), " Chyba komunikace", MessageBoxButtons.OK, MessageBoxIcon.Error);
		throw new Exception();
	}
		
	// Konstruktor
	public PLCSIM(){
		
		Connection = new S7ProSimClass();
		Connection.ConnectionError += new IS7ProSimEvents_ConnectionErrorEventHandler(ErrorComunnicationEvent);

		
	}
}
