Compare commits

...

27 Commits

Author SHA1 Message Date
Samuele E. Locatelli b2932d927c Merge remote-tracking branch 'origin/develop' into new/ThermoCamManager 2021-03-24 11:25:04 +01:00
Thermo_SIM 68add4e08d Ottimizzazione Frontend 2021-03-24 11:24:33 +01:00
Samuele E. Locatelli 5585c11ef5 new rel start 2021-03-24 10:48:18 +01:00
Samuele E. Locatelli b9caa4ac74 setup serverConfig x SIM 2021-03-24 10:48:09 +01:00
Samuele E. Locatelli cde514eed8 refresh x test produzione 2021-03-24 09:29:37 +01:00
Samuele E. Locatelli fad45a5635 new rel 190 2021-03-24 09:29:26 +01:00
Samuele E. Locatelli 9bf2265082 pulizia riferimenti vers 0.8.1 --> 0.4.0 2021-03-24 09:29:18 +01:00
Samuele E. Locatelli e488619ae5 Merge remote-tracking branch 'origin/develop' into new/ThermoCamManager 2021-03-24 07:55:53 +01:00
Samuele E. Locatelli babd8b25da vers 189 semaforo unico 2021-03-24 07:55:40 +01:00
Thermo_SIM 5894cd63ce Check LastTakenImage 2021-03-24 07:33:58 +01:00
Samuele E. Locatelli 5a19d44b34 semaforo su confirm/cancel ricetta (strobe R798!) 2021-03-24 06:14:15 +01:00
Samuele E. Locatelli 577cbe5c9d start test new rel 2021-03-24 05:48:47 +01:00
Samuele E. Locatelli e881006857 gestione semafori x Reciper + Warmers 2021-03-23 21:47:31 +01:00
Samuele E. Locatelli 83fb0acfd0 helpers gestione semafori Recipe + Warmers 2021-03-23 21:47:21 +01:00
Samuele E. Locatelli 04b3588e7f lieve allungamento delay scrittura singole memorie ricetta 2021-03-23 21:46:54 +01:00
Samuele E. Locatelli c00e695c15 inizio nuova release 2021-03-23 19:34:02 +01:00
Samuele E. Locatelli c228c454f6 Merge remote-tracking branch 'origin/develop' into new/ThermoCamManager 2021-03-23 19:33:43 +01:00
Thermo_SIM e86495eab5 Added Thermocamera Takesnapshot 2021-03-23 17:31:13 +01:00
Samuele E. Locatelli 63e636cd36 fix base WebApi (NO dispose ncAdapter: non serve) 2021-03-23 12:49:04 +01:00
Samuele E. Locatelli 1458a4cf5d inserito force close 2021-03-23 12:43:55 +01:00
Samuele E. Locatelli 6cf7331081 Merge remote-tracking branch 'origin/develop' into new/ThermoCamManager 2021-03-23 12:09:26 +01:00
Samuele E. Locatelli 43402a785f aggiunti metodi dispose x WebAPI con ncAdapter 2021-03-23 12:09:10 +01:00
Thermo_SIM 88561778ce Fix Classes bitselector 2021-03-23 11:01:03 +01:00
Thermo_SIM 0d395fca33 Added LOG on Auth error 2021-03-23 10:48:17 +01:00
Samuele E. Locatelli 09fea8f0e3 start new rel 2021-03-23 10:47:34 +01:00
Thermo_SIM 42531aac49 Fix COnfirm IO 2021-03-23 10:23:24 +01:00
Thermo_SIM bbfc3ca64d Fix Caricatore 2021-03-23 09:18:02 +01:00
56 changed files with 19149 additions and 18636 deletions
+1 -1
View File
@@ -180,7 +180,7 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup> <PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> <ErrorText>Questo progetto fa riferimento a uno o più pacchetti NuGet che non sono presenti in questo computer. Usare lo strumento di ripristino dei pacchetti NuGet per scaricarli. Per altre informazioni, vedere http://go.microsoft.com/fwlink/?LinkID=322105. Il file mancante è {0}.</ErrorText>
</PropertyGroup> </PropertyGroup>
<Error Condition="!Exists('..\packages\cef.redist.x64.84.4.1\build\cef.redist.x64.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\cef.redist.x64.84.4.1\build\cef.redist.x64.props'))" /> <Error Condition="!Exists('..\packages\cef.redist.x64.84.4.1\build\cef.redist.x64.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\cef.redist.x64.84.4.1\build\cef.redist.x64.props'))" />
<Error Condition="!Exists('..\packages\cef.redist.x86.84.4.1\build\cef.redist.x86.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\cef.redist.x86.84.4.1\build\cef.redist.x86.props'))" /> <Error Condition="!Exists('..\packages\cef.redist.x86.84.4.1\build\cef.redist.x86.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\cef.redist.x86.84.4.1\build\cef.redist.x86.props'))" />
+2 -1
View File
@@ -4,6 +4,7 @@
<ncVendor>S7NET</ncVendor> <ncVendor>S7NET</ncVendor>
<!-- NO_NC/DEMO/FANUC/SIEMENS/OSAI/S7NET --> <!-- NO_NC/DEMO/FANUC/SIEMENS/OSAI/S7NET -->
<showNcHMI>false</showNcHMI> <showNcHMI>false</showNcHMI>
<!--<ncIpAddress>192.168.139.1</ncIpAddress>-->
<ncIpAddress>192.168.0.102</ncIpAddress> <ncIpAddress>192.168.0.102</ncIpAddress>
<ncPort>102</ncPort> <ncPort>102</ncPort>
<machineModel>Thermo 2020</machineModel> <machineModel>Thermo 2020</machineModel>
@@ -140,7 +141,7 @@
<thread name="expMan" value="30000" /> <thread name="expMan" value="30000" />
<thread name="functionEnab" value="300" /> <thread name="functionEnab" value="300" />
<thread name="gauges" value="500" /> <thread name="gauges" value="500" />
<thread name="m154" value="500" /> <thread name="m154" value="1000" />
<thread name="mCommands" value="250" /> <thread name="mCommands" value="250" />
<thread name="powerOn" value="500" /> <thread name="powerOn" value="500" />
<thread name="prodCycle" value="1000" /> <thread name="prodCycle" value="1000" />
+205 -76
View File
@@ -49,6 +49,7 @@ public static class ThreadsFunctions
public static int modulesRtCounter = 0; public static int modulesRtCounter = 0;
public static int recipeRtCounter = 0; public static int recipeRtCounter = 0;
public static bool reconnectionIsRunning = false; public static bool reconnectionIsRunning = false;
public static bool forcetakeSnapshot = false;
#endregion Public Fields #endregion Public Fields
@@ -193,34 +194,45 @@ public static class ThreadsFunctions
StatReset(); StatReset();
NcAdapter ncAdapter = new NcAdapter(); NcAdapter ncAdapter = new NcAdapter();
CmsError libraryError = NO_ERROR; CmsError libraryError = NO_ERROR;
// Run loop until NC is connected try
while (!ncAdapter.numericalControl.NC_IsConnected())
{ {
// Try reconnection // Run loop until NC is connected
libraryError = ncAdapter.Connect(); while (!ncAdapter.numericalControl.NC_IsConnected())
if (libraryError.errorCode == CMS_ERROR_CODES.SIEMENS_ENVIRONMENT_NOT_FOUND || libraryError.errorCode == CMS_ERROR_CODES.SIEMENS_HMI_NOT_RUNNING || libraryError.errorCode == CMS_ERROR_CODES.OSAI_TT_FOLDER_NOT_FOUND)
ManageLibraryError(libraryError);
else if (libraryError.errorCode != CMS_ERROR_CODES.OK)
{ {
ncAdapter.Dispose(); // Try reconnection
libraryError = ncAdapter.Connect();
if (libraryError.errorCode == CMS_ERROR_CODES.SIEMENS_ENVIRONMENT_NOT_FOUND || libraryError.errorCode == CMS_ERROR_CODES.SIEMENS_HMI_NOT_RUNNING || libraryError.errorCode == CMS_ERROR_CODES.OSAI_TT_FOLDER_NOT_FOUND)
ManageLibraryError(libraryError);
else if (libraryError.errorCode != CMS_ERROR_CODES.OK)
{
ncAdapter.Dispose();
}
// Send status to UI
MessageServices.Current.Publish(SEND_NC_STATUS_UI, null, ncAdapter.numericalControl.NC_IsConnected());
// Send status to signalr
MessageServices.Current.Publish(SEND_NC_STATUS, null, ncAdapter.numericalControl.NC_IsConnected());
Thread.Sleep(1000);
} }
// Send status to UI if (!libraryError.IsError())
MessageServices.Current.Publish(SEND_NC_STATUS_UI, null, ncAdapter.numericalControl.NC_IsConnected()); {
// Send status to signalr if (ServerStartupConfig.AutoOpenCmsClient)
MessageServices.Current.Publish(SEND_NC_STATUS, null, ncAdapter.numericalControl.NC_IsConnected()); StartCMSClient();
Thread.Sleep(1000); // Start/Restart NC threads
ThreadsHandler.StartWorkers();
reconnectionIsRunning = false;
}
} }
catch (ThreadAbortException ex)
if (!libraryError.IsError())
{ {
if (ServerStartupConfig.AutoOpenCmsClient) ncAdapter.Dispose();
StartCMSClient(); }
finally
// Start/Restart NC threads {
ThreadsHandler.StartWorkers(); ncAdapter.Dispose();
reconnectionIsRunning = false;
} }
} }
@@ -326,6 +338,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
/// <summary> /// <summary>
@@ -345,6 +361,14 @@ public static class ThreadsFunctions
// avvio oggetto thermocam // avvio oggetto thermocam
ThermoCamComunicator TCCom = new ThermoCamComunicator(true); ThermoCamComunicator TCCom = new ThermoCamComunicator(true);
Stopwatch sw = new Stopwatch(); Stopwatch sw = new Stopwatch();
forcetakeSnapshot = false;
RegistrationInfo takeReginfo = MessageServices.Current.Subscribe(TAKE_SNAPSHOT_THERMO, (a, b) =>
{
ThreadsFunctions.forcetakeSnapshot = true;
});
try try
{ {
// Try connection // Try connection
@@ -365,11 +389,13 @@ public static class ThreadsFunctions
if (libraryError.IsError()) if (libraryError.IsError())
ManageLibraryError(libraryError); ManageLibraryError(libraryError);
if (flirImageReq) if (flirImageReq || forcetakeSnapshot)
{ {
forcetakeSnapshot = false;
bool done = false; bool done = false;
// if requested --> give ack! // if requested --> give ack!
ncAdapter.ManageFlirStrobe(); if (flirImageReq)
ncAdapter.ManageFlirStrobe();
// requesto photo from library // requesto photo from library
NcAdapter.lastThermoImage = TCCom.takePicture(); NcAdapter.lastThermoImage = TCCom.takePicture();
done = !string.IsNullOrEmpty(NcAdapter.lastThermoImage); done = !string.IsNullOrEmpty(NcAdapter.lastThermoImage);
@@ -392,7 +418,8 @@ public static class ThreadsFunctions
ncAdapter.WriteRecipeWarmChTCamTempAct(actualTemp); ncAdapter.WriteRecipeWarmChTCamTempAct(actualTemp);
NcAdapter.lastImageTaken = DateTime.Now; NcAdapter.lastImageTaken = DateTime.Now;
// give PLC strobe for uploaded Actual TEMP from image // give PLC strobe for uploaded Actual TEMP from image
ncAdapter.SendTCamImageReadyStrb(); if(flirImageReq)
ncAdapter.SendTCamImageReadyStrb();
MessageServices.Current.Publish(SEND_NEWTCAMIMAGE, null, NcAdapter.lastImageTaken); MessageServices.Current.Publish(SEND_NEWTCAMIMAGE, null, NcAdapter.lastImageTaken);
@@ -423,7 +450,8 @@ public static class ThreadsFunctions
} }
finally finally
{ {
ncAdapter.Dispose(); MessageServices.Current.UnSubscribe(takeReginfo);
ncAdapter.Dispose();
// chiudo thermocam // chiudo thermocam
TCCom.Dispose(); TCCom.Dispose();
} }
@@ -501,6 +529,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ManageWatchdog() public static void ManageWatchdog()
@@ -547,6 +579,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadAlarms() public static void ReadAlarms()
@@ -591,6 +627,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadAreaData() public static void ReadAreaData()
@@ -633,6 +673,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
/// <summary> /// <summary>
@@ -686,6 +730,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
/// <summary> /// <summary>
@@ -735,6 +783,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadEnabledFunctionality() public static void ReadEnabledFunctionality()
@@ -779,6 +831,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadExpiredMaintenances() public static void ReadExpiredMaintenances()
@@ -833,6 +889,11 @@ public static class ThreadsFunctions
} }
catch (Exception ex) catch (Exception ex)
{ {
ncAdapter.Dispose();
}
finally
{
ncAdapter.Dispose();
} }
} }
@@ -877,6 +938,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadM154Data() public static void ReadM154Data()
@@ -1051,6 +1116,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadMComandsData() public static void ReadMComandsData()
@@ -1097,6 +1166,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadModulesData() public static void ReadModulesData()
@@ -1139,6 +1212,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadPowerOnData() public static void ReadPowerOnData()
@@ -1181,6 +1258,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadProcessesPPStatus() public static void ReadProcessesPPStatus()
@@ -1227,6 +1308,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadProdCycleData() public static void ReadProdCycleData()
@@ -1270,6 +1355,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadProdInfoData() public static void ReadProdInfoData()
@@ -1313,6 +1402,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadProdPanelData() public static void ReadProdPanelData()
@@ -1356,6 +1449,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadRecipeData() public static void ReadRecipeData()
@@ -1382,39 +1479,46 @@ public static class ThreadsFunctions
// Check if client is connected // Check if client is connected
if (ncAdapter.numericalControl.NC_IsConnected()) if (ncAdapter.numericalControl.NC_IsConnected())
{ {
// Get new data from PLC // controllo su redis che NON sia bloccata lettura ricetta..
libraryError = ncAdapter.ReadRecipeData(onlyRt, false, out Dictionary<string, DTORecipeParam> currRecipe); if (!RedisController.getRecipeReadSem)
if (libraryError.IsError())
ManageLibraryError(libraryError);
MessageServices.Current.Publish(SEND_THERMO_RECIPE_FULL, null, currRecipe);
// ora gestisco la overview!
libraryError = ncAdapter.GetRecipeOverview(out Dictionary<RecipeSection, RecipeCatStatus> currOverview);
if (libraryError.IsError())
ManageLibraryError(libraryError);
MessageServices.Current.Publish(SEND_THERMO_RECIPE_OVERWIEW, null, currOverview);
// ora gestisco la lettura della overview di "modificata
DTORecipeStatus message = new DTORecipeStatus()
{ {
recipeName = NcAdapter.RecipeLiveData.RecipeName, // Get new data from PLC
hasChanged = NcAdapter.RecipeLiveData.hasChanged libraryError = ncAdapter.ReadRecipeData(onlyRt, false, out Dictionary<string, DTORecipeParam> currRecipe);
}; if (libraryError.IsError())
ManageLibraryError(libraryError);
MessageServices.Current.Publish(SEND_THERMO_RECIPE_CHANGED, null, message); MessageServices.Current.Publish(SEND_THERMO_RECIPE_FULL, null, currRecipe);
// verifico se dal PLC è segnalato che i setpointHMI sono invalidati, nel qual caso INVIO // ora gestisco la overview!
bool setpointHmiInvalidated = false; libraryError = ncAdapter.GetRecipeOverview(out Dictionary<RecipeSection, RecipeCatStatus> currOverview);
libraryError = ncAdapter.checkSetpointInvalidated(out setpointHmiInvalidated); if (libraryError.IsError())
if (setpointHmiInvalidated) ManageLibraryError(libraryError);
{
// ora gestisco l'ack della richiesta MessageServices.Current.Publish(SEND_THERMO_RECIPE_OVERWIEW, null, currOverview);
libraryError = ncAdapter.doAckSetpointInvalidated();
// ora gestisco la lettura della overview di "modificata
DTORecipeStatus message = new DTORecipeStatus()
{
recipeName = NcAdapter.RecipeLiveData.RecipeName,
hasChanged = NcAdapter.RecipeLiveData.hasChanged
};
MessageServices.Current.Publish(SEND_THERMO_RECIPE_CHANGED, null, message);
// verifico se dal PLC è segnalato che i setpointHMI sono invalidati, nel qual caso INVIO
bool setpointHmiInvalidated = false;
libraryError = ncAdapter.checkSetpointInvalidated(out setpointHmiInvalidated);
if (setpointHmiInvalidated)
{
// ora gestisco l'ack della richiesta
libraryError = ncAdapter.doAckSetpointInvalidated();
}
// pubblico booleana dei setpointHMI invalidati
MessageServices.Current.Publish(SEND_THERMO_RECIPE_SETPOINTHMI_CHANGED, null, setpointHmiInvalidated);
}
else
{
} }
// pubblico booleana dei setpointHMI invalidati
MessageServices.Current.Publish(SEND_THERMO_RECIPE_SETPOINTHMI_CHANGED, null, setpointHmiInvalidated);
} }
else else
RestoreConnection(); RestoreConnection();
@@ -1431,6 +1535,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadScadaData() public static void ReadScadaData()
@@ -1476,6 +1584,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadUserSoftKeysData() public static void ReadUserSoftKeysData()
@@ -1520,6 +1632,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void ReadWarmersData() public static void ReadWarmersData()
@@ -1537,33 +1653,38 @@ public static class ThreadsFunctions
bool useCache = false; bool useCache = false;
while (true) while (true)
{ {
sw.Restart();
// Check if client is connected // controllo su redis che NON sia bloccata lettura ricetta..
if (ncAdapter.numericalControl.NC_IsConnected()) if (!RedisController.getWarmersReadSem)
{ {
if (cacheWarmers) sw.Restart();
// Check if client is connected
if (ncAdapter.numericalControl.NC_IsConnected())
{ {
// every 10 reads all data... if (cacheWarmers)
useCache = (readCount != 0); {
readCount++; // every 10 reads all data...
// ciclo resettato ogni 20 useCache = (readCount != 0);
readCount = readCount % 20; readCount++;
// ciclo resettato ogni 20
readCount = readCount % 20;
}
// Get new data from PLC
libraryError = ncAdapter.ReadWarmers(useCache, out Dictionary<int, DTOWarmers> currWarmers);
if (libraryError.IsError())
ManageLibraryError(libraryError);
// pubblico
MessageServices.Current.Publish(SEND_THERMO_WARMERS_DATA, null, currWarmers);
} }
// Get new data from PLC else
libraryError = ncAdapter.ReadWarmers(useCache, out Dictionary<int, DTOWarmers> currWarmers); RestoreConnection();
if (libraryError.IsError())
ManageLibraryError(libraryError); sw.Stop();
// pubblico
MessageServices.Current.Publish(SEND_THERMO_WARMERS_DATA, null, currWarmers); // Update thread timer
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
} }
else
RestoreConnection();
sw.Stop();
// Update thread timer
UpdateStat(MethodBase.GetCurrentMethod().Name, sw.ElapsedMilliseconds);
// Wait // Wait
Thread.Sleep(CalcSleepTime(samplMsec("warmers"), (int)sw.ElapsedMilliseconds)); Thread.Sleep(CalcSleepTime(samplMsec("warmers"), (int)sw.ElapsedMilliseconds));
} }
@@ -1572,6 +1693,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void RestoreConnection() public static void RestoreConnection()
@@ -1665,6 +1790,10 @@ public static class ThreadsFunctions
{ {
ncAdapter.Dispose(); ncAdapter.Dispose();
} }
finally
{
ncAdapter.Dispose();
}
} }
public static void StartCMSClient() public static void StartCMSClient()
-4
View File
@@ -38,10 +38,6 @@
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly> </dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="S7.Net" publicKeyToken="d5812d469e84c693" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-0.8.1.0" newVersion="0.8.1.0" />
</dependentAssembly>
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>
</configuration> </configuration>
-4
View File
@@ -57,10 +57,6 @@
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly> </dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="S7.Net" publicKeyToken="d5812d469e84c693" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-0.8.1.0" newVersion="0.8.1.0" />
</dependentAssembly>
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>
</configuration> </configuration>
@@ -21,6 +21,12 @@ namespace Thermo.Active.Database.Controllers
// Initialize database context // Initialize database context
dbCtx = new DatabaseContext(); dbCtx = new DatabaseContext();
} }
public void Dispose()
{
// Clear database context
dbCtx.Dispose();
}
#endregion Public Constructors #endregion Public Constructors
@@ -80,11 +86,6 @@ namespace Thermo.Active.Database.Controllers
return prodData; return prodData;
} }
public void Dispose()
{
// Clear database context
dbCtx.Dispose();
}
/// <summary> /// <summary>
/// Get record by NumDone /// Get record by NumDone
@@ -36,6 +36,12 @@ namespace Thermo.Active.Database.Controllers
private const string machineEventKpis = "Events:Kpis"; private const string machineEventKpis = "Events:Kpis";
private const string machineMessagePath = "Events:Messages"; private const string machineMessagePath = "Events:Messages";
private const string thermoSemRecipe = "Thermo:Semaphore:All";
private const string thermoSemWarmers = "Thermo:Semaphore:All";
//private const string thermoSemRecipe = "Thermo:Semaphore:Recipe";
//private const string thermoSemWarmers = "Thermo:Semaphore:Warmers";
public static void WriteProductionNotification(uint ProductionProcess, string Notification) public static void WriteProductionNotification(uint ProductionProcess, string Notification)
{ {
string redisHash = redUtil.man.redHash(redisNotificationAddress).Replace("%NN%", ProductionProcess.ToString("00")); string redisHash = redUtil.man.redHash(redisNotificationAddress).Replace("%NN%", ProductionProcess.ToString("00"));
@@ -246,5 +252,89 @@ namespace Thermo.Active.Database.Controllers
return true; return true;
} }
/// <summary>
/// Imposta semaforo Recipe
/// </summary>
/// <param name="doLock">true: imposto lock per 5 sec, false: tolgo lock (stringa vuota)</param>
/// <returns></returns>
public static bool setRecipeReadSem(bool doLock)
{
return setSemaphore(doLock, redUtil.man.redHash(thermoSemRecipe));
}
/// <summary>
/// Restituisce semaforo Recipe
/// </summary>
/// <returns></returns>
public static bool getRecipeReadSem
{
get
{
return getSemaphore(redUtil.man.redHash(thermoSemRecipe));
}
}
/// <summary>
/// Imposta semaforo Warmers
/// </summary>
/// <param name="doLock">true: imposto lock per 5 sec, false: tolgo lock (stringa vuota)</param>
/// <returns></returns>
public static bool setWarmersReadSem(bool doLock)
{
return setSemaphore(doLock, redUtil.man.redHash(thermoSemWarmers));
}
/// <summary>
/// Restituisce semaforo Warmers
/// </summary>
/// <returns></returns>
public static bool getWarmersReadSem
{
get
{
return getSemaphore(redUtil.man.redHash(thermoSemWarmers));
}
}
/// <summary>
/// Gestione generica SET semaforo
/// </summary>
/// <param name="doLock"></param>
/// <param name="redisHash"></param>
/// <returns></returns>
private static bool setSemaphore(bool doLock, string redisHash)
{
bool answ = true;
int ttlSec = 5;
string rawData = $"{DateTime.Now}";
try
{
if (doLock)
{
// imposto lock
answ = redUtil.man.setRSV(redisHash, rawData, ttlSec);
}
else
{
// metto empty string a 1 sec
answ = redUtil.man.setRSV(redisHash, "", 1);
}
}
catch
{ }
return answ;
}
/// <summary>
/// Gestione generica GET semafoto
/// </summary>
/// <param name="redisHash"></param>
/// <returns></returns>
private static bool getSemaphore(string redisHash)
{
bool answ = true;
string rawData = redUtil.man.getRSV(redisHash);
// se non nulla --> ho semaforo!
answ = !string.IsNullOrEmpty(rawData);
return answ;
}
} }
} }
+1
View File
@@ -23,6 +23,7 @@ namespace Thermo.Active.Model
public const string AXES_CONFIG_PATH = CONFIG_DIRECTORY + "axesConfig.xml"; public const string AXES_CONFIG_PATH = CONFIG_DIRECTORY + "axesConfig.xml";
public const string AXES_CONFIG_SCHEMA_PATH = RESOURCE_DIRECTORY + @"axesConfigValidator.xsd"; public const string AXES_CONFIG_SCHEMA_PATH = RESOURCE_DIRECTORY + @"axesConfigValidator.xsd";
public const string BROADCAST_DATA = "BROADCAST_DATA"; public const string BROADCAST_DATA = "BROADCAST_DATA";
public const string TAKE_SNAPSHOT_THERMO = "TAKE_SNAPSHOT_THERMO";
// File paths // File paths
public const string CLIENT_EXE_NAME = @"Active_Client.exe"; public const string CLIENT_EXE_NAME = @"Active_Client.exe";
+73
View File
@@ -475,10 +475,16 @@ namespace Thermo.Active.NC
// solo x S7... // solo x S7...
if (NcConfig.NcVendor == NC_VENDOR.S7NET) if (NcConfig.NcVendor == NC_VENDOR.S7NET)
{ {
// registro in redis blocco x lettura ricetta...
RedisController.setRecipeReadSem(true);
// call NC for update // call NC for update
CmsError libraryError = numericalControl.PLC_WRecipeEdit(confirmUpdate); CmsError libraryError = numericalControl.PLC_WRecipeEdit(confirmUpdate);
if (libraryError.IsError()) if (libraryError.IsError())
return libraryError; return libraryError;
// tolgo blocco x lettura ricetta...
RedisController.setRecipeReadSem(false);
} }
else else
{ {
@@ -1764,10 +1770,16 @@ namespace Thermo.Active.NC
{ {
if (NcFileAdapter.RecipeLiveData.ChannelSetpoints != null) if (NcFileAdapter.RecipeLiveData.ChannelSetpoints != null)
{ {
// registro in redis blocco x lettura ricetta...
RedisController.setRecipeReadSem(true);
// se si in questo caso scrivo configurazione... // se si in questo caso scrivo configurazione...
WriteRecipeWarmConfig(); WriteRecipeWarmConfig();
// Ack ! // Ack !
libraryError = numericalControl.PLC_WAckConfRiskRequest(); libraryError = numericalControl.PLC_WAckConfRiskRequest();
// tolgo in redis blocco x lettura ricetta...
RedisController.setRecipeReadSem(false);
} }
} }
if (ThermoReqConfRecipeStr) if (ThermoReqConfRecipeStr)
@@ -1795,8 +1807,12 @@ namespace Thermo.Active.NC
return NOT_FOUND_ERROR; return NOT_FOUND_ERROR;
} }
} }
// registro in redis blocco x lettura ricetta...
RedisController.setRecipeReadSem(true);
// se si in questo caso scrivo configurazione attuale... // se si in questo caso scrivo configurazione attuale...
WriteRecipeParams(updtRecipe, nMaxParamWrite, delayParamWrite); WriteRecipeParams(updtRecipe, nMaxParamWrite, delayParamWrite);
// tolgo in redis blocco x lettura ricetta...
RedisController.setRecipeReadSem(false);
using (UserSoftkeysController controller = new UserSoftkeysController()) using (UserSoftkeysController controller = new UserSoftkeysController())
{ {
@@ -1813,6 +1829,9 @@ namespace Thermo.Active.NC
newRisk.Add(item.Key, item.Value); newRisk.Add(item.Key, item.Value);
} }
// registro in redis blocco x lettura ricetta...
RedisController.setRecipeReadSem(true);
// write to PLC SetPointHMI (%) // write to PLC SetPointHMI (%)
libraryError = WriteRecipeWarmChSetpHMI(newRisk); libraryError = WriteRecipeWarmChSetpHMI(newRisk);
if (libraryError.IsError()) if (libraryError.IsError())
@@ -1827,6 +1846,9 @@ namespace Thermo.Active.NC
libraryError = ConfirmRecipeData(true); libraryError = ConfirmRecipeData(true);
if (libraryError.IsError()) if (libraryError.IsError())
return libraryError; return libraryError;
// tolgo in redis blocco x lettura ricetta...
RedisController.setRecipeReadSem(true);
} }
} }
} }
@@ -3421,8 +3443,14 @@ namespace Thermo.Active.NC
/// <returns></returns> /// <returns></returns>
public CmsError SetTCamActiv(bool enableTCam) public CmsError SetTCamActiv(bool enableTCam)
{ {
// registro in redis blocco x lettura ricetta...
RedisController.setWarmersReadSem(true);
CmsError libraryError = numericalControl.PLC_WTCamActiv(enableTCam); CmsError libraryError = numericalControl.PLC_WTCamActiv(enableTCam);
// tolgo in redis blocco x lettura ricetta...
RedisController.setWarmersReadSem(false);
return libraryError; return libraryError;
} }
@@ -3433,8 +3461,14 @@ namespace Thermo.Active.NC
/// <returns></returns> /// <returns></returns>
public CmsError SetTCamMode(bool enableTCam) public CmsError SetTCamMode(bool enableTCam)
{ {
// registro in redis blocco x lettura ricetta...
RedisController.setWarmersReadSem(true);
CmsError libraryError = numericalControl.PLC_WTCamMode(enableTCam); CmsError libraryError = numericalControl.PLC_WTCamMode(enableTCam);
// tolgo in redis blocco x lettura ricetta...
RedisController.setWarmersReadSem(false);
return libraryError; return libraryError;
} }
@@ -3669,8 +3703,15 @@ namespace Thermo.Active.NC
/// <returns></returns> /// <returns></returns>
public CmsError WriteRecipeParams(Dictionary<string, DTORecipeParam> updtRecipe, int nMaxParamWrite, int delayParamWrite) public CmsError WriteRecipeParams(Dictionary<string, DTORecipeParam> updtRecipe, int nMaxParamWrite, int delayParamWrite)
{ {
// registro in redis blocco x lettura ricetta...
RedisController.setRecipeReadSem(true);
CmsError libraryError = WriteRecipeParametersToPLC(updtRecipe, nMaxParamWrite, delayParamWrite); CmsError libraryError = WriteRecipeParametersToPLC(updtRecipe, nMaxParamWrite, delayParamWrite);
// tolgo blocco x lettura ricetta...
RedisController.setRecipeReadSem(false);
return libraryError; return libraryError;
} }
@@ -3681,8 +3722,15 @@ namespace Thermo.Active.NC
/// <returns></returns> /// <returns></returns>
public CmsError WriteRecipeWarmChSetpHMI(Dictionary<int, int> updtSetpHmi) public CmsError WriteRecipeWarmChSetpHMI(Dictionary<int, int> updtSetpHmi)
{ {
// registro in redis blocco x lettura warmers...
RedisController.setWarmersReadSem(true);
CmsError libraryError = numericalControl.PLC_WWarmerChSetpHmi(updtSetpHmi); CmsError libraryError = numericalControl.PLC_WWarmerChSetpHmi(updtSetpHmi);
// tolgo blocco x lettura warmers...
RedisController.setWarmersReadSem(false);
return libraryError; return libraryError;
} }
@@ -3693,8 +3741,14 @@ namespace Thermo.Active.NC
/// <returns></returns> /// <returns></returns>
public CmsError WriteRecipeWarmChTCamEnab(Dictionary<int, bool> actualStates) public CmsError WriteRecipeWarmChTCamEnab(Dictionary<int, bool> actualStates)
{ {
// registro in redis blocco x lettura warmers...
RedisController.setWarmersReadSem(true);
CmsError libraryError = numericalControl.PLC_WWarmerChTCamEnab(actualStates); CmsError libraryError = numericalControl.PLC_WWarmerChTCamEnab(actualStates);
// tolgo blocco x lettura warmers...
RedisController.setWarmersReadSem(false);
return libraryError; return libraryError;
} }
@@ -3705,8 +3759,14 @@ namespace Thermo.Active.NC
/// <returns></returns> /// <returns></returns>
public CmsError WriteRecipeWarmChTCamTempAct(Dictionary<int, double> actualTemp) public CmsError WriteRecipeWarmChTCamTempAct(Dictionary<int, double> actualTemp)
{ {
// registro in redis blocco x lettura warmers...
RedisController.setWarmersReadSem(true);
CmsError libraryError = numericalControl.PLC_WWarmerChTCamTempAct(actualTemp); CmsError libraryError = numericalControl.PLC_WWarmerChTCamTempAct(actualTemp);
// tolgo blocco x lettura warmers...
RedisController.setWarmersReadSem(false);
return libraryError; return libraryError;
} }
@@ -3717,8 +3777,14 @@ namespace Thermo.Active.NC
/// <returns></returns> /// <returns></returns>
public CmsError WriteRecipeWarmChTCamTempSet(Dictionary<int, double> referenceTemp) public CmsError WriteRecipeWarmChTCamTempSet(Dictionary<int, double> referenceTemp)
{ {
// registro in redis blocco x lettura warmers...
RedisController.setWarmersReadSem(true);
CmsError libraryError = numericalControl.PLC_WWarmerChTCamTempSet(referenceTemp); CmsError libraryError = numericalControl.PLC_WWarmerChTCamTempSet(referenceTemp);
// tolgo blocco x lettura warmers...
RedisController.setWarmersReadSem(false);
return libraryError; return libraryError;
} }
@@ -3732,6 +3798,9 @@ namespace Thermo.Active.NC
Dictionary<int, int> newData = new Dictionary<int, int>(); Dictionary<int, int> newData = new Dictionary<int, int>();
CmsError libraryError = NO_ERROR; CmsError libraryError = NO_ERROR;
// registro in redis blocco x lettura warmers...
RedisController.setWarmersReadSem(true);
// scrivo l'abilitazione dei canali... // scrivo l'abilitazione dei canali...
foreach (var item in RiskBoardConfig) foreach (var item in RiskBoardConfig)
{ {
@@ -3793,6 +3862,10 @@ namespace Thermo.Active.NC
numericalControl.PLC_WWarmerChTCamEnab(resetTCamEnab); numericalControl.PLC_WWarmerChTCamEnab(resetTCamEnab);
numericalControl.PLC_WWarmerChTCamTempAct(resetTCamTemp); numericalControl.PLC_WWarmerChTCamTempAct(resetTCamTemp);
numericalControl.PLC_WWarmerChTCamTempSet(resetTCamTemp); numericalControl.PLC_WWarmerChTCamTempSet(resetTCamTemp);
// tolgo blocco x lettura warmers...
RedisController.setWarmersReadSem(false);
// esce // esce
return libraryError; return libraryError;
} }
-4
View File
@@ -38,10 +38,6 @@
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly> </dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="S7.Net" publicKeyToken="d5812d469e84c693" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-0.8.1.0" newVersion="0.8.1.0" />
</dependentAssembly>
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>
</configuration> </configuration>
-4
View File
@@ -38,10 +38,6 @@
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly> </dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="S7.Net" publicKeyToken="d5812d469e84c693" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-0.8.1.0" newVersion="0.8.1.0" />
</dependentAssembly>
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>
</configuration> </configuration>
@@ -47,6 +47,10 @@ namespace Thermo.Active.Utils
{ {
Log.Info(message); Log.Info(message);
} }
public static void LogDebug(string message)
{
Log.Debug(message);
}
public static void LogWarning(string message) public static void LogWarning(string message)
{ {
+1 -5
View File
@@ -15,7 +15,7 @@
<add key="ClientSettingsProvider.ServiceUri" value="" /> <add key="ClientSettingsProvider.ServiceUri" value="" />
<add key="ServerServiceName" value="MariaDB" /> <add key="ServerServiceName" value="MariaDB" />
<add key="nMaxParamWrite" value="5" /> <add key="nMaxParamWrite" value="5" />
<add key="delayParamWrite" value="5" /> <add key="delayParamWrite" value="10" />
<add key="ewmaPar100" value="40" /> <add key="ewmaPar100" value="40" />
<add key="flirSwapXY" value="true" /> <add key="flirSwapXY" value="true" />
<add key="cacheWarmers" value="false" /> <add key="cacheWarmers" value="false" />
@@ -115,10 +115,6 @@
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly> </dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="S7.Net" publicKeyToken="d5812d469e84c693" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-0.8.1.0" newVersion="0.8.1.0" />
</dependentAssembly>
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>
<connectionStrings> <connectionStrings>
@@ -8,6 +8,7 @@ using System.Security.Principal;
using Thermo.Active.Config; using Thermo.Active.Config;
using Thermo.Active.Database.Controllers; using Thermo.Active.Database.Controllers;
using Thermo.Active.Model.DatabaseModels; using Thermo.Active.Model.DatabaseModels;
using Thermo.Active.Utils;
using static Thermo.Active.Config.ServerConfig; using static Thermo.Active.Config.ServerConfig;
using static Thermo.Active.Listeners.SignalRStaticObjects; using static Thermo.Active.Listeners.SignalRStaticObjects;
using static Thermo.Active.Model.Constants; using static Thermo.Active.Model.Constants;
@@ -28,7 +29,11 @@ namespace Thermo.Active.Attributes
// Find user session on this machine // Find user session on this machine
SessionModel session = sessionsController.FindSessionByToken(token); SessionModel session = sessionsController.FindSessionByToken(token);
if (session == null) if (session == null)
{
ThermoActiveLogger.LogError($"SignalRAuthorizeAttribute | AuthorizeHubConnection | session == null");
return false; return false;
}
} }
return base.AuthorizeHubConnection(hubDescriptor, request); return base.AuthorizeHubConnection(hubDescriptor, request);
@@ -39,11 +44,16 @@ namespace Thermo.Active.Attributes
var connectionId = hubIncomingInvokerContext.Hub.Context.ConnectionId; var connectionId = hubIncomingInvokerContext.Hub.Context.ConnectionId;
var request = hubIncomingInvokerContext.Hub.Context.Request; var request = hubIncomingInvokerContext.Hub.Context.Request;
var token = request.QueryString.Get("Authorization"); var token = request.QueryString.Get("Authorization");
if (!string.IsNullOrEmpty(token)) if (!string.IsNullOrEmpty(token))
{ {
// check authorization // check authorization
if (!CheckAuthorization(FunctionAccess, token, out int machineId, out int userId)) if (!CheckAuthorization(FunctionAccess, token, out int machineId, out int userId))
{
ThermoActiveLogger.LogError($"SignalRAuthorizeAttribute | AuthorizeHubMethodInvocation | CheckAuthorization == false");
return false; return false;
}
var claims = new ClaimsIdentity(AUTHENTICATION_TYPE); var claims = new ClaimsIdentity(AUTHENTICATION_TYPE);
claims.AddClaim(new Claim(USER_ID_KEY, userId.ToString())); claims.AddClaim(new Claim(USER_ID_KEY, userId.ToString()));
@@ -66,11 +76,17 @@ namespace Thermo.Active.Attributes
// Find user session on this machine // Find user session on this machine
SessionModel session = sessionsController.FindSessionByToken(token); SessionModel session = sessionsController.FindSessionByToken(token);
if (session == null) if (session == null)
{
ThermoActiveLogger.LogError($"SignalRAuthorizeAttribute | CheckAuthorization | session == null");
return false; return false;
}
// Check if the machine is the same where the user logged in // Check if the machine is the same where the user logged in
if (session.MachineUser.MachineId != MachineConfig.MachineId) if (session.MachineUser.MachineId != MachineConfig.MachineId)
{
ThermoActiveLogger.LogError($"SignalRAuthorizeAttribute | CheckAuthorization | session.MachineUser.MachineId != MachineConfig.MachineId | " + session.MachineUser.MachineId + "," + MachineConfig.MachineId);
return false; return false;
}
machineId = session.MachineUser.MachineId; machineId = session.MachineUser.MachineId;
userId = session.MachineUser.UserId; userId = session.MachineUser.UserId;
@@ -91,12 +107,18 @@ namespace Thermo.Active.Attributes
if (Action == ACTIONS.READ) if (Action == ACTIONS.READ)
{ // Check read permissions { // Check read permissions
if (functionAccess.ReadLevelMin > machineUser.Role.Level) if (functionAccess.ReadLevelMin > machineUser.Role.Level)
{
ThermoActiveLogger.LogError($"SignalRAuthorizeAttribute | CheckAuthorization | functionAccess.ReadLevelMin > machineUser.Role.Level | " + functionAccess.ReadLevelMin + "," + machineUser.Role.Level);
return false; // Not authorized return false; // Not authorized
}
} }
else else
{ // Check write permissions { // Check write permissions
if (functionAccess.WriteLevelMin > machineUser.Role.Level) if (functionAccess.WriteLevelMin > machineUser.Role.Level)
{
ThermoActiveLogger.LogError($"SignalRAuthorizeAttribute | CheckAuthorization | functionAccess.WriteLevelMin > machineUser.Role.Level | " + functionAccess.WriteLevelMin + "," + machineUser.Role.Level);
return false; // Not authorized return false; // Not authorized
}
} }
// Check if PLC bit exists // Check if PLC bit exists
@@ -105,13 +127,21 @@ namespace Thermo.Active.Attributes
// Check if functionality is enabled by PLC // Check if functionality is enabled by PLC
var functionalityIsEnabled = LastRuntimeFunctionality.Where(x => x.Name == functionName).FirstOrDefault(); var functionalityIsEnabled = LastRuntimeFunctionality.Where(x => x.Name == functionName).FirstOrDefault();
if (functionalityIsEnabled == null || functionalityIsEnabled.Enabled == false) if (functionalityIsEnabled == null || functionalityIsEnabled.Enabled == false)
return false; {
ThermoActiveLogger.LogError($"SignalRAuthorizeAttribute | CheckAuthorization | functionalityIsEnabled == null || functionalityIsEnabled.Enabled == false | " + functionalityIsEnabled + "," + functionalityIsEnabled.Enabled);
return false; // Not authorized
}
} }
} }
else else
{
ThermoActiveLogger.LogError($"SignalRAuthorizeAttribute | CheckAuthorization | functionAccess != null && ServerConfigController.CheckAreaStatus(functionAccess.Area) | " + functionAccess + "," + functionAccess.Area);
return false; return false;
}
// Authorized // Authorized
ThermoActiveLogger.LogInfo($"SignalRAuthorizeAttribute | CheckAuthorization | Authorized | ");
return true; return true;
} }
} }
@@ -22,12 +22,14 @@ using static Thermo.Active.Model.Constants;
namespace Thermo.Active.Controllers.WebApi namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/maintenance_manager")] [RoutePrefix("api/maintenance_manager")]
public class ApiMaintenanceController : ApiController public class ApiMaintenanceController : aBaseApiController // ApiController
{ {
#if false
/// <summary> /// <summary>
/// Oggetto adapter condiviso da WebAPI /// Oggetto adapter condiviso da WebAPI
/// </summary> /// </summary>
protected static NcAdapter ncAdapter = new NcAdapter(); protected static NcAdapter ncAdapter = new NcAdapter();
#endif
[Route("maintenances"), HttpGet] [Route("maintenances"), HttpGet]
[WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.READ)] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.READ)]
@@ -10,7 +10,7 @@ using static Thermo.Active.Model.Constants;
namespace Thermo.Active.Controllers.WebApi namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/authorization")] [RoutePrefix("api/authorization")]
public class AuthorizationController : ApiController public class AuthorizationController : ApiController
{ {
[Route("functions"), HttpGet] [Route("functions"), HttpGet]
[WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.GENERAL, Action = ACTIONS.READ)] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.GENERAL, Action = ACTIONS.READ)]
@@ -13,12 +13,14 @@ using static Thermo.Active.Model.Constants;
namespace Thermo.Active.Controllers.WebApi namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/user_softkey")] [RoutePrefix("api/user_softkey")]
public class FavoriteUserSoftkeyController : ApiController public class FavoriteUserSoftkeyController : aBaseApiController // ApiController
{ {
#if false
/// <summary> /// <summary>
/// Oggetto adapter condiviso da WebAPI /// Oggetto adapter condiviso da WebAPI
/// </summary> /// </summary>
protected static NcAdapter ncAdapter = new NcAdapter(); protected static NcAdapter ncAdapter = new NcAdapter();
#endif
[Route("favorite"), HttpGet] [Route("favorite"), HttpGet]
@@ -12,12 +12,14 @@ using static Thermo.Active.Utils.LanguageController;
namespace Thermo.Active.Controllers.WebApi namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/language")] [RoutePrefix("api/language")]
public class LanguageController : ApiController public class LanguageController : aBaseApiController // ApiController
{ {
#if false
/// <summary> /// <summary>
/// Oggetto adapter condiviso da WebAPI /// Oggetto adapter condiviso da WebAPI
/// </summary> /// </summary>
protected static NcAdapter ncAdapter = new NcAdapter(); protected static NcAdapter ncAdapter = new NcAdapter();
#endif
[Route("languages"), HttpGet] [Route("languages"), HttpGet]
public IHttpActionResult GetLanguageList() public IHttpActionResult GetLanguageList()
@@ -8,12 +8,14 @@ using Thermo.Active.Utils;
namespace Thermo.Active.Controllers.WebApi namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/ModBlock")] [RoutePrefix("api/ModBlock")]
public class ModulesController : ApiController public class ModulesController : aBaseApiController // ApiController
{ {
#if false
/// <summary> /// <summary>
/// Oggetto adapter condiviso da WebAPI /// Oggetto adapter condiviso da WebAPI
/// </summary> /// </summary>
protected static NcAdapter ncAdapter = new NcAdapter(); protected static NcAdapter ncAdapter = new NcAdapter();
#endif
[Route("current"), HttpGet] [Route("current"), HttpGet]
public IHttpActionResult GetCurrentModules() public IHttpActionResult GetCurrentModules()
@@ -8,13 +8,15 @@ using static Thermo.Active.Model.Constants;
namespace Thermo.Active.Controllers.WebApi namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/nc")] [RoutePrefix("api/nc")]
public class NcApiController : ApiController public class NcApiController : aBaseApiController // ApiController
{ {
#if false
/// <summary> /// <summary>
/// Oggetto adapter condiviso da WebAPI /// Oggetto adapter condiviso da WebAPI
/// </summary> /// </summary>
protected static NcAdapter ncAdapter = new NcAdapter(); protected static NcAdapter ncAdapter = new NcAdapter();
#endif
[Route("generic_data"), HttpGet] [Route("generic_data"), HttpGet]
[WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.NC_DATA, Action = ACTIONS.READ)] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.NC_DATA, Action = ACTIONS.READ)]
public IHttpActionResult GetNcGenericData() public IHttpActionResult GetNcGenericData()
@@ -11,13 +11,16 @@ using static Thermo.Active.Model.Constants;
namespace Thermo.Active.Controllers.WebApi namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/prod")] [RoutePrefix("api/prod")]
public class ProdController : ApiController public class ProdController : aBaseApiController //ApiController
{ {
#if false
/// <summary> /// <summary>
/// Oggetto adapter condiviso da WebAPI /// Oggetto adapter condiviso da WebAPI
/// </summary> /// </summary>
protected static NcAdapter ncAdapter = new NcAdapter(); protected static NcAdapter ncAdapter = new NcAdapter();
#endif
/// <summary> /// <summary>
/// Request mode SETUP /// Request mode SETUP
/// </summary> /// </summary>
@@ -26,12 +26,14 @@ using static Thermo.Active.Model.Constants;
namespace Thermo.Active.Controllers.WebApi namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/recipe")] [RoutePrefix("api/recipe")]
public class RecipeController : ApiController public class RecipeController : aBaseApiController // ApiController
{ {
#if false
/// <summary> /// <summary>
/// Oggetto adapter condiviso da WebAPI /// Oggetto adapter condiviso da WebAPI
/// </summary> /// </summary>
protected static NcAdapter ncAdapter = new NcAdapter(); protected static NcAdapter ncAdapter = new NcAdapter();
#endif
[Route("overview"), HttpGet] [Route("overview"), HttpGet]
public IHttpActionResult GetOverview() public IHttpActionResult GetOverview()
@@ -699,6 +701,7 @@ namespace Thermo.Active.Controllers.WebApi
} }
// copy data to PLC // copy data to PLC
checkError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> prevRecipe); checkError = ncAdapter.ReadFullRecipe(out Dictionary<string, DTORecipeParam> prevRecipe);
if (checkError.IsError()) if (checkError.IsError())
@@ -13,12 +13,14 @@ namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/scada")] [RoutePrefix("api/scada")]
public class ScadaController : ApiController public class ScadaController : aBaseApiController // ApiController
{ {
#if false
/// <summary> /// <summary>
/// Oggetto adapter condiviso da WebAPI /// Oggetto adapter condiviso da WebAPI
/// </summary> /// </summary>
protected static NcAdapter ncAdapter = new NcAdapter(); protected static NcAdapter ncAdapter = new NcAdapter();
#endif
[Route("list"), HttpGet] [Route("list"), HttpGet]
public IHttpActionResult GetScadaList() public IHttpActionResult GetScadaList()
@@ -8,12 +8,14 @@ using Thermo.Active.Utils;
namespace Thermo.Active.Controllers.WebApi namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/starred_softkey")] [RoutePrefix("api/starred_softkey")]
public class StarredUserSoftKeyController : ApiController public class StarredUserSoftKeyController : aBaseApiController // ApiController
{ {
#if false
/// <summary> /// <summary>
/// Oggetto adapter condiviso da WebAPI /// Oggetto adapter condiviso da WebAPI
/// </summary> /// </summary>
protected static NcAdapter ncAdapter = new NcAdapter(); protected static NcAdapter ncAdapter = new NcAdapter();
#endif
[Route("get"), HttpGet] [Route("get"), HttpGet]
public IHttpActionResult GetStarredUserSoftkey() public IHttpActionResult GetStarredUserSoftkey()
@@ -29,12 +29,15 @@ using static Thermo.Active.Model.Constants;
namespace Thermo.Active.Controllers.WebApi namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/underthehood")] [RoutePrefix("api/underthehood")]
public class UnderTheHoodController : ApiController public class UnderTheHoodController : aBaseApiController // ApiController
{ {
#if false
/// <summary> /// <summary>
/// Oggetto adapter condiviso da WebAPI /// Oggetto adapter condiviso da WebAPI
/// </summary> /// </summary>
protected static NcAdapter ncAdapter = new NcAdapter(); protected static NcAdapter ncAdapter = new NcAdapter();
#endif
[ResponseType(typeof(DTOCycleLog))] [ResponseType(typeof(DTOCycleLog))]
[Route("CycleLogRefresh"), HttpGet] [Route("CycleLogRefresh"), HttpGet]
@@ -18,14 +18,16 @@ using System.Linq;
namespace Thermo.Active.Controllers.WebApi namespace Thermo.Active.Controllers.WebApi
{ {
[RoutePrefix("api/warmers")] [RoutePrefix("api/warmers")]
public class WarmersController : ApiController public class WarmersController : aBaseApiController // ApiController
{ {
#region Protected Fields #region Protected Fields
#if false
/// <summary> /// <summary>
/// Oggetto adapter condiviso da WebAPI /// Oggetto adapter condiviso da WebAPI
/// </summary> /// </summary>
protected static NcAdapter ncAdapter = new NcAdapter(); protected static NcAdapter ncAdapter = new NcAdapter();
#endif
protected static Dictionary<int, ThermoPoint> MeasurePoints = new Dictionary<int, ThermoPoint>(); protected static Dictionary<int, ThermoPoint> MeasurePoints = new Dictionary<int, ThermoPoint>();
@@ -589,6 +591,19 @@ namespace Thermo.Active.Controllers.WebApi
return NotFound(); return NotFound();
} }
} }
/// <summary>
///Take photo Thermocam
/// </summary>
/// <param name="channelsTemp"></param>
/// <returns></returns>
[Route("takeTcamImage"), HttpPut]
[WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)]
public IHttpActionResult TakeTcamImage()
{
MessageServices.Current.Publish(TAKE_SNAPSHOT_THERMO);
return Ok();
}
#endregion Public Methods #endregion Public Methods
} }
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using Thermo.Active.NC;
namespace Thermo.Active.Controllers.WebApi
{
public class aBaseApiController : ApiController
{
/// <summary>
/// Oggetto adapter condiviso da WebAPI
/// </summary>
protected static NcAdapter ncAdapter = new NcAdapter();
#if false
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (ncAdapter != null)
{
ncAdapter.Dispose();
}
}
base.Dispose(disposing);
}
#endif
}
}
@@ -326,6 +326,10 @@ namespace Thermo.Active.Listeners.SignalR
lastSetpointHmiInvalid = currMessage; lastSetpointHmiInvalid = currMessage;
var context = GlobalHost.ConnectionManager.GetHubContext<NcHub>(); var context = GlobalHost.ConnectionManager.GetHubContext<NcHub>();
context.Clients.Group("ncData").setpointHmiInvalid(currMessage); context.Clients.Group("ncData").setpointHmiInvalid(currMessage);
context.Clients.Group("ncData").recipeFullDataInvalidSetpoint(LastRecipeFullData);
context.Clients.Group("ncData").warmersData(LastWarmersData);
} }
} }
@@ -686,7 +690,7 @@ namespace Thermo.Active.Listeners.SignalR
// Send THERMO Recipe data // Send THERMO Recipe data
group.recipeFullData(LastRecipeFullData); group.recipeFullData(LastRecipeFullData);
group.recipeOverData(LastRecipeOverData); group.recipeOverData(LastRecipeOverData);
group.setpointHmiInvalid();
// Send THERMO Modules data // Send THERMO Modules data
group.modulesData(LastModulesData); group.modulesData(LastModulesData);
// Send THERMO Warmers data // Send THERMO Warmers data
@@ -696,6 +700,8 @@ namespace Thermo.Active.Listeners.SignalR
group.gaugeData(LastLiveProdData); group.gaugeData(LastLiveProdData);
// THERMO prod info data // THERMO prod info data
group.prodInfoData(LastProdInfoData); group.prodInfoData(LastProdInfoData);
group.prodPanelData(LastProdPanelData);
// THERMO prod cycle data // THERMO prod cycle data
group.prodCycleData(LastProdCycleData); group.prodCycleData(LastProdCycleData);
+1 -1
View File
@@ -30,4 +30,4 @@ using System.Runtime.InteropServices;
// //
// You can specify all the values or you can default the Revision and Build Numbers // You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
[assembly: AssemblyVersion("1.1.185")] [assembly: AssemblyVersion("1.1.191")]
+1
View File
@@ -222,6 +222,7 @@
<Compile Include="Attributes\WebApiAuthorizeAttribute.cs" /> <Compile Include="Attributes\WebApiAuthorizeAttribute.cs" />
<Compile Include="Attributes\SignalRAuthorizeAttribute.cs" /> <Compile Include="Attributes\SignalRAuthorizeAttribute.cs" />
<Compile Include="Controllers\SignalR\NcHub.cs" /> <Compile Include="Controllers\SignalR\NcHub.cs" />
<Compile Include="Controllers\WebApi\aBaseApiController.cs" />
<Compile Include="Controllers\WebApi\ApiAlarmController.cs" /> <Compile Include="Controllers\WebApi\ApiAlarmController.cs" />
<Compile Include="Controllers\WebApi\UnderTheHoodController.cs" /> <Compile Include="Controllers\WebApi\UnderTheHoodController.cs" />
<Compile Include="Controllers\WebApi\SchedTaskController.cs" /> <Compile Include="Controllers\WebApi\SchedTaskController.cs" />
+3
View File
@@ -119,6 +119,9 @@ namespace Thermo.Active
ListenersHandler.Stop(); ListenersHandler.Stop();
// Close WinForm // Close WinForm
ServerControlWindow.Stop(); ServerControlWindow.Stop();
// force close
Environment.Exit(0);
} }
private static bool ValidateAddress(string Addr) private static bool ValidateAddress(string Addr)
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@@ -2092,7 +2092,7 @@
} }
.body { .body {
height: calc(~"100%"- 64px); height: calc(~"100%" - 64px);
overflow: hidden; overflow: hidden;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -3476,7 +3476,6 @@
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 100%; height: 100%;
background: #ffffff;
top: 0; top: 0;
display: block; display: block;
overflow: hidden; overflow: hidden;
@@ -3485,6 +3484,9 @@
width: 100%; width: 100%;
height: 100%; height: 100%;
cursor: -webkit-grab; cursor: -webkit-grab;
display: flex;
justify-content: center;
align-items: center;
} }
.loading { .loading {
@@ -3530,6 +3532,17 @@
} }
.btngroup2{
position: absolute;
bottom: 510px;
right: 0;
margin-right: 20px;
img{
box-shadow: none;
filter: grayscale(1)brightness(0)invert(1);
}
}
.btngroup { .btngroup {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
@@ -3562,6 +3575,9 @@
cursor: pointer; cursor: pointer;
color: #FFF; color: #FFF;
z-index: 1; z-index: 1;
display: flex;
justify-content: center;
align-items: center;
} }
button:disabled { button:disabled {
+17 -4
View File
@@ -2321,7 +2321,7 @@ article .box .body {
color: #fff; color: #fff;
} }
.modal.modal-image .body { .modal.modal-image .body {
height: calc(100%-64px); height: calc(100% - 64px);
overflow: hidden; overflow: hidden;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -3668,7 +3668,6 @@ article .box .body {
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 100%; height: 100%;
background: #ffffff;
top: 0; top: 0;
display: block; display: block;
overflow: hidden; overflow: hidden;
@@ -3677,6 +3676,9 @@ article .box .body {
width: 100%; width: 100%;
height: 100%; height: 100%;
cursor: -webkit-grab; cursor: -webkit-grab;
display: flex;
justify-content: center;
align-items: center;
} }
.imageViewerZoom .loading { .imageViewerZoom .loading {
position: absolute; position: absolute;
@@ -3715,6 +3717,16 @@ article .box .body {
margin-right: 20px; margin-right: 20px;
margin-top: 20px; margin-top: 20px;
} }
.imageViewerZoom .btngroup2 {
position: absolute;
bottom: 510px;
right: 0;
margin-right: 20px;
}
.imageViewerZoom .btngroup2 img {
box-shadow: none;
filter: grayscale(1) brightness(0) invert(1);
}
.imageViewerZoom .btngroup { .imageViewerZoom .btngroup {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
@@ -3730,8 +3742,6 @@ article .box .body {
} }
.imageViewerZoom button { .imageViewerZoom button {
font-size: 20px; font-size: 20px;
justify-content: center;
display: flex;
background-color: #ffffff; background-color: #ffffff;
background-image: linear-gradient(to bottom, #1756ad, #002680); background-image: linear-gradient(to bottom, #1756ad, #002680);
box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.4); box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.4);
@@ -3744,6 +3754,9 @@ article .box .body {
cursor: pointer; cursor: pointer;
color: #FFF; color: #FFF;
z-index: 1; z-index: 1;
display: flex;
justify-content: center;
align-items: center;
} }
.imageViewerZoom button:disabled { .imageViewerZoom button:disabled {
background-color: #002680 !important; background-color: #002680 !important;
+18412 -18460
View File
File diff suppressed because it is too large Load Diff
@@ -12,6 +12,7 @@ import { loginService, machineService, localizationService } from "./services";
import { prodService } from "./services/prodService"; import { prodService } from "./services/prodService";
import * as iziToast from "izitoast"; import * as iziToast from "izitoast";
import { underTheHoodService } from "./services/underTheHoodService"; import { underTheHoodService } from "./services/underTheHoodService";
import { warmersService } from "./services/warmersService";
// import { UsersService } from "./services/usersService"; // import { UsersService } from "./services/usersService";
@@ -60,19 +61,16 @@ async function loadMachineConfig() {
await loginService.getUserInfo(); await loginService.getUserInfo();
try { try {
let machine = new machineService(); let machine = new machineService();
let result = await machine.getAreasConfiguration(); let result = await machine.getAreasConfiguration();
machineStatusActions.setAreasConfg(store, result); machineStatusActions.setAreasConfg(store, result);
let mcresult = await machine.getMachineConfiguration(); let mcresult = await machine.getMachineConfiguration();
await underTheHoodService.getChannelsConfig();
await warmersService.GetResistances();
machineStatusActions.setWarmersParameters(store, mcresult.additionalParameters); machineStatusActions.setWarmersParameters(store, mcresult.additionalParameters);
await prodService.GetProdPanel();
await underTheHoodService.getChannels();
await underTheHoodService.getChannelsConfig();
// load default language // load default language
if (!(store.state as AppModel).localization.currentLanguage) { if (!(store.state as AppModel).localization.currentLanguage) {
@@ -130,8 +130,6 @@ export default class Dashboard extends Vue {
} }
async mounted() { async mounted() {
prodService.GetProdPanel();
let $this = this; let $this = this;
setInterval(() => { setInterval(() => {
$this.now = moment(); $this.now = moment();
@@ -42,8 +42,8 @@ export default class SVGCaricatore extends Vue{
minoreuguale:string="<="; minoreuguale:string="<=";
getPositionSheet(id,col){ getPositionSheet(id,col){
var vent = ((this.larghTelaioSVG + (this.dimVentose*2)) / (this.numVentose +1)); var vent = (this.larghTelaioSVG - (this.dimVentose*2)) / (this.numVentose -1);
var posX = (id*vent ) - (this.dimVentose*2); var posX = (id-1)*vent;
if(col == 1) if(col == 1)
return "translate(-630 -147) translate(50 25) translate(580 122) translate(0 70) translate(0 0) translate("+ posX + ")"; return "translate(-630 -147) translate(50 25) translate(580 122) translate(0 70) translate(0 0) translate("+ posX + ")";
else if(col == 2) else if(col == 2)
@@ -20,6 +20,12 @@
position: relative; position: relative;
cursor: pointer; cursor: pointer;
} }
.bitSelect .form.error {
outline: 2px #d0021b auto !important;
}
.bitSelect .form.disabled {
background-color: rgba(0, 0, 0, 0.15);
}
.bitSelect .form i { .bitSelect .form i {
position: absolute; position: absolute;
right: 4px; right: 4px;
@@ -19,6 +19,16 @@
padding-right: 25px; padding-right: 25px;
position: relative; position: relative;
cursor: pointer; cursor: pointer;
&.error{
outline: 2px #d0021b auto !important;
}
&.disabled{
background-color: rgba(0, 0, 0, 0.15);
}
i { i {
position: absolute; position: absolute;
right: 4px; right: 4px;
@@ -23,6 +23,13 @@ export default class bitSelect extends Vue {
this.value.setpointHMI = v; this.value.setpointHMI = v;
} }
openclose(){
if(!this.value || !this.value.status || !this.value.status.enabled)
return
this.opened = !this.opened
}
get currentValue() { get currentValue() {
let result = [] let result = []
for (let index = 0; index < this.bitSize; index++) { for (let index = 0; index < this.bitSize; index++) {
@@ -2,7 +2,7 @@
<div class="bitSelect"> <div class="bitSelect">
<div <div
class="form" class="form"
@click="opened = !opened" @click="openclose"
:class="{'error': value && value.status && value.status.hasError, 'disabled': value && value.status && !value.status.enabled}" :class="{'error': value && value.status && value.status.hasError, 'disabled': value && value.status && !value.status.enabled}"
> >
{{currentValue}} {{currentValue}}
@@ -0,0 +1,70 @@
.warmers {
display: grid !important;
grid-template-columns: 1fr 70px;
margin-right: -14px;
}
.warmers .right-controls {
display: flex;
flex-flow: column nowrap;
align-items: center;
justify-content: space-between;
}
.warmers .right-controls .tm-controls {
display: flex;
flex-flow: column;
align-items: center;
justify-content: space-between;
height: 420px;
}
.warmers .right-controls .tm-controls input[type="range"][orient="vertical"] {
writing-mode: bt-lr;
/* IE */
-webkit-appearance: slider-vertical;
/* WebKit */
width: 6px;
height: 150px;
border: none !important;
box-shadow: inset 0 1px 3px 0 rgba(0, 0, 0, 0.5);
border-radius: 10px;
}
.warmers .right-controls .tm-controls input[type="range"][orient="vertical"]::-webkit-slider-thumb {
min-width: 30px;
min-height: 30px;
border: none;
background: none !important;
appearance: none;
}
.warmers .right-controls .tm-controls input[type="range"]::-webkit-slider-thumb {
background-color: linear-gradient(to bottom, #1756ad, #002e6e 97%) !important;
}
.warmers .right-controls .um-buttons {
background-color: #dddddd;
height: 130px;
width: 40px;
border-radius: 20px;
box-shadow: inset 0 1px 3px 0 rgba(0, 0, 0, 0.5);
display: flex;
flex-flow: column nowrap;
justify-content: space-around;
align-items: center;
}
.warmers .right-controls .um-buttons button {
width: 34px;
height: 34px;
border-radius: 50px;
border: none;
text-align: center;
line-height: 34px;
font-size: 18px;
font-weight: bold;
color: #fff;
box-shadow: inset 0 2px 2px 0 rgba(0, 0, 0, 0.19);
background-color: rgba(187, 188, 188, 0.5);
}
.warmers .right-controls .um-buttons button.selected {
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.5);
background-image: linear-gradient(to bottom, #1756ad, #002e6e 97%);
}
.warmers .right-controls .buttons button {
margin: 8px;
}
@@ -13,13 +13,13 @@
flex-flow: column; flex-flow: column;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
height: 350px; height: 420px;
input[type="range"][orient="vertical"] { input[type="range"][orient="vertical"] {
writing-mode: bt-lr; /* IE */ writing-mode: bt-lr; /* IE */
-webkit-appearance: slider-vertical; /* WebKit */ -webkit-appearance: slider-vertical; /* WebKit */
width: 6px; width: 6px;
height: 250px; height: 150px;
border: none !important; border: none !important;
box-shadow: inset 0 1px 3px 0 rgba(0, 0, 0, 0.5); box-shadow: inset 0 1px 3px 0 rgba(0, 0, 0, 0.5);
border-radius: 10px; border-radius: 10px;
@@ -10,11 +10,12 @@ import termoModal from "./thermoProphet-modal.vue";
import { ModalHelper } from '@/components/modals'; import { ModalHelper } from '@/components/modals';
import moment from "moment"; import moment from "moment";
import { messageService } from "src/_base"; import { messageService } from "src/_base";
import ModalImage from "@/modules/base-components/modal-image.vue";
@Component({ @Component({
name: "thermocamera", components: { name: "thermocamera", components: {
warmers warmers,ModalImage
} }
}) })
export default class Thermocamera extends Vue { export default class Thermocamera extends Vue {
@@ -64,8 +65,8 @@ export default class Thermocamera extends Vue {
messageService.subscribeToChannel("new-thermocam-image", (args)=>{ messageService.subscribeToChannel("new-thermocam-image", (args)=>{
if(this.TCamData){ if(this.TCamData){
console.log(args)
this.TCamData.lastTakenImage = args[0]; this.TCamData.lastTakenImage = args[0];
ModalHelper.modalImage.content = this.thermocameraOriginalUrl;
} }
}); });
} }
@@ -95,6 +96,11 @@ export default class Thermocamera extends Vue {
return "/thermoprophet/colored/_last.jpg?lastmod=NOTAVAILABLE"; return "/thermoprophet/colored/_last.jpg?lastmod=NOTAVAILABLE";
return "/thermoprophet/colored/_last.jpg?lastmod=" + this.TCamData.lastTakenImage; return "/thermoprophet/colored/_last.jpg?lastmod=" + this.TCamData.lastTakenImage;
} }
get thermocameraOriginalUrl(){
if(!this.TCamData || moment(this.TCamData.lastTakenImage).year() <= 2000)
return "/thermoprophet/original/_last.jpg?lastmod=NOTAVAILABLE";
return "/thermoprophet/original/_last.jpg?lastmod=" + this.TCamData.lastTakenImage;
}
get thermocameraImageOk(): boolean { get thermocameraImageOk(): boolean {
clearInterval(this.timeoutLastTakenImage); clearInterval(this.timeoutLastTakenImage);
@@ -231,4 +237,19 @@ export default class Thermocamera extends Vue {
async openThermoModal() { async openThermoModal() {
ModalHelper.ShowModal(termoModal, "modal2"); ModalHelper.ShowModal(termoModal, "modal2");
} }
async openImageModal() {
if(this.TCamData){
ModalHelper.modalImage.title = moment(this.TCamData.lastTakenImage).format("L") + " - " + moment(this.TCamData.lastTakenImage).format("LTS");
}
ModalHelper.modalImage.content = this.thermocameraOriginalUrl;
ModalHelper.ShowModal(ModalImage, "modal2");
}
async forceTakeImage() {
warmersService.TakeNewPhoto();
}
} }
@@ -125,9 +125,15 @@
</div> </div>
<div class="tm-controls"> <div class="tm-controls">
<button class="btn btn-info square" @click="openThermoModal()"> <button class="btn btn-info square" @click="forceTakeImage()">
<img src="/assets/icons/png/takesnap.png" />
</button>
<button class="btn btn-info square" @click="openImageModal()">
<img src="/assets/icons/png/ico-bt-selez-image.png" /> <img src="/assets/icons/png/ico-bt-selez-image.png" />
</button> </button>
<button class="btn btn-info square" @click="openThermoModal()">
<img src="/assets/icons/png/history.png" />
</button>
<span>{{timeCamDiff}}</span> <span>{{timeCamDiff}}</span>
<input <input
:disabled="!thermocameraImageOk" :disabled="!thermocameraImageOk"
@@ -27,8 +27,8 @@ export default class outputRow extends Vue {
async force(value: number) { async force(value: number) {
if(!this.item.isForced && (this.item.forcedValue === undefined || value != this.item.forcedValue)) if(!this.item.isForced && (this.item.forcedValue === undefined || value != this.item.forcedValue))
{ {
ModalHelper.AskConfirm( this.$options.filters.localize("Richiesta di conferma","modal_confirm_title"), ModalHelper.AskConfirm( this.$options.filters.localize("modal_confirm_title", "Richiesta di conferma"),
this.$options.filters.localize("Confirm?","softkey_confirm"), this.$options.filters.localize("softkey_confirm", "Confirm?"),
async() => { async() => {
await underTheHoodService.forceChannel(this.group, this.item, value); await underTheHoodService.forceChannel(this.group, this.item, value);
}, null, "modal"); }, null, "modal");
@@ -49,7 +49,8 @@ export class ModalHelper {
}; };
public static modalImage = { public static modalImage = {
content: null, content: null,
title: null title: null,
lastPhoto:null
}; };
public static maintenanceModal = { public static maintenanceModal = {
currentMaintenance: null, currentMaintenance: null,
-6
View File
@@ -24,12 +24,6 @@ import "./app.business-logic";
import "./app.modules"; import "./app.modules";
import { messageService } from "src/_base"; import { messageService } from "src/_base";
import { warmersService } from "./services/warmersService";
warmersService.GetChannels();
warmersService.GetResistances();
import { prodService } from "./services/prodService";
prodService.GetProd();
const App = () => const App = () =>
import("./App.vue"); import("./App.vue");
@@ -3,6 +3,7 @@ import { Factory, messageService } from "../../_base";
import ZoomImage from './zoom-image.vue' import ZoomImage from './zoom-image.vue'
import Vue from "vue"; import Vue from "vue";
import Component from "vue-class-component"; import Component from "vue-class-component";
import moment from "moment";
@Component({ @Component({
components:{ components:{
@@ -13,19 +14,24 @@ import Component from "vue-class-component";
export default class ModalImage extends Vue { export default class ModalImage extends Vue {
content: string = ""; content: string = "";
title: string = ""; title: string = "";
mounted() {
this.content = ModalHelper.modalImage.content;
this.title = ModalHelper.modalImage.title;
mounted() { messageService.subscribeToChannel("new-thermocam-image", (args)=>{
this.content = ModalHelper.modalImage.content; this.content = "/thermoprophet/original/_last.jpg?lastmod=" + args[0];
this.title = ModalHelper.modalImage.title; this.title = moment(args[0]).format("L") + " - " + moment(args[0]).format("LTS");
} });
}
beforeMount() { beforeMount() {
messageService.subscribeToChannel("esc_pressed", args => { messageService.subscribeToChannel("esc_pressed", args => {
this.close(); this.close();
}); });
} }
beforeDestroy() { beforeDestroy() {
@@ -34,7 +40,7 @@ export default class ModalImage extends Vue {
close() { close() {
messageService.deleteChannel("esc_pressed"); messageService.deleteChannel("esc_pressed");
ModalHelper.HideModal(); ModalHelper.HideModal("modal2");
} }
}; };
@@ -1,8 +1,7 @@
<template> <template>
<modal type="modal-image" :title="title"> <modal type="modal-image" :title="title">
<button class="close" slot="header-buttons" @click="close()"><i class="fa fa-remove"></i></button> <button class="close" slot="header-buttons" @click="close()"><i class="fa fa-remove"></i></button>
<zoom-image :imageSrc="this.content" :showBackButton="false" /> <zoom-image :imageSrc="this.content" :showBackButton="false" :isTcam="true"/>
</modal> </modal>
</template> </template>
<script src="./modal-image.ts" lang="ts" /> <script src="./modal-image.ts" lang="ts" />
<!--<script src="./create-maintenance.ts" lang="ts"></script>-->
@@ -1,5 +1,6 @@
import Vue from "vue"; import Vue from "vue";
import { Prop, Component } from "vue-property-decorator"; import { Prop, Component } from "vue-property-decorator";
import { warmersService } from "@/services/warmersService";
@Component([]) @Component([])
export default class ZoomImage extends Vue { export default class ZoomImage extends Vue {
@@ -9,6 +10,8 @@ export default class ZoomImage extends Vue {
imageSrc: string; imageSrc: string;
@Prop({ default: true }) @Prop({ default: true })
showBackButton: boolean; showBackButton: boolean;
@Prop({ default: false })
isTcam: boolean;
transImage: string = ""; transImage: string = "";
scaleImage: number = 1; scaleImage: number = 1;
@@ -136,5 +139,10 @@ export default class ZoomImage extends Vue {
this.transImage = "translateX(" + 0 + "px)translateY(" + 0 + "px)scale(" + this.scaleImage + ")"; this.transImage = "translateX(" + 0 + "px)translateY(" + 0 + "px)scale(" + this.scaleImage + ")";
} }
async forceTakeImage() {
warmersService.TakeNewPhoto();
}
}; };
@@ -7,14 +7,19 @@
@touchstart="dw" @touchstart="dw"
@touchmove="move" @touchmove="move"
@dblclick="zoomPlusAnimated"> @dblclick="zoomPlusAnimated">
<img ref="imageChild" :style="{'transform':transImage,'transition':animation}" :src="imageSrc" v-on:load="onImageLoaded" >
<svg xmlns="http://www.w3.org/2000/svg" :style="{'transform':transImage}" v-html="imageSrc" version="1.1" width="100%" height="100%" viewBox="0 0 2000 1500" v-on:load="onImageLoaded"></svg> <!-- <svg xmlns="http://www.w3.org/2000/svg" :style="{'transform':transImage}" v-html="imageSrc" version="1.1" width="100%" height="100%" viewBox="0 0 2000 1500" v-on:load="onImageLoaded"></svg>-->
</div> </div>
<!-- <div class="loading" v-if="!imageLoaded"><i class="fa fa-circle-o-notch fa-spin"></i></div>--> <div class="loading" v-if="!imageLoaded"><i class="fa fa-circle-o-notch fa-spin"></i></div>
<div class="btngroup_close" v-if="showBackButton"> <div class="btngroup_close" v-if="showBackButton">
<button @click="close"><i class="fa fa-chevron-left" ></i></button> <button @click="close"><i class="fa fa-chevron-left" ></i></button>
</div> </div>
<div class="btngroup2" v-if="true">
<button @click="forceTakeImage()">
<img src="/assets/icons/png/takesnap.png" />
</button>
</div>
<div class="btngroup"> <div class="btngroup">
<button @click="zoomPlusAnimated"><i class="fa fa-search-plus" ></i></button> <button @click="zoomPlusAnimated"><i class="fa fa-search-plus" ></i></button>
<div class="rangecontainer"> <div class="rangecontainer">
+10 -2
View File
@@ -113,6 +113,7 @@ export class Hub {
// qui i NUOVI metodi NUOVI dal server (Recipe, gauges) da completare lato HUB // qui i NUOVI metodi NUOVI dal server (Recipe, gauges) da completare lato HUB
this._hub.client.recipeFullData = Hub.recipeFullData; this._hub.client.recipeFullData = Hub.recipeFullData;
this._hub.client.recipeFullDataInvalidSetpoint = Hub.recipeFullDataInvalidSetpoint;
this._hub.client.warmersData = Hub.warmersData; this._hub.client.warmersData = Hub.warmersData;
this._hub.client.setpointHmiInvalid = Hub.setpointHmiInvalid; this._hub.client.setpointHmiInvalid = Hub.setpointHmiInvalid;
this._hub.client.recipeOverData = Hub.recipeOverData; this._hub.client.recipeOverData = Hub.recipeOverData;
@@ -201,14 +202,17 @@ export class Hub {
recipeActions.setCurrent(store, data, true); recipeActions.setCurrent(store, data, true);
} }
public static recipeFullDataInvalidSetpoint(data) {
recipeActions.setCurrent(store, data, false);
}
public static warmersData(data) { public static warmersData(data) {
warmersActions.setChannels(store, data as { [id: number]: Warmers.IChannel }); warmersActions.setChannels(store, data as { [id: number]: Warmers.IChannel });
} }
public static async setpointHmiInvalid(data) { public static async setpointHmiInvalid(data) {
if (data) { if (data) {
await recipeService.GetCurrent();
await warmersService.GetChannels();
await warmersService.GetThermocameraStatus(); await warmersService.GetThermocameraStatus();
// await recipeService.GetOverview(); // await recipeService.GetOverview();
} }
@@ -231,11 +235,14 @@ export class Hub {
prodActions.setProd(store, data); prodActions.setProd(store, data);
} }
public updateAuthToken() { public updateAuthToken() {
// Set or update authorization token // Set or update authorization token
let authData = JSON.parse(window.localStorage.getItem("authorizationData") || window.sessionStorage.getItem("authorizationData")) as AuthToken; let authData = JSON.parse(window.localStorage.getItem("authorizationData") || window.sessionStorage.getItem("authorizationData")) as AuthToken;
$.connection.hub.qs = {}; $.connection.hub.qs = {};
console.log(authData);
if (authData) if (authData)
$.connection.hub.qs.Authorization = authData.access_token; $.connection.hub.qs.Authorization = authData.access_token;
@@ -243,6 +250,7 @@ export class Hub {
$.connection.hub.qs.CmsClientId = cmsClient.getClientID; $.connection.hub.qs.CmsClientId = cmsClient.getClientID;
} }
private logout(e) { private logout(e) {
if (e) if (e)
appModelActions.CheckLogoff(store, e.id); appModelActions.CheckLogoff(store, e.id);
@@ -90,5 +90,10 @@ export class WarmersService extends baseRestService {
async ResetMeasurePoints() { async ResetMeasurePoints() {
return this.Put((await this.BASE_URL()) + `resetMeasurePoint`, null, true); return this.Put((await this.BASE_URL()) + `resetMeasurePoint`, null, true);
} }
async TakeNewPhoto() {
return this.Put((await this.BASE_URL()) + `TakeTcamImage`, null, true);
}
} }
export const warmersService = new WarmersService(); export const warmersService = new WarmersService();