Merge branch 'IobMan' into develop
This commit is contained in:
+46
-6
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
|
||||
@@ -6,14 +6,54 @@
|
||||
<appSettings>
|
||||
<add key="appName" value="IOB-MAN" />
|
||||
<add key="checkPeriod" value="20" />
|
||||
<add key="chekMult" value="25"/>
|
||||
<add key="watchDogMult" value="500"/>
|
||||
<add key="autoRestartTimeoutMin" value="15"/>
|
||||
<add key="autoStartProc" value="true"/>
|
||||
<add key="closeOnChildUpdate" value="true"/>
|
||||
<add key="chekMult" value="25" />
|
||||
<add key="watchDogMult" value="500" />
|
||||
<add key="autoRestartTimeoutMin" value="15" />
|
||||
<add key="autoStartProc" value="true" />
|
||||
<add key="closeOnChildUpdate" value="true" />
|
||||
<add key="targetExe" value="C:\Steamware\IOB-WIN\IOB-WIN.exe" />
|
||||
<add key="BaseArg" value="MODE=MAN IOB=" />
|
||||
<add key="ArgsList" value="SIMUL_00,SIMUL_00" />
|
||||
<add key="ArgsConfFile" value="/CONF/process.json" />
|
||||
</appSettings>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="SharpCompress" publicKeyToken="afb0a02973931d96" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-0.24.0.0" newVersion="0.24.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.IO.Pipelines" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Threading.Channels" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
@@ -0,0 +1,12 @@
|
||||
---------------------------------------------------------------
|
||||
------- SteamWareLib SDK -------
|
||||
---------------------------------------------------------------
|
||||
|
||||
Libreria di utility base di SteamWare.
|
||||
|
||||
Le dipendenze inserite sono necessarie al funzionamento dell'SDK.
|
||||
|
||||
Sono inclusi a titolo di esempio vari files di conf:
|
||||
* example-NLog.config
|
||||
|
||||
Attenzione a configurare correttamente il file NLog.xml includendo il rule per la classe, vedere ad esempio il file example-NLog.config allegato.
|
||||
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
|
||||
autoReload="true"
|
||||
throwExceptions="false"
|
||||
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log" >
|
||||
|
||||
|
||||
<!-- optional, add some variabeles
|
||||
https://github.com/nlog/NLog/wiki/Configuration-file#variables
|
||||
-->
|
||||
<variable name="myvar" value="myvalue"/>
|
||||
|
||||
<!--
|
||||
See https://github.com/nlog/nlog/wiki/Configuration-file
|
||||
for information on customizing logging rules and outputs.
|
||||
-->
|
||||
|
||||
<targets async="true">
|
||||
<target xsi:type="File"
|
||||
name="SteamWareLib"
|
||||
fileName="${basedir}/logs/${shortdate}-SteamWare.log"
|
||||
layout="${longdate} ${uppercase:${level}} ${message}"
|
||||
/>
|
||||
</targets>
|
||||
|
||||
<rules>
|
||||
<logger name="SteamWare.*" minlevel="Debug" writeTo="SteamWareLib" />
|
||||
</rules>
|
||||
</nlog>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
|
||||
<connectionStrings>
|
||||
<add name="SteamWare.Properties.Settings.loggerConnectionString" connectionString="Data Source=SQL2012DEV;Initial Catalog=Flamma_SC;Persist Security Info=True;User ID=sa;Password=keyhammer16;" providerName="System.Data.SqlClient" />
|
||||
<add name="SteamWare.Properties.Settings.SteamWare_VocabolarioConnectionString" connectionString="Data Source=SQL2012DEV;Initial Catalog=SteamWare_Vocabolario;Persist Security Info=True;User ID=sa;Password=keyhammer16;" providerName="System.Data.SqlClient" />
|
||||
<add name="SteamWare.Properties.Settings.DS_AuthConnectionString" connectionString="Data Source=SQL2012DEV;Initial Catalog=SteamWare_Anagrafica;Persist Security Info=True;User ID=sa;Password=keyhammer16;" providerName="System.Data.SqlClient" />
|
||||
<add name="SteamWare.Properties.Settings.AnagraficaBremboConnectionString" connectionString="Data Source=SQL2012DEV;Initial Catalog=AnagraficaBrembo;Persist Security Info=True;User ID=sa;Password=keyhammer16;" providerName="System.Data.SqlClient" />
|
||||
<add name="SteamWare.Properties.Settings.SteamWare_BremboConnectionString" connectionString="Data Source=SQL2012DEV;Initial Catalog=SteamWare_Brembo;Persist Security Info=True;User ID=sa;Password=keyhammer16;" providerName="System.Data.SqlClient" />
|
||||
<add name="SteamWare.Properties.Settings.Flamma_AnagraficaConnectionString" connectionString="Data Source=SQL2012DEV;Initial Catalog=Flamma_Anagrafica;Persist Security Info=True;User ID=sa;Password=keyhammer16;" providerName="System.Data.SqlClient" />
|
||||
<add name="SteamWare.Properties.Settings.AnagraficaConnectionString" connectionString="Data Source=SQL2012DEV;Initial Catalog=SteamWare_Anagrafica;Persist Security Info=True;User ID=sa;Password=keyhammer16;" providerName="System.Data.SqlClient" />
|
||||
<add name="SteamWare.Properties.Settings.SEL_fatture_SteamWareConnectionString" connectionString="Data Source=SQLSTEAM;Initial Catalog=SEL_fatture_SteamWare;User ID=sa;Password=keyhammer;Encrypt=False;TrustServerCertificate=True" providerName="System.Data.SqlClient" />
|
||||
<add name="SteamWare.Properties.Settings.Equa_AnagraficaConnectionString" connectionString="Data Source=SQL2012DEV;Initial Catalog=Equa_Anagrafica;Persist Security Info=True;User ID=sa;Password=keyhammer16;" providerName="System.Data.SqlClient" />
|
||||
<add name="SteamWare.Properties.Settings.GMWConnectionString" connectionString="Data Source=SQL2012DEV;Initial Catalog=GMW;Persist Security Info=True;User ID=sa;Password=keyhammer16;" providerName="System.Data.SqlClient" />
|
||||
<add name="SteamWare.Properties.Settings.MoonProConnectionString" connectionString="Data Source=SQL2016DEV;Initial Catalog=MoonPro;Persist Security Info=True;User ID=sa;Password=keyhammer16" providerName="System.Data.SqlClient" />
|
||||
<add name="SteamWare.Properties.Settings.DbConfConnectionString" connectionString="Data Source=SQL2016DEV;Initial Catalog=MoonPro;Persist Security Info=True;User ID=sa;Password=keyhammer16" providerName="System.Data.SqlClient" />
|
||||
</connectionStrings>
|
||||
</configuration>
|
||||
@@ -0,0 +1,30 @@
|
||||
# chiave valore valoreStd note
|
||||
_adminEmail samuele@steamware.net,info@steamware.net samuele@steamware.net,info@steamware.net info@steamware.net
|
||||
_allowForceUser true true abilita login forzato
|
||||
_commonPages menu menu pagina comune
|
||||
_emailPwd drmfsls16 drmfsls16 drmfsls16
|
||||
_emailUser steamwarebot@gmail.com steamwarebot@gmail.com steamwarebot@gmail.com
|
||||
_enableSSL true true true
|
||||
_fromEmail webmaster@admodelling.org webmaster@admodelling.org email mittente eventuali msg
|
||||
_righeDataGrid 30 30 Num righe datagrid std
|
||||
_righeDataGridAnagr 20 20 Num righe datagrid anagrafiche
|
||||
_righeDataGridLong 30 30 Num righe datagrid long
|
||||
_righeDataGridMed 15 15 Num righe datagrid med
|
||||
_righeDataGridShort 10 10 Num righe datagrid short
|
||||
_smtpCli smtp.gmail.com smtp.gmail.com smtp.gmail.com
|
||||
_useAIMSmtp false false impiego client posta elettronica alternativo
|
||||
_useAuthSmtp true true true
|
||||
AuthCookieName admodellingAuth admodellingAuth Cookie applicativo
|
||||
autoConfCmd true true Conferma automatica comandi barcode
|
||||
baseUrl http://site_name http://iis02/site_name URL base del sito
|
||||
cacheValSec 60 60 Validità cache dati in gestore Barcode
|
||||
cookieDayExp 365 365 Periodo validità cookie
|
||||
cookieUsed admodellingAuth admodellingAuth,CTrack_CodOpr,CTrack_CodPost Elenco dei cookie impiegati
|
||||
enableCookie true true Abilitazione uso cookie
|
||||
enableLogOut true false Abilita button logout COMPLETO in alto a sx
|
||||
enablePlain true true Abilitazione decode plain
|
||||
maxAuth 1000 1000 num auth minimo per NON consumare tokens
|
||||
serializeSession true true Serializzazione valori in sessione (REDIS)
|
||||
SiteName iis02/site_name iis02/site_name Nome sito
|
||||
enableDumpDiag false false abilitazione dumb diagnostico x eccezioni di default
|
||||
doShrinkFolder true true Imposta compressione area LOGS
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
@@ -38,22 +38,101 @@
|
||||
<ApplicationIcon>IobManIcon.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="AegisImplicitMail, Version=1.0.3.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\AIM.1.0.3\lib\AegisImplicitMail.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="AjaxControlToolkit, Version=19.1.0.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\AjaxControlToolkit.19.1.0\lib\net40\AjaxControlToolkit.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Costura, Version=4.1.0.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Costura.Fody.4.1.0\lib\net40\Costura.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Crc32C.NET, Version=1.0.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Crc32C.NET.1.0.5.0\lib\net20\Crc32C.NET.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="DnsClient, Version=1.2.0.0, Culture=neutral, PublicKeyToken=4574bb5573c51424, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\DnsClient.1.2.0\lib\net45\DnsClient.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="ICSharpCode.SharpZipLib, Version=1.2.0.246, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\SharpZipLib.1.2.0\lib\net45\ICSharpCode.SharpZipLib.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MapoSDK, Version=6.9.1912.1271, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MapoSDK.6.9.1912.1271\lib\net40\MapoSDK.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MongoDB.Bson, Version=2.10.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MongoDB.Bson.2.10.0\lib\net452\MongoDB.Bson.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MongoDB.Driver, Version=2.10.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MongoDB.Driver.2.10.0\lib\net452\MongoDB.Driver.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MongoDB.Driver.Core, Version=2.10.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MongoDB.Driver.Core.2.10.0\lib\net452\MongoDB.Driver.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MongoDB.Libmongocrypt, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MongoDB.Libmongocrypt.1.0.0\lib\net452\MongoDB.Libmongocrypt.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NLog.4.6.8\lib\net45\NLog.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PdfSharp, Version=1.50.5147.0, Culture=neutral, PublicKeyToken=f94615aa0424f9eb, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\PDFsharp.1.50.5147\lib\net20\PdfSharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PdfSharp.Charting, Version=1.50.5147.0, Culture=neutral, PublicKeyToken=f94615aa0424f9eb, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\PDFsharp.1.50.5147\lib\net20\PdfSharp.Charting.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Pipelines.Sockets.Unofficial, Version=1.0.0.0, Culture=neutral, PublicKeyToken=42ea0a778e13fbe2, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Pipelines.Sockets.Unofficial.2.1.1\lib\net461\Pipelines.Sockets.Unofficial.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SharpCompress, Version=0.24.0.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\SharpCompress.0.24.0\lib\net45\SharpCompress.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Snappy.NET, Version=1.1.1.8, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Snappy.NET.1.1.1.8\lib\net45\Snappy.NET.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="StackExchange.Redis, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c219ff1ca8c2ce46, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\StackExchange.Redis.2.0.601\lib\net461\StackExchange.Redis.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Buffers.4.5.0\lib\netstandard2.0\System.Buffers.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Diagnostics.PerformanceCounter, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Diagnostics.PerformanceCounter.4.7.0\lib\net461\System.Diagnostics.PerformanceCounter.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.IO.Compression" />
|
||||
<Reference Include="System.IO.Pipelines, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.IO.Pipelines.4.7.0\lib\netstandard2.0\System.IO.Pipelines.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Numerics" />
|
||||
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.Serialization" />
|
||||
<Reference Include="System.ServiceModel" />
|
||||
<Reference Include="System.Threading.Channels, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Threading.Channels.4.7.0\lib\netstandard2.0\System.Threading.Channels.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Transactions" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
@@ -78,7 +157,11 @@
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="utils.cs" />
|
||||
<Content Include="App_Readme\README_SteamWare.txt" />
|
||||
<Content Include="App_Readme\SteamWare_demo\example-config-table.txt" />
|
||||
<Content Include="App_Readme\SteamWare_demo\example-favicon.ico" />
|
||||
<Content Include="IobManIcon.ico" />
|
||||
<Content Include="mongocrypt.dll" />
|
||||
<Content Include="Resources\IobManIcon.ico">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
@@ -94,6 +177,8 @@
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<None Include="App_Readme\SteamWare_demo\example-app.config" />
|
||||
<None Include="App_Readme\SteamWare_demo\example-NLog.config" />
|
||||
<None Include="CONF\.placeholder">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
@@ -132,6 +217,10 @@
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props'))" />
|
||||
<Error Condition="!Exists('..\packages\Fody.6.0.5\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.6.0.5\build\Fody.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\MongoDB.Libmongocrypt.1.0.0\build\MongoDB.Libmongocrypt.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MongoDB.Libmongocrypt.1.0.0\build\MongoDB.Libmongocrypt.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets'))" />
|
||||
</Target>
|
||||
<Import Project="..\packages\Fody.6.0.5\build\Fody.targets" Condition="Exists('..\packages\Fody.6.0.5\build\Fody.targets')" />
|
||||
<Import Project="..\packages\MongoDB.Libmongocrypt.1.0.0\build\MongoDB.Libmongocrypt.targets" Condition="Exists('..\packages\MongoDB.Libmongocrypt.1.0.0\build\MongoDB.Libmongocrypt.targets')" />
|
||||
<Import Project="..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
|
||||
</Project>
|
||||
@@ -1,9 +1,36 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="AIM" version="1.0.3" targetFramework="net461" />
|
||||
<package id="AjaxControlToolkit" version="19.1.0" targetFramework="net461" />
|
||||
<package id="Costura.Fody" version="4.1.0" targetFramework="net461" />
|
||||
<package id="Crc32C.NET" version="1.0.5.0" targetFramework="net461" />
|
||||
<package id="DnsClient" version="1.2.0" targetFramework="net461" />
|
||||
<package id="Fody" version="6.0.5" targetFramework="net461" developmentDependency="true" />
|
||||
<package id="MapoSDK" version="6.9.1912.1271" targetFramework="net461" />
|
||||
<package id="Microsoft.NETCore.Platforms" version="3.1.0" targetFramework="net461" />
|
||||
<package id="MongoDB.Bson" version="2.10.0" targetFramework="net461" />
|
||||
<package id="MongoDB.Driver" version="2.10.0" targetFramework="net461" />
|
||||
<package id="MongoDB.Driver.Core" version="2.10.0" targetFramework="net461" />
|
||||
<package id="MongoDB.Libmongocrypt" version="1.0.0" targetFramework="net461" />
|
||||
<package id="NETStandard.Library" version="2.0.3" targetFramework="net461" />
|
||||
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net461" />
|
||||
<package id="NLog" version="4.6.8" targetFramework="net461" />
|
||||
<package id="NLog.Config" version="4.6.8" targetFramework="net461" />
|
||||
<package id="NLog.Schema" version="4.6.8" targetFramework="net461" />
|
||||
<package id="PDFsharp" version="1.50.5147" targetFramework="net461" />
|
||||
<package id="Pipelines.Sockets.Unofficial" version="2.1.1" targetFramework="net461" />
|
||||
<package id="SharpCompress" version="0.24.0" targetFramework="net461" />
|
||||
<package id="SharpZipLib" version="1.2.0" targetFramework="net461" />
|
||||
<package id="Snappy.NET" version="1.1.1.8" targetFramework="net461" />
|
||||
<package id="StackExchange.Redis" version="2.0.601" targetFramework="net461" />
|
||||
<package id="SteamWare" version="3.5.1912.708" targetFramework="net461" />
|
||||
<package id="System.Buffers" version="4.5.0" targetFramework="net461" />
|
||||
<package id="System.Diagnostics.PerformanceCounter" version="4.7.0" targetFramework="net461" />
|
||||
<package id="System.IO.Pipelines" version="4.7.0" targetFramework="net461" />
|
||||
<package id="System.Memory" version="4.5.3" targetFramework="net461" />
|
||||
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net461" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="4.7.0" targetFramework="net461" />
|
||||
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net461" />
|
||||
<package id="System.Threading.Channels" version="4.7.0" targetFramework="net461" />
|
||||
<package id="System.Threading.Tasks.Extensions" version="4.5.3" targetFramework="net461" />
|
||||
</packages>
|
||||
+319
@@ -0,0 +1,319 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace IOB_UT
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Tipologie di DUMP memoria
|
||||
/// </summary>
|
||||
public enum dumpType
|
||||
{
|
||||
/// <summary>
|
||||
/// Salvataggio all'avvio aree memoria (con sovrascrittura)
|
||||
/// </summary>
|
||||
STARTUP,
|
||||
/// <summary>
|
||||
/// Campionamento periodico
|
||||
/// </summary>
|
||||
SAMPLE
|
||||
}
|
||||
/// <summary>
|
||||
/// Tipologia di adapters ammessi
|
||||
/// </summary>
|
||||
public enum tipoAdapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Adapter SIMULAZIONE
|
||||
/// </summary>
|
||||
SIMULA,
|
||||
/// <summary>
|
||||
/// adapter FANUC
|
||||
/// </summary>
|
||||
FANUC,
|
||||
/// <summary>
|
||||
/// adapter KAWASAKI e-controller
|
||||
/// </summary>
|
||||
KAWASAKI,
|
||||
/// <summary>
|
||||
/// Adapter non specificato
|
||||
/// </summary>
|
||||
ND,
|
||||
/// <summary>
|
||||
/// Adapter MTConnect
|
||||
/// </summary>
|
||||
MTConnect,
|
||||
/// <summary>
|
||||
/// Adapter OMRON
|
||||
/// </summary>
|
||||
OMRON,
|
||||
/// <summary>
|
||||
/// Adapter OSAI CNDEX (Cndex)
|
||||
/// </summary>
|
||||
OSAI_CNDEX,
|
||||
/// <summary>
|
||||
/// Adapter OSAI OPEN (ws)
|
||||
/// </summary>
|
||||
OSAI_OPEN,
|
||||
/// <summary>
|
||||
/// Adapter OSAI VB6
|
||||
/// </summary>
|
||||
OSAI_VB6,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS
|
||||
/// </summary>
|
||||
SIEMENS,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione APROCHIM (filtro liquidi rettifiche)
|
||||
/// </summary>
|
||||
SIEMENS_APROCHIM,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione VIPA @2001
|
||||
/// </summary>
|
||||
SIEMENS_AT2001,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione FAPE (punzonatrici)
|
||||
/// </summary>
|
||||
SIEMENS_FAPE,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione COMUR (dentatrice)
|
||||
/// </summary>
|
||||
SIEMENS_COMUR,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione INGENIA (Valvital, Automazione)
|
||||
/// </summary>
|
||||
SIEMENS_INGENIA,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione LASCO (Valvital, Pressa Bilancere)
|
||||
/// </summary>
|
||||
SIEMENS_LASCO,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione PRESSOIL + CEI (Valvital, Pressa Idraulica)
|
||||
/// </summary>
|
||||
SIEMENS_PRESSOIL_CEI,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione SAET (Valvital, forni / tempra)
|
||||
/// </summary>
|
||||
SIEMENS_SAET,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione Torri
|
||||
/// </summary>
|
||||
SIEMENS_TORRI,
|
||||
/// <summary>
|
||||
/// Metodi di WPS WebPageScraping (es x compressori Atlas Copco)
|
||||
/// </summary>
|
||||
WPS
|
||||
}
|
||||
/// <summary>
|
||||
/// Tipo di ciclo da processare
|
||||
/// </summary>
|
||||
public enum gatherCycle
|
||||
{
|
||||
/// <summary>
|
||||
/// Very High Frequency (solo x invii...)
|
||||
/// </summary>
|
||||
VHF,
|
||||
/// <summary>
|
||||
/// lettura dati ad alta frequenza
|
||||
/// </summary>
|
||||
HF,
|
||||
/// <summary>
|
||||
/// lettura dati standard
|
||||
/// </summary>
|
||||
MF,
|
||||
/// <summary>
|
||||
/// lettura dati bassa freq
|
||||
/// </summary>
|
||||
LF,
|
||||
/// <summary>
|
||||
/// lettura dati bassissima priorità (re-sync stato allarmi)
|
||||
/// </summary>
|
||||
VLF
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// StFlag8: set di 8 bit (1 word) contente semaforo di variabili
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum StFlag8 : int
|
||||
{
|
||||
NONE = 0,
|
||||
B0 = 1 << 0,
|
||||
B1 = 1 << 1,
|
||||
B2 = 1 << 2,
|
||||
B3 = 1 << 3,
|
||||
B4 = 1 << 4,
|
||||
B5 = 1 << 5,
|
||||
B6 = 1 << 6,
|
||||
B7 = 1 << 7
|
||||
}
|
||||
/// <summary>
|
||||
/// StFlag32: set di 32 bit (4 word) contente semaforo di variabili
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum StFlag32 : int
|
||||
{
|
||||
NONE = 0,
|
||||
B00 = 1 << 0,
|
||||
B01 = 1 << 1,
|
||||
B02 = 1 << 2,
|
||||
B03 = 1 << 3,
|
||||
B04 = 1 << 4,
|
||||
B05 = 1 << 5,
|
||||
B06 = 1 << 6,
|
||||
B07 = 1 << 7,
|
||||
B08 = 1 << 8,
|
||||
B09 = 1 << 9,
|
||||
B10 = 1 << 10,
|
||||
B11 = 1 << 11,
|
||||
B12 = 1 << 12,
|
||||
B13 = 1 << 13,
|
||||
B14 = 1 << 14,
|
||||
B15 = 1 << 15,
|
||||
B16 = 1 << 16,
|
||||
B17 = 1 << 17,
|
||||
B18 = 1 << 18,
|
||||
B19 = 1 << 19,
|
||||
B20 = 1 << 20,
|
||||
B21 = 1 << 21,
|
||||
B22 = 1 << 22,
|
||||
B23 = 1 << 23,
|
||||
B24 = 1 << 24,
|
||||
B25 = 1 << 25,
|
||||
B26 = 1 << 26,
|
||||
B27 = 1 << 27,
|
||||
B28 = 1 << 28,
|
||||
B29 = 1 << 29,
|
||||
B30 = 1 << 30,
|
||||
B31 = 1 << 31
|
||||
}
|
||||
/// <summary>
|
||||
/// Enumerazione tipi di semaforo
|
||||
/// </summary>
|
||||
public enum Semaforo
|
||||
{
|
||||
/// <summary>
|
||||
/// Stato non definito
|
||||
/// </summary>
|
||||
ND,
|
||||
/// <summary>
|
||||
/// Verde
|
||||
/// </summary>
|
||||
SV,
|
||||
/// <summary>
|
||||
/// Giallo
|
||||
/// </summary>
|
||||
SG,
|
||||
/// <summary>
|
||||
/// Rosso
|
||||
/// </summary>
|
||||
SR,
|
||||
/// <summary>
|
||||
/// Grigio/Spento
|
||||
/// </summary>
|
||||
SS
|
||||
}
|
||||
/// <summary>
|
||||
/// Enumerazione tipi di tipi di URL x invio
|
||||
/// </summary>
|
||||
public enum urlType
|
||||
{
|
||||
/// <summary>
|
||||
/// Salvataggio FluxLog (valori estesi che non provocano calcoli di macchine a stati, eventi...)
|
||||
/// </summary>
|
||||
FLog,
|
||||
/// <summary>
|
||||
/// INPUT segnali in ingresso (standard base MAPO)
|
||||
/// </summary>
|
||||
SignIN
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco STATI CNC OSAI
|
||||
/// </summary>
|
||||
public enum CNC_STATUS_OSAI
|
||||
{
|
||||
IDLE = 1,
|
||||
CYCLE,
|
||||
HODA,
|
||||
RUNH,
|
||||
HRUN,
|
||||
ERRO,
|
||||
WAIT,
|
||||
RESET,
|
||||
EMERG,
|
||||
INPUT
|
||||
}
|
||||
/// <summary>
|
||||
/// Elenco MODI CNC
|
||||
/// </summary>
|
||||
public enum CNC_MODE
|
||||
{
|
||||
/// <summary>
|
||||
/// Non definito
|
||||
/// </summary>
|
||||
ND = 0,
|
||||
/// <summary>
|
||||
/// AUTOMATICO
|
||||
/// </summary>
|
||||
AUTO,
|
||||
/// <summary>
|
||||
/// EDIT (MEMORY EDIT)
|
||||
/// </summary>
|
||||
EDIT,
|
||||
/// <summary>
|
||||
/// MEN (MEMORY OPERATION)
|
||||
/// </summary>
|
||||
MEN,
|
||||
/// <summary>
|
||||
/// MDI (MANUAL DATA INPUT)
|
||||
/// </summary>
|
||||
MDI,
|
||||
/// <summary>
|
||||
/// HANDLE/INC (MANUAL HANDLE / INCREMENTAL FEED)
|
||||
/// </summary>
|
||||
HANDLE_INC,
|
||||
/// <summary>
|
||||
/// HOME
|
||||
/// </summary>
|
||||
HOME,
|
||||
/// <summary>
|
||||
/// JOG (MANUAL CONTINUOUS FEED)
|
||||
/// </summary>
|
||||
JOG,
|
||||
/// <summary>
|
||||
/// JOG MAN
|
||||
/// </summary>
|
||||
JOG_MAN,
|
||||
/// <summary>
|
||||
/// JOG_INC
|
||||
/// </summary>
|
||||
JOG_INC,
|
||||
/// <summary>
|
||||
/// PROFILE
|
||||
/// </summary>
|
||||
PROFILE,
|
||||
/// <summary>
|
||||
/// SEMI
|
||||
/// </summary>
|
||||
SEMI,
|
||||
/// <summary>
|
||||
/// THND (TEACH IN HANDLE)
|
||||
/// </summary>
|
||||
THND,
|
||||
/// <summary>
|
||||
/// TJOG (TEACH IN JOG)
|
||||
/// </summary>
|
||||
TJOG,
|
||||
/// <summary>
|
||||
/// RMT (DNC OPERATION)
|
||||
/// </summary>
|
||||
RMT,
|
||||
/// <summary>
|
||||
/// REF (MANUAL REFERENCE POSITION RETURN)
|
||||
/// </summary>
|
||||
REF
|
||||
}
|
||||
}
|
||||
@@ -100,8 +100,10 @@
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="BinaryFormatter.cs" />
|
||||
<Compile Include="Enums.cs" />
|
||||
<Compile Include="fileMover.cs" />
|
||||
<Compile Include="IniFile.cs" />
|
||||
<Compile Include="Objects.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -0,0 +1,510 @@
|
||||
using MapoSDK;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace IOB_UT
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto timing x archiviazione dati perfomances
|
||||
/// </summary>
|
||||
public class TimeRec
|
||||
{
|
||||
/// <summary>
|
||||
/// Classe chiamante della funzione (es codice univoco IOB)
|
||||
/// </summary>
|
||||
public string classCall;
|
||||
/// <summary>
|
||||
/// Codice univoco chiamata: tipo R4 (read 4 byte), W2 (write 2 Byte)
|
||||
/// </summary>
|
||||
public string codCall;
|
||||
/// <summary>
|
||||
/// Num chiamate totale
|
||||
/// </summary>
|
||||
public int numCall;
|
||||
/// <summary>
|
||||
/// Tempo medio chiamata
|
||||
/// </summary>
|
||||
public double avgMsec
|
||||
{
|
||||
get
|
||||
{
|
||||
return totMsec.TotalMilliseconds / numCall;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Totale Msec accumulati
|
||||
/// </summary>
|
||||
public TimeSpan totMsec;
|
||||
/// <summary>
|
||||
/// Classe record timing
|
||||
/// </summary>
|
||||
public TimeRec()
|
||||
{
|
||||
codCall = "";
|
||||
numCall = 0;
|
||||
totMsec = new TimeSpan(0);
|
||||
}
|
||||
/// <summary>
|
||||
/// Classe record timing
|
||||
/// </summary>
|
||||
/// <param name="caller"></param>
|
||||
/// <param name="codice"></param>
|
||||
/// <param name="ticks"></param>
|
||||
public TimeRec(string caller, string codice, long nTicks)
|
||||
{
|
||||
classCall = caller;
|
||||
codCall = codice;
|
||||
numCall = 1;
|
||||
totMsec = new TimeSpan(nTicks);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Classe gestione valori campionati su periodo
|
||||
/// </summary>
|
||||
public class sampleVect
|
||||
{
|
||||
/// <summary>
|
||||
/// Dimensione finestra di campionamento (secondi)
|
||||
/// </summary>
|
||||
protected int windSize;
|
||||
/// <summary>
|
||||
/// vettore valori temporali della serie
|
||||
/// </summary>
|
||||
protected List<DateTime> lTime;
|
||||
/// <summary>
|
||||
/// vettore valoti puntuali della serie
|
||||
/// </summary>
|
||||
protected List<int> lVal;
|
||||
/// <summary>
|
||||
/// Inizializzo l'oggetto
|
||||
/// </summary>
|
||||
public sampleVect()
|
||||
{
|
||||
// init valori default...
|
||||
windSize = baseUtils.CRI("countWindSize") > 0 ? baseUtils.CRI("countWindSize") : 60;
|
||||
lTime = new List<DateTime>();
|
||||
lVal = new List<int>();
|
||||
}
|
||||
/// <summary>
|
||||
/// Conteggio elementi
|
||||
/// </summary>
|
||||
protected int numElem
|
||||
{
|
||||
get
|
||||
{
|
||||
int answ = 0;
|
||||
try
|
||||
{
|
||||
answ = lTime.Count;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Verifica ampiezza finestra valori First-Last
|
||||
/// </summary>
|
||||
protected double flWindSize
|
||||
{
|
||||
get
|
||||
{
|
||||
double answ = 0;
|
||||
if (numElem > 1)
|
||||
{
|
||||
answ = lTime.Last().Subtract(lTime[0]).TotalSeconds;
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Verifica ampiezza finestra valori Second-Last
|
||||
/// </summary>
|
||||
protected double slWindSize
|
||||
{
|
||||
get
|
||||
{
|
||||
double answ = 0;
|
||||
if (numElem > 2) // altrimenti SE non ne ho almeno 3 NON posso avere secondo/ultimo...
|
||||
{
|
||||
|
||||
answ = lTime.Last().Subtract(lTime[1]).TotalSeconds;
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Aggiunge un valore alla serie ed eventualmente elimina i valori superflui a garantirne una finestra temporale valida
|
||||
/// </summary>
|
||||
/// <param name="tempo"></param>
|
||||
/// <param name="valore"></param>
|
||||
public void addValue(DateTime tempo, int valore)
|
||||
{
|
||||
lTime.Add(tempo);
|
||||
lVal.Add(valore);
|
||||
// verifico se siano da accorciare le serie... ovvero i 2 intervalli ENTRAMBI sono superiori al periodo minimo (in tal caso riduco..
|
||||
while (flWindSize > windSize && slWindSize > windSize)
|
||||
{
|
||||
// elimino i 2 valori + vecchi
|
||||
lTime.RemoveAt(0);
|
||||
lVal.RemoveAt(0);
|
||||
// ora ricontrollo...
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Calcola il valore mediano...
|
||||
/// </summary>
|
||||
public double vcMedian
|
||||
{
|
||||
get
|
||||
{
|
||||
double answ = 0;
|
||||
// restituisce la mediana SE valida, altrimenti null...
|
||||
if (numElem > 2 && flWindSize > windSize)
|
||||
{
|
||||
try
|
||||
{
|
||||
// calcolo mediana!
|
||||
//answ = Statistics.Median(lVal.ToArray());
|
||||
|
||||
// rif: https://blogs.msmvps.com/deborahk/linq-mean-median-and-mode/
|
||||
var sortedNumbers = lVal.OrderBy(n => n);
|
||||
int numCount = lVal.Count;
|
||||
int indice50 = lVal.Count / 2;
|
||||
if ((numCount % 2) == 0)
|
||||
{
|
||||
answ = ((sortedNumbers.ElementAt(indice50) + sortedNumbers.ElementAt(indice50 - 1)) / 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = sortedNumbers.ElementAt(indice50);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Verifica se la vc sia valida (ovvero almeno 2 valori e intervallo > window richiesta)
|
||||
/// </summary>
|
||||
public bool vcValid
|
||||
{
|
||||
get
|
||||
{
|
||||
return (flWindSize > windSize && numElem > 1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// GEstione dati di timing
|
||||
/// </summary>
|
||||
public static class TimingData
|
||||
{
|
||||
public static List<TimeRec> results = new List<TimeRec>();
|
||||
|
||||
/// <summary>
|
||||
/// aggiorno vettore aggiungendo risultato
|
||||
/// </summary>
|
||||
/// <param name="caller">Codice chiamante</param>
|
||||
/// <param name="codice">Codice da registrare (univoco con chiamante)</param>
|
||||
/// <param name="ticks">Tempo esecuzione in ticks</param>
|
||||
public static void addResult(string caller, string codice, long ticks)
|
||||
{
|
||||
if (results.Count == 0)
|
||||
{
|
||||
results.Add(new TimeRec(caller, codice, ticks));
|
||||
}
|
||||
int indice = -1;
|
||||
for (int i = 0; i < results.Count; i++)
|
||||
{
|
||||
// se il codice è quello cercato...
|
||||
if (results[i].codCall == codice && results[i].classCall == caller)
|
||||
{
|
||||
indice = i;
|
||||
}
|
||||
}
|
||||
// se c'è aggiorno...
|
||||
if (indice >= 0)
|
||||
{
|
||||
results[indice].numCall++;
|
||||
results[indice].totMsec = results[indice].totMsec.Add(new TimeSpan(ticks));
|
||||
}
|
||||
// altrimenti aggiungo...
|
||||
else
|
||||
{
|
||||
results.Add(new TimeRec(caller, codice, ticks));
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Resetta i dati registrati (ad avvio adapter...)
|
||||
/// </summary>
|
||||
public static void resetData()
|
||||
{
|
||||
results = new List<TimeRec>();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Gestione Endianness
|
||||
/// </summary>
|
||||
public static class Endian
|
||||
{
|
||||
/// <summary>
|
||||
/// Scambia MSB/LSB per 16bit
|
||||
/// </summary>
|
||||
/// <param name="inValue"></param>
|
||||
/// <returns></returns>
|
||||
public static UInt16 SwapUInt16(UInt16 inValue)
|
||||
{
|
||||
return (UInt16)(((inValue & 0xff00) >> 8) |
|
||||
((inValue & 0x00ff) << 8));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Scambia MSB/LSB per 32bit
|
||||
/// </summary>
|
||||
/// <param name="inValue"></param>
|
||||
/// <returns></returns>
|
||||
public static UInt32 SwapUInt32(UInt32 inValue)
|
||||
{
|
||||
return ((inValue & 0xff000000) >> 24) |
|
||||
((inValue & 0x00ff0000) >> 8) |
|
||||
((inValue & 0x0000ff00) << 8) |
|
||||
((inValue & 0x000000ff) << 24);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Classe conf x item DynData
|
||||
/// </summary>
|
||||
public class DynDataItem
|
||||
{
|
||||
public string key { get; set; } = "";
|
||||
public string name { get; set; } = "";
|
||||
public string val { get; set; } = "";
|
||||
public string unit { get; set; } = "";
|
||||
public string func { get; set; } = "";
|
||||
public int sPeriod { get; set; } = 60;
|
||||
/// <summary>
|
||||
/// Valore effettivo da salvare
|
||||
/// </summary>
|
||||
public string actVal { get; set; } = "";
|
||||
/// <summary>
|
||||
/// DataOra scadenza invio forzato
|
||||
/// </summary>
|
||||
public DateTime DTScad = DateTime.Now;
|
||||
}
|
||||
/// <summary>
|
||||
/// Classe conf x decodifica stsatus
|
||||
/// </summary>
|
||||
public class StatusItem : DynDataItem
|
||||
{
|
||||
public Dictionary<string, string> codeMapping;
|
||||
}
|
||||
/// <summary>
|
||||
/// Classe conf server html
|
||||
/// </summary>
|
||||
public class srvData
|
||||
{
|
||||
public string baseUri { get; set; } = "";
|
||||
public string driverName { get; set; } = "";
|
||||
}
|
||||
/// <summary>
|
||||
/// Elenco oggetti del monitoraggio (DynData, Status)
|
||||
/// </summary>
|
||||
public class MonitoredItemsConf
|
||||
{
|
||||
public srvData SrvData { get; set; }
|
||||
public List<DynDataItem> DynData { get; set; }
|
||||
public List<StatusItem> Status { get; set; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Configurazione per Eventi/Variabili
|
||||
/// </summary>
|
||||
public class EVData
|
||||
{
|
||||
/// <summary>
|
||||
/// Unità di misura
|
||||
/// </summary>
|
||||
public string UM { get; set; } = "num";
|
||||
/// <summary>
|
||||
/// Valore salvato
|
||||
/// </summary>
|
||||
public string Val { get; set; } = "";
|
||||
/// <summary>
|
||||
/// DataOra scadenza invio forzato
|
||||
/// </summary>
|
||||
public DateTime DTScad = DateTime.Now;
|
||||
}
|
||||
/// <summary>
|
||||
/// Configurazione per Variabili Casuali
|
||||
/// </summary>
|
||||
public class VCData
|
||||
{
|
||||
/// <summary>
|
||||
/// Periodo di riferimento
|
||||
/// </summary>
|
||||
public int Period { get; set; } = 60;
|
||||
/// <summary>
|
||||
/// Tipologia di funzione da applicare
|
||||
/// </summary>
|
||||
public VC_func Funzione { get; set; } = VC_func.POINT;
|
||||
/// <summary>
|
||||
/// DataOra inizio periodo di elaborazione
|
||||
/// </summary>
|
||||
public DateTime DTStart;
|
||||
/// <summary>
|
||||
/// Array dati per calcolo
|
||||
/// </summary>
|
||||
public List<double> dataArray;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// informazioni di produzione
|
||||
/// </summary>
|
||||
public struct prodData
|
||||
{
|
||||
public string Operator;
|
||||
|
||||
public bool Status;
|
||||
public int AccTime;
|
||||
public int Power;
|
||||
public string FuncMode;
|
||||
public bool EmrStop;
|
||||
public string MessageCode;
|
||||
public string MessageText;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Dato generico (per decodifica)
|
||||
/// </summary>
|
||||
public class otherData
|
||||
{
|
||||
public string codNum;
|
||||
public string memAddr;
|
||||
public string varName;
|
||||
public string dataType;
|
||||
public otherData()
|
||||
{
|
||||
codNum = "";
|
||||
memAddr = "";
|
||||
varName = "";
|
||||
dataType = "";
|
||||
}
|
||||
public otherData(string _codNum, string _memAddr, string _varName, string _dataType)
|
||||
{
|
||||
codNum = _codNum;
|
||||
memAddr = _memAddr;
|
||||
varName = _varName;
|
||||
dataType = _dataType;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Classe che contiene tutte le NUOVE informaizoni da aggiornare sulla form
|
||||
/// </summary>
|
||||
public class newDisplayData
|
||||
{
|
||||
/// <summary>
|
||||
/// Dati tipo IN (RAW)
|
||||
/// </summary>
|
||||
public string newInData { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Dati tipo Signal
|
||||
/// </summary>
|
||||
public string newSignalData { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Dati tipo FluxLog
|
||||
/// </summary>
|
||||
public string newFLogData { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Dati tipo UrlCall
|
||||
/// </summary>
|
||||
public string newUrlCallData { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Dati tipo LiveLog
|
||||
/// </summary>
|
||||
public string newLiveLogData { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Oggetto COUTNER generico (pezzi, portata...)
|
||||
/// </summary>
|
||||
public int counter { get; set; } = -9999;
|
||||
/// <summary>
|
||||
/// Bitmap attuale segnali letti
|
||||
/// </summary>
|
||||
public string currBitmap { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Stato semaforo IN verso PLC
|
||||
/// </summary>
|
||||
public Semaforo semIn { get; set; } = Semaforo.ND;
|
||||
/// <summary>
|
||||
/// Stato semaforo OUT verso MES
|
||||
/// </summary>
|
||||
public Semaforo semOut { get; set; } = Semaforo.ND;
|
||||
/// <summary>
|
||||
/// Verifica se contenga valori (NON default/empty)
|
||||
/// </summary>
|
||||
public bool hasData
|
||||
{
|
||||
get
|
||||
{
|
||||
bool answ = false;
|
||||
// true se qualcosa NON E' come default
|
||||
if (!string.IsNullOrWhiteSpace(newInData) || !string.IsNullOrWhiteSpace(newSignalData) || !string.IsNullOrWhiteSpace(newFLogData) || !string.IsNullOrWhiteSpace(newUrlCallData) || !string.IsNullOrWhiteSpace(newLiveLogData) || counter > -9999 || !string.IsNullOrWhiteSpace(currBitmap) || semIn != Semaforo.ND || semOut != Semaforo.ND)
|
||||
{
|
||||
answ = true;
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Rappresentazione dello stato corrente dell'IOB
|
||||
/// </summary>
|
||||
public class IobWinCurrentState
|
||||
{
|
||||
/// <summary>
|
||||
/// Semaforo IN (IOB-PLC)
|
||||
/// </summary>
|
||||
public Semaforo SemIn { get; set; } = Semaforo.ND;
|
||||
/// <summary>
|
||||
/// Semaforo OUT (IOB-MPserver)
|
||||
/// </summary>
|
||||
public Semaforo SemOut { get; set; } = Semaforo.ND;
|
||||
/// <summary>
|
||||
/// Contatore IOB
|
||||
/// </summary>
|
||||
public float counterIOB { get; set; } = 0;
|
||||
/// <summary>
|
||||
/// Contatore Macchina
|
||||
/// </summary>
|
||||
public float counterMAC { get; set; } = 0;
|
||||
/// <summary>
|
||||
/// Lunghezza coda EVENTI in uscita
|
||||
/// </summary>
|
||||
public int queueEvLen { get; set; } = 0;
|
||||
/// <summary>
|
||||
/// Lunghezza coda FluxLog in uscita
|
||||
/// </summary>
|
||||
public int queueFLogLen { get; set; } = 0;
|
||||
/// <summary>
|
||||
/// DataOra ultima comunicazione IN (con PLC)
|
||||
/// </summary>
|
||||
public DateTime lastDataIn { get; set; } = DateTime.Now.AddYears(-1);
|
||||
/// <summary>
|
||||
/// DataOra ultima comunicazione OUT (con MP Server)
|
||||
/// </summary>
|
||||
public DateTime lastDataOut { get; set; } = DateTime.Now.AddYears(-1);
|
||||
/// <summary>
|
||||
/// Ultimo stato noto dei parametri in memoria letti da PLC
|
||||
/// </summary>
|
||||
public Dictionary<string, string> currParams { get; set; } = null;
|
||||
}
|
||||
}
|
||||
@@ -648,772 +648,4 @@ namespace IOB_UT
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto timing x archiviazione dati perfomances
|
||||
/// </summary>
|
||||
public class TimeRec
|
||||
{
|
||||
/// <summary>
|
||||
/// Classe chiamante della funzione (es codice univoco IOB)
|
||||
/// </summary>
|
||||
public string classCall;
|
||||
/// <summary>
|
||||
/// Codice univoco chiamata: tipo R4 (read 4 byte), W2 (write 2 Byte)
|
||||
/// </summary>
|
||||
public string codCall;
|
||||
/// <summary>
|
||||
/// Num chiamate totale
|
||||
/// </summary>
|
||||
public int numCall;
|
||||
/// <summary>
|
||||
/// Tempo medio chiamata
|
||||
/// </summary>
|
||||
public double avgMsec
|
||||
{
|
||||
get
|
||||
{
|
||||
return totMsec.TotalMilliseconds / numCall;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Totale Msec accumulati
|
||||
/// </summary>
|
||||
public TimeSpan totMsec;
|
||||
/// <summary>
|
||||
/// Classe record timing
|
||||
/// </summary>
|
||||
public TimeRec()
|
||||
{
|
||||
codCall = "";
|
||||
numCall = 0;
|
||||
totMsec = new TimeSpan(0);
|
||||
}
|
||||
/// <summary>
|
||||
/// Classe record timing
|
||||
/// </summary>
|
||||
/// <param name="caller"></param>
|
||||
/// <param name="codice"></param>
|
||||
/// <param name="ticks"></param>
|
||||
public TimeRec(string caller, string codice, long nTicks)
|
||||
{
|
||||
classCall = caller;
|
||||
codCall = codice;
|
||||
numCall = 1;
|
||||
totMsec = new TimeSpan(nTicks);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Classe gestione valori campionati su periodo
|
||||
/// </summary>
|
||||
public class sampleVect
|
||||
{
|
||||
/// <summary>
|
||||
/// Dimensione finestra di campionamento (secondi)
|
||||
/// </summary>
|
||||
protected int windSize;
|
||||
/// <summary>
|
||||
/// vettore valori temporali della serie
|
||||
/// </summary>
|
||||
protected List<DateTime> lTime;
|
||||
/// <summary>
|
||||
/// vettore valoti puntuali della serie
|
||||
/// </summary>
|
||||
protected List<int> lVal;
|
||||
/// <summary>
|
||||
/// Inizializzo l'oggetto
|
||||
/// </summary>
|
||||
public sampleVect()
|
||||
{
|
||||
// init valori default...
|
||||
windSize = baseUtils.CRI("countWindSize") > 0 ? baseUtils.CRI("countWindSize") : 60;
|
||||
lTime = new List<DateTime>();
|
||||
lVal = new List<int>();
|
||||
}
|
||||
/// <summary>
|
||||
/// Conteggio elementi
|
||||
/// </summary>
|
||||
protected int numElem
|
||||
{
|
||||
get
|
||||
{
|
||||
int answ = 0;
|
||||
try
|
||||
{
|
||||
answ = lTime.Count;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Verifica ampiezza finestra valori First-Last
|
||||
/// </summary>
|
||||
protected double flWindSize
|
||||
{
|
||||
get
|
||||
{
|
||||
double answ = 0;
|
||||
if (numElem > 1)
|
||||
{
|
||||
answ = lTime.Last().Subtract(lTime[0]).TotalSeconds;
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Verifica ampiezza finestra valori Second-Last
|
||||
/// </summary>
|
||||
protected double slWindSize
|
||||
{
|
||||
get
|
||||
{
|
||||
double answ = 0;
|
||||
if (numElem > 2) // altrimenti SE non ne ho almeno 3 NON posso avere secondo/ultimo...
|
||||
{
|
||||
|
||||
answ = lTime.Last().Subtract(lTime[1]).TotalSeconds;
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Aggiunge un valore alla serie ed eventualmente elimina i valori superflui a garantirne una finestra temporale valida
|
||||
/// </summary>
|
||||
/// <param name="tempo"></param>
|
||||
/// <param name="valore"></param>
|
||||
public void addValue(DateTime tempo, int valore)
|
||||
{
|
||||
lTime.Add(tempo);
|
||||
lVal.Add(valore);
|
||||
// verifico se siano da accorciare le serie... ovvero i 2 intervalli ENTRAMBI sono superiori al periodo minimo (in tal caso riduco..
|
||||
while (flWindSize > windSize && slWindSize > windSize)
|
||||
{
|
||||
// elimino i 2 valori + vecchi
|
||||
lTime.RemoveAt(0);
|
||||
lVal.RemoveAt(0);
|
||||
// ora ricontrollo...
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Calcola il valore mediano...
|
||||
/// </summary>
|
||||
public double vcMedian
|
||||
{
|
||||
get
|
||||
{
|
||||
double answ = 0;
|
||||
// restituisce la mediana SE valida, altrimenti null...
|
||||
if (numElem > 2 && flWindSize > windSize)
|
||||
{
|
||||
try
|
||||
{
|
||||
// calcolo mediana!
|
||||
//answ = Statistics.Median(lVal.ToArray());
|
||||
|
||||
// rif: https://blogs.msmvps.com/deborahk/linq-mean-median-and-mode/
|
||||
var sortedNumbers = lVal.OrderBy(n => n);
|
||||
int numCount = lVal.Count;
|
||||
int indice50 = lVal.Count / 2;
|
||||
if ((numCount % 2) == 0)
|
||||
{
|
||||
answ = ((sortedNumbers.ElementAt(indice50) + sortedNumbers.ElementAt(indice50 - 1)) / 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = sortedNumbers.ElementAt(indice50);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Verifica se la vc sia valida (ovvero almeno 2 valori e intervallo > window richiesta)
|
||||
/// </summary>
|
||||
public bool vcValid
|
||||
{
|
||||
get
|
||||
{
|
||||
return (flWindSize > windSize && numElem > 1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// GEstione dati di timing
|
||||
/// </summary>
|
||||
public static class TimingData
|
||||
{
|
||||
public static List<TimeRec> results = new List<TimeRec>();
|
||||
|
||||
/// <summary>
|
||||
/// aggiorno vettore aggiungendo risultato
|
||||
/// </summary>
|
||||
/// <param name="caller">Codice chiamante</param>
|
||||
/// <param name="codice">Codice da registrare (univoco con chiamante)</param>
|
||||
/// <param name="ticks">Tempo esecuzione in ticks</param>
|
||||
public static void addResult(string caller, string codice, long ticks)
|
||||
{
|
||||
if (results.Count == 0)
|
||||
{
|
||||
results.Add(new TimeRec(caller, codice, ticks));
|
||||
}
|
||||
int indice = -1;
|
||||
for (int i = 0; i < results.Count; i++)
|
||||
{
|
||||
// se il codice è quello cercato...
|
||||
if (results[i].codCall == codice && results[i].classCall == caller)
|
||||
{
|
||||
indice = i;
|
||||
}
|
||||
}
|
||||
// se c'è aggiorno...
|
||||
if (indice >= 0)
|
||||
{
|
||||
results[indice].numCall++;
|
||||
results[indice].totMsec = results[indice].totMsec.Add(new TimeSpan(ticks));
|
||||
}
|
||||
// altrimenti aggiungo...
|
||||
else
|
||||
{
|
||||
results.Add(new TimeRec(caller, codice, ticks));
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Resetta i dati registrati (ad avvio adapter...)
|
||||
/// </summary>
|
||||
public static void resetData()
|
||||
{
|
||||
results = new List<TimeRec>();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Gestione Endianness
|
||||
/// </summary>
|
||||
public static class Endian
|
||||
{
|
||||
/// <summary>
|
||||
/// Scambia MSB/LSB per 16bit
|
||||
/// </summary>
|
||||
/// <param name="inValue"></param>
|
||||
/// <returns></returns>
|
||||
public static UInt16 SwapUInt16(UInt16 inValue)
|
||||
{
|
||||
return (UInt16)(((inValue & 0xff00) >> 8) |
|
||||
((inValue & 0x00ff) << 8));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Scambia MSB/LSB per 32bit
|
||||
/// </summary>
|
||||
/// <param name="inValue"></param>
|
||||
/// <returns></returns>
|
||||
public static UInt32 SwapUInt32(UInt32 inValue)
|
||||
{
|
||||
return ((inValue & 0xff000000) >> 24) |
|
||||
((inValue & 0x00ff0000) >> 8) |
|
||||
((inValue & 0x0000ff00) << 8) |
|
||||
((inValue & 0x000000ff) << 24);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Tipologie di DUMP memoria
|
||||
/// </summary>
|
||||
public enum dumpType
|
||||
{
|
||||
/// <summary>
|
||||
/// Salvataggio all'avvio aree memoria (con sovrascrittura)
|
||||
/// </summary>
|
||||
STARTUP,
|
||||
/// <summary>
|
||||
/// Campionamento periodico
|
||||
/// </summary>
|
||||
SAMPLE
|
||||
}
|
||||
/// <summary>
|
||||
/// Tipologia di adapters ammessi
|
||||
/// </summary>
|
||||
public enum tipoAdapter
|
||||
{
|
||||
/// <summary>
|
||||
/// Adapter SIMULAZIONE
|
||||
/// </summary>
|
||||
SIMULA,
|
||||
/// <summary>
|
||||
/// adapter FANUC
|
||||
/// </summary>
|
||||
FANUC,
|
||||
/// <summary>
|
||||
/// adapter KAWASAKI e-controller
|
||||
/// </summary>
|
||||
KAWASAKI,
|
||||
/// <summary>
|
||||
/// Adapter non specificato
|
||||
/// </summary>
|
||||
ND,
|
||||
/// <summary>
|
||||
/// Adapter MTConnect
|
||||
/// </summary>
|
||||
MTConnect,
|
||||
/// <summary>
|
||||
/// Adapter OMRON
|
||||
/// </summary>
|
||||
OMRON,
|
||||
/// <summary>
|
||||
/// Adapter OSAI CNDEX (Cndex)
|
||||
/// </summary>
|
||||
OSAI_CNDEX,
|
||||
/// <summary>
|
||||
/// Adapter OSAI OPEN (ws)
|
||||
/// </summary>
|
||||
OSAI_OPEN,
|
||||
/// <summary>
|
||||
/// Adapter OSAI VB6
|
||||
/// </summary>
|
||||
OSAI_VB6,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS
|
||||
/// </summary>
|
||||
SIEMENS,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione APROCHIM (filtro liquidi rettifiche)
|
||||
/// </summary>
|
||||
SIEMENS_APROCHIM,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione VIPA @2001
|
||||
/// </summary>
|
||||
SIEMENS_AT2001,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione FAPE (punzonatrici)
|
||||
/// </summary>
|
||||
SIEMENS_FAPE,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione COMUR (dentatrice)
|
||||
/// </summary>
|
||||
SIEMENS_COMUR,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione INGENIA (Valvital, Automazione)
|
||||
/// </summary>
|
||||
SIEMENS_INGENIA,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione LASCO (Valvital, Pressa Bilancere)
|
||||
/// </summary>
|
||||
SIEMENS_LASCO,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione PRESSOIL + CEI (Valvital, Pressa Idraulica)
|
||||
/// </summary>
|
||||
SIEMENS_PRESSOIL_CEI,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione SAET (Valvital, forni / tempra)
|
||||
/// </summary>
|
||||
SIEMENS_SAET,
|
||||
/// <summary>
|
||||
/// Adapter SIEMENS, interfaccia versione Torri
|
||||
/// </summary>
|
||||
SIEMENS_TORRI,
|
||||
/// <summary>
|
||||
/// Metodi di WPS WebPageScraping (es x compressori Atlas Copco)
|
||||
/// </summary>
|
||||
WPS
|
||||
}
|
||||
/// <summary>
|
||||
/// Tipo di ciclo da processare
|
||||
/// </summary>
|
||||
public enum gatherCycle
|
||||
{
|
||||
/// <summary>
|
||||
/// Very High Frequency (solo x invii...)
|
||||
/// </summary>
|
||||
VHF,
|
||||
/// <summary>
|
||||
/// lettura dati ad alta frequenza
|
||||
/// </summary>
|
||||
HF,
|
||||
/// <summary>
|
||||
/// lettura dati standard
|
||||
/// </summary>
|
||||
MF,
|
||||
/// <summary>
|
||||
/// lettura dati bassa freq
|
||||
/// </summary>
|
||||
LF,
|
||||
/// <summary>
|
||||
/// lettura dati bassissima priorità (re-sync stato allarmi)
|
||||
/// </summary>
|
||||
VLF
|
||||
}
|
||||
/// <summary>
|
||||
/// Classe conf x item DynData
|
||||
/// </summary>
|
||||
public class DynDataItem
|
||||
{
|
||||
public string key { get; set; } = "";
|
||||
public string name { get; set; } = "";
|
||||
public string val { get; set; } = "";
|
||||
public string unit { get; set; } = "";
|
||||
public string func { get; set; } = "";
|
||||
public int sPeriod { get; set; } = 60;
|
||||
/// <summary>
|
||||
/// Valore effettivo da salvare
|
||||
/// </summary>
|
||||
public string actVal { get; set; } = "";
|
||||
/// <summary>
|
||||
/// DataOra scadenza invio forzato
|
||||
/// </summary>
|
||||
public DateTime DTScad = DateTime.Now;
|
||||
}
|
||||
/// <summary>
|
||||
/// Classe conf x decodifica stsatus
|
||||
/// </summary>
|
||||
public class StatusItem : DynDataItem
|
||||
{
|
||||
public Dictionary<string, string> codeMapping;
|
||||
}
|
||||
/// <summary>
|
||||
/// Classe conf server html
|
||||
/// </summary>
|
||||
public class srvData
|
||||
{
|
||||
public string baseUri { get; set; } = "";
|
||||
public string driverName { get; set; } = "";
|
||||
}
|
||||
/// <summary>
|
||||
/// Elenco oggetti del monitoraggio (DynData, Status)
|
||||
/// </summary>
|
||||
public class MonitoredItemsConf
|
||||
{
|
||||
public srvData SrvData { get; set; }
|
||||
public List<DynDataItem> DynData { get; set; }
|
||||
public List<StatusItem> Status { get; set; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Configurazione per Eventi/Variabili
|
||||
/// </summary>
|
||||
public class EVData
|
||||
{
|
||||
/// <summary>
|
||||
/// Unità di misura
|
||||
/// </summary>
|
||||
public string UM { get; set; } = "num";
|
||||
/// <summary>
|
||||
/// Valore salvato
|
||||
/// </summary>
|
||||
public string Val { get; set; } = "";
|
||||
/// <summary>
|
||||
/// DataOra scadenza invio forzato
|
||||
/// </summary>
|
||||
public DateTime DTScad = DateTime.Now;
|
||||
}
|
||||
/// <summary>
|
||||
/// Configurazione per Variabili Casuali
|
||||
/// </summary>
|
||||
public class VCData
|
||||
{
|
||||
/// <summary>
|
||||
/// Periodo di riferimento
|
||||
/// </summary>
|
||||
public int Period { get; set; } = 60;
|
||||
/// <summary>
|
||||
/// Tipologia di funzione da applicare
|
||||
/// </summary>
|
||||
public VC_func Funzione { get; set; } = VC_func.POINT;
|
||||
/// <summary>
|
||||
/// DataOra inizio periodo di elaborazione
|
||||
/// </summary>
|
||||
public DateTime DTStart;
|
||||
/// <summary>
|
||||
/// Array dati per calcolo
|
||||
/// </summary>
|
||||
public List<double> dataArray;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// informazioni di produzione
|
||||
/// </summary>
|
||||
public struct prodData
|
||||
{
|
||||
public string Operator;
|
||||
|
||||
public bool Status;
|
||||
public int AccTime;
|
||||
public int Power;
|
||||
public string FuncMode;
|
||||
public bool EmrStop;
|
||||
public string MessageCode;
|
||||
public string MessageText;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Dato generico (per decodifica)
|
||||
/// </summary>
|
||||
public class otherData
|
||||
{
|
||||
public string codNum;
|
||||
public string memAddr;
|
||||
public string varName;
|
||||
public string dataType;
|
||||
public otherData()
|
||||
{
|
||||
codNum = "";
|
||||
memAddr = "";
|
||||
varName = "";
|
||||
dataType = "";
|
||||
}
|
||||
public otherData(string _codNum, string _memAddr, string _varName, string _dataType)
|
||||
{
|
||||
codNum = _codNum;
|
||||
memAddr = _memAddr;
|
||||
varName = _varName;
|
||||
dataType = _dataType;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Classe che contiene tutte le NUOVE informaizoni da aggiornare sulla form
|
||||
/// </summary>
|
||||
public class newDisplayData
|
||||
{
|
||||
/// <summary>
|
||||
/// Dati tipo IN (RAW)
|
||||
/// </summary>
|
||||
public string newInData { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Dati tipo Signal
|
||||
/// </summary>
|
||||
public string newSignalData { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Dati tipo FluxLog
|
||||
/// </summary>
|
||||
public string newFLogData { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Dati tipo UrlCall
|
||||
/// </summary>
|
||||
public string newUrlCallData { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Dati tipo LiveLog
|
||||
/// </summary>
|
||||
public string newLiveLogData { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Oggetto COUTNER generico (pezzi, portata...)
|
||||
/// </summary>
|
||||
public int counter { get; set; } = -9999;
|
||||
/// <summary>
|
||||
/// Bitmap attuale segnali letti
|
||||
/// </summary>
|
||||
public string currBitmap { get; set; } = "";
|
||||
/// <summary>
|
||||
/// Stato semaforo IN verso PLC
|
||||
/// </summary>
|
||||
public Semaforo semIn { get; set; } = Semaforo.ND;
|
||||
/// <summary>
|
||||
/// Stato semaforo OUT verso MES
|
||||
/// </summary>
|
||||
public Semaforo semOut { get; set; } = Semaforo.ND;
|
||||
/// <summary>
|
||||
/// Verifica se contenga valori (NON default/empty)
|
||||
/// </summary>
|
||||
public bool hasData
|
||||
{
|
||||
get
|
||||
{
|
||||
bool answ = false;
|
||||
// true se qualcosa NON E' come default
|
||||
if (!string.IsNullOrWhiteSpace(newInData) || !string.IsNullOrWhiteSpace(newSignalData) || !string.IsNullOrWhiteSpace(newFLogData) || !string.IsNullOrWhiteSpace(newUrlCallData) || !string.IsNullOrWhiteSpace(newLiveLogData) || counter > -9999 || !string.IsNullOrWhiteSpace(currBitmap) || semIn != Semaforo.ND || semOut != Semaforo.ND)
|
||||
{
|
||||
answ = true;
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// StFlag8: set di 8 bit (1 word) contente semaforo di variabili
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum StFlag8 : int
|
||||
{
|
||||
NONE = 0,
|
||||
B0 = 1 << 0,
|
||||
B1 = 1 << 1,
|
||||
B2 = 1 << 2,
|
||||
B3 = 1 << 3,
|
||||
B4 = 1 << 4,
|
||||
B5 = 1 << 5,
|
||||
B6 = 1 << 6,
|
||||
B7 = 1 << 7
|
||||
}
|
||||
/// <summary>
|
||||
/// StFlag32: set di 32 bit (4 word) contente semaforo di variabili
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum StFlag32 : int
|
||||
{
|
||||
NONE = 0,
|
||||
B00 = 1 << 0,
|
||||
B01 = 1 << 1,
|
||||
B02 = 1 << 2,
|
||||
B03 = 1 << 3,
|
||||
B04 = 1 << 4,
|
||||
B05 = 1 << 5,
|
||||
B06 = 1 << 6,
|
||||
B07 = 1 << 7,
|
||||
B08 = 1 << 8,
|
||||
B09 = 1 << 9,
|
||||
B10 = 1 << 10,
|
||||
B11 = 1 << 11,
|
||||
B12 = 1 << 12,
|
||||
B13 = 1 << 13,
|
||||
B14 = 1 << 14,
|
||||
B15 = 1 << 15,
|
||||
B16 = 1 << 16,
|
||||
B17 = 1 << 17,
|
||||
B18 = 1 << 18,
|
||||
B19 = 1 << 19,
|
||||
B20 = 1 << 20,
|
||||
B21 = 1 << 21,
|
||||
B22 = 1 << 22,
|
||||
B23 = 1 << 23,
|
||||
B24 = 1 << 24,
|
||||
B25 = 1 << 25,
|
||||
B26 = 1 << 26,
|
||||
B27 = 1 << 27,
|
||||
B28 = 1 << 28,
|
||||
B29 = 1 << 29,
|
||||
B30 = 1 << 30,
|
||||
B31 = 1 << 31
|
||||
}
|
||||
/// <summary>
|
||||
/// Enumerazione tipi di semaforo
|
||||
/// </summary>
|
||||
public enum Semaforo
|
||||
{
|
||||
/// <summary>
|
||||
/// Stato non definito
|
||||
/// </summary>
|
||||
ND,
|
||||
/// <summary>
|
||||
/// Verde
|
||||
/// </summary>
|
||||
SV,
|
||||
/// <summary>
|
||||
/// Giallo
|
||||
/// </summary>
|
||||
SG,
|
||||
/// <summary>
|
||||
/// Rosso
|
||||
/// </summary>
|
||||
SR,
|
||||
/// <summary>
|
||||
/// Grigio/Spento
|
||||
/// </summary>
|
||||
SS
|
||||
}
|
||||
/// <summary>
|
||||
/// Enumerazione tipi di tipi di URL x invio
|
||||
/// </summary>
|
||||
public enum urlType
|
||||
{
|
||||
/// <summary>
|
||||
/// Salvataggio FluxLog (valori estesi che non provocano calcoli di macchine a stati, eventi...)
|
||||
/// </summary>
|
||||
FLog,
|
||||
/// <summary>
|
||||
/// INPUT segnali in ingresso (standard base MAPO)
|
||||
/// </summary>
|
||||
SignIN
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco STATI CNC OSAI
|
||||
/// </summary>
|
||||
public enum CNC_STATUS_OSAI
|
||||
{
|
||||
IDLE = 1,
|
||||
CYCLE,
|
||||
HODA,
|
||||
RUNH,
|
||||
HRUN,
|
||||
ERRO,
|
||||
WAIT,
|
||||
RESET,
|
||||
EMERG,
|
||||
INPUT
|
||||
}
|
||||
/// <summary>
|
||||
/// Elenco MODI CNC
|
||||
/// </summary>
|
||||
public enum CNC_MODE
|
||||
{
|
||||
/// <summary>
|
||||
/// Non definito
|
||||
/// </summary>
|
||||
ND = 0,
|
||||
/// <summary>
|
||||
/// AUTOMATICO
|
||||
/// </summary>
|
||||
AUTO,
|
||||
/// <summary>
|
||||
/// EDIT (MEMORY EDIT)
|
||||
/// </summary>
|
||||
EDIT,
|
||||
/// <summary>
|
||||
/// MEN (MEMORY OPERATION)
|
||||
/// </summary>
|
||||
MEN,
|
||||
/// <summary>
|
||||
/// MDI (MANUAL DATA INPUT)
|
||||
/// </summary>
|
||||
MDI,
|
||||
/// <summary>
|
||||
/// HANDLE/INC (MANUAL HANDLE / INCREMENTAL FEED)
|
||||
/// </summary>
|
||||
HANDLE_INC,
|
||||
/// <summary>
|
||||
/// HOME
|
||||
/// </summary>
|
||||
HOME,
|
||||
/// <summary>
|
||||
/// JOG (MANUAL CONTINUOUS FEED)
|
||||
/// </summary>
|
||||
JOG,
|
||||
/// <summary>
|
||||
/// JOG MAN
|
||||
/// </summary>
|
||||
JOG_MAN,
|
||||
/// <summary>
|
||||
/// JOG_INC
|
||||
/// </summary>
|
||||
JOG_INC,
|
||||
/// <summary>
|
||||
/// PROFILE
|
||||
/// </summary>
|
||||
PROFILE,
|
||||
/// <summary>
|
||||
/// SEMI
|
||||
/// </summary>
|
||||
SEMI,
|
||||
/// <summary>
|
||||
/// THND (TEACH IN HANDLE)
|
||||
/// </summary>
|
||||
THND,
|
||||
/// <summary>
|
||||
/// TJOG (TEACH IN JOG)
|
||||
/// </summary>
|
||||
TJOG,
|
||||
/// <summary>
|
||||
/// RMT (DNC OPERATION)
|
||||
/// </summary>
|
||||
RMT,
|
||||
/// <summary>
|
||||
/// REF (MANUAL REFERENCE POSITION RETURN)
|
||||
/// </summary>
|
||||
REF
|
||||
}
|
||||
}
|
||||
@@ -113,6 +113,18 @@
|
||||
<Reference Include="S7.Net, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d5812d469e84c693, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\S7netplus.0.1.9\lib\net40\S7.Net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="ServiceStack.Common, Version=4.0.62.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ServiceStack.Common.4.0.62\lib\net40\ServiceStack.Common.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="ServiceStack.Interfaces, Version=4.0.0.0, Culture=neutral, PublicKeyToken=e06fbc6124f57c43, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ServiceStack.Interfaces.4.0.62\lib\portable-wp80+sl5+net40+win8+wpa81+monotouch+monoandroid+xamarin.ios10\ServiceStack.Interfaces.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="ServiceStack.Redis, Version=4.0.62.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ServiceStack.Redis.4.0.62\lib\net40\ServiceStack.Redis.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="ServiceStack.Text, Version=4.0.62.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ServiceStack.Text.4.0.62\lib\net40\ServiceStack.Text.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Core" />
|
||||
|
||||
+65
-56
@@ -3389,71 +3389,80 @@ namespace IOB_WIN
|
||||
public bool forceSplitOdl()
|
||||
{
|
||||
bool fatto = false;
|
||||
string fullUrl = "";
|
||||
string rawSplit = "";
|
||||
string IOB_MULTI_CNAME = "";
|
||||
string[] elencoMulti = null;
|
||||
|
||||
try
|
||||
// eseguo SOLO SE sono online...
|
||||
if (MPOnline && IobOnline)
|
||||
{
|
||||
/***************************************************
|
||||
* Descrizione procedura (OK X SIMULATORI...)
|
||||
*
|
||||
* - chiamata su MP/IO
|
||||
* - verifica che su DB sia abilitato AUTO ODL
|
||||
* - il server inserisce un evento fine prod HW 1 minuto prima e inizio setup HW
|
||||
* - viene duplicato e chiuso ODL corrente
|
||||
* - viene fatto partire ODL nuovo ADESSO
|
||||
* - num pezzi come ODL precedente (o da media 3 ODL precedenti)
|
||||
* - conferme pezzi & co... gestione NULL (NON SERVONO si tratta di impianti SENZA gestione vera ODL)
|
||||
* - reset contapezzi PLC locale...
|
||||
*
|
||||
*
|
||||
*
|
||||
* DA VALUTARE (x macchine tipo linea con + impianti... es valvital) SE
|
||||
* - creare una gestione ALTERNATIVA sul server che preveda impianto LEADER e impianti follower (RIGIDAMENTE CONFIGURATI)
|
||||
* - ogni volta che si fa setup LEADER --> si ripete su impianti FOLLOWER (eventi!!!)
|
||||
* - viene fatto reset contapezzi sui follower (+ altre operazioni opzionali, ES imposstazione nome commessa, quantità, articolo...)
|
||||
* - viene fatto reset + nuovo ODL (con stessi articoli e quantità) su follower, SENZA avere gestione x ODL di un codice esterno (quindi registra TUTTO ma NON RITORNERA' dati non avendo link verso esterno)
|
||||
* - serve NUOVA TABELLA delle macchine LEADER | FOLLOWER (1:n) e gestione da MP/IO
|
||||
*
|
||||
* ***************************************************/
|
||||
string fullUrl = "";
|
||||
string rawSplit = "";
|
||||
string IOB_MULTI_CNAME = "";
|
||||
string[] elencoMulti = null;
|
||||
|
||||
if (isMulti)
|
||||
try
|
||||
{
|
||||
// devo chiamare cambio ODL x OGNI tavola: mi servono i parametri opzionali...
|
||||
IOB_MULTI_CNAME = getOptPar("IOB_MULTI_CNAME");
|
||||
elencoMulti = IOB_MULTI_CNAME.Split(',');
|
||||
}
|
||||
// se normale splitto!
|
||||
if (!isMulti)
|
||||
{
|
||||
// invio chiamata URL x reset ODL su macchina
|
||||
rawSplit = callUrl(urlForceSplit, false);
|
||||
fatto = (rawSplit == "OK") ? true : false;
|
||||
}
|
||||
// se multi gestisco il bit delle tavole...
|
||||
else
|
||||
{
|
||||
foreach (string item in elencoMulti)
|
||||
/***************************************************
|
||||
* Descrizione procedura (OK X SIMULATORI...)
|
||||
*
|
||||
* - chiamata su MP/IO
|
||||
* - verifica che su DB sia abilitato AUTO ODL
|
||||
* - il server inserisce un evento fine prod HW 1 minuto prima e inizio setup HW
|
||||
* - viene duplicato e chiuso ODL corrente
|
||||
* - viene fatto partire ODL nuovo ADESSO
|
||||
* - num pezzi come ODL precedente (o da media 3 ODL precedenti)
|
||||
* - conferme pezzi & co... gestione NULL (NON SERVONO si tratta di impianti SENZA gestione vera ODL)
|
||||
* - reset contapezzi PLC locale...
|
||||
*
|
||||
*
|
||||
*
|
||||
* DA VALUTARE (x macchine tipo linea con + impianti... es valvital) SE
|
||||
* - creare una gestione ALTERNATIVA sul server che preveda impianto LEADER e impianti follower (RIGIDAMENTE CONFIGURATI)
|
||||
* - ogni volta che si fa setup LEADER --> si ripete su impianti FOLLOWER (eventi!!!)
|
||||
* - viene fatto reset contapezzi sui follower (+ altre operazioni opzionali, ES imposstazione nome commessa, quantità, articolo...)
|
||||
* - viene fatto reset + nuovo ODL (con stessi articoli e quantità) su follower, SENZA avere gestione x ODL di un codice esterno (quindi registra TUTTO ma NON RITORNERA' dati non avendo link verso esterno)
|
||||
* - serve NUOVA TABELLA delle macchine LEADER | FOLLOWER (1:n) e gestione da MP/IO
|
||||
*
|
||||
* ***************************************************/
|
||||
|
||||
if (isMulti)
|
||||
{
|
||||
// invio chiamata URL x reset ODL su macchina, ATTENZIONE scriviamo | al posto di "#" che in URL sarebbe filtrato...
|
||||
fullUrl = $"{urlForceSplit}|{item}";
|
||||
rawSplit = callUrl(fullUrl, true);
|
||||
// devo chiamare cambio ODL x OGNI tavola: mi servono i parametri opzionali...
|
||||
IOB_MULTI_CNAME = getOptPar("IOB_MULTI_CNAME");
|
||||
elencoMulti = IOB_MULTI_CNAME.Split(',');
|
||||
}
|
||||
// se normale splitto!
|
||||
if (!isMulti)
|
||||
{
|
||||
// invio chiamata URL x reset ODL su macchina
|
||||
rawSplit = callUrl(urlForceSplit, false);
|
||||
fatto = (rawSplit == "OK") ? true : false;
|
||||
}
|
||||
// se multi gestisco il bit delle tavole...
|
||||
else
|
||||
{
|
||||
foreach (string item in elencoMulti)
|
||||
{
|
||||
// invio chiamata URL x reset ODL su macchina, ATTENZIONE scriviamo | al posto di "#" che in URL sarebbe filtrato...
|
||||
fullUrl = $"{urlForceSplit}|{item}";
|
||||
rawSplit = callUrl(fullUrl, true);
|
||||
}
|
||||
fatto = (rawSplit == "OK") ? true : false;
|
||||
}
|
||||
fatto = (rawSplit == "OK") ? true : false;
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
lgError($"Eccezione in forceSplitOdl{Environment.NewLine}{exc}");
|
||||
}
|
||||
// se fatto --> resetto contapezzi!!!
|
||||
if (fatto)
|
||||
{
|
||||
lastCountCNC = 0;
|
||||
contapezzi = 0;
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
else
|
||||
{
|
||||
lgError($"Eccezione in forceSplitOdl{Environment.NewLine}{exc}");
|
||||
}
|
||||
// se fatto --> resetto contapezzi!!!
|
||||
if (fatto)
|
||||
{
|
||||
lastCountCNC = 0;
|
||||
contapezzi = 0;
|
||||
lgError("Richeisto forceSplitOdl ma MP/IOB offline --> NON eseguito");
|
||||
}
|
||||
return fatto;
|
||||
}
|
||||
|
||||
@@ -416,7 +416,7 @@ namespace IOB_WIN
|
||||
DateTime.TryParse(rawDataInizio, out inizioOdl);
|
||||
if (DateTime.Now.Subtract(inizioOdl).TotalMinutes > minDurataODL)
|
||||
{
|
||||
// invio reset ODL...
|
||||
// invio reset ODL...
|
||||
forceSplitOdl();
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -280,7 +280,7 @@ namespace IOB_WIN
|
||||
AutoUpdater.ShowRemindLaterButton = false;
|
||||
AutoUpdater.RunUpdateAsAdmin = utils.CRB("AUpdAsAdm");
|
||||
AutoUpdater.ReportErrors = false;
|
||||
AutoUpdater.DownloadPath = @"C:\Steawmare\src\";
|
||||
AutoUpdater.DownloadPath = @"C:\Steamware\src\";
|
||||
AutoUpdater.ApplicationExitEvent += AutoUpdater_ApplicationExitEvent;
|
||||
AutoUpdater.Start(updateUrl);
|
||||
}
|
||||
|
||||
@@ -21,4 +21,8 @@
|
||||
<package id="Selenium.Firefox.WebDriver" version="0.26.0" targetFramework="net40-client" />
|
||||
<package id="Selenium.WebDriver" version="3.141.0" targetFramework="net40-client" />
|
||||
<package id="Selenium.WebDriver.ChromeDriver" version="79.0.3945.3600" targetFramework="net40-client" />
|
||||
<package id="ServiceStack.Common" version="4.0.62" targetFramework="net40-client" />
|
||||
<package id="ServiceStack.Interfaces" version="4.0.62" targetFramework="net40-client" />
|
||||
<package id="ServiceStack.Redis" version="4.0.62" targetFramework="net40-client" />
|
||||
<package id="ServiceStack.Text" version="4.0.62" targetFramework="net40-client" />
|
||||
</packages>
|
||||
Reference in New Issue
Block a user