inizio separazione adapter SIEMENS

This commit is contained in:
Samuele Locatelli
2025-01-10 16:47:50 +01:00
parent 3361e2f6a0
commit 6496d42a57
62 changed files with 11431 additions and 17 deletions
+3 -1
View File
@@ -112,6 +112,7 @@ namespace IOB_WIN_NEXT
btnStart.Enabled = true;
break;
#if false
case tipoAdapter.SIEMENS:
iobObj = new IobSiemens.Siemens(this, IOBConf);
btnStart.Enabled = true;
@@ -190,7 +191,8 @@ namespace IOB_WIN_NEXT
case tipoAdapter.SIEMENS_TORRI:
iobObj = new IobSiemens.SiemensTorri(this, IOBConf);
btnStart.Enabled = true;
break;
break;
#endif
case tipoAdapter.SOAP_GOMBA:
iobObj = new IobSoap.Gomba(this, IOBConf);
-1
View File
@@ -748,7 +748,6 @@
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="IobModbusTCP\" />
<Folder Include="prog\" />
</ItemGroup>
<ItemGroup>
@@ -135,6 +135,7 @@ namespace IOB_WIN_NEXT
#endregion Public Fields
}
#if false
/// <summary>
/// Definizione area memoria SIEMENS
/// </summary>
@@ -188,5 +189,6 @@ namespace IOB_WIN_NEXT
}
#endregion Public Constructors
}
}
#endif
}
-1
View File
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="EasyModbusTCP" version="5.6.0" targetFramework="net462" />
<package id="EgwProxy.Ftp" version="3.6.2410.816" targetFramework="net462" />
<package id="EgwProxy.Gomba" version="3.6.2309.1416" targetFramework="net462" />
<package id="EgwProxy.Icoel" version="3.6.2309.708" targetFramework="net462" />
+13 -13
View File
@@ -14,7 +14,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOB-UT-NEXT", "IOB-UT-NEXT\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOB-WIN-FORM", "IOB-WIN-FORM\IOB-WIN-FORM.csproj", "{9BA331BB-9BF1-40E0-AC03-74B43D73A097}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOB-WIN-PING", "IOB-WIN-PING\IOB-WIN-PING.csproj", "{6ADF1E82-124C-489C-99EF-A857C933D362}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOB-WIN-SIEMENS", "IOB-WIN-SIEMENS\IOB-WIN-SIEMENS.csproj", "{26D891EF-C115-420A-B240-05F099E13853}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -61,18 +61,18 @@ Global
{9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Remote_DEBUG|Any CPU.Build.0 = Debug|Any CPU
{9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Remote_DEBUG|x86.ActiveCfg = Release|Any CPU
{9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Remote_DEBUG|x86.Build.0 = Release|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Debug|x86.ActiveCfg = Debug|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Debug|x86.Build.0 = Debug|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Release|Any CPU.Build.0 = Release|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Release|x86.ActiveCfg = Release|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Release|x86.Build.0 = Release|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Remote_DEBUG|Any CPU.ActiveCfg = Release|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Remote_DEBUG|Any CPU.Build.0 = Release|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Remote_DEBUG|x86.ActiveCfg = Release|Any CPU
{6ADF1E82-124C-489C-99EF-A857C933D362}.Remote_DEBUG|x86.Build.0 = Release|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Debug|Any CPU.Build.0 = Debug|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Debug|x86.ActiveCfg = Debug|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Debug|x86.Build.0 = Debug|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Release|Any CPU.ActiveCfg = Release|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Release|Any CPU.Build.0 = Release|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Release|x86.ActiveCfg = Release|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Release|x86.Build.0 = Release|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Remote_DEBUG|Any CPU.ActiveCfg = Remote_DEBUG|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Remote_DEBUG|Any CPU.Build.0 = Remote_DEBUG|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Remote_DEBUG|x86.ActiveCfg = Release|Any CPU
{26D891EF-C115-420A-B240-05F099E13853}.Remote_DEBUG|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
+131
View File
@@ -0,0 +1,131 @@
using IOB_UT_NEXT;
using IOB_WIN_SIEMENS.Iob;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IOB_WIN_SIEMENS
{
public class AdapterFormNext: IOB_WIN_FORM.AdapterForm
{
/// <summary>
/// Avvio MainForm
/// </summary>
/// <param name="codIOB"></param>
public AdapterFormNext(string codIOB): base(codIOB)
{
}
/// <summary>
/// carica IOB richiesto
/// </summary>
protected override void loadIobType()
{
if (IOBConf != null)
{
switch (tipoScelto)
{
case tipoAdapter.SIEMENS:
iobObj = new IobSiemens.Siemens(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_APROCHIM:
iobObj = new IobSiemens.SiemensAprochim(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_AT2001:
iobObj = new IobSiemens.SiemensAt2001(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_COMECA:
iobObj = new IobSiemens.SiemensComeca(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_COMUR:
iobObj = new IobSiemens.SiemensComur(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_COSMAP:
iobObj = new IobSiemens.SiemensCosmap(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_FAPE:
iobObj = new IobSiemens.SiemensFape(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_FAPE_2:
iobObj = new IobSiemens.SiemensFapeV2(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_INGENIA:
iobObj = new IobSiemens.SiemensIngenia(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_LASCO:
iobObj = new IobSiemens.SiemensLasco(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_NWSE:
iobObj = new IobSiemens.SiemensNWSE(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_PRESSOIL_CEI:
iobObj = new IobSiemens.SiemensPressoilCei(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_ROBOTSERVICE:
iobObj = new IobSiemens.SiemensRobotService(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_SAET:
iobObj = new IobSiemens.SiemensSaet(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_SIMEC:
iobObj = new IobSiemens.SiemensSimec(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIEMENS_TORRI:
iobObj = new IobSiemens.SiemensTorri(this, IOBConf);
btnStart.Enabled = true;
break;
case tipoAdapter.SIMULA:
case tipoAdapter.ND:
default:
iobObj = new IOB_WIN_FORM.Iob.Simula(this, IOBConf);
btnStart.Enabled = false;
break;
}
lblCncText = $"CNC: {IOBConf.tipoIob} [{IOBConf.cncIpAddr}:{IOBConf.cncPort}]";
lblSrvUrlText = $"SRV: {IOBConf.serverData.MPIP} | URL: {IOBConf.serverData.MPURL}{IOBConf.serverData.CMDBASE}";
// aggancio evento refresh
iobObj.eh_refreshed += IobObj_eh_refreshed;
// carico i default values su interfaccia
setDefaults();
displayTaskAndLog($"Caricata conf per adapter {tipoScelto}");
}
}
}
}
+10
View File
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- For more information on using transformations
see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="autoLoadConf" value="true" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<!--<add key="DemoIn" value="true" xdt:Transform="Replace" xdt:Locator="Match(key)"/>-->
<!--<add key="DemoOut" value="true" xdt:Transform="Replace" xdt:Locator="Match(key)"/>-->
</appSettings>
</configuration>
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- For more information on using transformations
see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="autoLoadConf" value="true" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="DemoIn" value="false" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="DemoOut" value="false" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="verbose" value="false" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
</appSettings>
</configuration>
+182
View File
@@ -0,0 +1,182 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
<appSettings>
<add key="appName" value="IOB-WIN-PING" />
<add key="enableTest" value="false" />
<add key="enableContapezzi" value="true" />
<add key="enableMode" value="true" />
<add key="enableOverrides" value="false" />
<add key="enableTSVC" value="true" />
<add key="enableDynData" value="false" />
<add key="enableSysInfo" value="false" />
<add key="enableAlarms" value="true" />
<add key="doStartMemDump" value="false" />
<add key="doSampleMemory" value="false" />
<add key="basePrgMemPath" value="CNCMEMUSER" />
<add key="pingMsTimeout" value="1500" />
<add key="serverPingDisabled" value="false" />
<add key="urlCallTOut" value="9999" />
<add key="urlRandWait" value="200" />
<!-- ciclo corto x invio a server: ms -->
<add key="timerIntMs" value="10" />
<add key="fastCount" value="20" />
<add key="normCount" value="200" />
<add key="slowCount" value="500" />
<add key="verySlowCount" value="3000" />
<add key="sampleMemCount" value="6000" />
<add key="waitEndCycle" value="0" />
<add key="comCheckTOut" value="10" />
<!-- watchdog, ping, check disconnesso -->
<add key="nMaxSend" value="10" />
<add key="pingTestSec" value="5" />
<add key="watchdogMaxSec" value="90" />
<add key="disconMaxSec" value="30" />
<add key="defIOB" value="2999" />
<add key="pauseSendMSec" value="2000" />
<add key="sendStartFLog" value="false" />
<!--gestione coda-->
<add key="maxQueueFLog" value="16384" />
<add key="maxQueueRawTransf" value="1024" />
<!--gestione max num errori-->
<add key="maxAliveErrors" value="1000" />
<add key="maxErroriCheck" value="300" />
<add key="maxSendErrors" value="100" />
<add key="maxReadErrors" value="20" />
<!--parametri SIM-->
<add key="waitSimPar" value="30" />
<!--<add key="waitSimPar" value="45" />-->
<!--gestione REDIS-->
<add key="RedisConn" value="localhost,abortConnect=false,ssl=false" />
<add key="RedisConnAdmin" value="localhost,abortConnect=false,ssl=false" />
<add key="redisDb" value="10" />
<!--gestione invio dati in blocchi Json-->
<add key="minJsonData" value="2" />
<add key="maxJsonData" value="100" />
<add key="maxJsonDataEv" value="25" />
<!--gestione multithread-->
<add key="sendDataByThread" value="false" />
<!--Modalità DEMO: DemoOUT indica che NON invia davvero al server e DemoIN che simula e NON legge da PLC-->
<add key="DemoIn" value="false" />
<add key="DemoInSample" value="false" />
<add key="DemoOut" value="false" />
<!--definizione invio dati molto variabili-->
<add key="SendAxPos" value="false" />
<add key="SendFeedSpeed" value="false" />
<!--Definizione avvio Adapter-->
<add key="autoLoadConf" value="true" />
<add key="autoStartOnLoad" value="true" />
<add key="startMinimized" value="false" />
<add key="windowCanMax" value="true" />
<add key="trayClose" value="true" />
<add key="autoSaveSec" value="60" />
<add key="waitRecMSec" value="60000" />
<add key="testCharSep" value="|" />
<add key="delayShowLogMs" value="500" />
<add key="vetoSeconds" value="5" />
<!--conf file-->
<add key="dataPath" value="DATA" />
<add key="dataConfPath" value="DATA\CONF" />
<add key="dataDatPath" value="DATA\DAT" />
<add key="resxPath" value="Resources" />
<add key="mainConfFile" value="MAIN.ini" />
<add key="defaultPersLayerFile" value="PersistData.dat" />
<!--<add key="simDataFile" value="SimData.dat" />-->
<!--<add key="memDumpFile" value="MemoryDump.dat" />-->
<add key="numSim" value="1" />
<add key="AUpdAsAdm" value="true" />
<add key="ConfToCloud" value="false" />
<add key="CacheConfToCloudDuratHour" value="24" />
<!--logging-->
<add key="recTime" value="true" />
<add key="verbose" value="false" />
<add key="logEvery" value="100" />
<add key="zipLogOldDay" value="1" />
<add key="maxLogDirSize" value="300" />
<add key="maxLogDays" value="400" />
<add key="numRowConsole" value="50" />
<add key="verboseLogTOut" value="60" />
<!--conf x FANUC-->
<add key="ClientSettingsProvider.ServiceUri" value="" />
<add key="pzCountDelay" value="2000" />
</appSettings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="lib;libs" xmlns="urn:schemas-microsoft-com:asm.v1" />
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.4.0" newVersion="4.0.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.1.0" newVersion="6.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Pipelines" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Web.WebView2.WinForms" publicKeyToken="2a8ab48044d2601e" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.0.2903.40" newVersion="1.0.2903.40" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Web.WebView2.Core" publicKeyToken="2a8ab48044d2601e" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.0.2903.40" newVersion="1.0.2903.40" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" 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.5.0" newVersion="4.1.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Channels" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>
+54
View File
@@ -0,0 +1,54 @@
;Configurazione IOB-WIN GENERALE
[BRANCH]
NAME=master
[SERVER]
; Server Steamware
MPIP=10.74.82.218
MPURL=/MP/IO
CMDREBO=/IOB/sendRebootGateway?GWIP=
CMDIOB2CALL=/IOB/getIob2call?GWIP=
;Client Install
CLI_INST=SteamWareSim
[IOB]
;--- TEST sul campo
; SIMULAZIONE verso server ufficio
;STARTLIST=SIMUL_01,SIMUL_02,SIMUL_03,SIMUL_04
;STARTLIST=PIZ09
;STARTLIST=VL25
;STARTLIST=SIMUL_03
;STARTLIST=GIACO_CEDAX_001
;STARTLIST=GIACO_ICOEL_002
;STARTLIST=GIACO_CENTERFRIGO
;STARTLIST=GIACO_NWSE
;STARTLIST=SIM_DP_01
;STARTLIST=WPS
;STARTLIST=FINASSI_HELPI_01
;STARTLIST=FINASSI_OMP_01
;STARTLIST=BAGLIETTO_CIMOLAI_01
;STARTLIST=GIACO_SAIM_003
;STARTLIST=PIZ09
;STARTLIST=IMI_RIMOR_SAB_01
;STARTLIST=IMI_RIMOR_SAB_02
;STARTLIST=IMI_RIMOR_VER_01
;STARTLIST=IMI_RIMOR_VER_02
;STARTLIST=IMI_PAMA_392
;STARTLIST=Tend_FIMAT_01
;STARTLIST=PIZ10
;STARTLIST=IMI_SOITAAB_Z2342_02
;STARTLIST=IMI_GOMBA
;STARTLIST=SIMUL_02
;STARTLIST=SIM_DP_01
;STARTLIST=FTP_SONATEST
;STARTLIST=L020
;STARTLIST=PING
;STARTLIST=VL27
;NB: mettere copy always ai file di conf x fare test...
STARTLIST=PIZ08
MAXCNC=10
+71
View File
@@ -0,0 +1,71 @@
;Configurazione IOB-WIN
[IOB]
;Impianto COMECA Pilastrello per Pizzaferri
CNCTYPE=SIEMENS_COMECA
PING_MS_TIMEOUT=500
[MACHINE]
VENDOR=COMECA
MODEL=01
[CNC]
IP=192.168.100.1
CPUTYPE=S71500
RACK=0
SLOT=0
[SERVER]
;MPIP=https://localhost:44339
MPIP=https://gwms.egalware.com
MPURL=/pizzaferri/api
CMDBASE=/IOB/input/
CMDFLOG=/IOB/flog/
CMDALIVE=/IOB
CMDENABLED=/IOB/enabled/
CMDADV1=?valore=
CMDREBO=/IOB/sendReboot?idxMacchina=
[MEMORY]
ADDR_READ=DB85.DBB0
ADDR_WRITE=DB85.DBB280
SIZE_READ=280
SIZE_WRITE=32
[BLINK]
;MAX_COUNTER_BLINK = 30
MAX_COUNTER_BLINK = 15
;bit0 = 0
;bit1 = 0
;bit2 = 1
;bit3 = 1
;bit4 = 1
;bit5 = 0
;bit6 = 0
;bit7 = 0
BLINK_FILT=0
;BLINK_FILT=28
[OPTPAR]
;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice
PZCOUNT_MODE=STD.DB85.DBRE16
DISABLE_PZCOUNT=FALSE
ENABLE_SEND_PZC_BLOCK=TRUE
MIN_SEND_PZC_BLOCK=0
MAX_SEND_PZC_BLOCK=100
; GEST DATI DYN
ENABLE_DYN_DATA=TRUE
FORCE_DYN_DATA=TRUE
; clock base (da 10ms)
timerIntMs=20
; conf parametri memoria READ/WRITE
PARAM_CONF=PIZ08.json
NO_PING=TRUE
; conf aree allarme
ALARM_CONF=PIZ08_alarm.json
[BRANCH]
NAME=master
+252
View File
@@ -0,0 +1,252 @@
{
"mMapWrite": {
"MinTemp01": {
"name": "MinTemp01",
"description": "Impostazione temperatura min TE04 Linea sfiato Gas",
"tipoMem": "Real",
"memAddr": "DB85.DBB280",
"index": 280,
"size": 4,
"unit": "C"
},
"MinTemp02": {
"name": "MinTemp02",
"description": "Impostazione temperatura min TT17 Linea sfiato Gas Torcia Serbatoio",
"tipoMem": "Real",
"memAddr": "DB85.DBB284",
"index": 284,
"size": 4,
"unit": "C"
}
},
"mMapRead": {
"TE2A": {
"name": "TE2A",
"description": "Temperatura Controllo Tenute Pompa A (TE2A)",
"memAddr": "DB85.DBB0",
"tipoMem": "Real",
"index": 0,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
},
"TE1A": {
"name": "TE1A",
"description": "Temperatura Raffreddamento Pompa A (TE1A)",
"memAddr": "DB85.DBB4",
"tipoMem": "Real",
"index": 4,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
},
"TE3A": {
"name": "TE3A",
"description": "Temperatura Cavitazione Pompa A (TE3A)",
"memAddr": "DB85.DBB8",
"tipoMem": "Real",
"index": 8,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
},
"Temp01": {
"name": "Temp01",
"description": "Temperatura Torcia Aria Fredda (TE04)",
"memAddr": "DB85.DBB12",
"tipoMem": "Real",
"index": 12,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
},
"Level": {
"name": "Level",
"description": "Livello Serbatoio (LT15)",
"memAddr": "DB85.DBB16",
"tipoMem": "Real",
"index": 16,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "Kg"
},
"PressBH": {
"name": "PressBH",
"description": "Pressione Linea CNG (PT01)",
"memAddr": "DB85.DBB20",
"tipoMem": "Real",
"index": 20,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "bar"
},
"PressBL": {
"name": "PressBL",
"description": "Pressione Riduttrice (PT100)",
"memAddr": "DB85.DBB24",
"tipoMem": "Real",
"index": 24,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "bar"
},
"MainPress": {
"name": "MainPress",
"description": "Pressione Serbatoio (PT16)",
"memAddr": "DB85.DBB28",
"tipoMem": "Real",
"index": 28,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "bar"
},
"Temp02": {
"name": "Temp02",
"description": "Temperatura Spurgo Torcia Serbatoio (TT17)",
"memAddr": "DB85.DBB36",
"tipoMem": "Real",
"index": 36,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
},
"TE06": {
"name": "TE06",
"description": "Temperatura Uscita Vaporizzatore (TE06)",
"memAddr": "DB85.DBB40",
"tipoMem": "Real",
"index": 40,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
},
"TE05": {
"name": "TE05",
"description": "Temperatura Carica Fredda (TE05)",
"memAddr": "DB85.DBB60",
"tipoMem": "Real",
"index": 60,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
},
"TE2B": {
"name": "TE2B",
"description": "Temperatura Controllo Tenute Pompa B (TE2B)",
"memAddr": "DB85.DBB64",
"tipoMem": "Real",
"index": 64,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
},
"TE1B": {
"name": "TE1B",
"description": "Temperatura Raffreddamento Pompa B (TE1B)",
"memAddr": "DB85.DBB68",
"tipoMem": "Real",
"index": 68,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
},
"TE3B": {
"name": "TE3B",
"description": "Temperatura Cavitazione Pompa B (TE3B)",
"memAddr": "DB85.DBB72",
"tipoMem": "Real",
"index": 72,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
},
"PressH": {
"name": "PressH",
"description": "Alta Pressione (PT300A)",
"memAddr": "DB85.DBB120",
"tipoMem": "Real",
"index": 120,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "bar"
},
"PressM": {
"name": "PressM",
"description": "Media Pressione (PT300M)",
"memAddr": "DB85.DBB124",
"tipoMem": "Real",
"index": 124,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "bar"
},
"LivelloPerc": {
"name": "LivelloPerc",
"description": "Livello Serbatorio % (LT15%)",
"memAddr": "DB85.DBB148",
"tipoMem": "Real",
"index": 148,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "%"
},
"MinTemp01": {
"name": "MinTemp01",
"description": "Minima Temperatura Linea Sfiato Gas (TE04)",
"memAddr": "DB85.DBB152",
"tipoMem": "Real",
"index": 152,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
},
"MinTemp02": {
"name": "MinTemp02",
"description": "Minima Temperatura Linea Sfiato Gas Torcia Serbatoio (TT17)",
"memAddr": "DB85.DBB156",
"tipoMem": "Real",
"index": 156,
"size": 4,
"func": "MAX",
"period": 60,
"factor": 1,
"unit": "C"
}
}
}
+125
View File
@@ -0,0 +1,125 @@
[
{
"description": "Allarmi Impianto",
"tipoMem": "Boolean",
"memAddr": "DB85.DBB232",
"index": 232,
"size": 6,
"messages": [
"Emergenza Non Ripristinata",
"Emergenza QE Intervenuta",
"Emergenza Puls. Dispencer B Intervenuta",
"Emergenza Puls. Dispencer A Intervenuta",
"Stato Interruttore Erogatore Liquido B",
"Allarme Controllo Tensione di Rete",
"Allarme Controllo Tensione Antincendio",
"Stato Interruttore Erogatore Liquido A",
"Stato Sezionatore Generale",
"Stato Interruttore Protezione SPD",
"Stato Interruttore Sirena e Rotoalarm",
"Stato Interruttore Luci Emergenza",
"Stato Interruttore Pompa PC1A",
"Stato Interruttore Pompa PC1B",
"Stato Interruttore Pompa Sommersa C",
"Stato Termica Boil-Off",
"##234.0",
"Preallarme Centralina Metano",
"Allarme Centralina Metano",
"Emergenza Puls. Dispencer C Invervenuta",
"Mancaza Pressione Aria",
"Minima Temperatura Linea Sfiato Gas TE04",
"Minima Temperatura Linea Sfiato Gas Torcia Serbatoio TT17",
"Massima Temperatura Linea Sfiato Gas Torcia Serbatoio TT17",
"Almeno Un Emergenza Intervenuta",
"Arresto Operativo da PT1(predisposizione)",
"Stato Interruttore Alimentazione Punto Zero",
"##234.11",
"##234.12",
"##234.13",
"##234.14",
"Configurazione Incongruente",
"Pulsante Emergenza 2 SB17.3A Premuto",
"Pulsante Emergenza 1 SB17.3B Premuto",
"Pulsante Emergenza SB17.3C Premuto",
"Pulsante Emergenza 3 SB17.5 Premuto",
"Pulsante Emergenza 4 SB17.7 Premuto",
"##236.5",
"##236.6",
"##236.7",
"GT_TE2A",
"GT_TE1A",
"GT_TE3A",
"GT_TE04",
"GT_LT15",
"GT_PT01",
"GT_PT300R",
"GT_PT16"
]
},
{
"description": "Allarmi Serbatoio",
"tipoMem": "Boolean",
"memAddr": "DB85.DBB248",
"index": 248,
"size": 2,
"messages": [
"Serbatoio Troppo Pieno",
"Serbatoio Pieno_HH",
"Serbatoio Pieno_H",
"Serbatoio Vuoto_LL",
"H Pressione Serbatoio",
"HH Pressione Serbatoio",
"LL Temperatura Ingresso BoilOff TE08",
"Minima Pressione Serbatoio per Partenza Pompe",
"Timeout Apertura Valvola PV1",
"Timeout Chiusura Valvola PV1",
"Timeout Apertura Valvola PV70",
"Timeout Chiusura Valvola PV70",
"##248.12",
"##248.13",
"##248.14",
"##248.15"
]
},
{
"description": "Allarmi Pompa Alta Pressione A",
"tipoMem": "Boolean",
"memAddr": "DB85.DBB252",
"index": 252,
"size": 4,
"messages": [
"Ritardo Avvio Pompa PC1B",
"##252.1",
"Temperatura Freddo TE1B NON Raggiunta",
"HH Temperatura Cavitazione TE3B",
"Allarme Temperatura Tenute Pompa TE2B",
"LL Temperatura Ingresso Stoccaggio TE06",
"Allarme Temperatura Ingresso Stoccaggio TE07",
"Aumento Pressione PT01",
"Max Pressione PT01",
"##256.9",
"##256.10",
"##256.11",
"##256.12",
"##256.13",
"##256.14",
"##256.15",
"Timeout Apertura PV3B",
"Timeout Apertura PV5B",
"Timeout Apertura PV6B",
"Timeout Apertura PV7",
"##258.4",
"##258.5",
"##258.6",
"##258.7",
"##258.8",
"##258.9",
"##258.10",
"##258.11",
"##258.12",
"##258.13",
"##258.14",
"##258.15"
]
}
]
+120
View File
@@ -0,0 +1,120 @@
;Configurazione IOB-WIN
[IOB]
CNCTYPE=SIMULA
PING_MS_TIMEOUT=500
MinDeltaSec=5
EnableRedisQueue=true
;IOB_NAME=TFT_RAMA_001
[MACHINE]
VENDOR=STEAMWARE
MODEL=DEMO_SIMULATOR
[CNC]
IP=127.0.0.1
PORT=0000
[SERVER]
MPIP=http://10.74.82.218
MPURL=/MP/IO
CMDBASE=/IOB/input/
CMDFLOG=/IOB/flog/
CMDALIVE=/IOB
CMDENABLED=/IOB/enabled/
CMDADV1=?valore=
CMDREBO=/sendReboot.aspx?idxMacchina=
CMD_ODL_STARTED=/IOB/getCurrOdlStart/
CMD_FORCLE_SPLIT_ODL=/IOB/forceSplitOdlFull/
CMD_IDLE_TIME=/IOB/getIdlePeriod/
[MEMORY]
[BLINK]
MAX_COUNTER_BLINK = 15
BLINK_FILT=0
[OPTPAR]
DISABLE_SEND_WDST=TRUE
AUTO_CHANGE_ODL=true
AUTO_SNAPSHOT_DOSSIER=true
CHANGE_ODL_HOURS=24
CHANGE_ODL_IDLE_MIN=0
CHANGE_ODL_MODE=SIMUL
; gestione custom timer
timerIntMs=100
;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice
PZCOUNT_MODE=BIT
ENABLE_PZ_RESET=TRUE
;gestione invio pezzi in blocco
ENABLE_SEND_PZC_BLOCK=TRUE
MIN_SEND_PZC_BLOCK=0
MAX_SEND_PZC_BLOCK=100
; gestione cambio ODL automatico (minuti minimi durata)
MIN_DURATA_ODL=960
; per il simulatore: 50|1 = WAIT 50, DURATION 1 con riferimento al PERIODO base (PER_BASE in ms, default 10 secondi)
PER_BASE=10100
SIM_PZCNT=5|1
SIM_ALARM=100|10
SIM_MANU=50|6
; indica gestione e simulazione bit 5 --> slow
SIM_SLOW=3600|20
; indica gestione e simulazione bit 6 --> warmup/cooldown
SIM_WUCD=8000|20
; indica gestione e simulazione bit 7 --> emergenza
SIM_EMRG=4000|10
; indica simulazione delle funzionalità power ON/ OFF
SIM_POW_ON_OFF=true
T_ON=7
T_OFF=22
; indica simulazione controlli utente
SIM_RC=81|1
; indica simulazione registro scarti
SIM_RS=161|1
; indica simulazione dichiarazioni (note) utente
SIM_DICH=261|1
; indica matricola opr simulata
SIM_MATR_OPR=1
; test x datasync...
DATA_SYNC_AT_START=true
; test sim dossiers tipo Kepware
SIM_KWP=true
; gestione DynData simulati
ENABLE_DYN_DATA=TRUE
FORCE_DYN_DATA=TRUE
NEW_DYN_DATA=TRUE
; indica parametri gestione TcMan
TC_MAX_TC_FACTOR=3.9
TC_LAMBDA=0.4
TC_MAX_INCR=5
MAX_PZ_INCR_PERC=1000
; conf parametri memoria READ/WRITE
PARAM_CONF=SIMUL_01.json
ALARM_CONF=SIMUL_01_alarm.json
;test gestione logfile (eg: soitaab)
EnabelPodlManFull=true
CodGruppoIob=STEAMWARE-SIM-FASE-01
; invio flux alla lettura file
sendFluxOnRead=true
;conf test FTP
FTP_SERVER=ftp.steamware.net
FTP_USER=testftpuser
FTP_PWD=we4reFromB3rghem!
FTP_CERT=
FTP_SKIP=TRUE
FTP_LOC_DIR=temp\csv
FTP_REM_DIR=
CSV_ADD_HEADER=true
[BRANCH]
NAME=master
; Tags manuali
[TAGS]
Customer=Steamware
HostOS=WIN
HostName=IOB-WIN-SIMULA
HostAddr=10.74.82.76
+410
View File
@@ -0,0 +1,410 @@
{
"mMapWrite": {
"setArt": {
"name": "setArt",
"description": "Articolo",
"memAddr": "DB150.DBB12",
"tipoMem": "String",
"index": 12,
"size": 20,
"displOrdinal": 1
},
"setArtNum": {
"name": "setArtNum",
"description": "# Num Articolo",
"memAddr": "DB150.DBB112",
"tipoMem": "Int",
"index": 112,
"size": 4,
"displOrdinal": 1
},
"setComm": {
"name": "setComm",
"description": "Commessa",
"memAddr": "DB150.DBB32",
"tipoMem": "String",
"index": 32,
"size": 20,
"displOrdinal": 2
},
"setCommNum": {
"name": "setCommNum",
"description": "# NumCommessa",
"memAddr": "DB150.DBB132",
"tipoMem": "Int",
"index": 132,
"size": 4,
"displOrdinal": 2
},
"setPzComm": {
"name": "setPzComm",
"description": "Qta Richiesta",
"memAddr": "DB150.DBB8",
"tipoMem": "Int",
"index": 8,
"size": 4,
"displOrdinal": 3
},
"forceSetPzCount": {
"name": "forceSetPzCount",
"description": "Imposta Qta",
"memAddr": "DB150.DBB8",
"tipoMem": "Int",
"index": 8,
"size": 4,
"displOrdinal": 11
},
//"OPC_Set Point.Chain Spped": {
// "name": "OPC_Set Point.Chain Spped",
// "description": "Chain Spped",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Chain Spped",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Top Overfeeding": {
// "name": "OPC_Set Point.Top Overfeeding",
// "description": "Top Overfeeding",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Top Overfeeding",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Bottom Overfeeding": {
// "name": "OPC_Set Point.Bottom Overfeeding",
// "description": "Bottom Overfeeding",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Bottom Overfeeding",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Width Master": {
// "name": "OPC_Set Point.Width Master",
// "description": "Width Master",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Width Master",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Thermoset Time": {
// "name": "OPC_Set Point.Thermoset Time",
// "description": "Thermoset Time",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Thermoset Time",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Thermoset Temperature": {
// "name": "OPC_Set Point.Thermoset Temperature",
// "description": "Thermoset Temperature",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Thermoset Temperature",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Take Off Overfeeding": {
// "name": "OPC_Set Point.Take Off Overfeeding",
// "description": "Take Off Overfeeding",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Take Off Overfeeding",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Small Roller Overfeeding": {
// "name": "OPC_Set Point.Small Roller Overfeeding",
// "description": "Small Roller Overfeeding",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Small Roller Overfeeding",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Scroll Roller Overfeeding": {
// "name": "OPC_Set Point.Scroll Roller Overfeeding",
// "description": "Scroll Roller Overfeeding",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Scroll Roller Overfeeding",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Right Whell Overfeeding": {
// "name": "OPC_Set Point.Right Whell Overfeeding",
// "description": "Right Whell Overfeeding",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Right Whell Overfeeding",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Plaiter Overfeeding": {
// "name": "OPC_Set Point.Plaiter Overfeeding",
// "description": "Plaiter Overfeeding",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Plaiter Overfeeding",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Load cell Weight": {
// "name": "OPC_Set Point.Load cell Weight",
// "description": "Load cell Weight",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Load cell Weight",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Left Wheel Overfeeding": {
// "name": "OPC_Set Point.Left Wheel Overfeeding",
// "description": "Left Wheel Overfeeding",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Left Wheel Overfeeding",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Fan 105A Speed": {
// "name": "OPC_Set Point.Fan 105A Speed",
// "description": "Fan 105A Speed",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Fan 105A Speed",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Fan 105 Speed": {
// "name": "OPC_Set Point.Fan 105 Speed",
// "description": "Fan 105 Speed",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Fan 105 Speed",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Fan 103A Speed": {
// "name": "OPC_Set Point.Fan 103A Speed",
// "description": "Fan 103A Speed",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Fan 103A Speed",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Fan 103 Speed": {
// "name": "OPC_Set Point.Fan 103 Speed",
// "description": "Fan 103 Speed",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Fan 103 Speed",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Fan 101A Speed": {
// "name": "OPC_Set Point.Fan 101A Speed",
// "description": "Fan 101A Speed",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Fan 101A Speed",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Fan 101 Speed": {
// "name": "OPC_Set Point.Fan 101 Speed",
// "description": "Fan 101 Speed",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Fan 101 Speed",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Exhaust Fan 1 Speed": {
// "name": "OPC_Set Point.Exhaust Fan 1 Speed",
// "description": "Exhaust Fan 1 Speed",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Exhaust Fan 1 Speed",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Differentiation Spindle 5": {
// "name": "OPC_Set Point.Differentiation Spindle 5",
// "description": "Differentiation Spindle 5",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Differentiation Spindle 5",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Differentiation Spindle 4": {
// "name": "OPC_Set Point.Differentiation Spindle 4",
// "description": "Differentiation Spindle 4",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Differentiation Spindle 4",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Differentiation Spindle 3": {
// "name": "OPC_Set Point.Differentiation Spindle 3",
// "description": "Differentiation Spindle 3",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Differentiation Spindle 3",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Differentiation Spindle 2": {
// "name": "OPC_Set Point.Differentiation Spindle 2",
// "description": "Differentiation Spindle 2",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Differentiation Spindle 2",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Differentiation Spindle 1": {
// "name": "OPC_Set Point.Differentiation Spindle 1",
// "description": "Differentiation Spindle 1",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Differentiation Spindle 1",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Cooling Cell 1 Speed": {
// "name": "OPC_Set Point.Cooling Cell 1 Speed",
// "description": "Cooling Cell 1 Speed",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Cooling Cell 1 Speed",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Burner 6 Temperature": {
// "name": "OPC_Set Point.Burner 6 Temperature",
// "description": "Burner 6 Temperature",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Burner 6 Temperature",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Burner 5 Temperature": {
// "name": "OPC_Set Point.Burner 5 Temperature",
// "description": "Burner 5 Temperature",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Burner 5 Temperature",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Burner 4 Temperature": {
// "name": "OPC_Set Point.Burner 4 Temperature",
// "description": "Burner 4 Temperature",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Burner 4 Temperature",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Burner 3 Temperature": {
// "name": "OPC_Set Point.Burner 3 Temperature",
// "description": "Burner 3 Temperature",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Burner 3 Temperature",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Burner 2 Temperature": {
// "name": "OPC_Set Point.Burner 2 Temperature",
// "description": "Burner 2 Temperature",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Burner 2 Temperature",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Burner 1 Temperature": {
// "name": "OPC_Set Point.Burner 1 Temperature",
// "description": "Burner 1 Temperature",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Burner 1 Temperature",
// "index": 0,
// "size": 0
//},
//"OPC_Set Point.Air Humidity Preset Esa 1": {
// "name": "OPC_Set Point.Air Humidity Preset Esa 1",
// "description": "Air Humidity Preset Esa 1",
// "tipoMem": "String",
// "memAddr": "ns=2;s=RamosaETN21.RamosaCJ2.Recipe.Air Humidity Preset Esa 1",
// "index": 0,
// "size": 0
//}
},
"mMapRead": {
"TEMP_01": {
"name": "TEMP_01",
"description": "Temperatura 01",
"tipoMem": "Real",
"minVal": 18,
"maxVal": 24,
"displOrdinal": 4
},
"POWER_01": {
"name": "POWER_01",
"description": "Potenza impianto",
"tipoMem": "Int",
"minVal": 40,
"maxVal": 80,
"displOrdinal": 5
},
"FEED_OVER": {
"name": "FEED_OVER",
"description": "FEED override",
"tipoMem": "Int",
"minVal": 0,
"maxVal": 100,
"displOrdinal": 6
},
"RAPID_OVER": {
"name": "RAPID_OVER",
"description": "RAPID override",
"tipoMem": "Int",
"minVal": 50,
"maxVal": 120,
"displOrdinal": 7
},
"POS_X": {
"name": "POS_X",
"description": "Asse X",
"tipoMem": "Int",
"minVal": -2000,
"maxVal": 2000,
"displOrdinal": 8
},
"POS_Y": {
"name": "POS_Y",
"description": "Asse Y",
"tipoMem": "Int",
"minVal": 0,
"maxVal": 2000,
"displOrdinal": 9
},
"POS_Z": {
"name": "POS_Z",
"description": "Asse Z",
"tipoMem": "Int",
"minVal": 0,
"maxVal": 1500,
"displOrdinal": 10
}
},
"optKVP": {
"fluxLogReduce": true,
"fluxLogRedDeadBand": 1.5,
"fluxLogResendPeriod": 15,
"hasRecipe": true,
"maxPodlQty": 530,
"useLocalRecipe": true,
"path-locBase": "C:\\MesData\\",
"path-00-Arch": "ArchivioRicette\\FIMAT",
"path-01-Temp": "01-Temp\\FIMAT",
"path-02-Sent": "02-Inviate\\FIMAT",
"path-03-Recv": "03-Ricevute\\FIMAT",
"path-04-remReq": "Y:\\",
"path-05-remExe": "C:\\MesData\\Remote\\Dosed",
"path-06-remRec": "R:\\",
"path-outReport": "C:\\MesData\\Report",
"path-confSetup": "C:\\MesData\\Setup\\setupConsumi.json",
"replace-<Variant>": "<Variant>{{PODL}}",
"replace-<Info1>": "<Info1>Kg{{Qty}} | {{Note}}"
}, //,
//"BaseKeyTranslate": "ns=2;s=RamosaETN21.RamosaCJ2",
//"RecipeKeyTranslate": {
// "Present Value.General Fan": "Recipe.Chain Spped",
// "Present Value.Bottom Overfeeding": "Recipe.Bottom Overfeeding",
// "Present Value.Top Overfeeding": "Recipe.Top Overfeeding"
//}
"mMapWriteLink": {
"setArt": "setArtNum",
"setComm": "setCommNum"
}
}
+51
View File
@@ -0,0 +1,51 @@
;Configurazione IOB-WIN
[IOB]
CNCTYPE=PingWatchdog
PING_MS_TIMEOUT=500
; attenzione che alcuni eventi vengo scritti cmq nel log di SIMUL_01 invece di SIMUL_01_WD
IOB_NAME=SIMUL_01
[MACHINE]
VENDOR=STEAMWARE
MODEL=WATCHDOG
[CNC]
; ping vs WIN10-VPN-03 per test
IP=10.74.83.203
PORT=0000
[SERVER]
MPIP=http://10.74.82.218
MPURL=/MP/IO
CMDBASE=/IOB/input/
CMDFLOG=/IOB/flog/
CMDALIVE=/IOB
CMDENABLED=/IOB/enabled/
CMDADV1=?valore=
CMDREBO=/sendReboot.aspx?idxMacchina=
CMD_ODL_STARTED=/IOB/getCurrOdlStart/
CMD_FORCLE_SPLIT_ODL=/IOB/forceSplitOdlFull/
CMD_IDLE_TIME=/IOB/getIdlePeriod/
[MEMORY]
[BLINK]
MAX_COUNTER_BLINK = 15
BLINK_FILT=0
[OPTPAR]
AUTO_CHANGE_ODL=false
POWEROFF_TIMEOUT_SEC=60
ENABLE_SEND_PZC_BLOCK=TRUE
MIN_SEND_PZC_BLOCK=0
MAX_SEND_PZC_BLOCK=100
[BRANCH]
NAME=master
; Tags manuali
[TAGS]
Customer=Steamware
HostOS=WIN
HostName=IOB-WIN-SIMULA
HostAddr=10.74.82.76
@@ -0,0 +1,859 @@
[
{
"description": "Alarm Word 0 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 0",
"index": 0,
"size": 2,
"messages": [
"1,ALLARME INVERTER CATENA TRASP. TESSUTO",
"2,ALLARME INVERTER CILINDRO SOVRALIMENTAZIONE SUPERIORE",
"3,ALLARME INVERTER CILINDRO SOVRALIMENTAZIONE INFERIORE",
"4,ALLARME INVERTER RUOTA SOVRALIMENTAZIONE SINISTRA",
"5,ALLARME INVERTER RUOTA SOVRALIMENTAZIONE DESTRA",
"6,ALLARME INVERTER STACCAPEZZA",
"7,ALLARME INVERTER FALDAROTOLATORE",
"8,ALLARME INVERTER FALDERUOLE",
"9,ALLARME INVERTER ESAUSTORE 1 ",
"10,ALLARME FUNE SICUREZZA USCITA",
"11,ALLARME VENTILATORE 1 (BASSO)",
"12, ALLARME VENTILATORE 2 (BASSO)",
"13,ALLARME F.C. MINIMO CAMPO MASTER",
"14,ALLARME F.C. MASSIMO CAMPO MASTER",
"15,ALLARME PROTEZIONE TAPPETO INGRESSO",
"16,RIFERIMENTO POTENZIOMETRI CAMPI ASSENTE"
]
},
{
"description": "Alarm Word 1 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 1",
"index": 1,
"size": 2,
"messages": [
"17,ALLARME CONDIZIONATORI",
"18,EMERGENZA IN CORSO !!!",
"19,ALLARME PROTEZIONE RECUPERO CALORE - GRUPPO 2 POMPA 1",
"20,ALLARME POMPA RECUPERO CALORE 3",
"21,CONTROLLO UMIDITA' : FUORI CAMPO",
"22,ALLARME RILEVATORE ALTEZZA TESSUTO",
"23,ALLARME NON RILASCIO TESSUTO SINISTRO",
"24,ALLARME NON RILASCIO TESSUTO DESTRO",
"25,ALLARME ALIMENTAZIONE 24VAC QUADRO",
"26,ALLARME APRICIMOSSE",
"27,ALLARME ASCIUGACIMOSSE A INFRAROSSI",
"28,ALLARME PROTEZIONE CELLA DI RAFFREDDAMENTO 1",
"29,CAMPO PARALLELO 2 ALLARME PROTEZIONE",
"30,ALLARME VENTILATORE 3 (BASSO)",
"31,ALLARME VENTILATORE 4 (BASSO)",
"32,CAMPO PARALLELO 1 ALLARME PROTEZIONE"
]
},
{
"description": "Alarm Word 2 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 2",
"index": 2,
"size": 2,
"messages": [
"33,CAMPO PARALLELO 3 ALLARME PROTEZIONE",
"34,RAGGIUNTO MASSIMO CARICO CELLA DI CARICO TAPPETO",
"35,ALLARME FALLOPEZZA SINISTRO",
"36,ALLARME FALLOPEZZA DESTRO",
"37,PARATIE ANTERIORI APERTE",
"38,ALLARME AZIONAMENTO CAMPO CONICO",
"39,BLOCCO BRUCIATORE 9",
"40,CAMPO MASTER ALLARME PROTEZIONE ",
"41,ALLARME PRESSOSTATO TENDICATENA SINISTRO",
"42,ALLARME PRESSOSTATO TENDICATENA DESTRO",
"43,ALLARME MASSIMO ALLUNGAMENTO CATENA",
"44,ALLARME TIPO LAVORO USCITA NON SELEZIONATO",
"45,ALLARME RADDRIZZATRAMA",
"46,ALLARME SPREMITORE 1",
"47,BLOCCO BRUCIATORE 10",
"48,BLOCCO BRUCIATORE 11"
]
},
{
"description": "Alarm Word 3 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 3",
"index": 3,
"size": 2,
"messages": [
"49,BLOCCO BRUCIATORE 12",
"50,BLOCCO BRUCIATORE 1",
"51,BLOCCO BRUCIATORE 2",
"52,BLOCCO BRUCIATORE 3",
"53,BLOCCO BRUCIATORE 4",
"54,BIELLE FUORI POSIZIONE",
"55,GRUPPO FALDATORE FUORI POSIZIONE",
"56,SERIE ARRESTI APERTA",
"57,MANCANZA LUBRIFICANTE CATENA TRASP. TESSUTO",
"58,ALLARME INVERTER PICCOLO ROTOLO",
"59,ALLARME PROTEZIONE ALLARGATORI",
"60,ALLARME PROTEZIONE ASPIRACIMOSSE",
"61,ALLARME TAGLIACIMOSSE SINISTRA",
"62,ALLARME TAGLIACIMOSSE DESTRA",
"63,ALLARME INVERTER VENTILATORI INV101",
"64,ALLARME INVERTER VENTILATORI INV103"
]
},
{
"description": "Alarm Word 4 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 4",
"index": 4,
"size": 2,
"messages": [
"65,ALLARME TIMEOUT VITE CAMPO MASTER",
"66,ALLARME TIMEOUT VITE CAMPO PARALLELO 1",
"67,ALLARME TIMEOUT VITE CAMPO PARALLELO 2",
"68,ALLARME TIMEOUT VITE CAMPO PARALLELO 3",
"69,ALLARME TIMEOUT VITE CAMPO PARALLELO 4",
"70,ALLARME TIMEOUT VITE CAMPO PARALLELO 5",
"71,ALLARME TIMEOUT VITE CAMPO PARALLELO 6",
"72,ALLARME TIMEOUT VITE CAMPO PARALLELO 7",
"73,ALLARME TIMEOUT VITE CAMPO PARALLELO 8",
"74,ALLARME TIMEOUT VITE CAMPO PARALLELO 9",
"75,ALLARME DEVICE_NET ADDR. 32 DA BANCHETTO DI SPALMATURA",
"76,ALLARME INVERTER DOGAL ",
"77,ALLARME FOTOCELLULA TAPPETO USCITA PIENO",
"78,TEMPO DI CICLO PLC SOPRA MASSIMO IMPOSTATO",
"79,ERRORE INDIRIZZI SONDE BRUCIATORI",
"80,ALLARME VENTILATORE 4 (ALTO)"
]
},
{
"description": "Alarm Word 5 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 5",
"index": 5,
"size": 2,
"messages": [
"81,ALLARME VENTILATORE 5 (ALTO)",
"82,ALLARME VENTILATORE 6 (ALTO)",
"83,ALLARME VENTILATORE 7 (ALTO)",
"84,SONDA BRUCIATORE 1 INTERROTTA",
"85,SONDA BRUCIATORE 2 INTERROTTA",
"86,SONDA BRUCIATORE 3 INTERROTTA",
"87,SONDA BRUCIATORE 4 INTERROTTA",
"88,ALLARME DEVICE_NET ADDR. 0",
"89,ALLARME DEVICE_NET ADDR. 1",
"90,ALLARME DEVICE_NET ADDR. 2",
"91,ALLARME DEVICE_NET ADDR. 3",
"92,ALLARME DEVICE_NET ADDR. 4",
"93,ALLARME DEVICE_NET ADDR. 5",
"94,ALLARME DEVICE_NET ADDR. 6",
"95,ALLARME DEVICE_NET ADDR. 7",
"96,ALLARME DEVICE_NET ADDR. 8"
]
},
{
"description": "Alarm Word 6 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 6",
"index": 6,
"size": 2,
"messages": [
"97,ALLARME DEVICE_NET ADDR. 9",
"98,ALLARME DEVICE_NET ADDR. 10",
"99,ALLARME DEVICE_NET ADDR. 11",
"100,ALLARME DEVICE_NET ADDR. 12",
"101,ALLARME DEVICE_NET ADDR. 13",
"102,ALLARME DEVICE_NET ADDR. 14",
"103,ALLARME DEVICE_NET ADDR. 15",
"104,ALLARME DEVICE_NET ADDR. 16",
"105,ALLARME DEVICE_NET ADDR. 17",
"106,ALLARME DEVICE_NET ADDR. 18",
"107,ALLARME DEVICE_NET ADDR. 19",
"108,ALLARME DEVICE_NET ADDR. 20",
"109,ALLARME DEVICE_NET ADDR. 21",
"110,ALLARME DEVICE_NET ADDR. 22",
"111,ALLARME DEVICE_NET ADDR. 23",
"112,ALLARME DEVICE_NET ADDR. 24"
]
},
{
"description": "Alarm Word 7 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 7",
"index": 7,
"size": 2,
"messages": [
"113,ALLARME DEVICE_NET ADDR. 25",
"114,ALLARME DEVICE_NET ADDR. 26",
"115,BLOCCO BRUCIATORE 5",
"116,BLOCCO BRUCIATORE 6",
"117,BLOCCO BRUCIATORE 7",
"118,BLOCCO BRUCIATORE 8",
"119,SOVRATEMPERATURA BRUCIATORE 1",
"120,SOVRATEMPERATURA BRUCIATORE 2",
"121,SOVRATEMPERATURA BRUCIATORE 3",
"122,SOVRATEMPERATURA BRUCIATORE 4",
"123,SOVRATEMPERATURA BRUCIATORE 5",
"124,SOVRATEMPERATURA BRUCIATORE 6",
"125,SOVRATEMPERATURA BRUCIATORE 7",
"126,SOVRATEMPERATURA BRUCIATORE 8",
"127,SONDA BRUCIATORE 5 INTERROTTA",
"128,SONDA BRUCIATORE 6 INTERROTTA"
]
},
{
"description": "Alarm Word 8 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 8",
"index": 8,
"size": 2,
"messages": [
"129,SONDA BRUCIATORE 7 INTERROTTA",
"130,SONDA BRUCIATORE 8 INTERROTTA",
"131,SONDA BRUCIATORE 9 INTERROTTA",
"132,SONDA BRUCIATORE 10 INTERROTTA",
"133,SONDA BRUCIATORE 11 INTERROTTA",
"134,SONDA BRUCIATORE 12 INTERROTTA",
"135,SOVRATEMPERATURA BRUCIATORE 9",
"136,SOVRATEMPERATURA BRUCIATORE 10",
"137,SOVRATEMPERATURA BRUCIATORE 11",
"138,SOVRATEMPERATURA BRUCIATORE 12",
"139,ALLARME INVERTER VENTILATORI INV105",
"140,ALLARME INVERTER VENTILATORI INV107",
"141,ALLARME INVERTER VENTILATORI INV109",
"142,ALLARME INVERTER VENTILATORI INV111",
"143,ALLARME VENTILATORE 5 (BASSO)",
"144,ALLARME VENTILATORE 6 (BASSO)"
]
},
{
"description": "Alarm Word 9 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 9",
"index": 9,
"size": 2,
"messages": [
"145,ALLARME VENTILATORE 7 (BASSO)",
"146,ALLARME VENTILATORE 8 (BASSO)",
"147,ALLARME VENTILATORE 9 (BASSO)",
"148,ALLARME VENTILATORE 10 (BASSO)",
"149,ALLARME VENTILATORE 11 (BASSO)",
"150,ALLARME VENTILATORE 12 (BASSO)",
"151,ALLARME INVERTER ESAUSTORE 2",
"152,CAMPO PARALLELO 4 ALLARME PROTEZIONE",
"153,CAMPO PARALLELO 5 ALLARME PROTEZIONE",
"154,CAMPO PARALLELO 6 ALLARME PROTEZIONE",
"155,CAMPO PARALLELO 7 ALLARME PROTEZIONE",
"156,CAMPO PARALLELO 8 ALLARME PROTEZIONE",
"157,ALLARME INSEGUIMENTO VITE MASTER AGGIUNTA",
"158,ALLARME INVERTER CILINDRO RAFFREDDAMENTO",
"159,ALLARME TEMPERATURA ESAUSTORI",
"160,ALLARME INVERTER RECUPERO CALORE GRUPPO 1 "
]
},
{
"description": "Alarm Word 10 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 10",
"index": 10,
"size": 2,
"messages": [
"161,ALLARME FINECORSA SX TAPPETO USCITA",
"162,ALLARME FINECORSA DX TAPPETO USCITA",
"163,ALLARME INVERTER RECUPERO CALORE GRUPPO 2",
"164,ALLARME DEVICE_NET ADDR. 31",
"165,ALLARME CENTRATORE USCITA",
"166,COMPATTATORE NON PRONTO",
"167,ALLARME CONTROLLO PIROMETRI",
"168,ALLARME ALLARGATORE SU TAPPETO USCITA",
"169,ALLARME CONTROLLO FUMI",
"170,ALLARME FINECORSA BALLERINO ALTO",
"171,ALLARME FINECORSA BALLERINO BASSO",
"172,ALLARME PROTEZIONE ASPIRATORE VAPORIZZO INTENSIVO",
"173,ALLARME PROTEZIONE BRUCIATORE 1",
"174,ALLARME PROTEZIONE BRUCIATORE 2",
"175,ALLARME PROTEZIONE BRUCIATORE 3",
"176,ALLARME PROTEZIONE BRUCIATORE 4"
]
},
{
"description": "Alarm Word 11 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 11",
"index": 11,
"size": 2,
"messages": [
"177,ALLARME PROTEZIONE BRUCIATORE 5",
"178,ALLARME PROTEZIONE BRUCIATORE 6",
"179,ALLARME PROTEZIONE BRUCIATORE 7",
"180,ALLARME PROTEZIONE BRUCIATORE 8",
"181,ALLARME PROTEZIONE BRUCIATORE 9",
"182,ALLARME PROTEZIONE BRUCIATORE 10",
"183,ALLARME PROTEZIONE BRUCIATORE 11",
"184,ALLARME PROTEZIONE BRUCIATORE 12",
"185,TERMOFISSAGGIO O ESSICCAZIONE: TEMPERATURA FUORI CAMPO",
"186,TERMOFISSAGGIO O ESSICCAZIONE: VELOCITA' FUORI CAMPO",
"187,TERMOFISSAGGIO O ESSICCAZIONE: TEMPO FUORI CAMPO",
"188,SISTEMA CAMPI PARALLELI NON TARATO",
"189,ALLARME PROTEZIONE VENTOLE BRUCIATORI",
"190,CAMPO CONICO SINISTRO SU LIMITE CHIUSURA",
"191,CAMPO CONICO SINISTRO SU LIMITE APERTURA",
"192,CAMPO CONICO DESTRO SU LIMITE APERTURA"
]
},
{
"description": "Alarm Word 12 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 12",
"index": 12,
"size": 2,
"messages": [
"193,CAMPO CONICO DESTRO SU LIMITE CHIUSURA",
"194,FINECORSA CAMPO CONICO DESTRO SU TRAVERSA",
"195,FINECORSA CAMPO CONICO SINISTRO SU TRAVERSA",
"196,ALLARME PROTEZIONE INVERTER CAMPO CONICO SINISTRO",
"197,ALLARME PROTEZIONE INVERTER CAMPO CONICO DESTRO",
"198,ALLARME DEVICE_NET ADDR. 27",
"199,ALLARME VENTILATORE 8 (ALTO)",
"200,ALLARME VENTILATORE 9 (ALTO)",
"201,ALLARME VENTILATORE 10 (ALTO)",
"202,ALLARME VENTILATORE 11 (ALTO)",
"203,ALLARME VENTILATORE 12 (ALTO)",
"204,ALLARME VENTILATORE 1 (ALTO)",
"205,ALLARME VENTILATORE 2 (ALTO)",
"206,ALLARME VENTILATORE 3 (ALTO)",
"207,ALLARME PROTEZIONE CELLA DI RAFFREDDAMENTO 2",
"208,ALLARME FINECORSA TANDEM CONTROLLO ANSA TESSUTO"
]
},
{
"description": "Alarm Word 13 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 13",
"index": 13,
"size": 2,
"messages": [
"209,ALLARME FUNE SICUREZZA / PROTEZIONE RIBALTABILE ANTERIORE",
"210,ALLARME INVERTER VENTILATORI INV101A",
"211,ALLARME INVERTER VENTILATORI INV103A",
"212,ALLARME INVERTER VENTILATORI INV105A",
"213,ALLARME INVERTER VENTILATORI INV107A",
"214,ALLARME INVERTER VENTILATORI INV109A",
"215,ALLARME INVERTER VENTILATORI INV111A",
"216,ALLARME DA BANCHETTO DI SPALMATURA",
"217,ALLARME DEVICE_NET ADDR. 28",
"218,STOP JOG USCITA PER PESO RAGGIUNTO SU CELLA DI CARICO",
"219,DOGAL NON PRONTO",
"220,ALLARME PROTEZIONE CELLA RAFFREDDAMENTO 91A",
"221,MALFUNZIONAMENTO RECUPERO CALORE GRUPPO 1",
"222,ALLARME PROTEZIONE SOSTEGNO TESSUTO",
"223,TARATURA CAMPI CONICI NON EFFETTUATA!",
"224,ALLARME TIMEOUT VITE CAMPO PARALLELO 10"
]
},
{
"description": "Alarm Word 14 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 14",
"index": 14,
"size": 2,
"messages": [
"225,CAMPO PARALLELO 9 ALLARME PROTEZIONE",
"226,CAMPO PARALLELO 10 ALLARME PROTEZIONE",
"227,CAMPO PARALLELO 11 ALLARME PROTEZIONE",
"228,CAMPO PARALLELO 12 ALLARME PROTEZIONE",
"229,ALLARME FLUSSOSTATO RECUPERO CALORE 1",
"230,ALLARME FLUSSOSTATO RECUPERO CALORE 2",
"231,ALLARME FLUSSOSTATO RECUPERO CALORE 3",
"232,ALLARME PROTEZIONE VENTILATORE ASCIUGACIMOSSE",
"233,ALLARME PROTEZIONE RESISTENZE ASCIUGACIMOSSE",
"234,ALLARME PROTEZIONE RECUPERO CALORE - GRUPPO 1 POMPA 1 ",
"235,ALLARME INCENDIO",
"236,ATTENZIONE ! ALLARME PRESENTE SU BANCHETTO DI SPALMATURA",
"237,MALFUNZIONAMENTO RECUPERO CALORE GRUPPO 2",
"238,ALLARME PROTEZIONE CELLA RAFFREDDAMENTO 91B",
"239,ALLARME PROTEZIONE PULISCISPILLI",
"240,BATTERIA PLC - LIVELLO BASSO"
]
},
{
"description": "Alarm Word 15 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 15",
"index": 15,
"size": 2,
"messages": [
"241,ALLARME CONTEMPORANEIT? TERMOSTATI SICUREZZA BRUCIATORI",
"242,BLOCCO VERSIONE SOFTWARE",
"243,SROTOLATORE NON PRONTO",
"244,ERRORE DI COMUNICAZIONE PROTOCOL MACRO",
"245,ALLARME TAGLIERINA URBAN",
"246,FINE TESSUTO IN INGRESSO",
"247,ALLARME PROTEZIONE SERVOVENTILAZIONI MOTORI",
"248,ALLARME INVERTER ARROTOLATORE TANGENZIALE",
"249,ALLARME SPREMITORE 2",
"250,ALLARME FS-91ER PLEVA",
"251,ALLARME LINEA EMERGENZA ARROTOLATORE",
"252,ALLARME FOTOCELLULE ARROTOLATORE",
"253,PORTA CASSETTA USCITA RAMOSA APERTA",
"254,ALLARME FINECORSA CILINDRO PROTEZIONE ARROTOLATORE ASSIALE",
"255,ALLARME PRESSOSTATI GRUPPO VALVOLE USCITA",
"256,ARROTOLATORE NON PRONTO"
]
},
{
"description": "Alarm Word 16 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 16",
"index": 16,
"size": 2,
"messages": [
"257,FINECORSA GRUPPO FALDATORE AVANTI",
"258,FINECORSA GRUPPO FALDATORE INDIETRO",
"259,ALLARME BATTERIA ELETTRICA 1",
"260,SOVRATEMPERATURA BATTERIA ELETTRICA 5",
"261,ALLARME BATTERIA ELETTRICA 2",
"262,RISCALDAMENTO QUADRO SPENTO",
"263,SOVRATEMPERATURA BATTERIA ELETTRICA 1",
"264,SOVRATEMPERATURA BATTERIA ELETTRICA 2",
"265,ALLARME BATTERIA ELETTRICA 3",
"266,EMERGENZA DA SPALMATRICE",
"267,ALLARME BATTERIA ELETTRICA 4",
"268,ALLARME BATTERIA ELETTRICA 5",
"269,SOVRATEMPERATURA BATTERIA ELETTRICA 3",
"270,SOVRATEMPERATURA BATTERIA ELETTRICA 4",
"271,ALLARME IDROSTATO RECUPERO CALORE 1",
"272,ALLARME SENSORE LIVELLO RECUPERO CALORE 1 : AGGIUNGERE LIQUIDO !"
]
},
{
"description": "Alarm Word 17 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 17",
"index": 17,
"size": 2,
"messages": [
"273,ALLARME RELE' CONTROLLO FASI",
"274,ALLARME DEVICE NET ADDR. 40 - MODULO GRT1-DRT USCITA RAMOSA",
"275,ALLARME PRESSOSTATO LINEA ENTRATA MACCHINA",
"276,ALLARME PRESSOSTATO LINEA USCITA MACCHINA",
"277,CAMPO CANNOCCHIALI 1 BLOCCATO",
"278,CAMPO CANNOCCHIALI 2 BLOCCATO",
"279,ALLARME DISCONTINUITA' CAMPI PARALLELI",
"280,ALLARME INSEGUIMENTO CAMPI PARALLELI - VITE LENTA",
"281,ALLARME LIMITE VITI",
"282,RAGGIUNTO MASSIMO CARICO SU CELLA DI CARICO",
"283,ALLARME PRESSOSTATO ESAUSTORE",
"284,EMERGENZA MOVIMENTO TESSUTO",
"285,EMERGENZA DA SPREMITORE 1",
"286,EMERGENZA DA RADDRIZZATRAMA",
"287,EMERGENZA DA SROTOLATORE",
"288,EMERGENZA DA ARROTOLATORE"
]
},
{
"description": "Alarm Word 18 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 18",
"index": 18,
"size": 2,
"messages": [
"289,ALLARME SICUREZZA BRUCIATORE 1",
"290,ALLARME SICUREZZA BRUCIATORE 2",
"291,ALLARME SICUREZZA BRUCIATORE 3",
"292,ALLARME SICUREZZA BRUCIATORE 4",
"293,ALLARME SICUREZZA BRUCIATORE 5",
"294,ALLARME SICUREZZA BRUCIATORE 6",
"295,ALLARME SICUREZZA BRUCIATORE 7",
"296,ALLARME SICUREZZA BRUCIATORE 8",
"297,ALLARME SICUREZZA BRUCIATORE 9",
"298,ALLARME SICUREZZA BRUCIATORE 10",
"299,ALLARME SICUREZZA BRUCIATORE 11",
"300,ALLARME SICUREZZA BRUCIATORE 12",
"301,ALLARME BRUCIATORE 1 SPENTO",
"302,ALLARME BRUCIATORE 2 SPENTO",
"303,ALLARME BRUCIATORE 3 SPENTO",
"304,ALLARME BRUCIATORE 4 SPENTO"
]
},
{
"description": "Alarm Word 19 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 19",
"index": 19,
"size": 2,
"messages": [
"305,ALLARME BRUCIATORE 5 SPENTO",
"306,ALLARME BRUCIATORE 6 SPENTO",
"307,ALLARME BRUCIATORE 7 SPENTO",
"308,ALLARME BRUCIATORE 8 SPENTO",
"309,ALLARME BRUCIATORE 9 SPENTO",
"310,ALLARME BRUCIATORE 10 SPENTO",
"311,ALLARME BRUCIATORE 11 SPENTO",
"312,ALLARME BRUCIATORE 12 SPENTO",
"313,ALLARME SENSORE LIVELLO RECUPERO CALORE 2 : AGGIUNGERE LIQUIDO !",
"314,ALLARME DA MIXER",
"315,ALLARME PRESSOSTATI LUBRIFICAZIONE",
"316,ALLARME ABBATTITORE FUMI",
"317,MACCHINA 1 NON IN LINEA",
"318,MACCHINA 2 NON IN LINEA",
"319,MACCHINA 3 NON IN LINEA",
"320,MACCHINA 4 NON IN LINEA"
]
},
{
"description": "Alarm Word 20 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 20",
"index": 20,
"size": 2,
"messages": [
"321,MACCHINA 5 NON IN LINEA",
"322,MACCHINA 6 NON IN LINEA",
"323,MACCHINA 7 NON IN LINEA",
"324,MACCHINA 8 NON IN LINEA",
"325,NON STOP NON PRONTO",
"326,EMERGENZA DA NON STOP",
"327,ALLARME DISCONTINUITA' CAMPO MASTER",
"328,ALLARME DISCONTINUITA' CAMPO PARALLELO 1",
"329,ALLARME DISCONTINUITA' CAMPO PARALLELO 2",
"330,ALLARME DISCONTINUITA' CAMPO PARALLELO 3",
"331,ALLARME DISCONTINUITA' CAMPO PARALLELO 4",
"332,ALLARME DISCONTINUITA' CAMPO PARALLELO 5",
"333,ALLARME DISCONTINUITA' CAMPO PARALLELO 6",
"334,ALLARME DISCONTINUITA' CAMPO PARALLELO 7",
"335,ALLARME DISCONTINUITA' CAMPO PARALLELO 8",
"336,ALLARME DISCONTINUITA' CAMPO PARALLELO 9"
]
},
{
"description": "Alarm Word 21 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 21",
"index": 21,
"size": 2,
"messages": [
"337,ALLARME DISCONTINUITA' CAMPO PARALLELO 10",
"338,PROTEZIONI INGRESSO APERTE",
"339,PROTEZIONI USCITA APERTE",
"340,ALLARME PROTEZIONE ESTRATTORE FUMI 1",
"341,ALLARME PROTEZIONE ESTRATTORE FUMI 2",
"342,MANCANZA PRESSOSTATO ESTRATTORE FUMI 1",
"343,MANCANZA PRESSOSTATO ESTRATTORE FUMI 2",
"344,EMERGENZA DA MIXER",
"345,EMERGENZA DA SPREMITORE 2",
"346,ALLARME PROTEZIONE VENTILATORE RECUPERO CALORE 1",
"347,ALLARME PROTEZIONE VENTILATORE RECUPERO CALORE 2",
"348,ALLARME MODULO VELOCITA? ZERO CATENA TRASP. TESSUTO",
"349,ALLARME RILEVAMENTO TESSUTO SINISTRO USCITA",
"350,ALLARME RILEVAMENTO TESSUTO DESTRO USCITA",
"351,ALLARME FINECORSA SOLLEVAMENTO CAMPI CONICI",
"352,ALLARME IDROSTATO RECUPERO CALORE 2"
]
},
{
"description": "Alarm Word 22 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 22",
"index": 22,
"size": 2,
"messages": [
"353,ALLARME FUNE DI PROTEZIONE IN USCITA",
"354,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 1",
"355,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 2",
"356,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 3",
"357,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 4",
"358,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 5",
"359,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 6",
"360,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 7",
"361,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 8",
"362,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 9",
"363,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 10",
"364,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 11",
"365,ALLARME PROTEZIONE VENTOLA BRUCIATORE MAXON 12",
"366,OLIO CATENA - PRESSIONE MINIMA",
"367,POMPA OLIO CATENA - ALLARME PROTEZIONE",
"368,JBOX INGRESSO - BALLERINO BASSO"
]
},
{
"description": "Alarm Word 23 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 23",
"index": 23,
"size": 2,
"messages": [
"369,JBOX INGRESSO - FINE TESSUTO",
"370,JBOX INGRESSO - PIENO",
"371,JBOX INGRESSO - BALLERINO ALTO",
"372,JBOX INGRESSO - VUOTO",
"373,JBOX USCITA - BALLERINO BASSO",
"374,JBOX USCITA - FINE TESSUTO",
"375,JBOX USCITA - PIENO",
"376,JBOX USCITA - BALLERINO ALTO",
"377,JBOX USCITA - VUOTO",
"378,JBOX USCITA - ALLARME PRESSOSTATO",
"379,JBOX ENTRATA - ALLARME PRESSOSTATO",
"380,ALLARME PROTEZIONE CARRELLO FALDATORE",
"381,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 1",
"382,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 2",
"383,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 3",
"384,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 4"
]
},
{
"description": "Alarm Word 24 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 24",
"index": 24,
"size": 2,
"messages": [
"385,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 5",
"386,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 6",
"387,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 7",
"388,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 8",
"389,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 9",
"390,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 10",
"391,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 11",
"392,RISCALDAMENTO INDIRETTO - ALLARME FEEDBACK SERRANDA BR. 12",
"393,ESTRATTORE FUMI RISC. INDIRETTO 1 - ALLARME PROTEZIONE",
"394,ESTRATTORE FUMI RISC. INDIRETTO 2 - ALLARME PROTEZIONE",
"395,ESTRATTORE FUMI RISC. INDIRETTO 3 - ALLARME PROTEZIONE",
"396,ESTRATTORE FUMI RISC. INDIRETTO 4 - ALLARME PROTEZIONE",
"397,ESTRATTORE FUMI RISC. INDIRETTO 5 - ALLARME PROTEZIONE",
"398,ESTRATTORE FUMI RISC. INDIRETTO 6 - ALLARME PROTEZIONE",
"399,TAGLIERINA SINISTRA - FUORI POSIZIONE",
"400,TAGLIERINA DESTRA - FUORI POSIZIONE"
]
},
{
"description": "Alarm Word 25 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 25",
"index": 25,
"size": 2,
"messages": [
"401,ALLARME PROTEZIONE CILINDRO CONTRASTO TAGLIERINE",
"402,JBOX INGRESSO - TESSUTO INCROCIATO",
"403,JBOX USCITA - TESSUTO INCROCIATO",
"404,ALLARME DEVICE_NET STAZIONE ADDR.38 - JBOX INGRESSO",
"405,ALLARME DEVICE_NET STAZIONE ADDR.39 - JBOX USCITA",
"406,JBOX INGRESSO - ALLARME INVERTER",
"407,JBOX USCITA - ALLARME INVERTER",
"408,ALLARGA/CENTRATORE A/B SU IMBARRAGGIO - ALLARME PROTEZIONE",
"409,ALLARME TIMEOUT VITE CAMPO PARALLELO 11",
"410,ALLARME TIMEOUT VITE CAMPO PARALLELO 12",
"411,FRENO JBOX INGRESSO - ALLARME PROTEZIONE",
"412,FRENO JBOX USCITA - ALLARME PROTEZIONE",
"413,ALLARME PROTEZIONE FRENO CAMPO CONICO SINISTRO",
"414,ALLARME PROTEZIONE FRENO CAMPO CONICO DESTRO",
"415,VERIFICA PRESSOSTATO 1 FALLITA",
"416,VERIFICA PRESSOSTATO 2 FALLITA"
]
},
{
"description": "Alarm Word 26 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 26",
"index": 26,
"size": 2,
"messages": [
"417,ALLARME TERMOSTATO INTERNO QUADRO",
"418,ALLARME PROTEZIONE RECUPERO CALORE - GRUPPO 1 POMPA 2",
"419,ALLARME PROTEZIONE RECUPERO CALORE - GRUPPO 2 POMPA 2",
"420,PROTEZIONE RIBALTABILE INGRESSO",
"421,FUNE EMERGENZA INGRESSO",
"422,PARATIA SCORREVOLE INGRESSO SINISTRA",
"423,PARATIA SCORREVOLE INGRESSO DESTRA",
"424,CANCELLO SINISTRO ENTRATA ANTERIORE",
"425,CANCELLO SINISTRO ENTRATA POSTERIORE",
"426,CANCELLO DESTRO ENTRATA ANTERIORE",
"427,CANCELLO DESTRO ENTRATA POSTERIORE",
"428,CANCELLO SINISTRO USCITA",
"429,CANCELLO DESTRO USCITA",
"430,TENSIONATORE FUNE EMERGENZA SINISTRA ZONA FORNO",
"431,TENSIONATORE FUNE EMERGENZA DESTRA ZONA FORNO",
"432,FUNE EMERGENZA SINISTRA ZONA FORNO"
]
},
{
"description": "Alarm Word 27 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 27",
"index": 27,
"size": 2,
"messages": [
"433,FUNE EMERGENZA DESTRA ZONA FORNO",
"434,ALLARME FEEDBACK SCARICO ARIA ENTRATA MACCHINA (1)",
"435,ALLARME FEEDBACK SCARICO ARIA ENTRATA MACCHINA (2)",
"436,ALLARME FEEDBACK SCARICO ARIA USCITA MACCHINA (1)",
"437,ALLARME FEEDBACK SCARICO ARIA USCITA MACCHINA (2)",
"438,ALLARME FEEDBACK EMERGENZA GENERALE DA SCARICO ARIA",
"439,BYPASS SPORTELLI ARMADIO ATTIVO",
"440,TIMEOUT ENCODER CAMPO CONICO SINISTRO",
"441,TIMEOUT ENCODER CAMPO CONICO DESTRO",
"442,ALLARME BALLERINO ALTO SPREMITORE 1",
"443,ALLARME BALLERINO ALTO SPREMITORE 2",
"444,",
"445,",
"446,",
"447,",
"448,"
]
},
{
"description": "Alarm Word 28 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 28",
"index": 28,
"size": 2,
"messages": [
"449,",
"450,",
"451,",
"452,",
"453,",
"454,",
"455,",
"456,",
"457,",
"458,",
"459,",
"460,ALLARME PROTEZIONE BARRE ANTISTATICHE",
"461,ALLARME PROTEZIONE VENTILAZIONE INTERNO QUADRO",
"462,BORDO SENSIBILE ",
"463,FALDAROTOLATORE_SICUREZZA SX/DX ",
"464,FALDAROTOLATORE_EMERGENZA TESSUTO "
]
},
{
"description": "Alarm Word 29 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 29",
"index": 29,
"size": 2,
"messages": [
"465,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.1",
"466,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.2",
"467,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.3",
"468,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.4",
"469,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.5",
"470,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.6",
"471,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.7",
"472,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.8",
"473,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.9",
"474,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.10",
"475,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.11",
"476,ALLARME DEPRESSIONE RISCALDAMENTO INDIRETTO BR.12",
"477,MALFUNZIONAMNETO PRESSOSTATO ESTRATTORE FUMI 1/2",
"478,MALFUNZIONAMNETO PRESSOSTATO ESTRATTORE FUMI 3/4",
"479,MALFUNZIONAMNETO PRESSOSTATO ESTRATTORE FUMI 5/6",
"480,MALFUNZIONAMNETO PRESSOSTATO ESTRATTORE FUMI 7/8"
]
},
{
"description": "Alarm Word 30 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 30",
"index": 30,
"size": 2,
"messages": [
"481,MALFUNZIONAMNETO PRESSOSTATO ESTRATTORE FUMI 9/10",
"482,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 1",
"483,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 2",
"484,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 3",
"485,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 4",
"486,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 5",
"487,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 6",
"488,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 7",
"489,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 8",
"490,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 9",
"491,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 10",
"492,TRASDUTTORE PRESSIONE BR 1 INTERROTTO",
"493,TRASDUTTORE PRESSIONE BR 2 INTERROTTO",
"494,TRASDUTTORE PRESSIONE BR 3 INTERROTTO",
"495,TRASDUTTORE PRESSIONE BR 4 INTERROTTO",
"496,TRASDUTTORE PRESSIONE BR 5 INTERROTTO"
]
},
{
"description": "Alarm Word 31 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 31",
"index": 31,
"size": 2,
"messages": [
"497,TRASDUTTORE PRESSIONE BR 6 INTERROTTO",
"498,TRASDUTTORE PRESSIONE BR 7 INTERROTTO",
"499,TRASDUTTORE PRESSIONE BR 8 INTERROTTO",
"500,TRASDUTTORE PRESSIONE BR 9 INTERROTTO",
"501,TRASDUTTORE PRESSIONE BR 10 INTERROTTO",
"502,TRASDUTTORE PRESSIONE BR 11 INTERROTTO",
"503,TRASDUTTORE PRESSIONE BR 12 INTERROTTO",
"504,ERRORE TRASDUTTORE DI PRESSIONE RC1",
"505,ERRORE TRASDUTTORE DI PRESSIONE RC2",
"506,ALLARME INVERTER RIPRISTINO PRESSIONE GRUPPO 1 RC",
"507,ALLARME INVERTER RIPRISTINO PRESSIONE GRUPPO 2 RC",
"508,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 11",
"509,MALFUNZIONAMENTO PRESSOSTATO SICUREZZA BRUCIATORE 12",
"510,ALLARME PRESSOSTATO TAGLIERINE",
"511,BALLERINO ALTO - SROTOLATORE - ALLARME",
"512,EMERGENZA DA LINEA ENTRATA RAMOSA"
]
},
{
"description": "Alarm Word 32 ",
"tipoMem": "Byte",
"memAddr": "Alarm Word 32",
"index": 32,
"size": 2,
"messages": [
"513,LINEA ENTRATA RAMOSA NON PRONTA",
"514,EMERGENZA DA LINEA USCITA RAMOSA",
"515,LINEA USCITA RAMOSA NON PRONTA",
"516,TAGLIERINA CENTRALE FUORI POSIZIONE",
"517,TIRACIMOSSE NON PRONTO",
"518,JBOX INGRESSO IN EMERGENZA",
"519,JBOX INGRESSO NON PRONTO",
"520,JBOX USCITA IN EMERGENZA",
"521,JBOX USCITA NON PRONTO",
"522,ALLARME D-NET 41 RISCALDAMENTO INDIRETTO",
"523,SPAZZOLATRICE IN EMERGENZA",
"524,SPAZZOLATRICE NON PRONTA",
"525,ALLARME FUNE DI SICUREZZA USCITA STACCAPEZZA",
"526,ALLARME FUNE DI SICUREZZA USCITA FALDAROTOLATORE",
"527,ALLARME FUNE DI SICUREZZA CAMPO CONICO SINISTRO",
"528,ALLARME FUNE DI SICUREZZA CAMPO CONICO DESTRO"
]
}
]
+209
View File
@@ -0,0 +1,209 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{26D891EF-C115-420A-B240-05F099E13853}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>IOB_WIN_SIEMENS</RootNamespace>
<AssemblyName>IOB-WIN-SIEMENS</AssemblyName>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Remote_DEBUG|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\Remote_DEBUG\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="MapoSDK, Version=6.14.2411.518, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MapoSDK.6.14.2411.518\lib\MapoSDK.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="S7.Net, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d5812d469e84c693, processorArchitecture=MSIL">
<HintPath>..\packages\S7netplus.0.1.9\lib\net45\S7.Net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\VersGen\VersGen.cs">
<Link>VersGen.cs</Link>
</Compile>
<Compile Include="AdapterFormNext.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="connParamS7.cs" />
<Compile Include="IobSiemens\Siemens.cs" />
<Compile Include="IobSiemens\SiemensAprochim.cs" />
<Compile Include="IobSiemens\SiemensAt2001.cs" />
<Compile Include="IobSiemens\SiemensComeca.cs" />
<Compile Include="IobSiemens\SiemensComur.cs" />
<Compile Include="IobSiemens\SiemensCosmap.cs" />
<Compile Include="IobSiemens\SiemensFape.cs" />
<Compile Include="IobSiemens\SiemensFapeV2.cs" />
<Compile Include="IobSiemens\SiemensIngenia.cs" />
<Compile Include="IobSiemens\SiemensLasco.cs" />
<Compile Include="IobSiemens\SiemensNWSE.cs" />
<Compile Include="IobSiemens\SiemensPressoilCei.cs" />
<Compile Include="IobSiemens\SiemensRobotService.cs" />
<Compile Include="IobSiemens\SiemensSaet.cs" />
<Compile Include="IobSiemens\SiemensSimec.cs" />
<Compile Include="IobSiemens\SiemensTorri.cs" />
<Compile Include="Iob\GenericNext.cs" />
<Compile Include="MainFormNext.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="memAreaSiemens.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Content Include="Resources\STEAM-IOB-WIN.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Resources\SteamWare.ico">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="App.Debug.config">
<DependentUpon>App.config</DependentUpon>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="App.Release.config">
<DependentUpon>App.config</DependentUpon>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\FTP-PING.ini">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\IOB.ini">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\MAIN.ini">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\PING.ini">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\SIMUL_01.ini">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\SIMUL_01.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\SIMUL_01_alarm.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\SIMUL_01_WD.ini">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\DAT\PersistData.dat">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\DAT\SimData.dat">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\HIST\.placeholder">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="NLog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="packages.config" />
<None Include="postBuildTgt.bat" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<Content Include="Resources\Start-IOB-WIN.bat">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<None Include="setupTgt.bat" />
<None Include="temp\.placeholder">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<None Include="App.config">
<SubType>Designer</SubType>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Content Include="logs\.placeholder.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Resources\ChangeLog.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Resources\Circuit.ico" />
<Content Include="Resources\logoSteamware.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Resources\manifest.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Resources\Net.ico" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\IOB-UT-NEXT\IOB-UT-NEXT.csproj">
<Project>{90512e12-29fc-460d-94cc-648c2a072dbd}</Project>
<Name>IOB-UT-NEXT</Name>
</ProjectReference>
<ProjectReference Include="..\IOB-WIN-FORM\IOB-WIN-FORM.csproj">
<Project>{9ba331bb-9bf1-40e0-ac03-74b43d73a097}</Project>
<Name>IOB-WIN-FORM</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
+13
View File
@@ -0,0 +1,13 @@
using IOB_UT_NEXT;
namespace IOB_WIN_SIEMENS.Iob
{
public class GenericNext : IOB_WIN_FORM.Iob.Generic
{
public GenericNext(AdapterFormNext caller, IobConfiguration IOBConf): base((IOB_WIN_FORM.AdapterForm)caller, IOBConf)
{
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,222 @@
using IOB_UT_NEXT;
using MapoSDK;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti Aprochim /MacDermid
/// </summary>
public class SiemensAprochim : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS Aprochim (impianti filtrazione in Jetco, gruppo macDermid)
* - basasto su SIEMENS
* - S7 vers 1500
*
* STRUTTURA MEMORIA DB60:
* - parametri processo
* - DB60.DBD6: pressione camera filtrante (salvataggio del MAX ogni minuto) | var testVal = S7.Net.Types.Double.FromByteArray(memByteRead.Skip(0).Take(4).ToArray());
* - DB60.DBD10: pressione linea utenze (salvataggio del MAX ogni minuto)
* - DB60.DBD14: temperatura acqua pulita (salvataggio del MAX ogni minuto)
*
* - BIT di stato
* - DB60.DBX3.0: AUSILIARI INSERITI = NO EMERGENZA
* - DB60.DBX3.1: Filtro (macchina) in LAVORAZIONE
* - DB60.DBX3.2: Selettore in AUTOMATICO (sennò GIALLO)
* - DB60.DBX3.3: WARNING MIN LIV VASCA (arancio)
* - DB60.DBX3.4: WARNING MIN LIV CELLULOSA (blu)
* - DB60.DBX3.5: LAMPADA ROSSA (allarmi almeno 1 attivo)
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensAprochim(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione APROCHIM");
// imposto i parametri speciali x calcolo...
var chiaviTSVC = findOptPar("TSVC");
if (chiaviTSVC.Count > 0)
{
lgInfo($"Trovate {chiaviTSVC.Count} chiavi TSVC");
string[] codVal;
VCData currConf;
int periodo = 0;
VC_func funz = VC_func.POINT;
// accodo nella conf...
foreach (var item in chiaviTSVC)
{
codVal = item.Value.Split(':');
Enum.TryParse(codVal[0], out funz);
int.TryParse(codVal[1], out periodo);
currConf = new VCData()
{
Funzione = funz,
Period = periodo,
DTStart = DateTime.Now.AddHours(-1),
dataArray = new List<double>()
};
TSVC_Data.Add(item.Key.Replace("TSVC_", ""), currConf);
}
// documento...
foreach (var item in TSVC_Data)
{
lgTrace($"TSVC: {item.Key} | periodo: {item.Value.Period} | funz: {item.Value.Funzione}");
// salvo i valori PREC...
LastTSVC.Add(item.Key, 0);
}
}
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Recupero dati dinamici in formato dictionary
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getDynData()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
try
{
/* ----------------------------------------------------------
* DB60.DBD6: pressione camera filtrante (salvataggio del MAX ogni minuto) | var testVal = S7.Net.Types.Double.FromByteArray(memByteRead.Skip(0).Take(4).ToArray());
* DB60.DBD10: pressione linea utenze (salvataggio del MAX ogni minuto)
* DB60.DBD14: temperatura acqua pulita (salvataggio del MAX ogni minuto)
* */
double pressCamFilt = S7.Net.Types.Double.FromByteArray(RawInput.Skip(6).Take(4).ToArray());
double pressLinUt = S7.Net.Types.Double.FromByteArray(RawInput.Skip(10).Take(4).ToArray());
double tempH2O = S7.Net.Types.Double.FromByteArray(RawInput.Skip(14).Take(4).ToArray());
if (utils.CRB("enableTSVC"))
{
DateTime adesso = DateTime.Now;
// salvo in stack le VC rilevate
bool scad01 = stackVal_TSVC("pressCamFilt", pressCamFilt, adesso);
bool scad02 = stackVal_TSVC("pressLinUt", pressLinUt, adesso);
bool scad03 = stackVal_TSVC("tempH2O", tempH2O, adesso);
// verifico SE devo riportare dati VC
if (scad01 || scad02 || scad03)
{
pressCamFilt = getVal_TSVC("pressCamFilt", scad01);
pressLinUt = getVal_TSVC("pressLinUt", scad02);
tempH2O = getVal_TSVC("tempH2O", scad03);
outVal.Add("DYNDATA", $"pressCamFilt {pressCamFilt:N6} | pressLinUt {pressLinUt:N6} | tempH2O {tempH2O:N3}");
outVal.Add("pressCamFilt", $"{pressCamFilt:N6}");
outVal.Add("pressLinUt", $"{pressLinUt:N6}");
outVal.Add("tempH2O", $"{tempH2O:N3}");
// salvo!
LastTSVC["pressCamFilt"] = pressCamFilt;
LastTSVC["pressLinUt"] = pressLinUt;
LastTSVC["tempH2O"] = tempH2O;
}
else
{
outVal.Add("DYNDATA", $"pressCamFilt {LastTSVC["pressCamFilt"]:N6} | pressLinUt {LastTSVC["pressLinUt"]:N6} | tempH2O {LastTSVC["tempH2O"]:N3}");
}
}
else
{
outVal.Add("pressCamFilt", $"{pressCamFilt:N6}");
outVal.Add("pressLinUt", $"{pressLinUt:N6}");
outVal.Add("tempH2O", $"{tempH2O:N3}");
outVal.Add("DYNDATA", $"pressCamFilt {pressCamFilt:N3} | pressLinUt {pressLinUt:N3} | tempH2O {tempH2O:N3}");
}
}
catch (Exception exc)
{
lgError(exc, "Errore in getDynData x Siemens Aprochim");
}
return outVal;
}
/// <summary>
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
/// </summary>
public override void processOverride()
{
}
#endregion Public Methods
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: emergenza
*
*
* - BIT di stato
* - DB60.DBX3.0: AUSILIARI INSERITI = NO EMERGENZA
* - DB60.DBX3.1: Filtro (macchina) in LAVORAZIONE
* - DB60.DBX3.2: Selettore in AUTOMATICO (sennò GIALLO)
* - DB60.DBX3.3: WARNING MIN LIV VASCA (arancio)
* - DB60.DBX3.4: WARNING MIN LIV CELLULOSA (blu)
* - DB60.DBX3.5: LAMPADA ROSSA (allarmi almeno 1 attivo)
----------------------------------------------------- */
/* -----------------------------------------------------
* bitmap MAPO FILTRO Aprochim
* B0: POWER_ON
* B1: RUN
* B2: AUTOMATICO
* B3: WARN_MIN_VASCA
* B4: WARN_MIN_CELL
* B5: ALARM
* B6: EMERGENZA
----------------------------------------------------- */
// bit 0 (poweron) imposto a 1 SE connected...
B_input = currPLC.IsConnected ? 1 : 0;
// recupero byte segnali...
int byteSignals = RawInput[3];
// aggiungo "in coda" primo bit emergenza...essendo un bit negato (NON emergenza) lo
// cambio di segno
if ((byteSignals & (1 << 0)) == 0)
{
byteSignals += (1 << 6);
}
// cancello primo bit (faccio uno shift a dx e poi a sx di 1...)
byteSignals = ((byteSignals >> 1) << 1);
// bit 0 (poweron) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSignals += (1 << 0);
}
// salvo!
B_input = byteSignals;
// log opzionale!
if (verboseLog)
{
lgInfo(string.Format($"Trasformazione dati: RawInput:{RawInput[3]} --> B_input: {B_input}"));
}
}
#endregion Protected Methods
}
}
+291
View File
@@ -0,0 +1,291 @@
using IOB_UT_NEXT;
using MapoSDK;
using System;
using System.Collections.Generic;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti SAET
/// </summary>
public class SiemensAt2001 : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli VIPA/SIEMENS (Interclays) di @2001
* - VIPA, COMPATIBILE SIEMENS
* - S7 vers 300
*
*
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensAt2001(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione VIPA AT2001");
lastPLCWatchDog = DateTime.Now.AddMinutes(-1);
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
// inizio VUOTO
byte[] MemBlock = new byte[1];
string memAddrWrite = "";
if (task2exe != null)
{
// cerco task specifici: se ho startSetup --> imposto bit DBB701.DBB0.4
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
memAddrWrite = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.fixStopSetup:
case taskType.forceSetPzCount:
case taskType.stopSetup:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
case taskType.forceResetPzCount:
case taskType.startSetup:
// alzo il bit x registrare richiesta reset contapezzi... POI quando ha
// eseguito abbassa il PLC il bit a zero...
MemBlock[0] = 1;
memAddrWrite = "DB1001.DBB88";
break;
case taskType.setArt:
case taskType.setComm:
case taskType.setProg:
int byteSize = 0;
upsertKey(item.Key, item.Value);
// recupero dati da memMap... altrimenti NULLA
if (memMap.mMapWrite.ContainsKey(item.Key))
{
dataConf currMem = memMap.mMapWrite[item.Key];
byteSize = currMem.size;
memAddrWrite = currMem.memAddr;
MemBlock = new byte[byteSize];
switch (currMem.tipoMem)
{
case plcDataType.Boolean:
break;
case plcDataType.Int:
saveIntOnMemBlock(ref MemBlock, item.Key, 0);
break;
case plcDataType.DInt:
saveDIntOnMemBlock(ref MemBlock, item.Key, 0);
break;
case plcDataType.Real:
saveRealOnMemBlock(ref MemBlock, item.Key, 0);
break;
case plcDataType.String:
saveStringOnMemBlock(ref MemBlock, item.Key, 0, byteSize);
break;
default:
break;
}
}
taskVal = item.Value;
break;
case taskType.setParameter:
// richiedo da URL i parametri WRITE da popolare
lgInfo("Chiamata processMemWriteRequests");
taskVal = processMemWriteRequests();
// se restituiscce "" faccio altra prova...
if (!string.IsNullOrEmpty(taskVal))
{
taskOk = true;
}
else
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
// alzo il bit x registrare RICHEISTA modifica (secondo BIT)... POI
// quando ha eseguito abbassa il PLC il bit a zero...
MemBlock[0] = 2;
memAddrWrite = "DB1001.DBB88";
break;
case taskType.sendWatchDogMes2Plc:
//// compogo in byte... primo bit è setup/run, ultimo è watchdog
//int valore = inSetup ? 1 : 0;
int valore = counterMes2Plc;
MemBlock[68] = (byte)valore;
taskVal = $"VALUE DB1001.68 --> {counterMes2Plc}";
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
// aggiungo task!
taskDone.Add(item.Key, taskVal);
if (!string.IsNullOrEmpty(memAddrWrite))
{
// scrivo!
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
}
if (!taskOk)
{
lgError($"Errore in S7WriteBB durante executeTasks: {item.Key} | {item.Value}");
}
}
}
return taskDone;
}
/// <summary>
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
/// </summary>
public override void processOverride()
{
}
public override void processWhatchDog()
{
//NON SERVE!!!!
}
#endregion Public Methods
#region Protected Fields
protected int counterMes2Plc = 0;
protected int counterPlc2Mes = 0;
protected DateTime lastPLCWatchDog;
#endregion Protected Fields
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: avvio/spegnimento
* B6: emergenza
*
*
* - BYTE di stato
* - +0.0 AutoStatus BYTE B#16#0 Valore 0=Fermo/1->3=Avviamento/4=Avviato/5=Pausa/6->8spegnimento/9->10 allarme
* - +1.0 Dosatore BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on)
* - +2.0 V_Dosatore BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on)
* - +3.0 Nas_Lancio BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on)
* - +4.0 Cilindro BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on)
* - +5.0 Bruciatore BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on)
* - +6.0 Aspiratore BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on)
* - +7.0 Nas_Raccolta BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on)
* - +8.0 Nas_Brandeg BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on)
* - +9.0 Coclea_Filtro BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on)
* - +10.0 Ciclico_Filtro BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on)
----------------------------------------------------- */
// recupero byte segnali...
int byteSignals = RawInput[0];
// bit 0 (poweron) imposto a 1 SE connected...
B_input = currPLC.IsConnected ? 1 : 0;
// avviamento --> manuale
switch (byteSignals)
{
case 0:
B_input = 1;
break;
case 1:
case 2:
case 3:
B_input += (1 << 5);
break;
case 4:
B_input += (1 << 1);
break;
case 5:
B_input += (1 << 4);
break;
case 6:
case 7:
case 8:
B_input += (1 << 5);
break;
case 9:
B_input += (1 << 3);
break;
case 10:
B_input += (1 << 6);
break;
default:
break;
}
// log opzionale!
if (verboseLog)
{
lgInfo(string.Format($"Trasformazione dati: RawInput:{RawInput[0]} --> B_input: {B_input}"));
}
}
#endregion Protected Methods
}
}
+234
View File
@@ -0,0 +1,234 @@
using IOB_UT_NEXT;
using MapoSDK;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti COMECA (gestione GNL x Pizzaferri)
/// </summary>
public class SiemensComeca : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS COMECA
* - basasto su SIEMENS
* - S7 vers 1500
*
* STRUTTURA MEMORIA DB85:
* lettura: 260 byte,
* scrittura 32 byte
* G:\Drive condivisi\30_Clienti\Pizzaferri\Impianti\Comeca
*
* Si intende lettura/scrittura con DB85.DBxx
*
* READ
* Si leggono parametri impianti + eventuali allarmi
* 000...151 R --> Variabili ANALOGICHE
* 152...183 R --> parametri
* 232...259 R --> allarmi
*
* WRITE
* 268...271 R --> Word conferma comandi (ACK)
* 280...288 W --> parametri inviati (WRITE)
* 308...309 W --> conferma invio (STR)
*
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensComeca(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione Comeca");
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
lgInfo($"Chiamata executeTasks specifica IobSiemensComeca: {task2exe.Count} task ricevuti");
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
// inizio con 1 byte di default
byte[] MemBlock = new byte[1];
string memAddrWrite = "";
if (task2exe != null)
{
// cerco task specifici
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.fixStopSetup:
case taskType.forceResetPzCount:
case taskType.forceSetPzCount:
case taskType.setProg:
case taskType.sendWatchDogMes2Plc:
case taskType.startSetup:
case taskType.stopSetup:
case taskType.setPzComm:
case taskType.setArt:
case taskType.setComm:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
case taskType.setParameter:
// richiedo da URL i parametri WRITE da popolare
lgInfo("Chiamata processMemWriteRequests");
taskVal = processMemWriteRequests();
// se restituiscce "" faccio altra prova...
if (string.IsNullOrEmpty(taskVal))
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
// aggiunta finale bit a 1 x richiesta processing..
MemBlock = S7.Net.Types.Int.ToByteArray(1);
memAddrWrite = "DB85.DBB308";
// imposto valore strobe x check successivi
strobeVal = 1;
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
// aggiungo task!
taskDone.Add(item.Key, taskVal);
if (!string.IsNullOrEmpty(memAddrWrite))
{
// scrivo!
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
}
if (!taskOk)
{
lgError($"Errore in S7WriteBB durante executeTasks: {item.Key} | {item.Value}");
}
}
}
return taskDone;
}
#endregion Public Methods
#region Protected Fields
protected int strobeVal = 0;
#endregion Protected Fields
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// - per lo scopo specifico IN REALTA' non conta lo stato macchina.... ma lo inviamo lo stesso
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
*
----------------------------------------------------- */
//bool fatto = false;
//ushort valW = 0;
var MemInt = new byte[2];
int byteSignals = 0;
// bit 0 (poweron) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSignals += (1 << 0);
}
// processo dagli stati + gravi...
if (hasAlarms())
{
byteSignals += (1 << 3);
}
else
{
byteSignals += (1 << 1);
}
// verifico SE ho strobe/hack da chiudere
if (strobeVal != 0)
{
checkStrobeHack();
}
// salvo!
B_input = byteSignals;
}
#endregion Protected Methods
#region Private Methods
private void checkStrobeHack()
{
// verifico SE ho un hack sulla var DB85.DB268
byte[] byteCtrlW = new byte[2];
bool fatto = S7ReadBB(ref byteCtrlW, "DB85.DBB268", 2);
ushort valCtrlW = S7.Net.Types.Word.FromByteArray(byteCtrlW.ToArray());
// se vale 1 --> resetto strobe!
if (valCtrlW == 1)
{
// aggiunta finale bit a 0 x chiusura processing..
var MemBlock = S7.Net.Types.Int.ToByteArray(0);
var memAddrWrite = "DB85.DBB308";
// imposto valore strobe x check successivi
var taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
if (taskOk)
{
strobeVal = 0;
}
}
else
{
lgInfo("SiemensComeca: Strobe attivo su DBB308, ack non rilevato su DBB268");
}
}
#endregion Private Methods
}
}
+282
View File
@@ -0,0 +1,282 @@
using IOB_UT_NEXT;
using MapoSDK;
using System;
using System.Collections.Generic;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti COMUR
/// </summary>
public class SiemensComur : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS COMUR
* - basasto su SIEMENS
* - S7 vers 1500
*
* STRUTTURA MEMORIA DB150: 56 byte lettura, di cui 4 byte scrittura (4..7), vedere doc allegato
* G:\Drive condivisi\30_Clienti\Valvital\Comunicazione PLC\COMUR Dentatrice
*
* Si intende tutto con DB150.DBxx
*
* - parametri processo PLC --> MES
* - DBX0.0 - Macchina On: Segnale pulito di informazione sullo stato della macchina. 0->Aux OFF, 1->Aux ON
* - DBX0.1 Macchina in Allarme: Segnale pulito di macchina in allarme. 0->Nessun Allarme, 1->E presente almeno un allarme/anomalia
* - DBX0.2 Macchina in Ciclo: Segnale pulito sullo stato di funzionamento. 0->La macchina NON sta eseguendo un ciclo automatico, 1->La macchina sta eseguendo un ciclo automatico.
* - DBX0.3 Macchina Non in Produzione: Segnale pulito sullo stato della macchina. 0->Macchina accesa e in lavorazione automatica, 1->Macchina accesa ma NON sta eseguendo un ciclo automatico.
* - DBX0.4 Macchina In Ciclo Continuità: Segnale pulito sullo stato di funzionamento. 1->La macchina sta eseguendo un ciclo automatico con carico/scarico pezzo autonomo, 0->Altrimenti.
* - DBX0.7 Assi In Moto: Segnale pulito sullo stato di movimento Assi. 0->Tutti gli assi della macchina sono fermi, 1->Almeno un asse si sta muovendo.
* - DBX1.0 Impulso Start Ciclo: Impulso a fronte positivo (0->1) della durata di 1’’ che rappresenta levento di Start Ciclo.
* - DBX1.1 Impulso Fine Ciclo: Impulso a fronte positivo (0->1) della durata di 1’’ che rappresenta levento di Fine Ciclo. Attenzione! Questo impulso viene generato solo se il Ciclo Automatico finisce correttamente. Non viene generato nel caso in cui il Ciclo Automatico venga interrotto da allarmi.
* - DBX1.3 Impulso Conta Pezzi: Impulso a fronte positivo (0->1) della durata di 1’’ generato al completamento di ogni programma pezzo.
* - DBX2.0 Preallarmi Pezzi: Segnale pulito di segnalazione Preallarme Pezzi impostabile su CN. 0->Preallarme Disattivo, 1->Preallarme Attivo
* - DBX2.1 Allarme Pezzi: Segnale pulito di segnalazione Allarme Pezzi impostabile su CN. 0->Allarme Disattivo, 1->Allarme Attivo.
* - DBX2.3 Fine Vita Utensile: Segnale pulito di segnalazione Allarme Fine Vita Creatore. 0->Allarme Disattivo, 1->Allarme Attivo.
* - DBX2.7 Ciclo In Attesa: Segnale pulito sullo stato di funzionamento. 1->Ciclo Automatico attivo ma tutti assi fermi, 0->Altrimenti.
*
* - DBD52 - Codice Pezzo In Lavorazione (4byte, REAL)
* - DBD56 - Codice Utensile In Uso (4byte, REAL)
*
*
* - parametri processo MES --> PLC
* - DBX4.0 Reset Contapezzi Parziale: Segnale per resettare il valore del contatore “Contapezzi parziale”. Impostare il bit a 1 per attivare la funzione (il PLC riporterà a 0 il valore quando completa loperazione).
*
* - DB150.DBD8 - Numero di Pezzi da produrre per il lotto (4byte, DInt)
* - DB150.[12.0 .. 31.7] - Codice articolo (stringa da 18 char)
* - DB150.[32.0 .. 51.7] - Codice commessa (stringa da 18 char)
*
*
* - DB111.DBD24: PartCounter INT 2.0 Conteggio Parziale di pezzi prodotti dalla macchina
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensComur(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione COMUR");
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
// inizio con 1 byte di default
byte[] MemBlock = new byte[1];
string memAddrWrite = "";
if (task2exe != null)
{
// cerco task specifici
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// init valori
int byteSize = 0;
int valDInt = 0;
short valShort = 0;
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.fixStopSetup:
case taskType.forceResetPzCount:
case taskType.forceSetPzCount:
case taskType.setProg:
case taskType.sendWatchDogMes2Plc:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
case taskType.setArt:
case taskType.setComm:
case taskType.setPzComm:
upsertKey(item.Key, item.Value);
// recupero dati da memMap... altrimenti NULLA
if (memMap.mMapWrite.ContainsKey(item.Key))
{
dataConf currMem = memMap.mMapWrite[item.Key];
byteSize = currMem.size;
memAddrWrite = currMem.memAddr;
MemBlock = new byte[byteSize];
if (currMem.tipoMem == plcDataType.String)
{
saveStringOnMemBlock(ref MemBlock, item.Key, 0, byteSize);
}
else if (currMem.tipoMem == plcDataType.DInt)
{
int.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.DInt.ToByteArray(valDInt);
}
else if (currMem.tipoMem == plcDataType.Int)
{
short.TryParse(item.Value, out valShort);
MemBlock = S7.Net.Types.Int.ToByteArray(valShort);
}
}
taskVal = item.Value;
break;
case taskType.startSetup:
// resetto IN PRIMIS il contapezzi...
valDInt = 0;
int.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.DInt.ToByteArray(valDInt);
memAddrWrite = "DB150.DBB24";
S7WriteBB(ref MemBlock, memAddrWrite);
// processo scrittura BIT su DB150.DBX4.0
MemBlock = new byte[1];
MemBlock[0] = (byte)1;
memAddrWrite = "DB150.DBB4";
break;
case taskType.stopSetup:
// resetto IN PRIMIS il contapezzi...
valDInt = 0;
int.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.DInt.ToByteArray(valDInt);
memAddrWrite = "DB150.DBB24";
S7WriteBB(ref MemBlock, memAddrWrite);
// processo scrittura BIT su DB150.DBX4.0
MemBlock = new byte[1];
MemBlock[0] = (byte)0;
memAddrWrite = "DB150.DBB4";
break;
case taskType.setParameter:
// richiedo da URL i parametri WRITE da popolare
lgInfo("Chiamata processMemWriteRequests");
taskVal = processMemWriteRequests();
// se restituiscce "" faccio altra prova...
if (string.IsNullOrEmpty(taskVal))
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
// aggiungo task!
taskDone.Add(item.Key, taskVal);
if (!string.IsNullOrEmpty(memAddrWrite))
{
// scrivo!
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
}
if (!taskOk)
{
lgError($"Errore in S7WriteBB durante executeTasks: {item.Key} | {item.Value} | taskOk {taskOk}");
}
}
}
return taskDone;
}
#endregion Public Methods
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: allarme creatore
*
*
* - BIT di stato
* - DBX0.0 - Macchina On: Segnale pulito di informazione sullo stato della macchina. 0->Aux OFF, 1->Aux ON
* - DBX0.1 Macchina in Allarme: Segnale pulito di macchina in allarme. 0->Nessun Allarme, 1->E presente almeno un allarme/anomalia
* - DBX0.2 Macchina in Ciclo: Segnale pulito sullo stato di funzionamento. 0->La macchina NON sta eseguendo un ciclo automatico, 1->La macchina sta eseguendo un ciclo automatico.
* - DBX0.3 Macchina Non in Produzione: Segnale pulito sullo stato della macchina. 0->Macchina accesa e in lavorazione automatica, 1->Macchina accesa ma NON sta eseguendo un ciclo automatico.
* - DBX0.4 Macchina In Ciclo Continuità: Segnale pulito sullo stato di funzionamento. 1->La macchina sta eseguendo un ciclo automatico con carico/scarico pezzo autonomo, 0-> Altrimenti. NON HA SENSO perché NON HANNO il robot...
* - DBX0.7 Assi In Moto: Segnale pulito sullo stato di movimento Assi. 0->Tutti gli assi della macchina sono fermi, 1->Almeno un asse si sta muovendo.
* - DBX1.0 Impulso Start Ciclo: Impulso a fronte positivo (0->1) della durata di 1’’ che rappresenta levento di Start Ciclo.
* - DBX1.1 Impulso Fine Ciclo: Impulso a fronte positivo (0->1) della durata di 1’’ che rappresenta levento di Fine Ciclo. Attenzione! Questo impulso viene generato solo se il Ciclo Automatico finisce correttamente. Non viene generato nel caso in cui il Ciclo Automatico venga interrotto da allarmi.
* - DBX1.3 Impulso Conta Pezzi: Impulso a fronte positivo (0->1) della durata di 1’’ generato al completamento di ogni programma pezzo.
* - DBX2.0 Preallarmi Pezzi: Segnale pulito di segnalazione Preallarme Pezzi impostabile su CN. 0->Preallarme Disattivo, 1->Preallarme Attivo
* - DBX2.1 Allarme Pezzi: Segnale pulito di segnalazione Allarme Pezzi impostabile su CN. 0->Allarme Disattivo, 1->Allarme Attivo.
* - DBX2.3 Fine Vita Utensile: Segnale pulito di segnalazione Allarme Fine Vita Creatore. 0->Allarme Disattivo, 1->Allarme Attivo.
* - DBX2.7 Ciclo In Attesa: Segnale pulito sullo stato di funzionamento. 1->Ciclo Automatico attivo ma tutti assi fermi, 0->Altrimenti.
*
----------------------------------------------------- */
byte mainData = RawInput[0];
int byteSignals = 0;
// bit 0 (poweron) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSignals += (1 << 0);
}
if ((mainData & (1 << 2)) != 0)
{
byteSignals += (1 << 1);
}
// controllo il bit MAIN dello status
if ((mainData & (1 << 1)) != 0)
{
byteSignals += (1 << 3);
}
// considero come MANUALE NON ciclo in continuo...
if ((mainData & (1 << 3)) != 0)
{
byteSignals += (1 << 4);
}
// salvo!
B_input = byteSignals;
// log opzionale!
if (verboseLog)
{
lgInfo($"Trasformazione dati: RawInput:{RawInput[0]} --> B_input: {B_input}");
}
}
#endregion Protected Methods
}
}
+284
View File
@@ -0,0 +1,284 @@
using IOB_UT_NEXT;
using MapoSDK;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti Cosmap
/// </summary>
public class SiemensCosmap : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS Cosmap
* - basasto su SIEMENS
* - S7 vers 1500
*
* STRUTTURA MEMORIA DB29: (lettura) 10byte,
* G:\Drive condivisi\30_Clienti\Donati\Schemi IOB-WIN\COSMAP
*
* Si intende lettura/scrittura con DB6.DBxx
*
* DB6
* CodOdl Array[000..049] of Char DBB0..49
* RicettaRich Array[050..099] of Char DBB50..99
* CodArt Array[100..150] of Char DBB100..149
* RicettaCorr Array[100..150] of Char DBB150..199
* QtaRich DInt 200
* Stato Int 204 (0 = ferma, 1 = produzione, 2 = manuale, 3 = emergenza)
* Allarme Int 206 (0 = ok, 1 = macchina in allarme)
* Contapezzi DInt 208
* PzCountSet DInt 212 valore che si vuole impostare sul contapezzi
* PzCountRes DInt 216 comando di set contapezzi: al fronte di salita (0-->1) imposta contapezzi al valore prec
*
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensCosmap(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione Cosmap");
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
lgInfo($"Chiamata executeTasks specifica IobSiemensCosmap: {task2exe.Count} task ricevuti");
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
// inizio con 1 byte di default
byte[] MemBlock = new byte[1];
string memAddrWrite = "";
if (task2exe != null)
{
// cerco task specifici
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.fixStopSetup:
case taskType.forceSetPzCount:
case taskType.setProg:
case taskType.sendWatchDogMes2Plc:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
case taskType.setPzComm:
case taskType.setArt:
case taskType.setComm:
upsertKey(item.Key, item.Value);
int byteSize = 0;
// recupero dati da memMap... altrimenti NULLA
if (memMap.mMapWrite.ContainsKey(item.Key))
{
dataConf currMem = memMap.mMapWrite[item.Key];
byteSize = currMem.size;
memAddrWrite = currMem.memAddr;
MemBlock = new byte[byteSize];
if (currMem.tipoMem == plcDataType.String)
{
saveStringOnMemBlock(ref MemBlock, item.Key, 0, byteSize);
}
else if (currMem.tipoMem == plcDataType.DInt)
{
int valDInt = 0;
int.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.DInt.ToByteArray(valDInt);
}
else if (currMem.tipoMem == plcDataType.Int)
{
short valInt = 0;
short.TryParse(item.Value, out valInt);
MemBlock = S7.Net.Types.Int.ToByteArray(valInt);
}
}
else
{
string rawMemConf = JsonConvert.SerializeObject(memMap, Formatting.Indented);
lgError($"Errore: non trovata chiave write in memMap.mMapWrite per {item.Key}{Environment.NewLine}Configurazione memoria R/W:{Environment.NewLine}{rawMemConf}");
}
taskVal = item.Value;
break;
case taskType.forceResetPzCount:
// processo scrittura BIT su DB6.DBDW216
MemBlock = new byte[4];
MemBlock = S7.Net.Types.DInt.ToByteArray(1);
memAddrWrite = "DB6.DBDW216";
break;
case taskType.startSetup:
// processo scrittura BIT su DB6.DBDW216
MemBlock = new byte[4];
MemBlock = S7.Net.Types.DInt.ToByteArray(1);
memAddrWrite = "DB6.DBDW216";
break;
case taskType.stopSetup:
// processo scrittura BIT su DB6.DBDW216
MemBlock = new byte[4];
MemBlock = S7.Net.Types.DInt.ToByteArray(0);
memAddrWrite = "DB6.DBDW216";
break;
case taskType.setParameter:
// richiedo da URL i parametri WRITE da popolare
lgInfo("setParameter --> processMemWriteRequests");
taskVal = processMemWriteRequests();
// se restituiscce "" faccio altra prova...
if (string.IsNullOrEmpty(taskVal))
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
lgInfo($"executeTask: {tName} | {taskVal}");
// aggiungo task!
taskDone.Add(item.Key, taskVal);
if (!string.IsNullOrEmpty(memAddrWrite))
{
// scrivo!
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
}
if (taskOk)
{
// aggiorno valore memoria... SE presente
if (memMap.mMapWrite.ContainsKey(item.Key))
{
memMap.mMapWrite[item.Key].value = item.Value;
lgInfo($"Aggiornato valore in mMapWrite per {item.Key}");
}
lgInfo($"Eseguita con successo S7WriteBB per executeTasks: {item.Key} | {item.Value}");
}
else
{
lgError($"Errore in S7WriteBB durante executeTasks: {item.Key} | {item.Value}");
}
}
}
return taskDone;
}
#endregion Public Methods
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: emergenza (1=attiva/premuta, 0=armed)
*
----------------------------------------------------- */
//bool fatto = false;
ushort currStatus = 0;
ushort allarme = 0;
//ushort valW = 0;
var MemInt = new byte[2];
// recupero
//fatto = S7ReadBB(ref MemInt, "DB6.DBW204", 2);
//valW = S7.Net.Types.Word.FromByteArray(MemInt.ToArray());
//var testalW = S7.Net.Types.Word.FromByteArray(RawInput.Skip(204).Take(2).ToArray());
currStatus = S7.Net.Types.Word.FromByteArray(RawInput.Skip(204).Take(2).ToArray());
//fatto = S7ReadBB(ref MemInt, "DB6.DBW206", 2);
//valW = S7.Net.Types.Word.FromByteArray(MemInt.ToArray());
//allarme = valW;
allarme = S7.Net.Types.Word.FromByteArray(RawInput.Skip(206).Take(2).ToArray());
int byteSignals = 0;
// bit 0 (poweron) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSignals += (1 << 0);
}
// processo dagli stati + gravi...
if (allarme > 0)
{
byteSignals += (1 << 3);
}
switch (currStatus)
{
case 1:
byteSignals += (1 << 1);
break;
case 2:
byteSignals += (1 << 4);
break;
case 3:
byteSignals += (1 << 5);
break;
default:
break;
}
// salvo!
B_input = byteSignals;
// log opzionale!
if (verboseLog)
{
lgInfo($"Trasformazione dati: Status:{currStatus} | alarm:{allarme} --> B_input: {B_input}");
}
}
#endregion Protected Methods
}
}
+293
View File
@@ -0,0 +1,293 @@
using IOB_UT_NEXT;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IOB_WIN_SIEMENS.IobSiemens
{
public class SiemensFape : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS FAPE (es punzonatrice Tecnomeccanica di LVF)
* - basasto su SIEMENS
* - S7 vers 1200
* - V1.0 (2018): abilitata 1 area in lettura DB15 ed 1 in scrittura DB16 (NON la usano)
* - x poter funzionare --> protezione: meccanismi di collegamento / consenti put/get
* - lettura/scrittura primi 48 byte (240 max x le due DB)
*
* Versione 2018
* DB15 | Read seguenti byte:
* - B0, WORD, Stato Macchina Generale
* - B2, WORD, Posizione sequenza contatore
* - B4, WORD, contatore cicli eseguiti per lubrifica
* - B40, DWORD, contapezzi azzerabile da operatore
* - B44, DWORD, contapezzi ASSOLUTO
*
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensFape(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione FAPE 1.0 - 2018");
}
#endregion Public Constructors
#region private enums
/// <summary>
/// Posizione sequenza ciclo standard punzonatrice
/// </summary>
private enum posSeq2018
{
CICLO_AUTOMATICO_FERMO = 0,
CONTROLLO_MODO_OPERATIVO = 5,
MODO_ATTIVO_CON_ROBOT = 8,
SBLOCCAGGIO_PEZZO = 10,
APERTURA_PORTELLO_ROBOT = 11,
CONSENSO_ACCESSO_AL_ROBOT = 12,
CARICO_ROBOT_IN_CORSO = 14,
CARICO_ROBOT_CONCLUSO = 16,
CHIUSURA_PORTELLO_ROBOT = 18,
VERIFICA_POSIZIONE_CARRI = 20,
BLOCCAGGIO_PEZZO = 22,
ATTESA_CARRO_A_DESTRA = 24,
DISCESA_RAPIDO_BROCCIATURA = 25,
CICLO_DI_BROCCIATURA = 26,
RITORNO_BROCCIATRICE = 28,
COMANDO_CARRO_A_SINISTRA = 30,
CICLO_DI_ALESATURA = 32,
RITORNO_CARRO_ALESATURA = 34,
COMANDO_CARRO_A_DESTRA = 36,
INCREMENTO_CONTAPEZZI = 38,
CONTROLLO_TIME_OUT_CICLO = 40,
RILANCIO_CICLO_F42 = 42,
ATTESA_FINE_CICLO = 45
}
/// <summary>
/// Enum degli stati macchina (B0)
/// </summary>
private enum stMacc2018
{
COMUNICAZIONE_ASSENTE = 0,
EMERGENZA_INSERITA = 1,
AVARIA_ARIA = 2,
AVARIA_PRESSIONE_OLIO = 3,
AVARIA_LIVELLO_OLIO = 4,
AVARIA_TEMPERATURA_OLIO = 5,
AVARIA_MOTORE_POMPA_IDRAULICA = 6,
AVARIA_MOTORE_RAFFREDDO_IDRAULICA = 7,
AVARIA_SINCRONISMO_PORTE = 8,
AVARIA_LIBERA = 9,
ATTIVAZIONE_IN_CORSO = 10,
MODO_MANUALE_ATTREZZAGGIO = 11,
MODO_AUTOMATICO_LOCALE = 12,
MODO_AUTOMATICO_ROBOT = 13,
CICLO_IN_CORSO = 14,
LIBERO = 15
}
#endregion private enums
#region Public Methods
/// <summary>
/// Recupero dati override in formato dictionary
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getDynData()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
ushort valStatus = S7.Net.Types.Word.FromByteArray(RawInput.Skip(0).Take(2).ToArray());
ushort valPosit = S7.Net.Types.Word.FromByteArray(RawInput.Skip(2).Take(2).ToArray());
outVal.Add("CURR_STATO", ((stMacc2018)valStatus).ToString());
outVal.Add("CURR_POSIT", ((posSeq2018)valPosit).ToString());
return outVal;
}
/// <summary>
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
/// </summary>
public override void processOverride()
{
}
#endregion Public Methods
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
// FAPE: leggo i primi 2 WORD x decodifica stato e posizione...
ushort valStatus = S7.Net.Types.Word.FromByteArray(RawInput.Skip(0).Take(2).ToArray());
ushort valPosit = S7.Net.Types.Word.FromByteArray(RawInput.Skip(2).Take(2).ToArray());
stMacc2018 _stMacch = ((stMacc2018)valStatus);
posSeq2018 _posSeq = ((posSeq2018)valPosit);
/* -----------------------------------------------------
* bitmap MAPO
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: emergenza
----------------------------------------------------- */
// bit 0 (poweron) imposto a 1 SE connected...
B_input = currPLC.IsConnected ? 1 : 0;
// controllo stato macchina x impostare altri bit...
switch (_stMacch)
{
case stMacc2018.EMERGENZA_INSERITA:
B_input += (1 << 5);
break;
case stMacc2018.AVARIA_ARIA:
case stMacc2018.AVARIA_PRESSIONE_OLIO:
case stMacc2018.AVARIA_LIVELLO_OLIO:
case stMacc2018.AVARIA_TEMPERATURA_OLIO:
B_input += (1 << 3);
B_input += (1 << 6);
break;
case stMacc2018.AVARIA_MOTORE_POMPA_IDRAULICA:
case stMacc2018.AVARIA_MOTORE_RAFFREDDO_IDRAULICA:
case stMacc2018.COMUNICAZIONE_ASSENTE:
case stMacc2018.AVARIA_SINCRONISMO_PORTE:
case stMacc2018.AVARIA_LIBERA:
case stMacc2018.ATTIVAZIONE_IN_CORSO:
B_input += (1 << 3);
break;
case stMacc2018.MODO_MANUALE_ATTREZZAGGIO:
B_input += (1 << 4);
break;
case stMacc2018.CICLO_IN_CORSO:
B_input += (1 << 1);
break;
case stMacc2018.MODO_AUTOMATICO_LOCALE:
case stMacc2018.MODO_AUTOMATICO_ROBOT:
B_input += (1 << 7);
break;
case stMacc2018.LIBERO:
default:
break;
}
// procedo SOLO SE è enabled IOB
if (IobOnline)
{
try
{
currODL = utils.callUrl(urlGetCurrODL);
// solo SE HO un ODL...
if (string.IsNullOrWhiteSpace(currODL) || currODL == "0")
{
if (periodicLog)
{
lgInfo(string.Format("SiemensFape | Lettura ODL andata a vuoto: currODL: {0}", currODL));
}
}
else
{
// se variato o scaduto timeout log...
if (periodicLog || (currIdxODL.ToString() != currODL))
{
lgInfo(string.Format("SiemensFape | Lettura ODL, currODL: {0} --> currIdxODL prec: {1}", currODL, currIdxODL));
}
// provo a salvare nuovo ODL
int.TryParse(currODL, out currIdxODL);
}
}
catch (Exception exc)
{
if (DateTime.Now.Subtract(lastWarnODL).TotalSeconds > 15)
{
lgError(exc, "Errore in fase di chiamata URL x ODL corrente | URL chiamato: {0}", urlGetCurrODL);
lastWarnODL = DateTime.Now;
}
}
}
else
{
// imposto currODL a vuoto!
currODL = "";
if (periodicLog)
{
lgInfo($"Fanuc | Lettura ODL non effettuata: IobOnline: {IobOnline} | currODL impostato a vuoto");
}
}
if (!string.IsNullOrWhiteSpace(currODL) && currODL != "0")
{
// ora processo il contapezzi... controllo se è passato intervallo minimo tra 2
// controlli/elaborazioni x distanziare invio e ridurre letture
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
// se sono differenti MOSTRO...
if (contapezziPLC != contapezziIOB)
{
// registro contapezzi
lgInfo($"Differenza Contapezzi: contapezziPLC: {contapezziPLC} | contapezziIOB {contapezziIOB}");
}
// verifico se variato contapezzi... e se passato ritardo minimo...
if (contapezziPLC > contapezziIOB)
{
// salvo nuovo contapezzi (incremento di 1...) + richiesta refresh conteggio
contapezziIOB++;
needRefreshPzCount = true;
// salvo in semaforo!
B_input += (1 << 2);
// registro contapezzi
lgInfo($"contapezziPLC SIEMENS: {contapezziPLC} | contapezziIOB {contapezziIOB}");
}
// invio a server contapezzi (aggiornato)
string retVal = utils.callUrl(urlSetPzCount + contapezziIOB.ToString());
// verifica se tutto OK
if (retVal != contapezziIOB.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio Contapezzi SIEMENS: contapezziPLC {contapezziPLC} | contapezziIOB {contapezziIOB} | risposta: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
else
{
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
lgInfo($"Attenzione: mancanza ODL non procedo con gestione contapezzi. contapezziPLC SIEMENS {contapezziPLC} | contapezziIOB {contapezziIOB}");
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
// log opzionale!
if (verboseLog)
{
lgInfo(string.Format("Trasformazione B_input: {0}", B_input));
}
}
#endregion Protected Methods
}
}
+681
View File
@@ -0,0 +1,681 @@
using IOB_UT_NEXT;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IOB_WIN_SIEMENS.IobSiemens
{
public class SiemensFapeV2 : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS FAPE (es punzonatrice Tecnomeccanica di LVF)
* - basasto su SIEMENS
* - S7 vers 1200
* - x poter funzionare --> protezione: meccanismi di collegamento / consenti put/get
*
* V1.0 (2018):
* - abilitata 1 area in lettura DB15
* DB15 | Read seguenti byte:
* - B0, WORD, Stato Macchina Generale
* - B2, WORD, Posizione sequenza contatore
* - B4, WORD, contatore cicli eseguiti per lubrifica
* - B40, DWORD, contapezzi azzerabile da operatore
* - B44, DWORD, contapezzi ASSOLUTO
* - abilitata 1 area in scrittura DB16 (NON la usano)
*
* V2.0 (2024):
* - abilitata 1 area in lettura DB17
* DB17 v.2 | Read seguenti byte:
* - B0, WORD, Stato Macchina Generale
* - B2, WORD, Posizione sequenza contatore
* - B4, WORD, contatore cicli eseguiti per lubrifica
* - B6, DWORD, contapezzi azzerabile da operatore
* - B10, DWORD, contapezzi ASSOLUTO
*
* DB17 v.3 | Read seguenti byte:
* - B0, WORD, Semaforo Macchina
* - B2, WORD, Stato Macchina Generale
* - B4, WORD, Posizione sequenza contatore
* - B6, WORD, contatore cicli eseguiti per lubrifica
* - B8, DWORD, contapezzi azzerabile da operatore
* - B12, DWORD, contapezzi ASSOLUTO
*
* - abilitata 1 area in scrittura DB16
* DB16 | Write seguenti byte:
* - B0, STRING(30), Commessa
* - B32, STRING(30), Articolo
* - B64, DWORD, NumPezzi
* - B68, BOOL, Reset Contapezzi Parziale(autoresetta)
*
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensFapeV2(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
string sFapeVers = getOptPar("FAPE_VERS");
if (!string.IsNullOrEmpty(sFapeVers))
{
int.TryParse(sFapeVers, out FapeVers);
}
int yRef = FapeVers == 1 ? 2018 : 2024;
// inizializzo dizionari decodifica da conf json...
// cerco nella conf specifica...
if (memMap.DataDecodMap != null && memMap.DataDecodMap.Count > 0)
{
if (memMap.DataDecodMap.ContainsKey("StatoMacchina"))
{
DictState = memMap.DataDecodMap["StatoMacchina"];
}
else
{
lgError("Errore: missing DataDecodMap.StatoMacchina dict");
}
if (memMap.DataDecodMap.ContainsKey("StepCiclo"))
{
DictStCic = memMap.DataDecodMap["StepCiclo"];
}
else
{
lgError("Errore: missing DataDecodMap.StepCiclo dict");
}
}
else
{
lgInfo("Attenzione. non ho trovcato dizionari di decodifica (DataDecodMap) nel file json!");
}
lgInfo($"NEW IOB SIEMENS versione FAPE v.{FapeVers} - {yRef}");
}
private Dictionary<string, string> DictState = new Dictionary<string, string>();
private Dictionary<string, string> DictStCic = new Dictionary<string, string>();
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Recupero dati override in formato dictionary
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getDynData()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
ExtractFapeData();
string curState = "";
string curPosiz = "";
// rivedere da conf estesa decodifica?!?
if (FapeVers == 3)
{
// stato
curState = $"{valState}";
// cerco nella conf specifica...
if (DictState.Count > 0 && DictState.ContainsKey($"{valState}"))
{
curState = DictState[$"{valState}"];
}
// posizione
curPosiz = $"{valStepCic}";
// cerco nella conf specifica...
if (DictStCic.Count > 0 && DictStCic.ContainsKey($"{valStepCic}"))
{
curPosiz = DictStCic[$"{valStepCic}"];
}
}
// se non trovato ancora..
if (string.IsNullOrEmpty(curState) || string.IsNullOrEmpty(curPosiz))
{
if (FapeVers == 1)
{
curState = ((stMacc2018)valState).ToString();
curPosiz = ((posSeq2018)valStepCic).ToString();
//outVal.Add("CURR_STATO", ((stMacc2018)valState).ToString());
//outVal.Add("CURR_POSIT", ((posSeq2018)valStepCic).ToString());
}
else
{
curState = ((stMacc2024)valState).ToString();
curPosiz = ((posSeq2024)valStepCic).ToString();
//outVal.Add("CURR_STATO", ((stMacc2024)valState).ToString());
//outVal.Add("CURR_POSIT", ((posSeq2024)valStepCic).ToString());
}
}
// salvo valori!
outVal.Add("CURR_STATO", curState);
outVal.Add("CURR_POSIT", curPosiz);
// aggiungo main state se disponibile...
if (FapeVers > 2)
{
outVal.Add("CURR_LAMP", ((mainState)valMain).ToString());
}
return outVal;
}
/// <summary>
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
/// </summary>
public override void processOverride()
{
}
#endregion Public Methods
#region Protected Fields
/// <summary>
/// Stato impianto codificato come valore mainState
/// </summary>
protected ushort valMain = 0;
/// <summary>
/// Posizione corrente ciclo
/// </summary>
protected ushort valStepCic = 0;
/// <summary>
/// Stato Dettagliato macchina
/// </summary>
protected ushort valState = 0;
#endregion Protected Fields
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
// FAPE: leggo i primi 2 WORD x decodifica stato e posizione...
ExtractFapeData();
#if false
mainState _stMain = ((mainState)valMain);
stMacc2024 _stMacch = ((stMacc2024)valStatus);
posSeq2024 _posSeq = ((posSeq2024)valPosit);
#endif
/* -----------------------------------------------------
* bitmap MAPO - 47
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: emergenza
----------------------------------------------------- */
// bit 0 (poweron) imposto a 1 SE connected...
B_input = currPLC.IsConnected ? 1 : 0;
// verifico versione decodifica da + recente a + vecchia...
if (FapeVers == 3)
{
DecodeV3(ref B_input);
}
else if (FapeVers == 2)
{
DecodeV2(ref B_input);
}
else
{
DecodeV1(ref B_input);
}
// FIXME ToDo !!! verificare da qui...
// procedo SOLO SE è enabled IOB
if (IobOnline)
{
try
{
currODL = utils.callUrl(urlGetCurrODL);
// solo SE HO un ODL...
if (string.IsNullOrWhiteSpace(currODL) || currODL == "0")
{
if (periodicLog)
{
lgInfo(string.Format("SiemensFape | Lettura ODL andata a vuoto: currODL: {0}", currODL));
}
}
else
{
// se variato o scaduto timeout log...
if (periodicLog || (currIdxODL.ToString() != currODL))
{
lgInfo(string.Format("SiemensFape | Lettura ODL, currODL: {0} --> currIdxODL prec: {1}", currODL, currIdxODL));
}
// provo a salvare nuovo ODL
int.TryParse(currODL, out currIdxODL);
}
}
catch (Exception exc)
{
if (DateTime.Now.Subtract(lastWarnODL).TotalSeconds > 15)
{
lgError(exc, "Errore in fase di chiamata URL x ODL corrente | URL chiamato: {0}", urlGetCurrODL);
lastWarnODL = DateTime.Now;
}
}
}
else
{
// imposto currODL a vuoto!
currODL = "";
if (periodicLog)
{
lgInfo($"Fanuc | Lettura ODL non effettuata: IobOnline: {IobOnline} | currODL impostato a vuoto");
}
}
if (!string.IsNullOrWhiteSpace(currODL) && currODL != "0")
{
// ora processo il contapezzi... controllo se è passato intervallo minimo tra 2
// controlli/elaborazioni x distanziare invio e ridurre letture
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
// se sono differenti MOSTRO...
if (contapezziPLC != contapezziIOB)
{
// registro contapezzi
lgInfo($"Differenza Contapezzi: contapezziPLC: {contapezziPLC} | contapezziIOB {contapezziIOB}");
}
// verifico se variato contapezzi... e se passato ritardo minimo...
if (contapezziPLC > contapezziIOB)
{
// salvo nuovo contapezzi (incremento di 1...) + richiesta refresh conteggio
contapezziIOB++;
needRefreshPzCount = true;
// salvo in semaforo!
B_input += (1 << 2);
// registro contapezzi
lgInfo($"contapezziPLC SIEMENS: {contapezziPLC} | contapezziIOB {contapezziIOB}");
}
// invio a server contapezzi (aggiornato)
string retVal = utils.callUrl(urlSetPzCount + contapezziIOB.ToString());
// verifica se tutto OK
if (retVal != contapezziIOB.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio Contapezzi SIEMENS: contapezziPLC {contapezziPLC} | contapezziIOB {contapezziIOB} | risposta: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
else
{
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
lgInfo($"Attenzione: mancanza ODL non procedo con gestione contapezzi. contapezziPLC SIEMENS {contapezziPLC} | contapezziIOB {contapezziIOB}");
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
// log opzionale!
if (verboseLog)
{
lgInfo(string.Format("Trasformazione B_input: {0}", B_input));
}
}
/// <summary>
/// Esegue decodificada stati in modalità "classica" (2018)
/// </summary>
/// <returns></returns>
protected void DecodeV1(ref int B_input)
{
// Guardo SOLO stato macchina V1 (2018)
stMacc2018 _stMacch = ((stMacc2018)valState);
// controllo stato macchina x impostare altri bit...
switch (_stMacch)
{
case stMacc2018.EMERGENZA_INSERITA:
B_input += (1 << 5);
break;
case stMacc2018.AVARIA_ARIA:
case stMacc2018.AVARIA_PRESSIONE_OLIO:
case stMacc2018.AVARIA_LIVELLO_OLIO:
case stMacc2018.AVARIA_TEMPERATURA_OLIO:
B_input += (1 << 3);
B_input += (1 << 6);
break;
case stMacc2018.AVARIA_MOTORE_POMPA_IDRAULICA:
case stMacc2018.AVARIA_MOTORE_RAFFREDDO_IDRAULICA:
case stMacc2018.COMUNICAZIONE_ASSENTE:
case stMacc2018.AVARIA_SINCRONISMO_PORTE:
case stMacc2018.AVARIA_LIBERA:
case stMacc2018.ATTIVAZIONE_IN_CORSO:
B_input += (1 << 3);
break;
case stMacc2018.MODO_MANUALE_ATTREZZAGGIO:
B_input += (1 << 4);
break;
case stMacc2018.CICLO_IN_CORSO:
B_input += (1 << 1);
break;
case stMacc2018.MODO_AUTOMATICO_LOCALE:
case stMacc2018.MODO_AUTOMATICO_ROBOT:
B_input += (1 << 7);
break;
case stMacc2018.LIBERO:
default:
break;
}
}
/// <summary>
/// Esegue decodificada stati in modalità "v2" (2024) con 2 valori senza macro stato
/// </summary>
/// <returns></returns>
protected void DecodeV2(ref int B_input)
{
// Guardo SOLO stato macchina V2 (2024)
stMacc2024 _stMacch = ((stMacc2024)valState);
// controllo stato macchina x impostare altri bit... semplificato sui VALORI interi val status...
// da 00..50 -> pronta NON faccio nulla
if (valState < 51)
{
//B_input = 1;
}
// lavora
else if (valState >= 51 && valState < 100)
{
B_input += (1 << 1);
}
// manuale/warning
else if (valState >= 100 && valState < 199)
{
B_input += (1 << 3);
}
// allarme
else if (valState >= 200)
{
B_input += (1 << 4);
}
// controllo COMUNQUE emergenza premuta...
if (_stMacch == stMacc2024.MACCHINA_NON_ATTIVA)
{
B_input += (1 << 5);
}
}
/// <summary>
/// Esegue decodificada stati in modalità "v3" (2024) con 3 valori guardando SOLO macro stato
/// </summary>
/// <returns></returns>
protected void DecodeV3(ref int B_input)
{
// Guardo SOLO stato MAIN V3 (2024)
mainState _stMain = ((mainState)valMain);
stMacc2024 _stMacch = ((stMacc2024)valState);
// controllo stato macchina x impostare altri bit...
switch (_stMain)
{
case mainState.Pronta:
break;
case mainState.Lavora:
B_input += (1 << 1);
break;
case mainState.Warning:
B_input += (1 << 4);
break;
case mainState.Allarme:
B_input += (1 << 3);
break;
case mainState.ND:
default:
break;
}
// controllo COMUNQUE emergenza premuta...
if (_stMacch == stMacc2024.MACCHINA_NON_ATTIVA)
{
B_input += (1 << 5);
}
}
#endregion Protected Methods
#region Private Fields
private int FapeVers = 1;
#endregion Private Fields
#region Private Enums
/// <summary>
/// Enum degli stati macchina (B0)
/// </summary>
private enum mainState
{
ND = 0,
Pronta = 1,
Lavora = 2,
Warning = 3,
Allarme = 4
}
/// <summary>
/// Posizione sequenza ciclo standard punzonatrice
/// </summary>
private enum posSeq2018
{
CICLO_AUTOMATICO_FERMO = 0,
CONTROLLO_MODO_OPERATIVO = 5,
MODO_ATTIVO_CON_ROBOT = 8,
SBLOCCAGGIO_PEZZO = 10,
APERTURA_PORTELLO_ROBOT = 11,
CONSENSO_ACCESSO_AL_ROBOT = 12,
CARICO_ROBOT_IN_CORSO = 14,
CARICO_ROBOT_CONCLUSO = 16,
CHIUSURA_PORTELLO_ROBOT = 18,
VERIFICA_POSIZIONE_CARRI = 20,
BLOCCAGGIO_PEZZO = 22,
ATTESA_CARRO_A_DESTRA = 24,
DISCESA_RAPIDO_BROCCIATURA = 25,
CICLO_DI_BROCCIATURA = 26,
RITORNO_BROCCIATRICE = 28,
COMANDO_CARRO_A_SINISTRA = 30,
CICLO_DI_ALESATURA = 32,
RITORNO_CARRO_ALESATURA = 34,
COMANDO_CARRO_A_DESTRA = 36,
INCREMENTO_CONTAPEZZI = 38,
CONTROLLO_TIME_OUT_CICLO = 40,
RILANCIO_CICLO_F42 = 42,
ATTESA_FINE_CICLO = 45
}
/// <summary>
/// Posizione sequenza ciclo standard punzonatrice
/// </summary>
private enum posSeq2024
{
CICLO_NON_ATTIVO_0 = 0,
CONTROLLO_TIPO_CARICO_5 = 5,
APERTURA_PORTELLO_ACCESSO_AREA_ROBOT_10 = 10,
ATTESA_SCARICO_CARICO_PEZZO_DA_ROBOT_15 = 15,
ATTESA_ROBOT_FUORI_AREA_20 = 20,
ATTESA_CADUTA_SEGNALE_ROBOT_FUORI_AREA_25 = 25,
CHIUSURA_PORTELLO_ACCESSO_AREA_ROBOT_30 = 30,
FASE_1_STAFFAGGIO_PEZZO_50 = 50,
FASE_2_POSIZIONAMENTO_CONTRASTO_PEZZO_60 = 60,
FASE_3_PUNZONATURA_1_LUBRIFICAZIONE_PUNZONE_69 = 69,
FASE_3_PUNZONATURA_1_DISCESA_RAPIDA_70 = 70,
FASE_3_PUNZONATURA_1_DISCESA_LENTA_74 = 74,
FASE_3_PUNZONATURA_1_DISCESA_LENTISSIMA_75 = 75,
FASE_3_PUNZONATURA_1_ARRESTO_AZIONAMENTO_79 = 79,
FASE_3_PUNZONATURA_1_RITARDO_PER_RISALITA_80 = 80,
FASE_3_PUNZONATURA_1_SALITA_LENTA_85 = 85,
FASE_3_PUNZONATURA_1_SALITA_RAPIDA_90 = 90,
FASE_3_PUNZONATURA_1_SALITA_FINALE_95 = 95,
FASE_3_PUNZONATURA_1_ARRESTO_AZIONAMENTO_96 = 96,
FASE_4_TRASLAZIONE_1_RITARDO_AVVIO_105 = 105,
FASE_4_TRASLAZIONE_1_MOVIMENTO_SU_PUNZONATURA_2_110 = 110,
FASE_4_TRASLAZIONE_1_ARRESTO_AZIONAMENTO_114 = 114,
FASE_5_PUNZONATURA_2_RITARDO_AVVIO_115 = 115,
FASE_5_PUNZONATURA_2_LUBRIFICAZIONE_PUNZONE_119 = 119,
FASE_5_PUNZONATURA_2_DISCESA_RAPIDA_120 = 120,
FASE_5_PUNZONATURA_2_DISCESA_LENTA_124 = 124,
FASE_5_PUNZONATURA_2_DISCESA_LENTISSIMA_125 = 125,
FASE_5_PUNZONATURA_2_ARRESTO_AZIONAMENTO_126 = 126,
FASE_5_PUNZONATURA_2_RITARDO_PER_RISALITA_130 = 130,
FASE_5_PUNZONATURA_2_SALITA_LENTA_135 = 135,
FASE_5_PUNZONATURA_2_SALITA_RAPIDA_140 = 140,
FASE_5_PUNZONATURA_2_SALITA_FINALE_145 = 145,
FASE_5_PUNZONATURA_2_ARRESTO_AZIONAMENTO_146 = 146,
INCREMENTO_CONTATORI_PEZZI_ESEGUITI_155 = 155,
FASE_6_TRASLAZIONE_2_RITARDO_AVVIO_156 = 156,
FASE_6_TRASLAZIONE_2_MOVIMENTO_SU_PUNZONATURA_1_160 = 160,
FASE_6_TRASLAZIONE_2_ARRESTO_AZIONAMENTO_161 = 161,
FASE_7_DISINSERIMENTO_CONTRASTO_165 = 165,
FASE_8_DESTAFFAGGIO_PEZZO_170 = 170,
DISATTIVAZIONE_AZIONAMENTO_180 = 180,
VERIFICA_RIAVVIO_CICLO_CON_CARICO_DA_ROBOT_190 = 190,
CICLO_TERMINATO_300 = 300
}
/// <summary>
/// Enum degli stati macchina (B0)
/// </summary>
private enum stMacc2018
{
COMUNICAZIONE_ASSENTE = 0,
EMERGENZA_INSERITA = 1,
AVARIA_ARIA = 2,
AVARIA_PRESSIONE_OLIO = 3,
AVARIA_LIVELLO_OLIO = 4,
AVARIA_TEMPERATURA_OLIO = 5,
AVARIA_MOTORE_POMPA_IDRAULICA = 6,
AVARIA_MOTORE_RAFFREDDO_IDRAULICA = 7,
AVARIA_SINCRONISMO_PORTE = 8,
AVARIA_LIBERA = 9,
ATTIVAZIONE_IN_CORSO = 10,
MODO_MANUALE_ATTREZZAGGIO = 11,
MODO_AUTOMATICO_LOCALE = 12,
MODO_AUTOMATICO_ROBOT = 13,
CICLO_IN_CORSO = 14,
LIBERO = 15
}
/// <summary>
/// Enum degli stati macchina (B0)
/// </summary>
private enum stMacc2024
{
COMUNICAZIONE_ASSENTE = 0,
EMERGENZA_RIPRISTINATA = 5,
MACCHINA_IN_POTENZA = 10,
MACCHINA_PRONTA_PER_CICLO_LOCALE = 15,
MACCHINA_PRONTA_PER_CICLO_CON_ROBOT = 20,
MACCHINA_IN_MANUALE = 25,
CICLO_RESET_ATTIVO = 50,
CICLO_AUTOMATICO_LOCALE_ATTIVO = 55,
CICLO_AUTOMATICO_CON_ROBOT_ATTIVO = 60,
MANCANZA_OLIO_LUBRIFICAZIONE_PEZZO = 100,
MANCANZA_OLIO_LUBRIFICAZIONE_CILINDRO = 105,
ATTESA_BARRIERE_LIBERE = 110,
ATTESA_BLOCCAGGIO_PORTELLO_ANTERIORE = 111,
ATTESA_RILASCIO_PULSANTE_RESET = 115,
ATTESA_ASSE_PUNZONATURA_ALTO = 120,
ATTESA_BLOCCAGGIO_PEZZO_ALTO = 125,
ATTESA_BLOCCAGGIO_PEZZO = 126,
ATTESA_CONTRASTO_PEZZO_DISINSERITO = 130,
ATTESA_CARRO_IN_POSIZIONE_1 = 135,
ATTESA_CHIUSURA_PORTELLO_ROBOT = 140,
ATTESA_ROBOT_FUORI_INGOMBRO = 145,
ATTESA_TERMINE_CICLO_RESET = 150,
TIMEOUT_LUBRIFICAZIONE_CILINDRO = 155,
LIVELLO_OLIO_BASSO_LUBRIFICA_PEZZO = 160,
LIVELLO_OLIO_BASSO_LUBRIFICA_CILINDRO = 165,
ATTESA_AREA_TRASLAZIONE_LIBERA = 170,
ANOMALIA_POSIZIONE_PER_CARICO_ROBOT = 205,
SOVRAPRESSIONE_PUNZONATURA_1 = 210,
OLTRE_QUOTA_MASSIMA_PUNZONATURA_1 = 215,
SOVRAPRESSIONE_PUNZONATURA_2 = 220,
OLTRE_QUOTA_MASSIMA_PUNZONATURA_2 = 225,
SOVRAPRESSIONE_TRASLAZIONE_CARRO = 230,
TIMEOUT_AVVIO_DRIVE_POMPA_IDRAULICA = 235,
SOVRAPRESSIONE_MOVIMENTO_PUNZONE = 240,
ALLARME_DRIVE_POMPA_IDRAULICA = 245,
ANOMALIA_ALIMENTAZIONE_PNEUMATICA = 250,
APERTURA_ANOMALA_PORTELLO_ROBOT = 255,
APERTURA_ANOMALA_PORTELLO_ANTERIORE = 260,
INTRUSIONE_ANOMALA_BARRIERE = 265,
MACCHINA_NON_ATTIVA = 270,
ALLARME_AREA_TRASLAZIONE_NON_LIBERA = 275,
ANOMALIA_SALITA_PUNZONATORE = 301,
ANOMALIA_TRASLAZIONE_CARRO = 303,
ANOMALIA_ARRETRAMENTO_CONTRASTO_305 = 305,
ANOMALIA_APERTURA_STAFFAGGIO = 307,
ANOMALIA_STAFFAGGIO_PEZZO = 403,
ANOMALIA_POSIZIONE_CONTRASTO = 405,
ANOMALIA_PUNZONATURA_1 = 407,
ANOMALI_TRASLAZIONE_IN_POSIZIONE_2 = 409,
ANOMALIA_PUNZONATURA_2 = 411,
ANOMALIA_ARRETRAMENTO_CONTRASTO_413 = 413,
ANOMALIA_SALITA_STAFFAGGIO = 415,
ANOMALI_TRASLAZIONE_IN_POSIZIONE_1 = 417,
ANOMALIA_DISATTIVAZIONE_DRIVE_POMPA = 419,
}
#endregion Private Enums
#region Private Methods
/// <summary>
/// recupero dati specifici FAPE da struttura array memoria e versione adapter
/// </summary>
private void ExtractFapeData()
{
/* ----------------------------------------------
* NOTA:
* - v1 (2018): 2 blocchi memoria, area DB15
* - v2 (2024): 2 blocchi area DB17
* - v3 (2024): 3 blocchi area DB17 (MacroStato, stato, ciclo)
*
* decodifico secondo conf
* ----------------------------------------------*/
// leggo secondo versione adapter 1/2/3...
if (FapeVers <= 2)
{
valState = S7.Net.Types.Word.FromByteArray(RawInput.Skip(0).Take(2).ToArray());
valStepCic = S7.Net.Types.Word.FromByteArray(RawInput.Skip(2).Take(2).ToArray());
}
else
{
valMain = S7.Net.Types.Word.FromByteArray(RawInput.Skip(0).Take(2).ToArray());
valState = S7.Net.Types.Word.FromByteArray(RawInput.Skip(2).Take(2).ToArray());
valStepCic = S7.Net.Types.Word.FromByteArray(RawInput.Skip(4).Take(2).ToArray());
}
}
#endregion Private Methods
}
}
@@ -0,0 +1,306 @@
using IOB_UT_NEXT;
using MapoSDK;
using System;
using System.Collections.Generic;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti Ingenia (Automazione Valvital)
/// </summary>
public class SiemensIngenia : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS INGENIA (system integrator gestione robot impianto PRESSA in VALVITAL)
* - basasto su SIEMENS
* - S7 vers 1500
*
* STRUTTURA MEMORIA DB700
*
* Le informazioni di cui abbiamo bisogno (lettura) sono le seguenti :
* Macchina Lavora (DB700.DBX0.0)
* Macchina in ciclo (DB700.DBX0.1)
* Macchina in manuale (DB700.DBX0.2)
* Macchina in allarme (DB700.DBX0.3)
* Macchina in emergenza (DB700.DBX0.4)
* Macchina in timeout -> NON GESTIBILE in quanto attualmente gestito come ALLARME o SCARTO.
* Contapezzi
* Gestione scarti
*
* Sul tema del contapezzi ovviamente ci adattiamo a come gestite la cosa e quindi vanno bene sia 2 (o più) contapezzi (contapezzi_buono, contapezzi_scarto_forno, contapezzi_scarto_pressa, contapezzi_scarto_bilancere) -> VITA ISOLA (DB700.DBD24), BUONI (DB700.DBD28), SCARTO SAET (DB700.DBD32), SCARTO PEZZI FREDDI (DB700.DBD36).
*
* in scrittura vorremmo indicare al PLC
* - codice articolo(DB701.DBD20)
* - codice commessa(DB701.DBD24)
* - quantità produzione(DB701.DBD28)
*
* Questi 3 dati devono essere visualizzati in una qualche schermata per poter asseverare il requisito della 4.0, non è necessario ci siano vincoli per cui se ad esempio la richiesta fosse superata il robot continua a lavorare comunque.
*
*
* NB: Si intende tutto con DB700.DBxx
*
* - BIT di stato
* - DBX0.0: Macchina in LAVORAZIONE
* - DBX0.1: Macchina in CICLO
* - DBX0.2: Macchina in MANUALE
* - DBX0.3: Macchina in ALLARME
* - DBX0.4: Macchina in EMERGENZA
*
* - DBD24: Vita isola (!!!???) Contapezzi TOTALISSIMO?
* - DBD28: BUONI
* - DBD32: pezzi prelevati per controllo qualità (era SCARTO SAET)
* - DBD36: SCARTO pezzi freddi
*
*
* SCRITTURA
* - DBD701.DBD20: codice articolo
* - DBD701.DBD24: codice commessa
* - DBD701.DBD28: qta produzione
*
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensIngenia(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione VIPA INGENIA");
lastPLCWatchDog = DateTime.Now.AddMinutes(-1);
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
// Verificare il protocollo: dovrebbe togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
// inizio con 1 byte VUOTO
byte[] MemBlock = new byte[1];
string memAddrWrite = "";
if (task2exe != null)
{
// cerco task specifici: se ho startSetup --> imposto bit DBB701.DBB0.4
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
memAddrWrite = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.fixStopSetup:
case taskType.forceResetPzCount:
case taskType.forceSetPzCount:
case taskType.setProg:
case taskType.startSetup:
case taskType.stopSetup:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
case taskType.sendWatchDogMes2Plc:
memAddrWrite = "DB701.DBB12";
upsertKey(item.Key, item.Value);
MemBlock = dwordToByte(counterMes2Plc.ToString());
taskVal = $"VALUE DB701.DBB12 --> {counterMes2Plc} ({MemBlock})";
if (verboseLog)
{
lgInfo(taskVal);
}
break;
case taskType.setArt:
case taskType.setComm:
case taskType.setPzComm:
case taskType.setParameter:
upsertKey(item.Key, item.Value);
// verifico se posso aggiornare valori in memoria...
if (memMap != null && memMap.mMapWrite != null)
{
if (memMap.mMapWrite.ContainsKey(item.Key))
{
dataConf currMem = memMap.mMapWrite[item.Key];
string addr = currMem.memAddr;
taskVal = $"SET task: {item.Key} --> {item.Value} | mem: {currMem.memAddr} - {currMem.size} byte";
// salvo il nuovo valore nella memoria... così prox invio lo trasmetterà
memMap.mMapWrite[item.Key].value = item.Value;
}
else
{
taskVal = $"NO DATA MEM, SET task: {item.Key} --> {item.Value}";
}
}
else
{
taskVal = $"NO MemMap found, SET task: {item.Key} --> {item.Value}";
}
// richiedo da URL i parametri WRITE da popolare
lgInfo("Chiamata processMemWriteRequests");
taskVal = processMemWriteRequests();
// se restituiscce "" faccio altra prova...
if (string.IsNullOrEmpty(taskVal))
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
taskOk = true;
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
// aggiungo task!
taskDone.Add(item.Key, taskVal);
if (!string.IsNullOrEmpty(memAddrWrite))
{
// scrivo!
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
}
if (!taskOk)
{
lgError($"Ingenia: errore in S7WriteBB durante executeTasks: {item.Key} | {item.Value} | memAddrWrite: {memAddrWrite} | {taskVal}");
}
}
}
return taskDone;
}
/// <summary>
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
/// </summary>
public override void processOverride()
{
}
public override void processWhatchDog()
{
// scrivo 1 volta al secondo il contatore incrementale su area apposita
DateTime adesso = DateTime.Now;
if (adesso.Subtract(lastPLCWatchDog).TotalSeconds > watchDogPeriod)
{
// incremento
counterMes2Plc++;
// se > 999'999'999 --> 0
if (counterMes2Plc > 999999999) counterMes2Plc = 0;
// salvo su DB
Dictionary<string, string> task2exe = new Dictionary<string, string>();
Dictionary<string, string> taskDone = new Dictionary<string, string>();
task2exe.Add("sendWatchDogMes2Plc", counterMes2Plc.ToString());
taskDone = executeTasks(task2exe);
lgInfo($"Scritto watchdog: {counterMes2Plc}");
// salvo watchdog PLC
lastPLCWatchDog = adesso;
}
}
#endregion Public Methods
#region Protected Fields
protected int counterMes2Plc = 0;
protected int counterPlc2Mes = 0;
protected DateTime lastPLCWatchDog;
#endregion Protected Fields
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: emergenza
*
*
* - BIT di stato
* - DBX0.0: Macchina in LAVORAZIONE
* - DBX0.1: Macchina in CICLO
* - DBX0.2: Macchina in MANUALE
* - DBX0.3: Macchina in ALLARME
* - DBX0.4: Macchina in EMERGENZA
----------------------------------------------------- */
// bit 0 (poweron) imposto a 1 SE connected...
B_input = currPLC.IsConnected ? 1 : 0;
// recupero byte segnali...
byte mainData = RawInput[0];
int byteSignals = 0;
// bit 0 (poweron) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSignals += (1 << 0);
}
// RUN se lavora ed in ciclo
if ((mainData & (1 << 0)) != 0 && (mainData & (1 << 1)) != 0)
{
byteSignals += (1 << 1);
}
// manuale
if ((mainData & (1 << 2)) != 0)
{
byteSignals += (1 << 4);
}
// allarme
if ((mainData & (1 << 3)) != 0)
{
byteSignals += (1 << 3);
}
// emergenza
if ((mainData & (1 << 4)) != 0)
{
byteSignals += (1 << 5);
}
// salvo!
B_input = byteSignals;
// log opzionale!
if (verboseLog)
{
lgInfo(string.Format($"Trasformazione dati: RawInput:{RawInput[3]} --> B_input: {B_input}"));
}
}
#endregion Protected Methods
}
}
+640
View File
@@ -0,0 +1,640 @@
using IOB_UT_NEXT;
using MapoSDK;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti Lasco (Pressa bilancere Valvital)
/// </summary>
public class SiemensLasco : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS LASCO (Pressa principale in VALVITAL)
* - basasto su SIEMENS
* - S7 vers 1500
*
* STRUTTURA MEMORIA DB1001 READ: 68 byte lettura, DB1002 68 byte byte scrittura, vedere doc allegato
* F:\Drive condivisi\30_Clienti\Valvital\Comunicazione PLC\22 - LASCO Bilancere
*
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensLasco(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione LASCO");
lastPLCWatchDog = DateTime.Now.AddMinutes(-1);
useNewSend = string.IsNullOrWhiteSpace(getOptPar("USE_NEW_EXE_TASK")) ? false : true;
// imposto i parametri speciali x calcolo...
var chiaviTSVC = findOptPar("TSVC");
if (chiaviTSVC.Count > 0)
{
lgInfo($"Trovate {chiaviTSVC.Count} chiavi TSVC");
string[] codVal;
VCData currConf;
int periodo = 0;
VC_func funz = VC_func.POINT;
// accodo nella conf...
foreach (var item in chiaviTSVC)
{
codVal = item.Value.Split(':');
Enum.TryParse(codVal[0], out funz);
int.TryParse(codVal[1], out periodo);
currConf = new VCData()
{
Funzione = funz,
Period = periodo,
DTStart = DateTime.Now.AddHours(-1),
dataArray = new List<double>()
};
// cerco se esiste eda ggiongo o aggiorno...
string currKey = item.Key.Replace("TSVC_", "");
if (TSVC_Data.ContainsKey(currKey))
{
TSVC_Data[currKey] = currConf;
}
else
{
TSVC_Data.Add(currKey, currConf);
}
}
// documento...
foreach (var item in TSVC_Data)
{
lgTrace($"TSVC: {item.Key} | periodo: {item.Value.Period} | funz: {item.Value.Funzione}");
// salvo i valori PREC...
if (LastTSVC.ContainsKey(item.Key))
{
LastTSVC[item.Key] = 0;
}
else
{
LastTSVC.Add(item.Key, 0);
}
}
}
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
string memAddrWrite = "";
if (task2exe != null)
{
// inizio VUOTO
byte[] MemBlock = new byte[parametri.memSizeWrite];
// controllo su OPT_PAR se usare nuovo metodo exe task...
if (useNewSend)
{
// cerco task specifici
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
int valore = 0;
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.forceSetPzCount:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
case taskType.setArt:
case taskType.setComm:
case taskType.setPzComm:
case taskType.setProg:
upsertKey(item.Key, item.Value);
// verifico se posso aggiornare valori in memoria...
if (memMap != null && memMap.mMapWrite != null)
{
if (memMap.mMapWrite.ContainsKey(item.Key))
{
dataConf currMem = memMap.mMapWrite[item.Key];
string addr = currMem.memAddr;
taskVal = $"SET task: {item.Key} --> {item.Value} | mem: {currMem.memAddr} - {currMem.size} byte";
// salvo il nuovo valore nella memoria... così prox invio lo trasmetterà
memMap.mMapWrite[item.Key].value = item.Value;
}
else
{
taskVal = $"NO DATA MEM, SET task: {item.Key} --> {item.Value}";
}
}
else
{
taskVal = $"NO MemMap found, SET task: {item.Key} --> {item.Value}";
}
int byteSize = 0;
// recupero dati da memMap... altrimenti NULLA
if (memMap.mMapWrite.ContainsKey(item.Key))
{
dataConf currMem = memMap.mMapWrite[item.Key];
byteSize = currMem.size;
memAddrWrite = currMem.memAddr;
MemBlock = new byte[byteSize];
if (currMem.tipoMem == plcDataType.String)
{
saveStringOnMemBlock(ref MemBlock, item.Key, 0, byteSize);
}
else if (currMem.tipoMem == plcDataType.DInt)
{
int valDInt = 0;
int.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.DInt.ToByteArray(valDInt);
}
else if (currMem.tipoMem == plcDataType.Int)
{
short valDInt = 0;
short.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.Int.ToByteArray(valDInt);
}
}
taskVal = item.Value;
break;
case taskType.sendWatchDogMes2Plc:
// processo scrittura BIT su DB1002.DBB0.0
MemBlock = new byte[1];
memAddrWrite = "DB1002.DBB0";
// compogo in byte... primo bit è setup/run, ultimo è watchdog
valore = inSetup ? 1 : 0;
// verifica SE aggiungere il veto reset contapezzi
if (forcePzReset)
{
// reset shift counter
valore += 2;
// reset type counter
valore += 4;
// controlla se resettare il pz reset...
forcePzReset = forcePzResetUntil >= DateTime.Now;
}
valore += (byte)(counterMes2Plc << 7);
MemBlock[0] = (byte)valore;
taskVal = $"VALUE DB1002.92 --> {valore} | counter interno {counterMes2Plc}";
break;
case taskType.forceResetPzCount:
// forzo reset contapezzi
forcePzReset = true;
forcePzResetUntil = DateTime.Now.AddSeconds(3);
break;
case taskType.setParameter:
// richiedo da URL i parametri WRITE da popolare
lgInfo("Chiamata processMemWriteRequests");
taskVal = processMemWriteRequests();
// se restituiscce "" faccio altra prova...
if (string.IsNullOrEmpty(taskVal))
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
break;
case taskType.startSetup:
// salvo che SONO IN SETUP!
inSetup = true;
lgInfo("!!! Richiesta startSetup - BLOCCO contapezzi LASCO !!!");
// forzo reset contapezzi
forcePzReset = true;
forcePzResetUntil = DateTime.Now.AddSeconds(3);
break;
case taskType.stopSetup:
// salvo che SONO FUORI DAL SETUP!
inSetup = false;
lgInfo("!!! Richiesta stopSetup - SBLOCCO contapezzi LASCO!!!");
// forzo reset contapezzi
forcePzReset = true;
forcePzResetUntil = DateTime.Now.AddSeconds(3);
break;
case taskType.fixStopSetup:
// salvo che SONO FUORI DAL SETUP!
inSetup = false;
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
// aggiungo task!
taskDone.Add(item.Key, taskVal);
// scrivo comunque!
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
if (!taskOk)
{
lgError($"Errore in S7WriteBB durante executeTasks: {item.Key} | {item.Value}");
}
}
}
else
{
lgInfo("Use old send");
// cerco task specifici: se ho startSetup --> imposto bit DBB701.DBB0.4
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.forceResetPzCount:
case taskType.forceSetPzCount:
case taskType.startSetup:
case taskType.stopSetup:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
case taskType.setArt:
case taskType.setComm:
case taskType.setPzComm:
case taskType.setProg:
//saveProdData(item);
upsertKey(item.Key, item.Value);
taskVal = item.Value;
break;
case taskType.sendWatchDogMes2Plc:
// compogo in byte... primo bit è setup/run, ultimo è watchdog
int valore = inSetup ? 1 : 0;
valore += (byte)(counterMes2Plc << 7);
MemBlock[0] = (byte)valore;
taskVal = $"VALUE DB1002.92 --> {counterMes2Plc}";
break;
case taskType.setParameter:
// richiedo da URL i parametri WRITE da popolare
lgInfo("Chiamata processMemWriteRequests");
taskVal = processMemWriteRequests();
// se restituiscce "" faccio altra prova...
if (string.IsNullOrEmpty(taskVal))
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
break;
case taskType.fixStopSetup:
// salvo che SONO FUORI DAL SETUP!
inSetup = false;
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
// aggiungo task!
taskDone.Add(item.Key, taskVal);
}
// controllo SE HO da scrivere articolo/commessa/programma
saveStringOnMemBlock(ref MemBlock, "setArt", 2, 22);
saveStringOnMemBlock(ref MemBlock, "setComm", 24, 22);
saveStringOnMemBlock(ref MemBlock, "setProg", 46, 22);
// scrivo comunque!
taskOk = S7WriteBB(ref MemBlock);
}
}
return taskDone;
}
/// <summary>
/// Recupero dati dinamici in formato dictionary
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getDynData()
{
bool disableDynData = true;
Dictionary<string, string> outVal = new Dictionary<string, string>();
// processing
try
{
disableDynData = (getOptPar("DISABLE_DYN_DATA") == "TRUE");
}
catch (Exception exc)
{
lgError(exc, "Errore in getOptPar x DISABLE_DYN_DATA");
}
try
{
// le 3 posizioni sono in 1/10 mm x cui vanno divise x 10... x avere MM
double RamPosition = S7.Net.Types.Int.FromByteArray(RawInput.Skip(18).Take(2).ToArray()) / 10;
double LowerEjectorPosition = S7.Net.Types.Int.FromByteArray(RawInput.Skip(20).Take(2).ToArray()) / 10;
double UpperTool = S7.Net.Types.Int.FromByteArray(RawInput.Skip(22).Take(2).ToArray()) / 10;
// temp in °C
int TempMainMotorU = S7.Net.Types.Int.FromByteArray(RawInput.Skip(24).Take(2).ToArray());
int TempMainMotorV = S7.Net.Types.Int.FromByteArray(RawInput.Skip(26).Take(2).ToArray());
int TempMainMotorW = S7.Net.Types.Int.FromByteArray(RawInput.Skip(28).Take(2).ToArray());
int TempSpindleNut = S7.Net.Types.Int.FromByteArray(RawInput.Skip(30).Take(2).ToArray());
int TempMotoModule = S7.Net.Types.Int.FromByteArray(RawInput.Skip(32).Take(2).ToArray());
int TempOilCirculation = S7.Net.Types.Int.FromByteArray(RawInput.Skip(34).Take(2).ToArray());
int TempHydraulicUnit = S7.Net.Types.Int.FromByteArray(RawInput.Skip(36).Take(2).ToArray());
// press in BAR
int PressHydraulicPump = S7.Net.Types.Int.FromByteArray(RawInput.Skip(38).Take(2).ToArray());
int PressHydraulicAccumulator = S7.Net.Types.Int.FromByteArray(RawInput.Skip(40).Take(2).ToArray());
int PressCounterforceOil = S7.Net.Types.Int.FromByteArray(RawInput.Skip(42).Take(2).ToArray());
int PressCounterforceGas = S7.Net.Types.Int.FromByteArray(RawInput.Skip(44).Take(2).ToArray());
// forze in kN (10^3 Newton)
int ForcePressureActual = S7.Net.Types.DInt.FromByteArray(RawInput.Skip(46).Take(4).ToArray());
int ForceOnBushing = S7.Net.Types.Int.FromByteArray(RawInput.Skip(50).Take(2).ToArray());
if (utils.CRB("enableTSVC"))
{
// per sicurezza prendo 1 sec avanti così da prendere tutti i valori insieme
DateTime adesso = DateTime.Now.AddSeconds(1);
bool[] scaduti = new bool[16];
// salvo in stack le VC rilevate
scaduti[0] = stackVal_TSVC("RamPosition", RamPosition, adesso);
scaduti[1] = stackVal_TSVC("LowerEjectorPosition", LowerEjectorPosition, adesso);
scaduti[2] = stackVal_TSVC("UpperTool", UpperTool, adesso);
scaduti[3] = stackVal_TSVC("TempMainMotorU", TempMainMotorU, adesso);
scaduti[4] = stackVal_TSVC("TempMainMotorV", TempMainMotorV, adesso);
scaduti[5] = stackVal_TSVC("TempMainMotorW", TempMainMotorW, adesso);
scaduti[6] = stackVal_TSVC("TempSpindleNut", TempSpindleNut, adesso);
scaduti[7] = stackVal_TSVC("TempMotoModule", TempMotoModule, adesso);
scaduti[8] = stackVal_TSVC("TempOilCirculation", TempOilCirculation, adesso);
scaduti[9] = stackVal_TSVC("TempHydraulicUnit", TempHydraulicUnit, adesso);
scaduti[10] = stackVal_TSVC("PressHydraulicPump", PressHydraulicPump, adesso);
scaduti[11] = stackVal_TSVC("PressHydraulicAccumulator", PressHydraulicAccumulator, adesso);
scaduti[12] = stackVal_TSVC("PressCounterforceOil", PressCounterforceOil, adesso);
scaduti[13] = stackVal_TSVC("PressCounterforceGas", PressCounterforceGas, adesso);
scaduti[14] = stackVal_TSVC("ForcePressureActual", ForcePressureActual, adesso);
scaduti[15] = stackVal_TSVC("ForceOnBushing", ForceOnBushing, adesso);
// verifico SE devo riportare dati VC
if (baseUtils.CountTrue(scaduti) > 0)
{
RamPosition = (int)getVal_TSVC("RamPosition", scaduti[0]);
LowerEjectorPosition = (int)getVal_TSVC("LowerEjectorPosition", scaduti[1]);
UpperTool = (int)getVal_TSVC("UpperTool", scaduti[2]);
TempMainMotorU = (int)getVal_TSVC("TempMainMotorU", scaduti[3]);
TempMainMotorV = (int)getVal_TSVC("TempMainMotorV", scaduti[4]);
TempMainMotorW = (int)getVal_TSVC("TempMainMotorW", scaduti[5]);
TempSpindleNut = (int)getVal_TSVC("TempSpindleNut", scaduti[6]);
TempMotoModule = (int)getVal_TSVC("TempMotoModule", scaduti[7]);
TempOilCirculation = (int)getVal_TSVC("TempOilCirculation", scaduti[8]);
TempHydraulicUnit = (int)getVal_TSVC("TempHydraulicUnit", scaduti[9]);
PressHydraulicPump = (int)getVal_TSVC("PressHydraulicPump", scaduti[10]);
PressHydraulicAccumulator = (int)getVal_TSVC("PressHydraulicAccumulator", scaduti[11]);
PressCounterforceOil = (int)getVal_TSVC("PressCounterforceOil", scaduti[12]);
PressCounterforceGas = (int)getVal_TSVC("PressCounterforceGas", scaduti[13]);
ForcePressureActual = (int)getVal_TSVC("ForcePressureActual", scaduti[14]);
ForceOnBushing = (int)getVal_TSVC("ForceOnBushing", scaduti[15]);
//vecchia gestione valori INT
//RamPosition = getVal_TSVC_int("RamPosition", scaduti[0]);
//LowerEjectorPosition = getVal_TSVC_int("LowerEjectorPosition", scaduti[1]);
//UpperTool = getVal_TSVC_int("UpperTool", scaduti[2]);
//TempMainMotorU = getVal_TSVC_int("TempMainMotorU", scaduti[3]);
//TempMainMotorV = getVal_TSVC_int("TempMainMotorV", scaduti[4]);
//TempMainMotorW = getVal_TSVC_int("TempMainMotorW", scaduti[5]);
//TempSpindleNut = getVal_TSVC_int("TempSpindleNut", scaduti[6]);
//TempMotoModule = getVal_TSVC_int("TempMotoModule", scaduti[7]);
//TempOilCirculation = getVal_TSVC_int("TempOilCirculation", scaduti[8]);
//TempHydraulicUnit = getVal_TSVC_int("TempHydraulicUnit", scaduti[9]);
//PressHydraulicPump = getVal_TSVC_int("PressHydraulicPump", scaduti[10]);
//PressHydraulicAccumulator = getVal_TSVC_int("PressHydraulicAccumulator", scaduti[11]);
//PressCounterforceOil = getVal_TSVC_int("PressCounterforceOil", scaduti[12]);
//PressCounterforceGas = getVal_TSVC_int("PressCounterforceGas", scaduti[13]);
//ForcePressureActual = getVal_TSVC_int("ForcePressureActual", scaduti[14]);
//ForceOnBushing = getVal_TSVC_int("ForceOnBushing", scaduti[15]);
outVal.Add("RamPosition", $"{RamPosition:N1}");
outVal.Add("LowerEjectorPosition", $"{LowerEjectorPosition:N1}");
outVal.Add("UpperTool", $"{UpperTool:N1}");
outVal.Add("TempMainMotorU", $"{TempMainMotorU}");
outVal.Add("TempMainMotorV", $"{TempMainMotorV}");
outVal.Add("TempMainMotorW", $"{TempMainMotorW}");
outVal.Add("TempSpindleNut", $"{TempSpindleNut}");
outVal.Add("TempMotoModule", $"{TempMotoModule}");
outVal.Add("TempOilCirculation", $"{TempOilCirculation}");
outVal.Add("TempHydraulicUnit", $"{TempHydraulicUnit}");
outVal.Add("PressHydraulicPump", $"{PressHydraulicPump}");
outVal.Add("PressHydraulicAccumulator", $"{PressHydraulicAccumulator}");
outVal.Add("PressCounterforceOil", $"{PressCounterforceOil}");
outVal.Add("PressCounterforceGas", $"{PressCounterforceGas}");
outVal.Add("ForcePressureActual", $"{ForcePressureActual}");
outVal.Add("ForceOnBushing", $"{ForceOnBushing}");
// salvo!
LastTSVC["RamPosition"] = RamPosition;
LastTSVC["LowerEjectorPosition"] = LowerEjectorPosition;
LastTSVC["UpperTool"] = UpperTool;
LastTSVC["TempMainMotorU"] = TempMainMotorU;
LastTSVC["TempMainMotorV"] = TempMainMotorV;
LastTSVC["TempMainMotorW"] = TempMainMotorW;
LastTSVC["TempSpindleNut"] = TempSpindleNut;
LastTSVC["TempMotoModule"] = TempMotoModule;
LastTSVC["TempOilCirculation"] = TempOilCirculation;
LastTSVC["TempHydraulicUnit"] = TempHydraulicUnit;
LastTSVC["PressHydraulicPump"] = PressHydraulicPump;
LastTSVC["PressHydraulicAccumulator"] = PressHydraulicAccumulator;
LastTSVC["PressCounterforceOil"] = PressCounterforceOil;
LastTSVC["PressCounterforceGas"] = PressCounterforceGas;
LastTSVC["ForcePressureActual"] = ForcePressureActual;
LastTSVC["ForceOnBushing"] = ForceOnBushing;
}
else
{
// se i dynData non sono disabilitati...
if (!disableDynData)
{
outVal.Add("DYNDATA", $"RamPosition {LastTSVC["RamPosition"]:N1} | ForcePressureActual {LastTSVC["ForcePressureActual"]} | ForceOnBushing {LastTSVC["ForceOnBushing"]}");
}
}
}
else
{
// se i dynData non sono disabilitati...
if (!disableDynData)
{
outVal.Add("DYNDATA", $"RamPosition {LastTSVC["RamPosition"]:N1} | ForcePressureActual {LastTSVC["ForcePressureActual"]} | ForceOnBushing {LastTSVC["ForceOnBushing"]}");
}
}
}
catch (Exception exc)
{
lgError(exc, "Errore in getDynData x Siemens LASCO");
}
return outVal;
}
public override string getPrgName()
{
string answ = "";
try
{
string rawProdCode = S7.Net.Types.String.FromByteArray(RawInput.Skip(54).Take(12).ToArray());
// primi due char sono \f e \n avanzamento carta e nuova linea...
answ = Regex.Replace(rawProdCode, @"\t|\n|\r|\f", "");
}
catch (Exception exc)
{
lgError($"Errore in decodifica product code{Environment.NewLine}{exc}");
}
return answ;
}
/// <summary>
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
/// </summary>
public override void processOverride()
{
}
public override void processWhatchDog()
{
// scrivo 1 volta al secondo il contatore incrementale su area apposita scrive nel primo
// byte, ultimo bit, il watchdog, mentre scrive nel primo 1 = setup, 0 = run
DateTime adesso = DateTime.Now;
if (adesso.Subtract(lastPLCWatchDog).TotalSeconds > watchDogPeriod)
{
// incremento
counterMes2Plc++;
// se > 1 --> 0 (balla solo 0..1)
if (counterMes2Plc > 1) counterMes2Plc = 0;
// salvo su DB
Dictionary<string, string> task2exe = new Dictionary<string, string>();
Dictionary<string, string> taskDone = new Dictionary<string, string>();
task2exe.Add("sendWatchDogMes2Plc", counterMes2Plc.ToString());
taskDone = executeTasks(task2exe);
// salvo watchdog PLC
lastPLCWatchDog = adesso;
}
}
#endregion Public Methods
#region Protected Fields
protected int counterMes2Plc = 0;
protected int counterPlc2Mes = 0;
protected int counterPlc2MesWrote = 0;
protected DateTime lastPLCWatchDog;
protected bool useNewSend = false;
#endregion Protected Fields
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: emergenza
*
*
* - BIT di stato
* - DBX0.0: RUN STATE
* - DBX0.1: CYCLE
* - DBX0.2: MANUAL MODE
* - DBX0.3: GENERAL ALARM
* - DBX0.4: ESTOP (1=OK, 0 = emergency)
* - DBX0.5: SAFETY DOORS
----------------------------------------------------- */
byte mainData = RawInput[0];
int byteSignals = 0;
// bit 0 (poweron) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSignals += (1 << 0);
}
if ((mainData & (1 << 0)) == 1)
{
byteSignals += (1 << 1);
}
// EMERGENZA
if ((mainData & (1 << 5)) == 1)
{
byteSignals += (1 << 5);
}
// ALLARME
if ((mainData & (1 << 3)) == 1)
{
byteSignals += (1 << 3);
}
// MANUALE ...
if ((mainData & (1 << 2)) == 1)
{
byteSignals += (1 << 4);
}
// salvo!
B_input = byteSignals;
// log opzionale!
if (verboseLog)
{
lgInfo(string.Format($"Trasformazione dati: RawInput:{RawInput[3]} --> B_input: {B_input}"));
}
}
#endregion Protected Methods
}
}
+221
View File
@@ -0,0 +1,221 @@
using IOB_UT_NEXT;
using MapoSDK;
using System;
using System.Collections.Generic;
using System.Threading;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti RobotSerice (es Smerigliature DONATI)
/// </summary>
public class SiemensNWSE : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS NWS
* - basasto su SIEMENS
* - S7 vers 1200
*
* STRUTTURA MEMORIA DB100: (lettura) 50byte,
* G:\Drive condivisi\30_Clienti\Giacovelli - WIL\NWS
*
*
* DB100
* B00..B15 --> 16 byte di allarmi (osmosi, depurazione, 6 x filtri)
* B20..B35 --> 16 byte di stati (osmosi, depurazione, 6 x filtri)
* B40..B49 --> 5 valori uint lettura parametri
*
*
*
* STRUTTURA MEMORIA DB101: (scrittura) 14byte, solo 2 impiegati x ora
* NB: segnali da tenere attivi ALMENO 3 secondi x farli recepire
*
* B0.0 Num Azzeramento volume acqua OSMOSI
* B0.1 Num Azzeramento volume acqua DEPURAZIONE
*
* B1.7 Num Attivazione modo DEMO (0 = disattivato)
*
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensNWSE(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione NWS");
if (IOBConf.optPar.ContainsKey("EMERGENCY_BYPASS"))
{
bool.TryParse(IOBConf.optPar["EMERGENCY_BYPASS"], out EmergencyBypass);
lgInfo($"Override EmergencyBypass da conf: {IOBConf.optPar["EMERGENCY_BYPASS"]} --> {EmergencyBypass}");
}
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
lgInfo($"Chiamata executeTasks specifica IobSiemensNWS: {task2exe.Count} task ricevuti");
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
// inizio con 1 byte di default
byte[] MemBlock = new byte[1];
string memAddrWrite = "";
if (task2exe != null)
{
// cerco task specifici
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.forceResetPzCount:
// usato x resettare i contatori osmosi inversa e depurazione processo
// scrittura BIT su DB101.DBB0 per
MemBlock = new byte[1];
// scrivo 3 x resettare entrambi i contatori
MemBlock = S7.Net.Types.Byte.ToByteArray(3);
memAddrWrite = "DB101.DB0";
// scrivo!
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
// attesa 3.5 sec sec
Thread.Sleep(3500);
// predispongo x reset valore 0...
MemBlock = S7.Net.Types.Byte.ToByteArray(0);
break;
// lasciato commentato, da rivalutare...
#if false
case taskType.setParameter:
// richiedo da URL i parametri WRITE da popolare
lgInfo("setParameter --> processMemWriteRequests");
taskVal = processMemWriteRequests();
// se restituiscce "" faccio altra prova...
if (string.IsNullOrEmpty(taskVal))
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
break;
#endif
default:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
}
lgInfo($"executeTask | task name: {tName} | task value: {taskVal}");
// aggiungo task!
taskDone.Add(item.Key, taskVal);
if (!string.IsNullOrEmpty(memAddrWrite))
{
// scrivo!
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
}
if (taskOk)
{
// aggiorno valore memoria... SE presente
if (memMap.mMapWrite.ContainsKey(item.Key))
{
memMap.mMapWrite[item.Key].value = item.Value;
lgInfo($"Aggiornato valore in mMapWrite per {item.Key}");
}
lgInfo($"Eseguita con successo S7WriteBB per executeTasks: {item.Key} | {item.Value}");
}
else
{
lgError($"Errore in S7WriteBB durante executeTasks: {item.Key} | {item.Value}");
}
}
}
return taskDone;
}
#endregion Public Methods
#region Protected Fields
protected bool EmergencyBypass = false;
#endregion Protected Fields
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD 60
* B0: POWER_ON
* B1: RUN
* B2: pzCount - NON usato
* B3: allarme (almeno 1 presente)
* B4: manuale - non usato
* B5: slowTC - non usato
* B6: WarmUpCoolDown - no usato
* B7: Emergenza armata (1)
*
----------------------------------------------------- */
int byteSignals = 0;
// bit 0 (poweron) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSignals += (1 << 0);
}
// processo dagli stati + gravi...
if (hasAlarms())
{
byteSignals += (1 << 3);
}
else
{
byteSignals += (1 << 1);
}
// se bypass emergenza attivo --> forzo a ARMED...
if (EmergencyBypass)
{
// segnalo NON emergenza
byteSignals += (1 << 7);
}
// salvo!
B_input = byteSignals;
}
#endregion Protected Methods
}
}
@@ -0,0 +1,275 @@
using IOB_UT_NEXT;
using MapoSDK;
using System;
using System.Collections.Generic;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti Pressoil+Cei (Pressa idraulica Valvital)
/// </summary>
public class SiemensPressoilCei : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS CEI PRESSOIL (impianti ad induzione in VALVITAL)
* - basasto su SIEMENS
* - S7 vers 1500
*
* STRUTTURA MEMORIA DB64 READ e DB67 WRITE, vedere file conf json
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensPressoilCei(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione PRESSOIL - CEI");
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
// inizio con 1 byte di default
byte[] MemBlock = new byte[1];
string memAddrWrite = "";
if (task2exe != null)
{
// cerco task specifici
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.fixStopSetup:
case taskType.forceResetPzCount:
case taskType.forceSetPzCount:
case taskType.setProg:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
case taskType.setArt:
case taskType.setComm:
case taskType.setPzComm:
upsertKey(item.Key, item.Value);
// verifico se posso aggiornare valori in memoria...
if (memMap != null && memMap.mMapWrite != null)
{
if (memMap.mMapWrite.ContainsKey(item.Key))
{
dataConf currMem = memMap.mMapWrite[item.Key];
string addr = currMem.memAddr;
taskVal = $"SET task: {item.Key} --> {item.Value} | mem: {currMem.memAddr} - {currMem.size} byte";
// salvo il nuovo valore nella memoria... così prox invio lo trasmetterà
memMap.mMapWrite[item.Key].value = item.Value;
}
else
{
taskVal = $"NO DATA MEM, SET task: {item.Key} --> {item.Value}";
}
}
else
{
taskVal = $"NO MemMap found, SET task: {item.Key} --> {item.Value}";
}
int byteSize = 0;
// recupero dati da memMap... altrimenti NULLA
if (memMap.mMapWrite.ContainsKey(item.Key))
{
dataConf currMem = memMap.mMapWrite[item.Key];
byteSize = currMem.size;
memAddrWrite = currMem.memAddr;
MemBlock = new byte[byteSize];
if (currMem.tipoMem == plcDataType.String)
{
saveStringOnMemBlock(ref MemBlock, item.Key, 0, byteSize);
}
else if (currMem.tipoMem == plcDataType.Int)
{
short valDInt = 0;
short.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.Int.ToByteArray(valDInt);
}
else if (currMem.tipoMem == plcDataType.DInt)
{
int valDInt = 0;
int.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.DInt.ToByteArray(valDInt);
}
else if (currMem.tipoMem == plcDataType.Word)
{
ushort valDInt = 0;
ushort.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.Word.ToByteArray(valDInt);
}
else if (currMem.tipoMem == plcDataType.DWord)
{
uint valDInt = 0;
uint.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.DWord.ToByteArray(valDInt);
}
}
taskVal = item.Value;
break;
case taskType.sendWatchDogMes2Plc:
// processo scrittura BIT su DB67.DBX0.0
MemBlock = new byte[1];
memAddrWrite = "DB67.DBB0";
// compogo in byte... primo bit è setup/run, ultimo è watchdog
int valore = inSetup ? 1 : 0;
valore += (byte)(counterMes2Plc << 7);
MemBlock[0] = (byte)valore;
taskVal = $"VALUE DB67.0 --> {valore} | counter interno {counterMes2Plc}";
break;
case taskType.setParameter:
// richiedo da URL i parametri WRITE da popolare
lgInfo("Chiamata processMemWriteRequests");
taskVal = processMemWriteRequests();
// se restituiscce "" faccio altra prova...
if (string.IsNullOrEmpty(taskVal))
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
break;
case taskType.startSetup:
// salvo che SONO IN SETUP!
inSetup = true;
break;
case taskType.stopSetup:
// salvo che SONO FUORI DAL SETUP!
inSetup = false;
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
// aggiungo task!
taskDone.Add(item.Key, taskVal);
// scrivo comunque!
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
if (!taskOk)
{
lgError($"Errore in S7WriteBB durante executeTasks: {item.Key} | {item.Value}");
}
}
}
return taskDone;
}
#endregion Public Methods
#region Protected Fields
protected int counterMes2Plc = 0;
protected int counterPlc2Mes = 0;
protected DateTime lastPLCWatchDog;
#endregion Protected Fields
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: emergenza
*
*
* - BIT di stato
* - DBX0.0 - Life bit
* - DBX0.1 Macchina lavora
* - DBX0.2 Macchina in ciclo
* - DBX0.3 Macchina in manuale
* - DBX0.4 Macchina in allarme
* - DBX0.5 Macchina in emergenza
*
----------------------------------------------------- */
byte mainData = RawInput[0];
int byteSignals = 0;
// bit 0 (poweron) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSignals += (1 << 0);
}
// RUN se lavora ed in ciclo
if ((mainData & (1 << 1)) != 0 && (mainData & (1 << 2)) != 0)
{
byteSignals += (1 << 1);
}
// manuale
if ((mainData & (1 << 3)) != 0)
{
byteSignals += (1 << 4);
}
// allarme
if ((mainData & (1 << 4)) != 0)
{
byteSignals += (1 << 3);
}
// emergenza
if ((mainData & (1 << 5)) != 0)
{
byteSignals += (1 << 5);
}
// salvo!
B_input = byteSignals;
// log opzionale!
if (verboseLog)
{
lgInfo($"Trasformazione dati: RawInput:{RawInput[0]} --> B_input: {B_input}");
}
}
#endregion Protected Methods
}
}
@@ -0,0 +1,278 @@
using IOB_UT_NEXT;
using MapoSDK;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti RobotSerice (es Smerigliature DONATI)
/// </summary>
public class SiemensRobotService : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS RobotService
* - basasto su SIEMENS
* - S7 vers 1500
*
* STRUTTURA MEMORIA DB15: (lettura) 10byte,
* G:\Drive condivisi\30_Clienti\Donati\Schemi IOB-WIN\RobotService
*
*
* DB15
* B0.0 Num PowerOn
* B0.1 Num Run
* B0.2 Num Contapezzi
* B0.3 Num Allarme
* B0.4 Num Manuale
* B0.5 Num MagOutPieno
* B0.6 Num MagInVuoto
* B0.7 Num EmergenzaArmata (0=triggered,premuta)
* Contapezzi DInt 2
* PezziRiman DInt 6
*
*
* STRUTTURA MEMORIA DB14: (scrittura) 520byte,
* G:\Drive condivisi\30_Clienti\Donati\Schemi IOB-WIN\RobotService
*
*
* DB14
* Commessa Odl String[000..256] String (254)
* CodArt String[256..512] String (254)
* QtaRich DInt 512 numero pezzi lanciati
* PzCountRes Bool/Byte 516 al fronte di salita (0-->1) reset contapezzi e NON CONTA mentre è 1, se 0 conta
*
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensRobotService(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione RobotService");
if (IOBConf.optPar.ContainsKey("EMERGENCY_BYPASS"))
{
bool.TryParse(IOBConf.optPar["EMERGENCY_BYPASS"], out EmergencyBypass);
lgInfo($"Override EmergencyBypass da conf: {IOBConf.optPar["EMERGENCY_BYPASS"]} --> {EmergencyBypass}");
}
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
lgInfo($"Chiamata executeTasks specifica IobSiemensRobotService: {task2exe.Count} task ricevuti");
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
// inizio con 1 byte di default
byte[] MemBlock = new byte[1];
string memAddrWrite = "";
if (task2exe != null)
{
// cerco task specifici
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.fixStopSetup:
case taskType.forceSetPzCount:
case taskType.setProg:
case taskType.sendWatchDogMes2Plc:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
case taskType.setPzComm:
case taskType.setArt:
case taskType.setComm:
upsertKey(item.Key, item.Value);
int byteSize = 0;
// recupero dati da memMap... altrimenti NULLA
if (memMap.mMapWrite.ContainsKey(item.Key))
{
dataConf currMem = memMap.mMapWrite[item.Key];
byteSize = currMem.size;
memAddrWrite = currMem.memAddr;
MemBlock = new byte[byteSize];
if (currMem.tipoMem == plcDataType.String)
{
saveStringOnMemBlock(ref MemBlock, item.Key, 0, byteSize);
}
else if (currMem.tipoMem == plcDataType.DInt)
{
int valDInt = 0;
int.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.DInt.ToByteArray(valDInt);
}
else if (currMem.tipoMem == plcDataType.Int)
{
short valInt = 0;
short.TryParse(item.Value, out valInt);
MemBlock = S7.Net.Types.Int.ToByteArray(valInt);
}
}
else
{
string rawMemConf = JsonConvert.SerializeObject(memMap, Formatting.Indented);
lgError($"Errore: non trovata chiave write in memMap.mMapWrite per {item.Key}{Environment.NewLine}Configurazione memoria R/W:{Environment.NewLine}{rawMemConf}");
}
taskVal = item.Value;
break;
case taskType.forceResetPzCount:
// processo scrittura BIT su DB6.DBB516
MemBlock = new byte[1];
MemBlock = S7.Net.Types.Byte.ToByteArray(1);
memAddrWrite = "DB14.DBB516";
break;
case taskType.startSetup:
// processo scrittura BIT su DB6.DBB516
MemBlock = new byte[1];
MemBlock = S7.Net.Types.Byte.ToByteArray(1);
memAddrWrite = "DB14.DBB516";
break;
case taskType.stopSetup:
// processo scrittura BIT su DB6.DBB516
MemBlock = new byte[1];
MemBlock = S7.Net.Types.Byte.ToByteArray(0);
memAddrWrite = "DB14.DBB516";
break;
case taskType.setParameter:
// richiedo da URL i parametri WRITE da popolare
lgInfo("setParameter --> processMemWriteRequests");
taskVal = processMemWriteRequests();
// se restituiscce "" faccio altra prova...
if (string.IsNullOrEmpty(taskVal))
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
lgInfo($"executeTask | task name: {tName} | task value: {taskVal}");
// aggiungo task!
taskDone.Add(item.Key, taskVal);
if (!string.IsNullOrEmpty(memAddrWrite))
{
// scrivo!
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
}
if (taskOk)
{
// aggiorno valore memoria... SE presente
if (memMap.mMapWrite.ContainsKey(item.Key))
{
memMap.mMapWrite[item.Key].value = item.Value;
lgInfo($"Aggiornato valore in mMapWrite per {item.Key}");
}
lgInfo($"Eseguita con successo S7WriteBB per executeTasks: {item.Key} | {item.Value}");
}
else
{
lgError($"Errore in S7WriteBB durante executeTasks: {item.Key} | {item.Value}");
}
}
}
return taskDone;
}
#endregion Public Methods
#region Protected Fields
protected bool EmergencyBypass = false;
#endregion Protected Fields
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: MagOutPieno
* B6: MagInVuoto
* B7: Emergenza armata (1)
*
----------------------------------------------------- */
byte mainData = RawInput[0];
// copio il primo byte
int byteSignals = RawInput[0];
// bit 0 (poweron) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSignals |= (1 << 0);
}
else
{
byteSignals &= ~(1 << 0);
}
// se bypass emergenza attivo --> forzo a ARMED...
if (EmergencyBypass)
{
byteSignals |= (1 << 7);
}
// salvo!
B_input = byteSignals;
// log opzionale!
if (verboseLog)
{
lgInfo($"Trasformazione dati: B0: {mainData} --> B_input: {B_input}");
}
}
#endregion Protected Methods
}
}
+343
View File
@@ -0,0 +1,343 @@
using IOB_UT_NEXT;
using MapoSDK;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti SAET
/// </summary>
public class SiemensSaet : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS SAET (impianti ad induzione in VALVITAL)
* - basasto su SIEMENS
* - S7 vers 1500
*
* STRUTTURA MEMORIA DB1275: primi 92 byte lettura, poi 56 byte scrittura, vedere doc allegato
* G:\Drive condivisi\30_Clienti\Valvital\Comunicazione PLC\SAET (forno e tempra)
*
* Si intende tutto con DB1275.DBxx
*
* - parametri processo
* - DBD00: Watchdog INT SAET Alive ( 1-9999 )
*
* - DB60.DBD6: pressione camera filtrante (salvataggio del MAX ogni minuto) | var testVal = S7.Net.Types.Double.FromByteArray(memByteRead.Skip(0).Take(4).ToArray());
* - DB60.DBD10: pressione linea utenze (salvataggio del MAX ogni minuto)
* - DB60.DBD14: temperatura acqua pulita (salvataggio del MAX ogni minuto)
*
* - BIT di stato
* - DBX2.1: READY TO RUN in AUTOMATICO
* - DBX2.3: Macchina in LAVORAZIONE
* - DBX2.4: WARNING Differenza tra Part Code MES - Saet (blu)
* - DBX2.5: se 1 --> LAMPADA ROSSA (allarmi almeno 1 attivo)
*
* PartCounter DINT 4.0 Conteggio Parziale di pezzi "OK" prodotti dalla macchina
* NumberCode String [12] 8.0 Valore numerico associato alla ricetta di produzione attualmente utilizzata dalla macchina
* NewCode INT 22.0 "1= Avvenuta ricezione del segnale ""richiesta nuovo ordine di produzione (NEW CODE)""
* ricevuto dal server,impostabile su 1 solo quando la macchina NON è in produzione attiva"
* Potenza utilizzata ST.1 REAL 24 Potenza utilizzata dalla stazione di riscaldo 1 [kW]
* Potenza utilizzata ST.2 REAL 28 Potenza utilizzata dalla stazione di riscaldo 2 [kW]
* Potenza utilizzata ST.3 REAL 32 Potenza utilizzata dalla stazione di riscaldo 3 [kW]
* Potenza utilizzata ST.4 REAL 36 Potenza utilizzata dalla stazione di riscaldo 4 [kW]
* Lettura Pirometro ST.1 REAL 40 Lettura Pirometro della stazione di riscaldo 1 [°C]
* Lettura Pirometro ST.2 REAL 44 Lettura Pirometro della stazione di riscaldo 2 [°C]
* Lettura Pirometro ST.3 REAL 48 Lettura Pirometro della stazione di riscaldo 3 [°C]
* Lettura Pirometro ST.4 REAL 52 Lettura Pirometro della stazione di riscaldo 4 [°C]
* Temperatura Acqua Raff Conv. ST.1 REAL 56 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 1 [°C]
* Temperatura Acqua Raff Conv. ST.2 REAL 60 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 2 [°C]
* Temperatura Acqua Raff Conv. ST.3 REAL 64 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 3 [°C]
* Temperatura Acqua Raff Conv. ST.4 REAL 68 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 4 [°C]
* Part_Status ST.1 INT 72 Stato Pezzo Stazione di Riscaldo 1 (0=Assente 1=Grezzo 10=OK 11=NOK)
* Part_Status ST.2 INT 74 Stato Pezzo Stazione di Riscaldo 2 (0=Assente 1=Grezzo 10=OK 11=NOK)
* Part_Status ST.3 INT 76 Stato Pezzo Stazione di Riscaldo 3 (0=Assente 1=Grezzo 10=OK 11=NOK)
* Part_Status ST.4 INT 78 Stato Pezzo Stazione di Riscaldo 4 (0=Assente 1=Grezzo 10=OK 11=NOK)
* Reserve_12 REAL 80 Riserva
* Reserve_13 REAL 84 Riserva
* Reserve_14 REAL 88 Riserva
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensSaet(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione SAET");
lastPLCWatchDog = DateTime.Now.AddMinutes(-1);
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
// verifico non sia null
if (task2exe != null)
{
// inizio con 1 byte di default
byte[] MemBlock = new byte[1];
string memAddrWrite = "";
// cerco task specifici
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.forceResetPzCount:
case taskType.forceSetPzCount:
case taskType.setProg:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
case taskType.setArt:
upsertKey(item.Key, item.Value);
MemBlock = new byte[34];
saveStringOnMemBlock(ref MemBlock, "setArt", 0, 32);
memAddrWrite = "DB1275.DBB96";
taskVal = item.Value;
break;
case taskType.setComm:
upsertKey(item.Key, item.Value);
MemBlock = new byte[14];
saveStringOnMemBlock(ref MemBlock, "setComm", 0, 12);
memAddrWrite = "DB1275.DBB130";
taskVal = item.Value;
break;
case taskType.setPzComm:
// imposto i valori...
MemBlock = new byte[4];
int numPz = 0;
int.TryParse(item.Value, out numPz);
MemBlock = S7.Net.Types.DInt.ToByteArray(numPz);
memAddrWrite = "DB1275.DBB144";
break;
case taskType.setParameter:
// richiedo da URL i parametri WRITE da popolare
lgInfo("Chiamata processMemWriteRequests");
taskVal = processMemWriteRequests();
// se restituiscce "" faccio altra prova...
if (string.IsNullOrEmpty(taskVal))
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
break;
case taskType.sendWatchDogMes2Plc:
MemBlock = new byte[2];
MemBlock[1] = (byte)counterMes2Plc;
MemBlock[0] = (byte)(counterMes2Plc >> 8);
memAddrWrite = "DB1275.DBB92";
taskVal = $"VALUE DB1275.92 --> {counterMes2Plc}";
break;
case taskType.endProd:
case taskType.startSetup:
// processo scrittura BIT x richiesta nuovo ordine a INIZIO setup --> è DINT!
MemBlock = new byte[2];
MemBlock[0] = (byte)1;
MemBlock[1] = (byte)1;
memAddrWrite = "DB1275.DBB94";
lgInfo($"Chiamata startSetup | memAddrWrite: {memAddrWrite} | MemBlock: {MemBlock}");
break;
case taskType.fixStopSetup:
case taskType.stopSetup:
// processo scrittura BIT x richiesta nuovo ordine a FINE setup
MemBlock = new byte[2];
MemBlock[0] = (byte)0;
MemBlock[1] = (byte)0;
memAddrWrite = "DB1275.DBB94";
lgInfo($"Chiamata stopSetup | memAddrWrite: {memAddrWrite} | MemBlock: {MemBlock}");
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
// verifico se posso aggiornare valori in memoria...
if (memMap != null && memMap.mMapWrite != null)
{
if (memMap.mMapWrite.ContainsKey(item.Key))
{
dataConf currMem = memMap.mMapWrite[item.Key];
string addr = currMem.memAddr;
taskVal = $"SET task: {item.Key} --> {item.Value} | mem: {currMem.memAddr} - {currMem.size} byte";
// salvo il nuovo valore nella memoria... così prox invio lo trasmetterà
memMap.mMapWrite[item.Key].value = item.Value;
}
else
{
taskVal = $"NO DATA MEM, SET task: {item.Key} --> {item.Value}";
}
}
else
{
taskVal = $"NO MemMap found, SET task: {item.Key} --> {item.Value}";
}
// aggiungo task!
taskDone.Add(item.Key, taskVal);
// scrivo comunque!
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
if (!taskOk)
{
lgError($"Errore in S7WriteBB durante executeTasks: {item.Key} | {item.Value}");
}
}
}
return taskDone;
}
/// <summary>
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
/// </summary>
public override void processOverride()
{
}
public override void processWhatchDog()
{
// scrivo 1 volta ogni n secondi il contatore incrementale su area apposita
DateTime adesso = DateTime.Now;
if (adesso.Subtract(lastPLCWatchDog).TotalSeconds > watchDogPeriod)
{
// incremento
counterMes2Plc++;
// se > 9999 --> 0
if (counterMes2Plc > 9999) counterMes2Plc = 0;
// salvo su DB
Dictionary<string, string> task2exe = new Dictionary<string, string>();
Dictionary<string, string> taskDone = new Dictionary<string, string>();
task2exe.Add("sendWatchDogMes2Plc", counterMes2Plc.ToString());
taskDone = executeTasks(task2exe);
// salvo watchdog PLC
lastPLCWatchDog = adesso;
}
}
#endregion Public Methods
#region Protected Fields
protected int counterMes2Plc = 0;
protected int counterPlc2Mes = 0;
protected int counterPlc2MesWrote = 0;
protected DateTime lastPLCWatchDog;
#endregion Protected Fields
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: anomalia
*
*
* - BIT di stato
* - DBX2.0: macchina accesa
* - DBX2.1: CICLO AUTO = NON HO ANOMALIE/ALLARMI (0 --> allarme)
* - DBX2.2: contapezzi
* - DBX2.3: MACCHINA IN CICLO AUTO = LAVORA
* - DBX2.4: ERRORE tra part code MES/SAET (blu)
* - DBX2.5: Anomalia presente (rosso)
----------------------------------------------------- */
byte mainData = RawInput[2];
int byteSignals = 0;
// bit 0 (poweron) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSignals += (1 << 0);
}
if ((mainData & (1 << 3)) != 0)
{
byteSignals += (1 << 1);
}
// controllo il bit ALLARME
if ((mainData & (1 << 1)) == 0)
{
byteSignals += (1 << 3);
}
// controllo il bit ANOMALIA
if ((mainData & (1 << 5)) != 0)
{
byteSignals += (1 << 3);
}
// considero NON auto come manuale...
if ((mainData & (1 << 3)) == 0)
{
byteSignals += (1 << 4);
}
// salvo!
B_input = byteSignals;
// processo il watchdog!
counterPlc2Mes = S7.Net.Types.Int.FromByteArray(RawInput.Skip(0).Take(2).ToArray());
// ogni 60 registro...
if (Math.Abs(counterPlc2Mes - counterPlc2MesWrote) > 60)
{
lgInfo($"WatchDog da PLC: {counterPlc2Mes}");
counterPlc2MesWrote = counterPlc2Mes;
}
// log opzionale!
if (verboseLog)
{
lgInfo($"Trasformazione dati: RawInput:{RawInput[3]} --> B_input: {B_input}");
}
}
#endregion Protected Methods
}
}
+270
View File
@@ -0,0 +1,270 @@
using IOB_UT_NEXT;
using MapoSDK;
using System;
using System.Collections.Generic;
namespace IOB_WIN_SIEMENS.IobSiemens
{
/// <summary>
/// Controllo Siemens specifico x impianti Simec
/// </summary>
public class SiemensSimec : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS SIMEC
* - basasto su SIEMENS
* - S7 vers 1500
*
* STRUTTURA MEMORIA DB29: (lettura) 10byte,
* G:\Drive condivisi\30_Clienti\Valvital\Comunicazione PLC\26 - SIMEC Taglio\
*
* Si intende lettura con DB29.DBxx, scrittura DB30.DBxx
*
* DB30 blocco dati scritto dal MES
* CodArt Array[0..19] of Char DBB0..19
* CodComm Array[0..9] of Char DBB20..29
* CodProgr Array[0..9] of Char DBB30..39
*
* DB29 blocco dati letto dal MES Byte Num
* CicloOn Bool 0 0
* MacchOn Bool 0 1
* ManualeOn Bool 0 2
* AllarmiOn Bool 0 3
* EmergenzaOn Bool 0 4
* EmergenzaPremuta Bool 0 5
* b06 Bool 0 6
* b07 Bool 0 7
* b10 Bool 1 0
* b11 Bool 1 1
* b12 Bool 1 2
* b13 Bool 1 3
* b14 Bool 1 4
* b15 Bool 1 5
* b16 Bool 1 6
* b17 Bool 1 7
* ContapezziAssoluto DInt 2
* Comtapezzi parziale DInt 6
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensSimec(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione SIMEC");
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool writeDone = false;
bool taskOk = false;
string taskVal = "";
// inizio con 1 byte di default
byte[] MemBlock = new byte[1];
string memAddrWrite = "";
if (task2exe != null)
{
// cerco task specifici
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.fixStopSetup:
case taskType.forceResetPzCount:
case taskType.forceSetPzCount:
case taskType.setProg:
case taskType.sendWatchDogMes2Plc:
case taskType.startSetup:
case taskType.stopSetup:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
lgInfo(taskVal);
break;
case taskType.setPzComm:
case taskType.setArt:
case taskType.setComm:
upsertKey(item.Key, item.Value);
int byteSize = 0;
// verifico se posso aggiornare valori in memoria...
if (memMap != null && memMap.mMapWrite != null)
{
if (memMap.mMapWrite.ContainsKey(item.Key))
{
// recupero dati da memMap... altrimenti NULLA
if (memMap.mMapWrite.ContainsKey(item.Key))
{
dataConf currMem = memMap.mMapWrite[item.Key];
byteSize = currMem.size;
memAddrWrite = currMem.memAddr;
MemBlock = new byte[byteSize];
if (currMem.tipoMem == plcDataType.String)
{
saveStringOnMemBlock(ref MemBlock, item.Key, 0, byteSize);
}
else if (currMem.tipoMem == plcDataType.DInt)
{
int valDInt = 0;
int.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.DInt.ToByteArray(valDInt);
}
else if (currMem.tipoMem == plcDataType.Int)
{
short valDInt = 0;
short.TryParse(item.Value, out valDInt);
MemBlock = S7.Net.Types.Int.ToByteArray(valDInt);
}
}
taskVal = item.Value;
}
else
{
taskVal = $"NO DATA MEM, SET task: {item.Key} --> {item.Value}";
}
}
else
{
taskVal = $"NO MemMap found, SET task: {item.Key} --> {item.Value}";
}
if (!string.IsNullOrEmpty(memAddrWrite))
{
// scrivo!
writeDone = true;
taskOk = S7WriteBB(ref MemBlock, memAddrWrite);
}
// se restituiscce "" faccio altra prova...
break;
case taskType.setParameter:
// richiedo da URL i parametri WRITE da popolare
lgInfo("Chiamata processMemWriteRequests");
taskVal = processMemWriteRequests();
if (string.IsNullOrEmpty(taskVal))
{
// i parametri me li aspetto come stringa composta paramName|paramvalue
if (item.Value.Contains("|"))
{
string[] paramsJob = item.Value.Split('|');
taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
}
else
{
taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
}
}
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
// aggiungo task!
taskDone.Add(item.Key, taskVal);
if (!taskOk && writeDone)
{
lgError($"Errore in S7WriteBB durante executeTasks: {item.Key} | {item.Value} | taskOk {taskOk} | writeDone {writeDone}");
}
}
}
return taskDone;
}
#endregion Public Methods
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
/* -----------------------------------------------------
* bitmap MAPO STANDARD
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: emergenza (1=attiva/premuta, 0=armed)
*
* - BIT di stato
* DB29 blocco dati letto dal MES Byte Num
* CicloOn Bool 0 0
* MacchOn Bool 0 1
* ManualeOn Bool 0 2
* AllarmiOn Bool 0 3
* EmergenzaOn Bool 0 4
* EmergenzaPremuta Bool 0 5
* ContapezziAssoluto DInt 2
* Comtapezzi parziale DInt 6
*
----------------------------------------------------- */
byte mainData = RawInput[0];
int byteSignals = 0;
// bit 0 (poweron) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSignals += (1 << 0);
}
// lavora --> bit0 e bit1: cicloOn AND macchOn
if ((mainData & (1 << 0)) != 0 && (mainData & (1 << 1)) != 0)
{
byteSignals += (1 << 1);
}
// controllo il bit ALARM
if ((mainData & (1 << 3)) != 0)
{
byteSignals += (1 << 3);
}
// controllo il bit emergenza dello status
if ((mainData & (1 << 5)) != 0)
{
byteSignals += (1 << 5);
}
// check MANUALE ...
if ((mainData & (1 << 2)) != 0)
{
byteSignals += (1 << 4);
}
// salvo!
B_input = byteSignals;
// log opzionale!
if (verboseLog)
{
lgInfo($"Trasformazione dati: RawInput:{RawInput[0]} --> B_input: {B_input}");
}
}
#endregion Protected Methods
}
}
+551
View File
@@ -0,0 +1,551 @@
using IOB_UT_NEXT;
using MapoSDK;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IOB_WIN_SIEMENS.IobSiemens
{
public class SiemensTorri : Siemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS TORRI
* - basasto su SIEMENS
* - S7 vers 1200
*
* mod: 2019.01.19: aggiunta gestione segnale test/accensione/spegnimento (DB700.B1.4) --> mod StateMachine!
* mod: 2019.04.06: aggiunta indicazione (IOB--> PLC) di stato setup su DB701.B0.4
* mod: 2024.12.05: gestione allarmi da file ext come base Siemens e opzione ENABLE_ALARM_LEGACY
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// estende l'init della classe base con i metodi x Siemens specifici x Torri
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public SiemensTorri(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
// gestione restart OpcUa client...
if (!string.IsNullOrEmpty(getOptPar("ENABLE_ALARM_LEGACY")))
{
bool.TryParse(getOptPar("ENABLE_ALARM_LEGACY"), out enableAlarmLegacy);
}
//
lgInfo("NEW IOB SIEMENS versione TORRI avviato | vers 2024");
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
// inizio con 1 byte VUOTO
byte[] MemBlock = new byte[1];
if (task2exe != null)
{
// cerco task specifici: se ho startSetup --> imposto bit DBB701.DBB0.4
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.forceResetPzCount:
case taskType.forceSetPzCount:
case taskType.setArt:
case taskType.setComm:
case taskType.setProg:
case taskType.sendWatchDogMes2Plc:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
lgInfo($"Chiamata senza processing: taskOk: {taskOk} | taskVal: {taskVal}");
break;
case taskType.fixStopSetup:
MemBlock[0] = 0;
taskVal = "VALUE DB701.0.4 --> 0";
lgInfo($"Chiamata fixStopSetup: taskOk: {taskOk} | taskVal: {taskVal}");
break;
case taskType.startSetup:
MemBlock[0] += (1 << 4);
taskVal = "VALUE DB701.0.4 --> 1";
lgInfo($"Chiamata startSetup: taskOk: {taskOk} | taskVal: {taskVal}");
break;
case taskType.stopSetup:
MemBlock[0] = 0;
taskVal = "VALUE DB701.0.4 --> 0";
lgInfo($"Chiamata stopSetup: taskOk: {taskOk} | taskVal: {taskVal}");
break;
default:
taskVal = "SKIPPED | NO EXEC";
lgInfo($"Chiamata default senza processing: taskOk: {taskOk} | taskVal: {taskVal}");
break;
}
taskDone.Add(item.Key, taskVal);
}
// scrivo comunque!
bool fatto = S7WriteBB(ref MemBlock);
}
return taskDone;
}
/// <summary>
/// Recupera ULTIMO allarme...
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getCncAlarms()
{
// parto da ultimo vettore allarmi rilevato
Dictionary<string, string> outVal = lastReadAlarms;
// se ho altro --> accodo
try
{
string almMsg = string.Format("{0} | {1}", currPLC.LastErrorCode.ToString(), currPLC.LastErrorString);
outVal.Add("CNC_ALARM", almMsg);
}
catch (Exception exc)
{
lgError(exc, "Errore in getCncAlarms");
}
// resetto vettore allarmi
lastReadAlarms = new Dictionary<string, string>();
return outVal;
}
/// <summary>
/// Recupero dati dinamici...
/// </summary>
public override Dictionary<string, string> getDynData()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
#if false
inizio = DateTime.Now;
EgwProxy.MultiCncLib.Focas1.ODBDY2_1 answ = FANUC_ref.getAllDynData();
if (utils.CRB("recTime")) TimingData.addResult(string.Format("PROC-DYN-DATA"), DateTime.Now.Subtract(inizio).Ticks);
try
{
string actf = answ.actf.ToString();
string acts = answ.acts.ToString();
//string numAlarm = answ.alarm.ToString();
// preparo i singoli valori dell'array...
//outVal.Add("DYNDATA", string.Format("{0}#{1}#{2}", actf, acts, numAlarm));
outVal.Add("DYNDATA", string.Format("FEED {0}#SPEED_RPM {1}", actf, acts));
if (utils.CRB("SendFeedSpeed"))
{
outVal.Add("FEED", actf);
outVal.Add("SPEED_RPM", acts);
//outVal.Add("NUM_ALARM", numAlarm);
}
if (utils.CRB("SendAxPos"))
{
// salvo le posizioni...
EgwProxy.MultiCncLib.Focas1.FAXIS posAx = answ.pos;
int[] currPosAbs = posAx.absolute;
int i = 0;
foreach (var item in currPosAbs)
{
i++;
outVal.Add(string.Format("POS_{0:00}", i), item.ToString());
}
}
}
catch (Exception exc)
{
lgError(exc, "Errore in getDynData");
}
#endif
return outVal;
}
/// <summary>
/// Recupero dati override in formato dictionary
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getOverrides()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
uint valDW = 0;
// !!!FARE!!! recuperare da conf memoria, ora HARD CODED
outVal.Add("FEED_OVER", RawInput[19].ToString());
outVal.Add("RAPID_OVER", RawInput[20].ToString());
outVal.Add("CURR_MODE", decodeCurrMode(RawInput[21]));
// recupero RPM pezzo/mola !!!FARE!!! cambio nome da config, qui sono 01:conduttrice e
// 02:operatrice (3013), mentre sono pezzo/mola nella V100
valDW = S7.Net.Types.DWord.FromByteArray(RawInput.Skip(24).Take(4).ToArray());
outVal.Add("RPM_01", valDW.ToString());
valDW = S7.Net.Types.DWord.FromByteArray(RawInput.Skip(28).Take(4).ToArray());
outVal.Add("RPM_02", valDW.ToString());
return outVal;
}
/// <summary>
/// Recupero programma in lavorazione
/// </summary>
/// <returns></returns>
public override string getPrgName()
{
string prgName = "";
#if false
// recupero NUOVO prgName...
try
{
// recupero nome programma MAIN
prgName = utils.purgedChar2String(FANUC_ref.getPrgNameMain());
// trimmo path del programma, ovvero "CNCMEMUSERPATH1"
prgName = prgName.Replace(utils.CRS("basePrgMemPath"), "");
}
catch (Exception exc)
{
lgError(string.Format("Eccezione in recupero PRG NAME MAIN:{0}{1}", Environment.NewLine, exc));
}
#endif
return prgName;
}
/// <summary>
/// Recupero programma in lavorazione come Dictionary FANUC...
/// - SYSINFO: (prima KEY globale) TUTTI i valori separati da # (x fare check modifica)
/// - altre stringhe: ogni singolo parametro / valore
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getSysInfo()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
try
{
outVal.Add("CPU", currPLC.CPU.ToString());
outVal.Add("MAX_PDU", currPLC.MaxPDUSize.ToString());
outVal.Add("RACK", currPLC.Rack.ToString());
outVal.Add("SLOT", currPLC.Slot.ToString());
}
catch (Exception exc)
{
lgError(exc, "Errore in getSysInfo");
}
return outVal;
}
/// <summary>
/// Esegue processing MODE (e nel contempo recupera altri dati dell'area G)
/// </summary>
public override void processMode()
{
if (utils.CRB("enableMode"))
{
#if false
try
{
inizio = DateTime.Now;
// leggo tutto da 0 a 43...
int memIndex = 0;
FanucMemRW(R, FANUC.MemType.G, memIndex, ref MemBlockG);
if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-G-AREA", MemBlockG.Length), DateTime.Now.Subtract(inizio).Ticks);
// verifico modo con valore corrente, se cambia aggiorno...
CNC_MODE newMode = decodeG43(MemBlockG[43]);
if (newMode != currMode)
{
// aggiorno!
currMode = newMode;
// conversione NUM MODE in descrizione da ENUM
string descrMode = Enum.GetName(typeof(CNC_MODE), currMode);
// accodo x invio
string sVal = string.Format("[CNC_MODE]{0}", descrMode);
// chiamo accodamento...
accodaFLog(sVal, qEncodeFLog("CNC_MODE", descrMode));
}
}
catch (Exception exc)
{
lgError(exc, "Errore in process Mode G43");
}
#endif
}
}
/// <summary>
/// Override salvataggio valori in memoria...
/// </summary>
/// <param name="tipo">tipo di DUMP</param>
public override void saveMemDump(dumpType tipo)
{
}
#endregion Public Methods
#region Protected Fields
protected Dictionary<string, string> lastReadAlarms = new Dictionary<string, string>();
#endregion Protected Fields
#region Protected Methods
/// <summary>
/// Decodifica il resto dell'area TORRI x i dati accessori (allarmi, ...)
/// </summary>
protected override void decodeOtherData()
{
if (verboseLog)
{
}
}
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
// TORRI: leggo i primi 8 bit hard coded...
int byteSem = RawInput[0];
// azzero powerOn...
byteSem &= ~(1 << 0);
// bit 0 (powerOn) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSem += (1 << 0);
}
// azzero i bit NON gestiti (2-5-6-7)
byteSem &= ~(1 << 2);
byteSem &= ~(1 << 5);
byteSem &= ~(1 << 6);
byteSem &= ~(1 << 7);
// leggo bit DB700.B1.4 e lo porto al bit 5 --> ciclo test/accensione/spegnimento
if ((RawInput[1] & (1 << 4)) != 0) //se RawInput[1] & 16-- > 5° bit-- > TEST
{
byteSem += (1 << 5);
}
// salvo infine variabile bit x invio
B_input = byteSem;
// se ho il bit di allarme
if ((RawInput[0] & (1 << 3)) != 0)
{
checkAlarms();
}
// procedo SOLO SE è enabled IOB
if (IobOnline)
{
try
{
currODL = utils.callUrl(urlGetCurrODL);
// solo SE HO un ODL...
if (string.IsNullOrEmpty(currODL) || currODL == "0")
{
if (periodicLog)
{
lgInfo($"SiemensTorri | Lettura ODL andata a vuoto: currODL: {currODL}");
}
}
else
{
// se variato o scaduto timeout log...
if (periodicLog || (currIdxODL.ToString() != currODL))
{
lgInfo($"SiemensTorri | Lettura ODL, currODL: {currODL} --> currIdxODL prec: {currIdxODL}");
}
// provo a salvare nuovo ODL
int.TryParse(currODL, out currIdxODL);
}
}
catch (Exception exc)
{
if (DateTime.Now.Subtract(lastWarnODL).TotalSeconds > 15)
{
lgError(exc, $"Errore in fase di chiamata URL x ODL corrente | URL chiamato: {urlGetCurrODL}");
lastWarnODL = DateTime.Now;
}
}
}
else
{
// imposto currODL a vuoto!
currODL = "";
if (periodicLog)
{
lgInfo($"Fanuc | Lettura ODL non effettuata: IobOnline: {IobOnline} | currODL impostato a vuoto");
}
}
if (!string.IsNullOrEmpty(currODL) && currODL != "0")
{
// ora processo il contapezzi...
string retVal = "";
// controllo se è passato intervallo minimo tra 2 controlli/elaborazioni x
// distanziare invio e ridurre letture
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
// Salvo il contapezzi della macchina
retVal = utils.callUrlNow(urlSetPzCountMAC + contapezziPLC.ToString());
// verifica se tutto OK, ovvero conferma i pezzi inviati
if (retVal != contapezziPLC.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio Contapezzi PLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB {contapezziIOB} | Valore tornato: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// se sono differenti MOSTRO...
if (contapezziPLC != contapezziIOB)
{
// registro contapezzi
lgInfo($"Differenza Contapezzi: contapezziPLC: {contapezziPLC} | contapezziIOB: {contapezziIOB}");
}
if ((contapezziPLC > contapezziIOB))
{
// salvo nuovo contapezzi (incremento di 1...) + richiesta refresh conteggio
contapezziIOB++;
needRefreshPzCount = true;
// salvo in semaforo!
B_input += 1 << 2;
// registro contapezzi
lgInfo($"contapezziPLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB {contapezziIOB}");
}
// Salvo il contapezzi della macchina
retVal = utils.callUrlNow(urlSetPzCount + contapezziIOB.ToString());
// verifica se tutto OK, ovvero conferma i pezzi inviati
if (retVal != contapezziIOB.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio contapezziPLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB {contapezziIOB} | Valore tornato: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// verifico se variato contapezzi... e se passato ritardo minimo...
if ((contapezziPLC - contapezziIOB) > minSendPzCountBlock)
{
trySendPzCountBlock("");
}
// invio a server contapezzi (aggiornato)
retVal = utils.callUrlNow(urlSetPzCount + contapezziIOB.ToString());
// verifica se tutto OK
if (retVal != contapezziIOB.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio Contapezzi SIEMENS-TORRI: contapezziPLC {contapezziPLC} | contapezziIOB {contapezziIOB} | risposta: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
else
{
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
lgInfo($"Attenzione: mancanza ODL non procedo con gestione contapezzi. contapezziPLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB: {contapezziIOB}");
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
// log opzionale!
if (verboseLog)
{
lgInfo("Trasformazione B_input: {B_input}");
}
}
#endregion Protected Methods
#region Private Fields
/// <summary>
/// gestione allarmi classica torri come eventi FluxLog
/// </summary>
private bool enableAlarmLegacy = false;
#endregion Private Fields
#region Private Methods
private int checkAlarmBank(string memAddrAlarms)
{
int trovato = 0;
uint valDW = 0;
var MemBlockPZ = new byte[4];
bool fatto = S7ReadBB(ref MemBlockPZ, memAddrAlarms, 4);
if (fatto)
{
valDW = S7.Net.Types.DWord.FromByteArray(MemBlockPZ.ToArray());
// se <> 0 --> log e accodo a dynData
if (valDW != 0)
{
string key = $"MTH_ALARM_{memAddrAlarms}_{valDW}";
var biteVal = baseUtils.binaryForm(valDW);
lgInfo($"Stato allarmi rilevati: {key} | {valDW} | {biteVal}");
// accodo a dictionary
string almMsg = $"{DateTime.Now} | val {valDW} | {biteVal}";
// se non ci fosse aggiungo
if (!lastReadAlarms.ContainsKey(key))
{
lastReadAlarms.Add(key, almMsg);
}
trovato++;
}
}
return trovato;
}
private void checkAlarms()
{
int trovati = 0;
// SE ho la gestione legacy allarmi sennò nulla...
if (enableAlarmLegacy)
{
// test gestione da conf alarmMap...
if (alarmMaps != null && alarmMaps.Count > 0)
{
foreach (var item in alarmMaps)
{
// da rivedere procedura x usare metodi di gestione allarmi con check differenze + invio alarmLog...
trovati += checkAlarmBank(item.memAddr);
}
}
// legacy... tolto!
#if false
else
{
// leggo i banchi allarmi : cablato D700.DBDW2 --> D700 DBDW14, sono 4 banchi a 32 bit
// da verificare
// ciclo nei 4 banchi...
trovati += checkAlarmBank("DB700.DBDW2");
trovati += checkAlarmBank("DB700.DBDW6");
trovati += checkAlarmBank("DB700.DBDW10");
trovati += checkAlarmBank("DB700.DBDW14");
}
#endif
}
}
#endregion Private Methods
}
}
+40
View File
@@ -0,0 +1,40 @@
using IOB_UT_NEXT;
using IOB_WIN_SIEMENS.Iob;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IOB_WIN_SIEMENS
{
public class MainFormNext : IOB_WIN_FORM.MainForm
{
/// <summary>
/// Avvio MainForm
/// </summary>
/// <param name="args"></param>
public MainFormNext(string[] args) : base(args)
{
}
/// <summary>
/// Apre la finestra child con conf
/// </summary>
protected override void openChild(string IOB)
{
if (IOB == null)
{
throw new ArgumentNullException(nameof(IOB));
}
AdapterFormNext child = new AdapterFormNext(IOB);
child.MdiParent = this;
child.Text = IOB;
child.Show();
child.Shown += Child_Shown;
child.FormClosed += Child_FormClosed;
}
}
}
+39
View File
@@ -0,0 +1,39 @@
<?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">
<variable name="logDir" value="${basedir}/logs"/>
<targets>
<target xsi:type="File"
name="f_base"
fileName="${logDir}/${var:codIOB:default=0000}/${shortdate}.log"
layout="${longdate} [${uppercase:${level}}] ${logger:shortName=true} | ${message}"
archiveFileName="${logDir}/${var:codIOB:default=0000}/${shortdate}.{###}.log"
archiveNumbering="Sequence"
archiveAboveSize="10240000"
maxArchiveFiles="90"
enableArchiveFileCompression="false"
keepFileOpen="false"
/>
<target xsi:type="File"
name="f_error"
fileName="${logDir}/${var:codIOB:default=0000}/${shortdate}_err.log"
layout="${longdate} [${uppercase:${level}}] ${logger:shortName=true} | ${message}${newline}${exception:format=tostring}"
archiveFileName="${logDir}/${var:codIOB:default=0000}/${shortdate}_err.{###}.log"
archiveNumbering="Sequence"
archiveAboveSize="10240000"
maxArchiveFiles="90"
enableArchiveFileCompression="false"
keepFileOpen="false"
/>
</targets>
<rules>
<!-- Logging Levels (Trace, Debug, Info, Warn, Error, Fatal)-->
<logger name="*" minlevel="Trace" maxlevel="Warn" final="true" writeTo="f_base" />
<logger name="*" minlevel="Error" writeTo="f_error" />
</rules>
</nlog>
+24
View File
@@ -0,0 +1,24 @@
using System;
using System.Windows.Forms;
namespace IOB_WIN_SIEMENS
{
internal static class Program
{
#region Private Methods
/// <summary>
/// Punto di ingresso principale dell'applicazione.
/// <paramref name="args">Parametri di avvio</paramref>
/// </summary>
[STAThread]
private static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainFormNext(args));
}
#endregion Private Methods
}
}
@@ -0,0 +1,21 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("IOB-WIN-SIEMENS")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyProduct("IOB-WIN-SIEMENS")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("26d891ef-c115-420a-b240-05f099e13853")]
+71
View File
@@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace IOB_WIN_SIEMENS.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("IOB_WIN_SIEMENS.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}
+117
View File
@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
+30
View File
@@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace IOB_WIN_SIEMENS.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}
@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
+120
View File
@@ -0,0 +1,120 @@
<body>
<h3>MAPO-IOB-WIN</h3>
<b>v: {{CURRENT-REL}}</b>
<br />
<i>Acquisitore MAPO-IOB per sistemi Windows</i>
<br />
Note di rilascio:
<ul>
<li>
<b>v.3.1.* &rarr; v.3.2.*</b>
<ul>
<li>Nuovi simulatori con gestione emergenza</li>
<li>Fix gestione invio dati Redis</li>
<li>Implementazione IOB Eurom63</li>
</ul>
</li>
<li>
<b>v.2.6.* &rarr; v.3.0.*</b>
<ul>
<li>revisione sistema metodi invio in blocco</li>
<li>Gestione invio contapezzi in step > 1</li>
<li>Gestione eventi in blocco (indipendente e prioritario su EvBlock)</li>
<li>Gestione limite eventi memorizzabili</li>
<li>Integrazione REDIS</li>
<li>Integrazione IOB-MAN</li>
</ul>
</li>
<li>
<b>v.2.5.* &rarr; v.2.6.*</b>
<ul>
<li>revisione sistema timeout Ping</li>
<li>Gestione AutoODL in prod generale (non solo SIM)</li>
</ul>
</li>
<li>
<b>v.2.4.* &rarr; v.2.5.*</b>
<ul>
<li>Aggiunto adapter MTConnect</li>
<li>Ottimizzazione gestione SIEMENS</li>
</ul>
</li>
<li>
<b>v.2.3.* &rarr; v.2.4.*</b>
<ul>
<li>inserita gestione conf json x Flog acquisiti</li>
<li>gestione invio Json blocchi dati FLog</li>
<li>ottimizzazioni varie adapter Siemens</li>
<li>ottimizzazione processo svuotamento code</li>
<li>riduzione interferenza e interblocchi in fase di PLC assente</li>
</ul>
</li>
<li>
<b>Ultime modifiche:</b>
<ul>{{LAST-CHANGES}}</ul>
</li>
<li>
<b>v.1.18.* &rarr; v.2.3.*</b>
<ul>
<li>inserimento WPS x acontrolli WebPage human readable</li>
<li>fix gestione task2exe</li>
<li>aggiunte varie versioni PLC siemens</li>
<li>aggiunto PLC WPS x generiche web pages</li>
<li>revisitazione LOG ODL e contapezzi</li>
<li>modifica pagina presentazione dati (master) x resize</li>
<li>Attivazione IOB SIMULATOR per test di carico (sostituito type DEMO)</li>
<li>Aggiunto simulatore macchine MULTI pallet</li>
<li>Ottimizzazione simulatore</li>
<li>Ottimizzazioni PLC Siemens x riavvio post disconnessione (es spegnimento notturno)</li>
<li>Ottimizzazione processo chiusura in update applicazione</li>
<li>Aggiunta simulazione spegnimento con WU/CD</li>
</ul>
</li>
<li>
<b>v.1.11.* &rarr; v.1.18.*</b>
<ul>
<li>Inserimento controller SIEMENS con S7+ library</li>
<li>Inserimento nuove letture FANUC x programmi</li>
<li>Inserimento nuove letture FANUC x SysEx (informazioni sistema)</li>
<li>Inserimento invio FluxLog x parametri estesi (es SysEx, ProgName,...)</li>
<li>FIX visualizzazione dati FluxLog e URL inviati</li>
<li>FIX MAIN program da FANUC (non il current)</li>
<li>Inserita modalita' DUMP memoria (iniziale full + periodica)</li>
<li>Inserimento gestione contapezzi standard/checkBit in IOB.cfg</li>
<li>Inserimento contapezzi da area memoria X</li>
<li>NUOVA Gestione rami cliente e URL di update</li>
<li>Gestione modi CNC</li>
<li>Lettura dari dinamycs FANUC (feed, speed)</li>
<li> aggiunta gestione aree G0..G30 (overrides?)</li>
<li>fix errore disconnessione FANUC (allo spegnimento dl CNC) e memoria valori persistente a 1</li>
<li>fix globali x gestione log IN / FLOG + ottimizzaizone check FANUC (PING)</li>
<li>ottimizzazione fasi di restart in caso di assenza del server (evita reinvii inutili e migliora tempo ripartenza invio)</li>
<li>review procedure controllo connessione x FANUC (es Tornos II)</li>
<li>non richeide più privilegi admin x fare update</li>
<li> gestione segnali inverted</li>
<li>completata gestione configurabilità parametrica segnali (Tornos, CMZ, Biglia)</li>
<li>revisitazione LOG x distinguere processi IOB</li>
</ul>
</li>
<li>
<b>v.0.1.* &rarr; v.0.10.*</b>
<ul>
<li>Testato in produzione x update ad avvio e su richiesta</li>
<li>Testato in produzione x lettura dati da Fanuc</li>
<li>Inizio deploy con copia file su area IIS</li>
<li>Prima versione con autoupdate</li>
<li>Test PrettyBin x spostamento dll</li>
<li>Base acquisitore FANUC</li>
<li>Sistema base sw controllo in tray</li>
</ul>
</li>
</ul>
<div>
<div style="float: left;">
<img src="logoSteamware.png" />
</div>
<div style="float: right;">
<a href="https://www.steamware.net/IOT" target="_blank">&copy; Steamware 2006-{{CURR-YEAR}}</a>
</div>
</div>
</body>
Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.
@@ -0,0 +1,15 @@
@ECHO OFF
SET EXEName=IOB-WIN.exe
SET EXEFullPath=C:\Steamware\IOB-WIN\IOB-WIN.exe
TASKLIST | FINDSTR /I "%EXEName%"
IF ERRORLEVEL 1 GOTO :StartIobWin
REM "Programma ancora in run, nessuna azione necessaria"
timeout /T 2
GOTO :EOF
:StartIobWin
START "" "%EXEFullPath%"
GOTO :EOF
Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>1.0.0.0</version>
<url>http://seriate.steamware.net:8083/SWS/MAPO/IOB-WIN/{{BRANCHNAME}}/MAPO-IOB-WIN.zip</url>
<changelog>http://seriate.steamware.net:8083/SWS/MAPO/IOB-WIN/{{BRANCHNAME}}/ChangeLog.html</changelog>
<mandatory>false</mandatory>
</item>
+60
View File
@@ -0,0 +1,60 @@
using S7.Net;
namespace IOB_WIN_SIEMENS
{
/// <summary>
/// Implementazione classe connessione SIEMENS con S7.net, comprensiva dei parametri delle aree
/// di memoria
/// </summary>
public class connParamS7
{
#region Public Fields
/// <summary>
/// Indirizzo IP del PLC
/// </summary>
public string ipAdrr = "";
/// <summary>
/// Base area x lettura
/// </summary>
public string memAddrRead = "";
/// <summary>
/// Base area x scrittura
/// </summary>
public string memAddrWrite = "";
/// <summary>
/// Size memoria lettura
/// </summary>
public int memSizeRead = 0;
/// <summary>
/// Size memoria scrittura
/// </summary>
public int memSizeWrite = 0;
/// <summary>
/// Timeout ping
/// </summary>
public int pingMsTimeout = 250;
/// <summary>
/// Rack comunicazione
/// </summary>
public short rack = 0;
/// <summary>
/// Slot comunicazione
/// </summary>
public short slot = 0;
/// <summary>
/// Tipo CPU Siemens
/// </summary>
public CpuType tipoCpu = CpuType.S7300;
#endregion Public Fields
}
}
+68
View File
@@ -0,0 +1,68 @@
{
"metadata": [
{
"src": [
{
"files": [
"*.csproj"
],
"cwd": ".",
"exclude": [
"**/obj/**",
"**/bin/**",
"_site/**"
]
}
],
"dest": "obj/api"
}
],
"build": {
"content": [
{
"files": [
"api/**.yml"
],
"cwd": "obj"
},
{
"files": [
"api/*.md",
"articles/**.md",
"toc.yml",
"*.md"
],
"exclude": [
"obj/**",
"_site/**"
]
}
],
"resource": [
{
"files": [
"images/**"
],
"exclude": [
"obj/**",
"_site/**"
]
}
],
"overwrite": [
{
"files": [
"apidoc/**.md"
],
"exclude": [
"obj/**",
"_site/**"
]
}
],
"dest": "_site",
"template": [
"default"
]
}
}
+11
View File
@@ -0,0 +1,11 @@
# IOB-WIN-PING
Documentazione relativa all'applicativo IOB-WIN-PING
## Articles
Per maggiori dettagli, definizioni e demo funzionamento si rimanda alla sezione Articles
## Api
Per ogni dettaglio e riferimento alla libreria si rimanda alla sezione Api Documentation
+1
View File
@@ -0,0 +1 @@

+63
View File
@@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IOB_WIN_SIEMENS
{
/// <summary>
/// Definizione area memoria SIEMENS
/// </summary>
public class memAreaSiemens
{
#region Public Fields
/// <summary>
/// Indice DB
/// </summary>
public int DbNum = 0;
/// <summary>
/// Indice partenza memoria (es DBD0 --> 0)
/// </summary>
public int indiceMem = 0;
/// <summary>
/// Tipo Memoria (DBD, DBW...)
/// </summary>
public string tipoMem = "";
#endregion Public Fields
#region Public Constructors
/// <summary>
/// Inizializza da un formato stringa
/// </summary>
/// <param name="strFormat"></param>
public memAreaSiemens(string strFormat)
{
if (!string.IsNullOrEmpty(strFormat))
{
string[] memComp = strFormat.Split('.');
int.TryParse(memComp[0].Replace("DB", ""), out DbNum);
//tipoMem = memComp[1].Substring(2, 1);
tipoMem = "";
for (int i = 0; i < memComp[1].Length; i++)
{
if (char.IsLetter(memComp[1][i]))
{
tipoMem += memComp[1][i];
}
}
// rimuovo DB iniziale..
tipoMem = tipoMem.Replace("DB", "");
// ciclo x trovare SOLO stringa
int.TryParse(memComp[1].Replace("DB", "").Replace(tipoMem, ""), out indiceMem);
}
}
#endregion Public Constructors
}
}
+21
View File
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="MapoSDK" version="6.14.2411.518" targetFramework="net462" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="6.0.0" targetFramework="net462" />
<package id="Microsoft.Extensions.Logging.Abstractions" version="6.0.0" targetFramework="net462" />
<package id="Microsoft.VisualStudio.SlowCheetah" version="4.0.50" targetFramework="net462" developmentDependency="true" />
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net462" />
<package id="NLog" version="5.3.4" targetFramework="net462" />
<package id="Pipelines.Sockets.Unofficial" version="2.2.8" targetFramework="net462" />
<package id="S7netplus" version="0.1.9" targetFramework="net462" />
<package id="StackExchange.Redis" version="2.8.24" targetFramework="net462" />
<package id="System.Buffers" version="4.5.1" targetFramework="net462" />
<package id="System.IO.Compression" version="4.3.0" targetFramework="net462" />
<package id="System.IO.Pipelines" version="5.0.1" targetFramework="net462" />
<package id="System.Memory" version="4.5.4" targetFramework="net462" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net462" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net462" />
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net462" />
<package id="System.Threading.Channels" version="5.0.0" targetFramework="net462" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net462" />
</packages>
+97
View File
@@ -0,0 +1,97 @@
@echo off
echo Inizio processing After Build: configurazione %1 , directory %2
RD /S /Q %2"\lib\ar"
RD /S /Q %2"\lib\cs"
RD /S /Q %2"\lib\da"
RD /S /Q %2"\lib\de"
RD /S /Q %2"\lib\es"
RD /S /Q %2"\lib\fr"
RD /S /Q %2"\lib\it"
RD /S /Q %2"\lib\ja-JP"
RD /S /Q %2"\lib\ko"
RD /S /Q %2"\lib\lv"
RD /S /Q %2"\lib\nl"
RD /S /Q %2"\lib\pl"
RD /S /Q %2"\lib\pt"
RD /S /Q %2"\lib\pt-BR"
RD /S /Q %2"\lib\ru"
RD /S /Q %2"\lib\sk"
RD /S /Q %2"\lib\sv"
RD /S /Q %2"\lib\th"
RD /S /Q %2"\lib\tr"
RD /S /Q %2"\lib\zh"
RD /S /Q %2"\lib\zh-TW"
MOVE /Y %2"ar" %2"lib\"
MOVE /Y %2"cs" %2"lib\"
MOVE /Y %2"da" %2"lib\"
MOVE /Y %2"de" %2"lib\"
MOVE /Y %2"es" %2"lib\"
MOVE /Y %2"fr" %2"lib\"
MOVE /Y %2"it" %2"lib\"
MOVE /Y %2"ja-JP" %2"lib\"
MOVE /Y %2"ko" %2"lib\"
MOVE /Y %2"lv" %2"lib\"
MOVE /Y %2"nl" %2"lib\"
MOVE /Y %2"pl" %2"lib\"
MOVE /Y %2"pt" %2"lib\"
MOVE /Y %2"pt-BR" %2"lib\"
MOVE /Y %2"ru" %2"lib\"
MOVE /Y %2"sk" %2"lib\"
MOVE /Y %2"sv" %2"lib\"
MOVE /Y %2"th" %2"lib\"
MOVE /Y %2"tr" %2"lib\"
MOVE /Y %2"zh" %2"lib\"
MOVE /Y %2"zh-TW" %2"lib\"
if %1 == "Release" goto ReleaseExec
if %1 == Release goto ReleaseExec
if %1 == "Debug" goto DebugExec
if %1 == Debug goto DebugExec
if %1 == "Remote_DEBUG" goto RemoteDebugExec
if %1 == Remote_DEBUG goto RemoteDebugExec
:ReleaseExec
echo Release processing...
del /S %2"*.pdb""
del /S %2"*.xml""
del /S %2"lib/*.pdb""
echo Release: eliminato pdb + xml!!!
goto END
:DebugExec
echo Debug processing...
goto END
:RemoteDebugExec
echo Remote_DEBUG processing, effettuo copia script verso server remoto (ROBOCOPY)
REM copia script verso server remoto
REM echo Debug remoto: effettuo robocopy sync (verificare remote per cliente)
REM FINASSI
REM ROBOCOPY %2 \\10.150.0.1\Steamware\IOB-WIN-WPS-DEB /MIR
REM Baglietto
REM ROBOCOPY %2 \\192.168.60.15\Steamware\IOB-WIN-WPS-DEB /MIR
REM GIACOVELLI LOCOROTONDO
REM ROBOCOPY %2 \\192.168.1.93\Steamware\IOB-WIN-WPS-DEB /MIR
REM IMI Remosa
REM ROBOCOPY %2 \\192.168.0.12\Steamware\IOB-WIN-WPS-DEB /MIR
REM IOB-WIN-SIM
REM ROBOCOPY %2 \\IOB-WIN-SIMULA\Steamware\IOB-WIN-WPS-DEB /MIR
REM IOBVPN4MACHINE
REM ROBOCOPY %2 \\10.51.90.5\Steamware\IOB-WIN-WPS-DEB /MIR
REM ROBOCOPY %2 \\10.51.90.5\Steamware\IOB-WIN-WPS-DEB /MIR /log:RobocopyTransfer.log
REM ROBOCOPY %2 Z:\IOB-WIN-WPS-DEB /MIR
REM ROBOCOPY %2 \\10.51.90.10\Steamware\IOB-WIN-WPS-DEB /MIR
ROBOCOPY %2 \\10.51.90.9\Steamware\IOB-WIN-WPS-DEB /MIR
goto END
:END
echo Fatto!
+25
View File
@@ -0,0 +1,25 @@
@echo off
echo Effettua setup dei file specifici per i vari ambienti pre build installer: verifica da nome configurazione %1
if %1 == "Release" goto Release
if %1 == "Debug" goto Debug
if %1 == "Remote_DEBUG" goto RemoteDebug
:Release
echo Release: nulla da copiare
goto END
:Debug
echo Debug: copia file ini x simulazione Debug
REM del %2"DATA\CONF\EsaKvara.ini"
REM copy %2"Resources\SCM\EsaKvara_SIM.ini" %2"DATA\CONF\EsaKvara.ini"
goto END
:RemoteDebug
echo RemoteDebug: nulla da copiare
goto END
:END
echo Fatto!
+1
View File
@@ -0,0 +1 @@

+6
View File
@@ -0,0 +1,6 @@
- name: Articles
href: articles/
- name: API Documentation
href: obj/api/
homepage: api/index.md