439 lines
16 KiB
C#
439 lines
16 KiB
C#
using CMS_CORE_Library.Models;
|
|
using Thermo.Active.Model.DTOModels;
|
|
using Thermo.Active.NC;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Threading.Tasks;
|
|
using System.Web.Http;
|
|
using static CMS_CORE_Library.Models.DataStructures;
|
|
using static Thermo.Active.Config.ServerConfig;
|
|
using static Thermo.Active.Model.Constants;
|
|
using Thermo.Active.Model.DTOModels.Recipe;
|
|
using Thermo.Active.Config;
|
|
|
|
namespace Thermo.Active.Controllers.WebApi
|
|
{
|
|
[RoutePrefix("api/recipe")]
|
|
public class RecipeController : ApiController
|
|
{
|
|
[Route("overview"), HttpGet]
|
|
public IHttpActionResult GetOverview()
|
|
{
|
|
using (NcAdapter ncAdapter = new NcAdapter())
|
|
{
|
|
// Try connection
|
|
CmsError libraryError = ncAdapter.Connect();
|
|
if (libraryError.errorCode != 0)
|
|
return NotFound();
|
|
|
|
CmsError cmsError = ncAdapter.GetRecipeOverview(out Dictionary<string, RecipeCatStatus> currOverview);
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
return Ok(currOverview);
|
|
}
|
|
}
|
|
[Route("current"), HttpGet]
|
|
public IHttpActionResult GetCurrentParameters()
|
|
{
|
|
using (NcAdapter ncAdapter = new NcAdapter())
|
|
{
|
|
// Try connection
|
|
CmsError libraryError = ncAdapter.Connect();
|
|
if (libraryError.errorCode != 0)
|
|
return NotFound();
|
|
|
|
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
return Ok(currRecipe);
|
|
}
|
|
}
|
|
|
|
[Route("update"), HttpPut]
|
|
public IHttpActionResult WriteParameters(Dictionary<string, double> parametersList)
|
|
{
|
|
if (parametersList != null)
|
|
{
|
|
if (RecipeLiveData != null)
|
|
{
|
|
using (NcAdapter ncAdapter = new NcAdapter())
|
|
{
|
|
// Try connection
|
|
CmsError libraryError = ncAdapter.Connect();
|
|
if (libraryError.errorCode != 0)
|
|
return NotFound();
|
|
|
|
// read recipe!
|
|
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> prevRecipe);
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
Dictionary<string, DTORecipeParam> updtRecipe = new Dictionary<string, DTORecipeParam>();
|
|
|
|
foreach (var item in parametersList)
|
|
{
|
|
if (prevRecipe.ContainsKey(item.Key))
|
|
{
|
|
// aggiorno il valore HMI nel parametro
|
|
var currParam = prevRecipe[item.Key];
|
|
currParam.SetpointHMI = item.Value;
|
|
// salvo (1 parametro, potrei fare N...)
|
|
updtRecipe.Add(item.Key, currParam);
|
|
}
|
|
else
|
|
{
|
|
return NotFound();
|
|
}
|
|
}
|
|
|
|
// scrivo sul PLC
|
|
ncAdapter.WriteRecipeParams(updtRecipe);
|
|
|
|
// ritorno solo fatto!
|
|
return Ok();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// non pronto!
|
|
return InternalServerError();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return NotFound();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Confirm recipe modification (parameters: HMI --> PLC)
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[Route("confirm"), HttpPut]
|
|
public IHttpActionResult ConfirmEdit()
|
|
{
|
|
if (RecipeLiveData != null)
|
|
{
|
|
using (NcAdapter ncAdapter = new NcAdapter())
|
|
{
|
|
// Try connection
|
|
CmsError libraryError = ncAdapter.Connect();
|
|
if (libraryError.errorCode != 0)
|
|
return NotFound();
|
|
|
|
// scrivo sul PLC il comando conferma!
|
|
CmsError cmsError = ncAdapter.ConfirmRecipeData(true);
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
// recupero i dati LIVE dei parametri HMI della ricetta...
|
|
cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
// rileggo la ricetta
|
|
var currParams = new Dictionary<string, double>();
|
|
foreach (var item in currRecipe)
|
|
{
|
|
currParams.Add(item.Key, item.Value.SetpointHMI);
|
|
}
|
|
|
|
saveCurrentRecipeParams(currParams);
|
|
|
|
// ritorno solo fatto!
|
|
return Ok();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// non pronto!
|
|
return InternalServerError();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Cancel recipe modification (parameters: PLC --> HMI)
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[Route("cancel"), HttpPut]
|
|
public IHttpActionResult CancelEdit()
|
|
{
|
|
if (RecipeLiveData != null)
|
|
{
|
|
using (NcAdapter ncAdapter = new NcAdapter())
|
|
{
|
|
// Try connection
|
|
CmsError libraryError = ncAdapter.Connect();
|
|
if (libraryError.errorCode != 0)
|
|
return NotFound();
|
|
|
|
// scrivo sul PLC il comando annula!
|
|
CmsError cmsError = ncAdapter.ConfirmRecipeData(false);
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
// recupero i dati LIVE dei parametri HMI della ricetta...
|
|
cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
var currParams = new Dictionary<string, double>();
|
|
foreach (var item in currRecipe)
|
|
{
|
|
currParams.Add(item.Key, item.Value.SetpointPLC);
|
|
}
|
|
|
|
// ora salvo ANCHE i dati live...
|
|
saveCurrentRecipeParams(currParams);
|
|
|
|
// ritorno solo fatto!
|
|
return Ok();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// non pronto!
|
|
return InternalServerError();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// load recipe from file and send to PLC
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[Route("load"), HttpPut]
|
|
public IHttpActionResult Load(string newName)
|
|
{
|
|
using (NcFileAdapter ncAdapter = new NcFileAdapter())
|
|
{
|
|
// Try connection
|
|
CmsError libraryError = ncAdapter.Connect();
|
|
if (libraryError.errorCode != 0)
|
|
return NotFound();
|
|
|
|
// chiamo metodo di lettura...
|
|
//CmsError cmsError = ServerConfigController.LoadRecipe(newName);
|
|
bool fatto = ServerConfigController.LoadRecipe(newName);
|
|
if (!fatto)
|
|
return NotFound();
|
|
|
|
|
|
CmsError cmsError = writeCurrentRecipeToPlc();
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
// ritorno solo fatto!
|
|
return Ok();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Load tempalte recipe from file and save as new current...
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[Route("new"), HttpPut]
|
|
public IHttpActionResult NewRecipe()
|
|
{
|
|
using (NcFileAdapter ncAdapter = new NcFileAdapter())
|
|
{
|
|
// chiamo metodo di lettura...
|
|
bool fatto = ServerConfigController.LoadTemplate();
|
|
|
|
if (!fatto)
|
|
return NotFound();
|
|
|
|
CmsError cmsError = writeCurrentRecipeToPlc();
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
}
|
|
// ritorno solo fatto!
|
|
return Ok();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Save current recipe from PLC to default
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[Route("save"), HttpPut]
|
|
public IHttpActionResult Save()
|
|
{
|
|
using (NcFileAdapter ncAdapter = new NcFileAdapter())
|
|
{
|
|
|
|
// recupero i dati LIVE dei parametri HMI della ricetta...
|
|
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
var currParams = new Dictionary<string, double>();
|
|
foreach (var item in currRecipe)
|
|
{
|
|
currParams.Add(item.Key, item.Value.SetpointPLC);
|
|
}
|
|
|
|
// ora salvo ANCHE i dati live...
|
|
saveCurrentRecipeParams(currParams);
|
|
|
|
// ritorno solo fatto!
|
|
return Ok();
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Save current recipe from PLC with new name
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[Route("saveAs"), HttpPut]
|
|
public IHttpActionResult SaveAs(string newName)
|
|
{
|
|
using (NcFileAdapter ncAdapter = new NcFileAdapter())
|
|
{
|
|
// recupero i dati LIVE dei parametri HMI della ricetta...
|
|
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
var currParams = new Dictionary<string, double>();
|
|
foreach (var item in currRecipe)
|
|
{
|
|
currParams.Add(item.Key, item.Value.SetpointPLC);
|
|
}
|
|
|
|
// ora salvo ANCHE i dati live...
|
|
RecipeLiveData.RecipeParameters = currParams;
|
|
// e salvo su disco
|
|
ServerConfigController.SaveRecipe(newName);
|
|
|
|
// ritorno solo fatto!
|
|
return Ok();
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Save current recipe from PLC to Template
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[Route("saveTemplate"), HttpPut]
|
|
public IHttpActionResult SaveTemplate()
|
|
{
|
|
using (NcFileAdapter ncAdapter = new NcFileAdapter())
|
|
{
|
|
// recupero i dati LIVE dei parametri HMI della ricetta...
|
|
CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> currRecipe);
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
|
|
// recupero i dati LIVE dei carichi load dei cahnnels di riscaldo...
|
|
cmsError = ncAdapter.ReadWarmers(out Dictionary<int, DTOWarmers> currWarmers);
|
|
if (cmsError.IsError())
|
|
return BadRequest(cmsError.localizationKey);
|
|
|
|
// uso i valopri HMI...
|
|
var currParams = new Dictionary<string, double>();
|
|
foreach (var item in currRecipe)
|
|
{
|
|
currParams.Add(item.Key, item.Value.SetpointHMI);
|
|
}
|
|
|
|
// ora salvo nei dati live...
|
|
RecipeLiveData.RecipeParameters = currParams;
|
|
|
|
// carico i dati dei riscaldi...
|
|
var currChSet = new Dictionary<int, int>();
|
|
foreach (var item in currWarmers)
|
|
{
|
|
currChSet.Add(item.Key, item.Value.SetpointHMI);
|
|
}
|
|
RecipeLiveData.ChannelSetpoints = currChSet;
|
|
|
|
|
|
// e salvo su disco
|
|
ServerConfigController.SaveRecipeTemplate();
|
|
|
|
// ritorno solo fatto!
|
|
return Ok();
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Do actual recipe parameters FileSave
|
|
/// </summary>
|
|
/// <param name="currParams"></param>
|
|
private static void saveCurrentRecipeParams(Dictionary<string, double> currParams)
|
|
{
|
|
try
|
|
{
|
|
// ora salvo ANCHE i dati live...
|
|
RecipeLiveData.RecipeParameters = currParams;
|
|
// e salvo su disco
|
|
ServerConfigController.SaveRecipeCurrent();
|
|
}
|
|
catch
|
|
{ }
|
|
}
|
|
|
|
protected static CmsError writeCurrentRecipeToPlc()
|
|
{
|
|
CmsError checkError = NO_ERROR;
|
|
|
|
using (NcAdapter ncAdapter = new NcAdapter())
|
|
{
|
|
// Try connection
|
|
CmsError libraryError = ncAdapter.Connect();
|
|
if (libraryError.errorCode != 0)
|
|
return libraryError;
|
|
|
|
|
|
// copy data to PLC
|
|
checkError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> prevRecipe);
|
|
if (checkError.IsError())
|
|
return checkError;
|
|
|
|
// save parameters to PLC!!!
|
|
Dictionary<string, DTORecipeParam> updtRecipe = new Dictionary<string, DTORecipeParam>();
|
|
foreach (var item in RecipeLiveData.RecipeParameters)
|
|
{
|
|
if (prevRecipe.ContainsKey(item.Key))
|
|
{
|
|
// aggiorno il valore HMI nel parametro
|
|
var currParam = prevRecipe[item.Key];
|
|
currParam.SetpointHMI = item.Value;
|
|
// salvo (1 parametro, potrei fare N...)
|
|
updtRecipe.Add(item.Key, currParam);
|
|
}
|
|
else
|
|
{
|
|
return NOT_FOUND_ERROR;
|
|
}
|
|
}
|
|
|
|
// write to PLC
|
|
checkError = ncAdapter.WriteRecipeParams(updtRecipe);
|
|
|
|
|
|
// process ch load setup...
|
|
Dictionary<int, int> newRisk = new Dictionary<int, int>();
|
|
foreach (var item in RecipeLiveData.ChannelSetpoints)
|
|
{
|
|
newRisk.Add(item.Key, item.Value);
|
|
}
|
|
|
|
// write to PLC
|
|
checkError = ncAdapter.WriteRecipeWarmChSetpHMI(newRisk);
|
|
|
|
// enable recipe! scrivo sul PLC il comando conferma!
|
|
CmsError cmsError = ncAdapter.ConfirmRecipeData(true);
|
|
if (cmsError.IsError())
|
|
return checkError;
|
|
}
|
|
return checkError;
|
|
}
|
|
}
|
|
} |