From 5cd4fc6ba14b568c6336589b471462f4b968570c Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 22 Jan 2025 11:53:41 +0100 Subject: [PATCH 1/3] Fix files x documentazione IOB-WIN-FILE --- IOB-WIN-FILE/docfx.json | 68 +++++++++++++++++++++++++++++++++++++++ IOB-WIN-FILE/toc copy.yml | 6 ++++ IOB-WIN-FILE/toc.yml | 6 ++++ 3 files changed, 80 insertions(+) create mode 100644 IOB-WIN-FILE/docfx.json create mode 100644 IOB-WIN-FILE/toc copy.yml create mode 100644 IOB-WIN-FILE/toc.yml diff --git a/IOB-WIN-FILE/docfx.json b/IOB-WIN-FILE/docfx.json new file mode 100644 index 00000000..bacb80c9 --- /dev/null +++ b/IOB-WIN-FILE/docfx.json @@ -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" + ] + } +} \ No newline at end of file diff --git a/IOB-WIN-FILE/toc copy.yml b/IOB-WIN-FILE/toc copy.yml new file mode 100644 index 00000000..7eee9ffb --- /dev/null +++ b/IOB-WIN-FILE/toc copy.yml @@ -0,0 +1,6 @@ + +- name: Articles + href: articles/ +- name: API Documentation + href: obj/api/ + homepage: api/index.md diff --git a/IOB-WIN-FILE/toc.yml b/IOB-WIN-FILE/toc.yml new file mode 100644 index 00000000..7eee9ffb --- /dev/null +++ b/IOB-WIN-FILE/toc.yml @@ -0,0 +1,6 @@ + +- name: Articles + href: articles/ +- name: API Documentation + href: obj/api/ + homepage: api/index.md From 7146ded65f07831cd5258bce91010f43b80d55e5 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 22 Jan 2025 12:06:56 +0100 Subject: [PATCH 2/3] Aggiunta IOB-WIN-MITSUBISHI --- IOB-WIN-FTP/App.config | 2 +- IOB-WIN-MITSUBISHI.sln | 83 + IOB-WIN-MITSUBISHII/AdapterFormNext.cs | 55 + IOB-WIN-MITSUBISHII/App.Debug.config | 10 + IOB-WIN-MITSUBISHII/App.Release.config | 11 + IOB-WIN-MITSUBISHII/App.config | 186 ++ IOB-WIN-MITSUBISHII/DATA/CONF/MAIN.ini | 24 + IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01.ini | 120 + IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01.json | 410 ++++ IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01_WD.ini | 51 + .../DATA/CONF/SIMUL_01_alarm.json | 859 +++++++ IOB-WIN-MITSUBISHII/DATA/CONF/VL28.ini | 81 + IOB-WIN-MITSUBISHII/DATA/CONF/VL28.json | 113 + .../IOB-WIN-MITSUBISHII.csproj | 206 ++ IOB-WIN-MITSUBISHII/Iob/GenericNext.cs | 13 + IOB-WIN-MITSUBISHII/Iob/Mitsubishi.cs | 2138 +++++++++++++++++ IOB-WIN-MITSUBISHII/MainFormNext.cs | 40 + IOB-WIN-MITSUBISHII/NLog.config | 39 + IOB-WIN-MITSUBISHII/Program.cs | 24 + .../Properties/AssemblyInfo.cs | 21 + .../Properties/Resources.Designer.cs | 71 + IOB-WIN-MITSUBISHII/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 30 + .../Properties/Settings.settings | 7 + IOB-WIN-MITSUBISHII/Resources/ChangeLog.html | 120 + IOB-WIN-MITSUBISHII/Resources/Circuit.ico | Bin 0 -> 164031 bytes IOB-WIN-MITSUBISHII/Resources/Net.ico | Bin 0 -> 104399 bytes .../Resources/STEAM-IOB-WIN.xml | Bin 0 -> 3688 bytes .../Resources/Start-IOB-WIN.bat | 15 + IOB-WIN-MITSUBISHII/Resources/SteamWare.ico | Bin 0 -> 279582 bytes .../Resources/logoSteamware.png | Bin 0 -> 3402 bytes IOB-WIN-MITSUBISHII/Resources/manifest.xml | 7 + IOB-WIN-MITSUBISHII/docfx.json | 68 + IOB-WIN-MITSUBISHII/index.md | 11 + IOB-WIN-MITSUBISHII/logs/.placeholder.txt | 1 + IOB-WIN-MITSUBISHII/packages.config | 24 + IOB-WIN-MITSUBISHII/postBuildTgt.bat | 52 + IOB-WIN-MITSUBISHII/setupTgt.bat | 25 + IOB-WIN-MITSUBISHII/temp/.placeholder | 1 + IOB-WIN-MITSUBISHII/toc.yml | 6 + IOB-WIN-NEXT/AdapterFormNext.cs | 2 +- 41 files changed, 5041 insertions(+), 2 deletions(-) create mode 100644 IOB-WIN-MITSUBISHI.sln create mode 100644 IOB-WIN-MITSUBISHII/AdapterFormNext.cs create mode 100644 IOB-WIN-MITSUBISHII/App.Debug.config create mode 100644 IOB-WIN-MITSUBISHII/App.Release.config create mode 100644 IOB-WIN-MITSUBISHII/App.config create mode 100644 IOB-WIN-MITSUBISHII/DATA/CONF/MAIN.ini create mode 100644 IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01.ini create mode 100644 IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01.json create mode 100644 IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01_WD.ini create mode 100644 IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01_alarm.json create mode 100644 IOB-WIN-MITSUBISHII/DATA/CONF/VL28.ini create mode 100644 IOB-WIN-MITSUBISHII/DATA/CONF/VL28.json create mode 100644 IOB-WIN-MITSUBISHII/IOB-WIN-MITSUBISHII.csproj create mode 100644 IOB-WIN-MITSUBISHII/Iob/GenericNext.cs create mode 100644 IOB-WIN-MITSUBISHII/Iob/Mitsubishi.cs create mode 100644 IOB-WIN-MITSUBISHII/MainFormNext.cs create mode 100644 IOB-WIN-MITSUBISHII/NLog.config create mode 100644 IOB-WIN-MITSUBISHII/Program.cs create mode 100644 IOB-WIN-MITSUBISHII/Properties/AssemblyInfo.cs create mode 100644 IOB-WIN-MITSUBISHII/Properties/Resources.Designer.cs create mode 100644 IOB-WIN-MITSUBISHII/Properties/Resources.resx create mode 100644 IOB-WIN-MITSUBISHII/Properties/Settings.Designer.cs create mode 100644 IOB-WIN-MITSUBISHII/Properties/Settings.settings create mode 100644 IOB-WIN-MITSUBISHII/Resources/ChangeLog.html create mode 100644 IOB-WIN-MITSUBISHII/Resources/Circuit.ico create mode 100644 IOB-WIN-MITSUBISHII/Resources/Net.ico create mode 100644 IOB-WIN-MITSUBISHII/Resources/STEAM-IOB-WIN.xml create mode 100644 IOB-WIN-MITSUBISHII/Resources/Start-IOB-WIN.bat create mode 100644 IOB-WIN-MITSUBISHII/Resources/SteamWare.ico create mode 100644 IOB-WIN-MITSUBISHII/Resources/logoSteamware.png create mode 100644 IOB-WIN-MITSUBISHII/Resources/manifest.xml create mode 100644 IOB-WIN-MITSUBISHII/docfx.json create mode 100644 IOB-WIN-MITSUBISHII/index.md create mode 100644 IOB-WIN-MITSUBISHII/logs/.placeholder.txt create mode 100644 IOB-WIN-MITSUBISHII/packages.config create mode 100644 IOB-WIN-MITSUBISHII/postBuildTgt.bat create mode 100644 IOB-WIN-MITSUBISHII/setupTgt.bat create mode 100644 IOB-WIN-MITSUBISHII/temp/.placeholder create mode 100644 IOB-WIN-MITSUBISHII/toc.yml diff --git a/IOB-WIN-FTP/App.config b/IOB-WIN-FTP/App.config index fd627151..a17a636d 100644 --- a/IOB-WIN-FTP/App.config +++ b/IOB-WIN-FTP/App.config @@ -8,7 +8,7 @@ - + diff --git a/IOB-WIN-MITSUBISHI.sln b/IOB-WIN-MITSUBISHI.sln new file mode 100644 index 00000000..e47922b4 --- /dev/null +++ b/IOB-WIN-MITSUBISHI.sln @@ -0,0 +1,83 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32505.173 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VersGen", "VersGen\VersGen.csproj", "{58E399F3-9D4E-49D3-AB35-9ED536543D50}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B52E3E86-1B82-4F4D-982C-0C8909CD2A28}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOB-UT-NEXT", "IOB-UT-NEXT\IOB-UT-NEXT.csproj", "{90512E12-29FC-460D-94CC-648C2A072DBD}" +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-MITSUBISHII", "IOB-WIN-MITSUBISHII\IOB-WIN-MITSUBISHII.csproj", "{4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + Remote_DEBUG|Any CPU = Remote_DEBUG|Any CPU + Remote_DEBUG|x86 = Remote_DEBUG|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Debug|x86.ActiveCfg = Debug|Any CPU + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Debug|x86.Build.0 = Debug|Any CPU + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Release|Any CPU.Build.0 = Release|Any CPU + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Release|x86.ActiveCfg = Release|x86 + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Release|x86.Build.0 = Release|x86 + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Remote_DEBUG|Any CPU.ActiveCfg = Debug|Any CPU + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Remote_DEBUG|Any CPU.Build.0 = Debug|Any CPU + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Remote_DEBUG|x86.ActiveCfg = Remote_DEBUG|x86 + {58E399F3-9D4E-49D3-AB35-9ED536543D50}.Remote_DEBUG|x86.Build.0 = Remote_DEBUG|x86 + {90512E12-29FC-460D-94CC-648C2A072DBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90512E12-29FC-460D-94CC-648C2A072DBD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90512E12-29FC-460D-94CC-648C2A072DBD}.Debug|x86.ActiveCfg = Debug|x86 + {90512E12-29FC-460D-94CC-648C2A072DBD}.Debug|x86.Build.0 = Debug|x86 + {90512E12-29FC-460D-94CC-648C2A072DBD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90512E12-29FC-460D-94CC-648C2A072DBD}.Release|Any CPU.Build.0 = Release|Any CPU + {90512E12-29FC-460D-94CC-648C2A072DBD}.Release|x86.ActiveCfg = Release|x86 + {90512E12-29FC-460D-94CC-648C2A072DBD}.Release|x86.Build.0 = Release|x86 + {90512E12-29FC-460D-94CC-648C2A072DBD}.Remote_DEBUG|Any CPU.ActiveCfg = Debug|Any CPU + {90512E12-29FC-460D-94CC-648C2A072DBD}.Remote_DEBUG|Any CPU.Build.0 = Debug|Any CPU + {90512E12-29FC-460D-94CC-648C2A072DBD}.Remote_DEBUG|x86.ActiveCfg = Release|x86 + {9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Debug|x86.ActiveCfg = Debug|Any CPU + {9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Debug|x86.Build.0 = Debug|Any CPU + {9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Release|Any CPU.Build.0 = Release|Any CPU + {9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Release|x86.ActiveCfg = Release|Any CPU + {9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Release|x86.Build.0 = Release|Any CPU + {9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Remote_DEBUG|Any CPU.ActiveCfg = Debug|Any CPU + {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 + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Debug|x86.ActiveCfg = Debug|Any CPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Debug|x86.Build.0 = Debug|Any CPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Release|Any CPU.Build.0 = Release|Any CPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Release|x86.ActiveCfg = Release|Any CPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Release|x86.Build.0 = Release|Any CPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Remote_DEBUG|Any CPU.ActiveCfg = Remote_DEBUG|Any CPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Remote_DEBUG|Any CPU.Build.0 = Remote_DEBUG|Any CPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Remote_DEBUG|x86.ActiveCfg = Release|Any CPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66}.Remote_DEBUG|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {801DCDC5-B7D3-4EA5-B543-783D2C91765F} + EndGlobalSection +EndGlobal diff --git a/IOB-WIN-MITSUBISHII/AdapterFormNext.cs b/IOB-WIN-MITSUBISHII/AdapterFormNext.cs new file mode 100644 index 00000000..32b693c5 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/AdapterFormNext.cs @@ -0,0 +1,55 @@ +using IOB_UT_NEXT; +using IOB_WIN_MITSUBISHI.Iob; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IOB_WIN_MITSUBISHI +{ + public class AdapterFormNext: IOB_WIN_FORM.AdapterForm + { + + /// + /// Avvio MainForm + /// + /// + public AdapterFormNext(string codIOB): base(codIOB) + { + } + /// + /// carica IOB richiesto + /// + protected override void loadIobType() + { + if (IOBConf != null) + { + switch (tipoScelto) + { + case tipoAdapter.MITSUBISHI: + iobObj = new Mitsubishi(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}"); + } + } + } +} diff --git a/IOB-WIN-MITSUBISHII/App.Debug.config b/IOB-WIN-MITSUBISHII/App.Debug.config new file mode 100644 index 00000000..42297ccc --- /dev/null +++ b/IOB-WIN-MITSUBISHII/App.Debug.config @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/App.Release.config b/IOB-WIN-MITSUBISHII/App.Release.config new file mode 100644 index 00000000..0f80d173 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/App.Release.config @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/App.config b/IOB-WIN-MITSUBISHII/App.config new file mode 100644 index 00000000..fce58a4c --- /dev/null +++ b/IOB-WIN-MITSUBISHII/App.config @@ -0,0 +1,186 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/DATA/CONF/MAIN.ini b/IOB-WIN-MITSUBISHII/DATA/CONF/MAIN.ini new file mode 100644 index 00000000..5335f1c9 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/DATA/CONF/MAIN.ini @@ -0,0 +1,24 @@ +;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=IMI_SONATEST +STARTLIST=FTP_SONATEST + + +MAXCNC=10 \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01.ini b/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01.ini new file mode 100644 index 00000000..08975356 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01.ini @@ -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 diff --git a/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01.json b/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01.json new file mode 100644 index 00000000..d2895eb1 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01.json @@ -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-": "{{PODL}}", + "replace-": "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" + } +} \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01_WD.ini b/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01_WD.ini new file mode 100644 index 00000000..56bca173 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01_WD.ini @@ -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 diff --git a/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01_alarm.json b/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01_alarm.json new file mode 100644 index 00000000..4f6ed310 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/DATA/CONF/SIMUL_01_alarm.json @@ -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" + ] + } +] \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/DATA/CONF/VL28.ini b/IOB-WIN-MITSUBISHII/DATA/CONF/VL28.ini new file mode 100644 index 00000000..90469029 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/DATA/CONF/VL28.ini @@ -0,0 +1,81 @@ +;Configurazione IOB-WIN +[IOB] +CNCTYPE=MITSUBISHI + +[MACHINE] +; VALVITAL 2024 +VENDOR=DMG MORI +MODEL=NLX4000 + +[CNC] +; FANUC! +IP=192.168.213.199 +PORT=683 +GETPRGNAME=true + +[SERVER] +MPIP=192.168.214.4 +MPURL=/MP/IO +CMDBASE=/IOB/input/ +CMDFLOG=/IOB/flog/ +CMDALIVE=/IOB +CMDENABLED=/IOB/enabled/ +CMDADV1=?valore= +CMDREBO=/sendReboot.aspx?idxMacchina= + +[MEMORY] +; Green Y62=10098 | Red: Y60=10096 | Yellow: Y61=10097 | Blue Y63=10099 | Emerg: ??? (negata???)| +;BIT0=CONN +BIT1=10098 +;BIT2=PZCOUNT.PAR.8002 +BIT3=10096 +BIT4=10097 +;BIT5=!X8.4 +AREAV_START=500 +AREAV_SIZE=3 +PAR_START=8001 +PAR_SIZE=3 +SIGN_START=10096 +SIGN_SIZE=4 + +[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] +EZNC_SYS=EZNC_SYS_MELDAS700L +ENABLE_PZCOUNT=TRUE +ENABLE_DYN_DATA=TRUE +PZCOUNT_MODE=STD.PAR.8002 +PZGTOT_MODE=STD.PAR.8001 +PZREQ_MODE=STD.PAR.8003 +ENABLE_PZ_REQ=TRUE +ENABLE_PZ_RESET=TRUE +ENABLE_PZ_RESET_stopSetup=FALSE +;gestione invio pezzi in blocco +ENABLE_SEND_PZC_BLOCK=TRUE +MIN_SEND_PZC_BLOCK=0 +MAX_SEND_PZC_BLOCK=100 +; conf cablata set Art/Commessa +SET_NUM_COM=STD.VAR.500 +SET_NUM_ART=STD.VAR.501 +SET_NUM_PZ=STD.VAR.502 +MAX_CHAR_DESC=7 +;indica se il numero articolo sia semplicemente il trim dei caratteri alfabetici (chiama comunque server...) +NUM_ART_CHR_TRIM=TRUE +; conf parametri memoria READ/WRITE +PARAM_CONF=VL28.json +DISABLE_SEND_WDST=TRUE + +[BRANCH] +NAME=master \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/DATA/CONF/VL28.json b/IOB-WIN-MITSUBISHII/DATA/CONF/VL28.json new file mode 100644 index 00000000..63d67e4d --- /dev/null +++ b/IOB-WIN-MITSUBISHII/DATA/CONF/VL28.json @@ -0,0 +1,113 @@ +{ + "mMapWrite": { + "setArt": { + "name": "setArt", + "description": "Articolo", + "memAddr": "", + "tipoMem": "String", + "index": 0, + "size": 20, + "displOrdinal": 1 + }, + "setArtNum": { + "name": "setArtNum", + "description": "CodArt", + "memAddr": "VAR.501", + "tipoMem": "Int", + "index": 966, + "size": 4, + "displOrdinal": 2 + }, + "setComm": { + "name": "setComm", + "description": "Commessa", + "memAddr": "", + "tipoMem": "String", + "index": 0, + "size": 20, + "displOrdinal": 3 + }, + "setCommNum": { + "name": "setCommNum", + "description": "ODL", + "memAddr": "VAR.500", + "tipoMem": "Int", + "index": 965, + "size": 4, + "displOrdinal": 4 + }, + "setPzComm": { + "name": "setPzComm", + "description": "Qta Richiesta", + "memAddr": "PAR.8003", + "tipoMem": "Int", + "index": 8003, + "size": 4, + "displOrdinal": 5 + } + }, + "mMapRead": { + "setPzCommOdl": { + "name": "setPzCommOdl", + "description": "PzOdl", + "memAddr": "VAR.502", + "tipoMem": "Int", + "index": 502, + "size": 4, + "displOrdinal": 6 + }, + "PZ_GTOT": { + "name": "PZ_GTOT", + "description": "Contatore GTot", + "memAddr": "", + "tipoMem": "Int", + "index": 0, + "size": 4, + "func": "MAX", + "period": 60, + "factor": 1, + "displOrdinal": 7 + }, + "PZ_COUNT": { + "name": "PZ_COUNT", + "description": "Contatore", + "memAddr": "", + "tipoMem": "Int", + "index": 0, + "size": 4, + "func": "MAX", + "period": 60, + "factor": 1, + "displOrdinal": 8 + }, + "PROG": { + "name": "PROG", + "description": "Programma", + "memAddr": "", + "tipoMem": "Int", + "index": 0, + "size": 4, + "func": "MAX", + "period": 60, + "factor": 1, + "displOrdinal": 9 + }, + "DYNDATA": { + "name": "DYNDATA", + "description": "DynData check", + "memAddr": "", + "tipoMem": "String", + "index": 0, + "size": 4, + "func": "POINT", + "period": 60, + "factor": 1, + "displOrdinal": 20 + } + }, + "mMapWriteLink": { + "setArt": "setArtNum", + "setComm": "setCommNum", + "setPzComm": "setPzCommOdl" + } +} \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/IOB-WIN-MITSUBISHII.csproj b/IOB-WIN-MITSUBISHII/IOB-WIN-MITSUBISHII.csproj new file mode 100644 index 00000000..17543460 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/IOB-WIN-MITSUBISHII.csproj @@ -0,0 +1,206 @@ + + + + + Debug + AnyCPU + {4FB0ABD9-84B9-4DA8-9AD4-CDD8CFF74F66} + WinExe + IOB_WIN_MITSUBISHII + IOB-WIN-MITSUBISHII + v4.6.2 + 512 + true + true + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\Remote_DEBUG\ + DEBUG;TRACE + full + x86 + 7.3 + prompt + + + + ..\packages\EgwProxy.MultiCncLib.3.6.2207.1211\lib\EgwProxy.MultiCncLib.dll + + + ..\packages\MapoSDK.6.14.2411.518\lib\MapoSDK.dll + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + VersGen.cs + + + Form + + + + + Form + + + + + Always + + + Always + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + App.config + PreserveNewest + + + App.config + PreserveNewest + + + Always + + + Always + + + Always + + + Always + + + Always + + + + + Always + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Always + + + + Always + + + + + Designer + true + PreserveNewest + + + + + Always + + + Always + + + + Always + + + Always + + + + + + {90512e12-29fc-460d-94cc-648c2a072dbd} + IOB-UT-NEXT + + + {9ba331bb-9bf1-40e0-ac03-74b43d73a097} + IOB-WIN-FORM + + + + + {1B93D6AF-FD32-4281-83FE-533F666FAE6C} + 1 + 0 + 0 + tlbimp + False + True + + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/Iob/GenericNext.cs b/IOB-WIN-MITSUBISHII/Iob/GenericNext.cs new file mode 100644 index 00000000..01c11574 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/Iob/GenericNext.cs @@ -0,0 +1,13 @@ +using IOB_UT_NEXT; + +namespace IOB_WIN_MITSUBISHI.Iob +{ + public class GenericNext : IOB_WIN_FORM.Iob.Generic + { + + public GenericNext(AdapterFormNext caller, IobConfiguration IOBConf): base((IOB_WIN_FORM.AdapterForm)caller, IOBConf) + { + } + + } +} \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/Iob/Mitsubishi.cs b/IOB-WIN-MITSUBISHII/Iob/Mitsubishi.cs new file mode 100644 index 00000000..9758d958 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/Iob/Mitsubishi.cs @@ -0,0 +1,2138 @@ +using IOB_UT_NEXT; +using MapoSDK; +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.NetworkInformation; +using System.Text; + +namespace IOB_WIN_MITSUBISHI.Iob +{ + public class Mitsubishi : Iob.GenericNext + { + #region Public Constructors + + /// + /// Estende l'init della classe base... + /// + /// + /// + public Mitsubishi(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf) + { + lgInfo("Start init Mitsubishi"); + // gestione invio ritardato contapezzi + pzCountDelay = utils.CRI("pzCountDelay"); + lastPzCountSend = DateTime.Now; + lastWarnODL = DateTime.Now; + + // inizializzo correttamente aree memoria secondo CONF - iniFileName + IniFile fIni = new IniFile(IOBConf.iniFileName); + + // inizializzo aree di memoria correnti... + MemVarStart = fIni.ReadInteger("MEMORY", "AREAV_START", 500); + MemVarSize = fIni.ReadInteger("MEMORY", "AREAV_SIZE", 1); + ParamStart = fIni.ReadInteger("MEMORY", "PAR_START", 8001); + ParamSize = fIni.ReadInteger("MEMORY", "PAR_SIZE", 1); + SignStart = fIni.ReadInteger("MEMORY", "SIGN_START", 10096); + SignSize = fIni.ReadInteger("MEMORY", "SIGN_SIZE", 1); + + // loggo aree di memoria avviate... + lgInfo($"Avviata area di memoria Var: {MemVarSize} vars"); + lgInfo($"Avviata area di memoria Param: {ParamSize} params"); + + // fix enable prgName + enablePrgName = fIni.ReadBoolean("CNC", "GETPRGNAME", true); + + // effettuo lettura della conf sigLUT... cercando 1:1 i bit... + string currBit = ""; + string memArea = ""; + for (int i = 0; i < 8; i++) + { + currBit = $"BIT{i}"; + memArea = fIni.ReadString("MEMORY", currBit, ""); + // se trovo un valore... + if (!string.IsNullOrEmpty(memArea)) + { + signLUT.Add(currBit, memArea); + } + } + + // recupero sysType del controllo, sennò default M700L... + string sEZNC_SYS = getOptPar("EZNC_SYS"); + if (!string.IsNullOrEmpty(sEZNC_SYS)) + { + sysType = (SYSTEMTYPE)Enum.Parse(typeof(SYSTEMTYPE), sEZNC_SYS); + } + lgInfo($"Start init Mitsubishi | SysType: {sysType}"); + + // gestione override contapezzi + enablePzCountByApp = utils.CRB("enableContapezzi"); + enablePzCountByIob = (getOptPar("ENABLE_PZCOUNT") == "TRUE"); + disablePzCountByIob = (getOptPar("DISABLE_PZCOUNT") == "FALSE"); + + // gestione override idx articoli... + if (!string.IsNullOrEmpty(getOptPar("NUM_ART_CHR_TRIM"))) + { + string NUM_ART_CHR_TRIM = getOptPar("NUM_ART_CHR_TRIM"); + bool.TryParse(NUM_ART_CHR_TRIM, out numArtCharTrim); + } + if (!string.IsNullOrEmpty(getOptPar("MAX_CHAR_DESC"))) + { + string MAX_CHAR_DESC = getOptPar("MAX_CHAR_DESC"); + int.TryParse(MAX_CHAR_DESC, out maxVarStrLen); + } + + // leggo conf x ricerca valori memoria da tracciare in log di continuo... + mem2trace = fIni.ReadString("OPTPAR", "MEM_2_TRACE", ""); + + // è little endian (NON serve conversione) + hasBigEndian = false; + lgInfoStartup($"Start init Adapter MITSUBISHI | IP {IOBConf.cncIpAddr}:{IOBConf.cncPort} per IOB {IOBConf.codIOB}"); + + // Creo oggetto connessione NC + parentForm.commPlcActive = true; + + // init oggetto + oEZNcAutCom = new EZNCAUTLib.DispEZNcCommunication(); + int.TryParse(IOBConf.cncPort, out ezPort); + ipAddr = IOBConf.cncIpAddr; + + parentForm.commPlcActive = false; + + // effettuo tryConnect... + lgInfo("MITSUBISHI startup: tryConnect"); + tryConnect(); + if ((enablePzCountByApp || enablePzCountByIob) && !(disablePzCountByIob)) + { + lgInfo("MITSUBISHI: inizio gestione contapezzi"); + try + { + // verifico quale modalità sia richiesta: STD (6711) oppure BIT (Custom, con + // indicazione area) + if (cIobConf.optPar.Count > 0 && !string.IsNullOrEmpty(getOptPar("PZCOUNT_MODE"))) + { + if (getOptPar("PZCOUNT_MODE").StartsWith("STD")) + { + lgInfo("Init contapezzi MITSUBISHI: pzCntReload(true)"); + pzCntReload(true); + // refresh associazione Macchina - IOB + SendM2IOB(); + // invio altri dati accessori... + SendMachineConf(); + // per adesso imposto lettura MITSUBISHI == contapezzi (poi farà vera lettura...) + contapezziPLC = contapezziIOB; + } + else + { + contapezziIOB = 0; + lgInfo("Contapezzi STD disabilitato: modalità {0}", getOptPar("PZCOUNT_MODE")); + } + } + else + { + contapezziIOB = 0; + lgInfo("Parametro mancante PZCOUNT_MODE"); + } + } + catch (Exception exc) + { + lgError(exc, "Errore in contapezzi MITSUBISHI 01"); + } + } + // finisco INIT ADAPTER + lgInfo("End init Adapter MITSUBISHI"); + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Processo i task richiesti e li elimino dalla coda 1:1 + /// + /// + public override Dictionary executeTasks(Dictionary task2exe) + { + // Verificare il protocollo: dovrebbe togliere SOLO i task eseguiti... + Dictionary taskDone = new Dictionary(); + if (task2exe != null) + { + bool taskOk = false; + string taskVal = ""; + string newVal = ""; + string memAddr = ""; + long valLong = 0; + // 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); + switch (tName) + { + case taskType.setArt: + case taskType.setComm: + lgInfo($"Richiesta scrittura {tName}"); + // salvo in memoria il valore richiesto... + if (memMap != null && memMap.mMapWrite != null) + { + if (memMap.mMapWrite.ContainsKey(item.Key)) + { + dataConf currMem = memMap.mMapWrite[item.Key]; + memAddr = currMem.memAddr; + taskVal = $"SET task: {item.Key} --> {newVal} | mem: {currMem.memAddr} - {currMem.size} byte"; + // salvo il nuovo valore nella memoria... così prox invio lo trasmetterà + memMap.mMapWrite[item.Key].value = newVal; + } + else + { + taskVal = $"NO DATA MEM, SET task: {item.Key} --> {newVal} ({item.Value})"; + } + } + else + { + taskVal = $"NO MemMap found, SET task: {item.Key} --> {newVal} ({item.Value})"; + } + // salvo in currProd.. + upsertKey(item.Key, item.Value); + break; + + case taskType.nihil: + case taskType.fixStopSetup: + case taskType.forceResetPzCount: + case taskType.setProg: + case taskType.forceSetPzCount: + 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.setArtNum: + lgInfo($"Richiesta scrittura CodART numerico"); + // in primis faccio una chiamata per tutta la tab SE fosse vuoto il dict + // di traduzione + if (DictNumArt == null || DictNumArt.Count == 0) + { + getNumArt(""); + lgInfo($"Recuperato DictNumArt, trovati {DictNumArt.Count} rec"); + } + // chiamo server x avere decodifica valore INT + newVal = getNumArt(item.Value); + // se c'è gestione semplificata num articolo --> usa trim dei soli + // caratteri alfabetici lasciando numeri.. + if (numArtCharTrim) + { + newVal = baseUtils.GetNumbers(item.Value); + } + // converto int... + long.TryParse(newVal, out valLong); + // procedo come il resto cercando mappatura in memMap: recupero dati da memMap... + if (memMap != null && memMap.mMapWrite != null) + { + if (memMap.mMapWrite.ContainsKey(item.Key)) + { + dataConf currMem = memMap.mMapWrite[item.Key]; + memAddr = currMem.memAddr; + taskVal = $"SET task: {item.Key} --> {newVal} | mem: {currMem.memAddr} - {currMem.size} byte"; + // salvo il nuovo valore nella memoria... così prox invio lo trasmetterà + memMap.mMapWrite[item.Key].value = newVal; + } + else + { + taskVal = $"NO DATA MEM, SET task: {item.Key} --> {newVal} ({item.Value})"; + } + } + else + { + taskVal = $"NO MemMap found, SET task: {item.Key} --> {newVal} ({item.Value})"; + } + + // invio a controller... + taskOk = setNumArt(valLong); + //se ho successo rileggo ed eventualmente sistemo valore + if (taskOk) + { + var rVal = getValByMemAddr(memAddr); + if (rVal == newVal) + { + lgInfo("All OK"); + // invio aggiornamento x reset richiesta... test! + sendOptVal(item.Key, newVal); + } + else + { + lgError($"Error | memAddr: {memAddr} | rVal: {rVal} | newVal: {newVal}"); + } + } + else + { + lgError("Errore in scrittura SetNumArt"); + } + // salvo in currProd.. + upsertKey(item.Key, item.Value); + break; + + case taskType.setCommNum: + lgInfo($"Richiesta scrittura cod COMMESSA numerica"); + // chiamo server x avere decodifica valore INT + newVal = getNumComm(item.Value); + // converto int... + long.TryParse(newVal, out valLong); + //riscrivo senza eventuali zeri... + newVal = valLong > 0 ? $"{valLong}" : newVal; + lgTrace($"Conv.Int numComm | newVal: {newVal} | valLong: {valLong}"); + // procedo come il resto cercando mappatura in memMap: recupero dati da memMap... + if (memMap != null && memMap.mMapWrite != null) + { + if (memMap.mMapWrite.ContainsKey(item.Key)) + { + dataConf currMem = memMap.mMapWrite[item.Key]; + memAddr = currMem.memAddr; + taskVal = $"SET task: {item.Key} --> {newVal} | mem: {currMem.memAddr} - {currMem.size} byte"; + // salvo il nuovo valore nella memoria... così prox invio lo trasmetterà + memMap.mMapWrite[item.Key].value = newVal; + } + else + { + taskVal = $"NO DATA MEM, SET task: {item.Key} --> {newVal} ({item.Value})"; + } + } + else + { + taskVal = $"NO MemMap found, SET task: {item.Key} --> {newVal} ({item.Value})"; + } + + // invio a controller... + taskOk = setNumCom(valLong); + //se ho successo rileggo ed eventualmente sistemo valore + if (taskOk) + { + //var rVal = getValByParam("SET_NUM_COM"); + var rVal = getValByMemAddr(memAddr); + if (rVal == newVal) + { + lgInfo("All OK"); + // invio aggiornamento x reset richiesta... test! + sendOptVal(item.Key, newVal); + } + else + { + lgError($"Error | memAddr: {memAddr} | rVal: {rVal} | newVal: {newVal}"); + } + } + else + { + lgError("Errore in scrittura SetNumCom"); + } + // salvo in currProd.. + upsertKey(item.Key, item.Value); + break; + + case taskType.setPzComm: + int pzReq = 0; + int.TryParse(item.Value, out pzReq); + // procedo come il resto cercando mappatura in memMap: recupero dati da memMap... + if (memMap != null && memMap.mMapWrite != null) + { + if (memMap.mMapWrite.ContainsKey(item.Key)) + { + dataConf currMem = memMap.mMapWrite[item.Key]; + memAddr = currMem.memAddr; + taskVal = $"SET task: {item.Key} --> {newVal} | mem: {currMem.memAddr} - {currMem.size} byte"; + // salvo il nuovo valore nella memoria... così prox invio lo trasmetterà + memMap.mMapWrite[item.Key].value = newVal; + } + else + { + taskVal = $"NO DATA MEM, SET task: {item.Key} --> {newVal} ({item.Value})"; + } + } + else + { + taskVal = $"NO MemMap found, SET task: {item.Key} --> {newVal} ({item.Value})"; + } + // set pezzi richiesti inizio setup + taskOk = setPzComm(pzReq); + //se ho successo rileggo ed eventualmente sistemo valore + if (taskOk) + { + var rVal = getValByMemAddr(memAddr); + if (rVal == newVal) + { + lgInfo("All OK"); + // invio aggiornamento x reset richiesta... test! + sendOptVal(item.Key, newVal); + } + else + { + lgError($"Error | memAddr: {memAddr} | rVal: {rVal} | newVal: {newVal}"); + } + } + else + { + lgError("Errore in scrittura SetNumCom"); + } + taskVal = taskOk ? "RESET: SETUP START" : "PZ RESET DISABLED | NO EXEC"; + lgInfo($"Chiamata startSetup: taskOk: {taskOk} | taskVal: {taskVal}"); + + // salvo in currProd.. + upsertKey(item.Key, item.Value); + break; + + case taskType.startSetup: + // reset contapezzi inizio setup + taskOk = resetContapezziPLC(); + taskVal = taskOk ? "RESET: SETUP START" : "PZ RESET DISABLED | NO EXEC"; + lgInfo($"Chiamata startSetup: taskOk: {taskOk} | taskVal: {taskVal}"); + break; + + case taskType.stopSetup: + // reset contapezzi fine setup SE ESPLICITAMENTE IMPOSTATO + if (cIobConf.optPar.Count > 0 && getOptPar("ENABLE_PZ_RESET_stopSetup") == "TRUE") + { + taskOk = resetContapezziPLC(); + } + taskVal = taskOk ? "RESET: SETUP END" : "PZ RESET DISABLED | NO EXEC"; + lgInfo($"Chiamata stopSetup: taskOk: {taskOk} | taskVal: {taskVal}"); + break; + + case taskType.setParameter: + lgInfo($"Chiamata setParameter | NO processing: taskOk: {taskOk} | taskVal: {taskVal}"); + taskVal = "setParameter | SKIPPED | NO EXEC"; + break; + + default: + lgInfo($"Chiamata default senza processing: taskOk: {taskOk} | taskVal: {taskVal}"); + taskVal = "SKIPPED | NO EXEC"; + break; + } + + // aggiungo task! + taskDone.Add(item.Key, taskVal); + } + } + return taskDone; + } + + /// + /// Recupero dati dinamici... + /// + public override Dictionary getDynData() + { + Dictionary outVal = new Dictionary(); + // processo SOLO SE connected... + if (connectionOk) + { + // leggo i valori Var + ReadMitsubVars(); + + // cerco tra tutte le aree write le VARS... + foreach (var item in memMap.mMapWrite) + { + if (item.Value.memAddr.StartsWith("VAR")) + { + // certo in dict ed accodo... + int iVar = 0; + string sVar = item.Value.memAddr.Replace("VAR.", ""); + int.TryParse(sVar, out iVar); + if (iVar > 0) + { + // cerco in dizionario... + if (DictVar.ContainsKey(iVar)) + { + outVal.Add(item.Key, $"{DictVar[iVar]}"); + upsertKey(item.Key, $"{DictVar[iVar]}"); + } + } + } + } + // cerco tra tutte le aree read le VARS... + foreach (var item in memMap.mMapRead) + { + if (item.Value.memAddr.StartsWith("VAR")) + { + // certo in dict ed accodo... + int iVar = 0; + string sVar = item.Value.memAddr.Replace("VAR.", ""); + int.TryParse(sVar, out iVar); + if (iVar > 0) + { + // cerco in dizionario... + if (DictVar.ContainsKey(iVar)) + { + outVal.Add(item.Key, $"{DictVar[iVar]}"); + upsertKey(item.Key, $"{DictVar[iVar]}"); + } + } + } + } + // aggiungo DynData... calcolato come variazione pezzi e lampade... + if (outVal.ContainsKey("DYNDATA")) + { + outVal.Remove("DYNDATA"); + } + StringBuilder sb = new StringBuilder(); + // inserisco i segnali + sb.Append("SIGN:["); + foreach (var item in DictSign) + { + sb.Append($"{item.Key}:{item.Value}|"); + } + // inserisco parametri + sb.Append("] PAR:["); + foreach (var item in DictParam) + { + sb.Append($"{item.Key}:{item.Value}|"); + } + // inserisco le variabili + sb.Append("] VAR:["); + foreach (var item in outVal) + { + sb.Append($"{item.Value}|"); + } + sb.Append("]"); + outVal.Add("DYNDATA", sb.ToString()); + } + return outVal; + } + + /// + /// Recupero programma in lavorazione + /// + /// + public override string getPrgName() + { + string prgName = ""; + // recupero NUOVO prgName... + try + { + int iRet = oEZNcAutCom.Program_GetProgramNumber2((Int32)PROGRAMTYPE.EZNC_MAINPRG, out String strProgramNo); + + // recupero nome programma MAIN + prgName = utils.purgedChar2String(strProgramNo); + // trimmo path del programma SE presente + prgName = prgName.Replace(utils.CRS("basePrgMemPath"), ""); + lgInfo("Current PROG: {0}", prgName); + } + catch (Exception exc) + { + lgError(string.Format("Eccezione in recupero PRG NAME MAIN:{0}{1}", Environment.NewLine, exc)); + connectionOk = false; + } + return prgName; + } + + /// + /// Recupero info lavorazione come Dictionary... + /// - SYSINFO: (prima KEY globale) TUTTI i valori separati da # (x fare check modifica) + /// - altre stringhe: ogni singolo parametro / valore + /// + /// + public override Dictionary getSysInfo() + { + Dictionary outVal = new Dictionary(); + stopwatch.Restart(); + try + { + oEZNcAutCom.System_GetSystemInformation(0, out int partSys); + outVal.Add("PartSys", $"{partSys}"); + oEZNcAutCom.System_GetSystemInformation(1, out int numAx); + outVal.Add("NumAxis", $"{numAx}"); + oEZNcAutCom.System_GetSerialNo(out string serNo); + outVal.Add("SerialNo", $"{serNo}"); + for (int i = 0; i < 3; i++) + { + oEZNcAutCom.System_GetVersion(0, i, out string pVers); + outVal.Add($"V_{i}", $"{pVers}"); + } + } + catch (Exception exc) + { + lgError($"Eccezione in getSysInfo{Environment.NewLine}{exc}"); + connectionOk = false; + } + if (utils.CRB("recTime")) + { + TimingData.addResult(cIobConf.codIOB, string.Format("SYS-INFO"), stopwatch.ElapsedTicks); + } + return outVal; + } + + /// + /// Effettua vero processing contapezzi da configurazione + /// PZCOUNT_MODE: pezzi lavorati (parziale) + /// PZGTOT_MODE: pezzi lavorati totali + /// PZREQ_MODE: pezzi richiesti + /// + public override void processContapezzi() + { + if ((enablePzCountByApp || enablePzCountByIob) && !(disablePzCountByIob)) + { + // procedo SOLO SE ho connessione... + if (connectionOk) + { + try + { + // lettura parametri per procedere + ReadMitsubParams(); + // controllo di AVERE parametri opzionali x conteggi vari + if (cIobConf.optPar.Count > 0) + { + // contapezzi ATTUALE + string memAddr = getOptPar("PZCOUNT_MODE"); + if (!string.IsNullOrEmpty(memAddr)) + { + // verifico quale modalità sia richiesta: STD oppure CST (Custom, TBD) + if (memAddr.StartsWith("STD")) + { + // inizio verifica area memoria/parametro levando prima parte codice + memAddr = memAddr.Replace("STD.", ""); + } + + // verifico SE sia di tipo PAR e cerco valore... + int cntAddr = 0; + if (memAddr.StartsWith("PAR.")) + { + // recupero parametro... + int.TryParse(memAddr.Replace("PAR.", ""), out cntAddr); + } + // cerco in dizionario... + if (DictParam.ContainsKey(cntAddr)) + { + string rawVal = DictParam[cntAddr]; + int newVal = -1; + Int32.TryParse(rawVal, out newVal); + contapezziPLC = newVal > -1 ? newVal : contapezziPLC; + } + + stopwatch.Stop(); + } + } + } + catch (Exception exc) + { + lgError(exc, "Errore in contapezzi MITSUBISHI 02"); + connectionOk = false; + } + } + else + { + lgError("Errore: manca connessione in contapezzi MITSUBISHI"); + } + } + } + + /// + /// Recupero altri counters se ci sono + /// + public override void processOtherCounters() + { + try + { + // lettura parametri per procedere + ReadMitsubParams(); + + // controllo di AVERE parametri opzionali x conteggi vari + if (cIobConf.optPar.Count > 0) + { + // gestione con ricerca in memoria Write / optPar... + if (string.IsNullOrEmpty(memAddrPzReq)) + { + lgTrace("PzReq disabilitato | NO memConf.Write | NO optPar"); + } + else + { + sendOptVal(memNamePzReq, getValByMemAddr(memAddrPzReq)); + } + if (string.IsNullOrEmpty(memAddrArt)) + { + lgTrace("Articolo disabilitato | NO memConf.Write | NO optPar"); + } + else + { + sendOptVal(memNameArt, getValByMemAddr(memAddrArt)); + } + if (string.IsNullOrEmpty(memAddrCom)) + { + lgTrace("Commessa disabilitata | NO memConf.Write | NO optPar"); + } + else + { + sendOptVal(memNameCom, getValByMemAddr(memAddrCom)); + } + if (string.IsNullOrEmpty(memAddrPzCnt)) + { + lgTrace("PzCount disabilitato | NO memConf.Write | NO optPar"); + } + else + { + sendOptVal(memNamePzCnt, getValByMemAddr(memAddrPzCnt)); + } + if (string.IsNullOrEmpty(memAddrPzCntTot)) + { + lgTrace("PzCntTOT disabilitato | NO memConf.Write | NO optPar"); + } + else + { + sendOptVal(memNamePzCntTot, getValByMemAddr(memAddrPzCntTot)); + } + if (string.IsNullOrEmpty(memAddrCaden)) + { + lgTrace("Cadenza disabilitata | NO memConf.Write | NO optPar"); + } + else + { + sendOptVal(memNameCaden, getValByMemAddr(memAddrCaden)); + } + } + } + catch (Exception exc) + { + lgError(exc, "Eccezione in processOtherCounters"); + } + } + + /// + /// Effettua lettura semafori principale Parametri da + /// aggiornare x display in form + /// + public override void readSemafori(ref newDisplayData currDispData) + { + DateTime adesso = DateTime.Now; + base.readSemafori(ref currDispData); + // verifico non sia in veto invio iniziale... + if (queueInEnabCurr) + { + try + { + if (verboseLog) + { + lgInfo("inizio read semafori"); + } + + currDispData.semIn = Semaforo.SV; + ReadMitsubGenData(); + // salvo il solo BYTE dell'input decifrando il semaforo... + decodeToBitmap(); + reportRawInput(ref currDispData); + } + catch (Exception exc) + { + lgError(string.Format("Eccezione in readSemafori:{0}{1}", Environment.NewLine, exc)); + connectionOk = false; + currDispData.semIn = Semaforo.SR; + } + } + else + { + lgDebug($"[VETO readSemafori] | veto attivo alle {adesso:yyyy.MM.dd HH:mm:ss}"); + checkVetoQueueIn(); + } + } + + /// + /// Effettua reset del contapezzi + /// + /// + public override bool resetContapezziPLC() + { + bool answ = false; + // ...SE abilitato da conf IOB + if (cIobConf.optPar.Count > 0 && getOptPar("ENABLE_PZ_RESET") == "TRUE") + { + // scrivo valore 0 x il contapezzi + try + { + // contapezzi ATTUALE + if (!string.IsNullOrEmpty(getOptPar("PZCOUNT_MODE"))) + { + int valReq = 0; + // scrivo valore 0 x il contapezzi + try + { + answ = writeMitsubMem("NumPz", memAddrPzCnt, valReq); + } + catch (Exception exc) + { + lgError($"Errore in SET NumPz MITSUBISHI{Environment.NewLine}{exc}"); + } + answ = true; + } + } + catch (Exception exc) + { + lgError(exc, "Errore in RESET contapezzi MITSUBISHI"); + connectionOk = false; + } + answ = true; + } + return answ; + } + + /// + /// Effettua impostazione del valore numerico ARTICOLO (specifico MITSUBISHI) + /// + /// + public bool setNumArt(double valReq) + { + bool answ = false; + string memAddr = memAddrArt; + lgTrace($"INIT setNumArt | memAddr: {memAddr}"); + if (cIobConf.optPar.Count > 0 && !string.IsNullOrEmpty(memAddr)) + { + // scrivo valore richiesto in area configurata + try + { + answ = writeMitsubMem("CodArt", memAddr, valReq); + } + catch (Exception exc) + { + lgError(exc, "Errore in setNumArt MITSUBISHI"); + } + } + return answ; + } + + /// + /// Effettua impostazione del valore numerico COMMESSA (specifico MITSUBISHI) + /// + /// + public bool setNumCom(double valReq) + { + bool answ = false; + // verifico quale modalità sia richiesta + string memAddr = memAddrCom; + lgTrace($"INIT setNumCom | memAddr: {memAddr}"); + if (cIobConf.optPar.Count > 0 && !string.IsNullOrEmpty(memAddr)) + { + lgTrace($"setNumCom | memAddr: {memAddr} | valReq: {valReq}"); + // scrivo valore richiesto in area configurata + try + { + answ = writeMitsubMem("ODL", memAddr, valReq); + } + catch (Exception exc) + { + lgError(exc, "Errore in setNumCom MITSUBISHI"); + } + answ = true; + } + return answ; + } + + /// + /// Effettua impostazione del conteggio pezzi richiesti + /// + /// + public override bool setPzComm(int valReq) + { + bool answ = false; + // ...SE abilitato da conf IOB + if (cIobConf.optPar.Count > 0 && getOptPar("ENABLE_PZ_REQ") == "TRUE") + { + // scrivo valore 0 x il contapezzi + try + { + bool write1 = writeMitsubMem("NumPz", memAddrPzReq, valReq); + bool write2 = writeMitsubMem("PzOdl", memAddrPzReqOdl, valReq); + answ = write1 && write2; + } + catch (Exception exc) + { + lgError($"Errore in SET NumPz MITSUBISHI{Environment.NewLine}{exc}"); + } + answ = true; + } + return answ; + } + + /// + /// Override connessione + /// + public override void tryConnect() + { + if (!connectionOk) + { + // controllo che il ping sia stato tentato almeno pingTestSec fa... + if (DateTime.Now.Subtract(lastPING).TotalSeconds > utils.CRI("pingTestSec")) + { + if (verboseLog || periodicLog) + { + lgInfo("MITSUBISHI: ConnKO - tryConnect"); + } + // in primis salvo data ping... + lastPING = DateTime.Now; + // ora PING!!! + Ping pingSender = new Ping(); + IPAddress address = IPAddress.Loopback; + IPAddress.TryParse(cIobConf.cncIpAddr, out address); + PingReply reply; + try + { + // se != null --> uso address... + if (address != null) + { + reply = pingSender.Send(address, 100); + } + else + { + reply = pingSender.Send(cIobConf.cncIpAddr, 100); + } + } + catch + { + reply = pingSender.Send(IPAddress.Loopback, 100); + } + // se passa il ping faccio il resto... + if (reply.Status == IPStatus.Success) + { + string szStatusConnection = ""; + try + { + // ora provo connessione... + parentForm.commPlcActive = true; + + // Open communication + int iRet = 0; + oEZNcAutCom = new EZNCAUTLib.DispEZNcCommunication(); + iRet = oEZNcAutCom.SetTCPIPProtocol(ipAddr, ezPort); + iRet = oEZNcAutCom.Open3((int)sysType, 1, 10, hostName); + parentForm.commPlcActive = false; + lgInfo($"Mitubishi | open Result: {iRet}"); + connectionOk = iRet == 0; + connectionOk = true; + // refresh stato allarmi!!! + if (connectionOk) + { + checkVetoQueueIn(); + dtAvvioAdp = DateTime.Now; + if (adpRunning) + { + lgInfo("Connessione OK"); + } + } + else + { + lgError("Impossibile procedere, connessione mancante..."); + } + } + catch (Exception exc) + { + lgFatal(string.Format("Errore nella connessione all'adapter MITSUBISHI: {0}{1}{2}", szStatusConnection, Environment.NewLine, exc)); + connectionOk = false; + lgInfo(string.Format("Eccezione in TryConnect, Adapter NON running, pausa di {0} msec prima di ulteriori tentativi di riconnessione", utils.CRI("waitRecMSec"))); + } + } + else + { + // loggo no risposta ping ... + connectionOk = false; + if (verboseLog || periodicLog) + { + lgInfo(string.Format("Attenzione: controllo PING fallito per IP {0} - {1}", cIobConf.cncPingAddr, reply.Status)); + } + } + } + } + // se non è ancora connesso faccio procesisng memoria caso disconnesso... + if (!connectionOk) + { + // processo semafori ed invio... + processMemoryDiscon(); + } + } + + /// + /// Override disconnessione + /// + public override void tryDisconnect() + { + if (connectionOk) + { + string szStatusConnection = ""; + try + { + // Close. + var iRet = oEZNcAutCom.Close(); + //Release object + oEZNcAutCom = null; + connectionOk = false; + // resetto timing! + TimingData.resetData(); + lgInfo(szStatusConnection); + lgInfo("Effettuata disconnessione adapter MITSUBISHI!"); + } + catch (Exception exc) + { + lgFatal(exc, "Errore nella disconnessione dall'adapter MITSUBISHI"); + } + } + else + { + lgError("IMPOSSIBILE effettuare disconnessione: Connessione non disponibile..."); + } + queueInEnabCurr = false; + } + + #endregion Public Methods + + #region Protected Fields + + /// + /// Porta di comunicazione INT + /// + protected int ezPort = 683; + + /// + /// Nome amcchina x connessione + /// + protected string hostName = "EZNC_LOCALHOST"; + + /// + /// Nome/IP del CN + /// + protected string ipAddr = ""; + + /// + /// Obj di comunicazione Mitsubishi + /// + protected EZNCAUTLib.DispEZNcCommunication oEZNcAutCom = null; + + #endregion Protected Fields + + #region Protected Methods + + /// + /// Metodo da overridare x scrivere DAVVERO i parametri sul PLC + /// + /// + protected override void plcWriteParams(ref List updatedPar) + { + lgTrace($"plcWriteParams: richiesta per {updatedPar.Count} params"); + foreach (var item in updatedPar) + { + lgInfo($"ITEM | {item.uid} | {item.value}"); + // effettuo scrittura SE configurata in write param... + bool fatto = false; + double valReq = 0; + if (memMap != null && memMap.mMapWrite != null) + { + if (memMap.mMapWrite.ContainsKey(item.uid)) + { + double.TryParse(item.value, out valReq); + var currSet = memMap.mMapWrite[item.uid]; + if (string.IsNullOrEmpty(currSet.memAddr)) + { + fatto = true; + } + else + { + fatto = writeMitsubMem(currSet.description, currSet.memAddr, valReq); + } + } + } + // salvo i valori ricevuti + upsertKey(item.uid, item.reqValue); + // se i valori richiesto e fatto corrispondono... resetto! + if (fatto && item.reqValue.Trim() == item.value.Trim()) + { + // resetto richiesta! + item.reqValue = ""; + } + } + } + + #endregion Protected Methods + + #region Private Fields + + private DateTime lastParRefr = DateTime.Now; + + private DateTime lastSigRefr = DateTime.Now; + + private DateTime lastVarRefr = DateTime.Now; + + /// + /// Max num caratteri string ammessi VAR label + /// + private int maxVarStrLen = 7; + + /// + /// Num celle Var da leggere + /// + private int MemVarSize = 1; + + /// + /// Indirizzo partenza lettura Var(100/500) + /// + private int MemVarStart = 500; + + /// + /// Num celle Param da leggere + /// + private int ParamSize = 1; + + /// + /// Indirizzo partenza lettura Param + /// + private int ParamStart = 8000; + + /// + /// LookUpTable di decodifica da CNC a segnali tipo bitmap MAPO + /// + private Dictionary signLUT = new Dictionary(); + + /// + /// Num celle Signal da leggere + /// + private int SignSize = 3; + + /// + /// Indirizzo partenza lettura Signal + /// + private int SignStart = 10096; + + /// + /// Tipo di controllo gestito + /// + private SYSTEMTYPE sysType = SYSTEMTYPE.EZNC_SYS_MELDAS700L; + + #endregion Private Fields + + #region Private Enums + + /// + /// Tipo program + /// + private enum PROGRAMTYPE + { + /// + /// Main Program メインプログラム + /// + EZNC_MAINPRG = 0, + + /// + /// Sub Program サブプログラム + /// + EZNC_SUBPRG = 1, + } + + /// + /// Controllo specifico da gestire + /// + private enum SYSTEMTYPE + { + /// + /// M700L + /// + EZNC_SYS_MELDAS700L = 5, + + /// + /// M700M + /// + EZNC_SYS_MELDAS700M = 6, + + /// + /// C70 + /// + EZNC_SYS_MELDASC70 = 7, + + /// + /// M800L + /// + EZNC_SYS_MELDAS800L = 8, + + /// + /// M800M + /// + EZNC_SYS_MELDAS800M = 9, + + /// + /// C80 + /// + EZNC_SYS_CNCC80 = 10, + } + + #endregion Private Enums + + #region Private Properties + + /// + /// Dictionary contenuto memorie Param + /// + private Dictionary DictParam { get; set; } = new Dictionary(); + + /// + /// Dictionary contenuto dati Signal (es Y) + /// + private Dictionary DictSign { get; set; } = new Dictionary(); + + /// + /// Dictionary contenuto memorie Var + /// + private Dictionary DictVar { get; set; } = new Dictionary(); + + private string memAddrArt + { + get + { + string memAddr = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("setArtNum")) + { + memAddr = memMap.mMapWrite["setArtNum"].memAddr; + } + // se vuoto provo altra alternativa... + if (string.IsNullOrEmpty(memAddr) && memMap.mMapWrite.ContainsKey("setArt")) + { + memAddr = memMap.mMapWrite["setArt"].memAddr; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memAddr)) + { + memAddr = getOptPar("SET_NUM_ART"); + } + // bonifica variabile da definizione STD iniziale... + if (memAddr.StartsWith("STD")) + { + memAddr = memAddr.Replace("STD.", ""); + } + return memAddr; + } + } + + private string memAddrCaden + { + get + { + string memAddr = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("Cadenza")) + { + memAddr = memMap.mMapWrite["Cadenza"].memAddr; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memAddr)) + { + memAddr = getOptPar("PZCAD_MODE"); + } + // bonifica variabile da definizione STD iniziale... + if (memAddr.StartsWith("STD")) + { + memAddr = memAddr.Replace("STD.", ""); + } + return memAddr; + } + } + + private string memAddrCom + { + get + { + string memAddr = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("setCommNum")) + { + memAddr = memMap.mMapWrite["setCommNum"].memAddr; + } + // se vuoto provo altra alternativa... + if (string.IsNullOrEmpty(memAddr) && memMap.mMapWrite.ContainsKey("setComm")) + { + memAddr = memMap.mMapWrite["setComm"].memAddr; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memAddr)) + { + memAddr = getOptPar("SET_NUM_COM"); + } + // bonifica variabile da definizione STD iniziale... + if (memAddr.StartsWith("STD")) + { + memAddr = memAddr.Replace("STD.", ""); + } + return memAddr; + } + } + + private string memAddrPzCnt + { + get + { + string memAddr = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("ContatoreParziale")) + { + memAddr = memMap.mMapWrite["ContatoreParziale"].memAddr; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memAddr)) + { + memAddr = getOptPar("PZCOUNT_MODE"); + } + // bonifica variabile da definizione STD iniziale... + if (memAddr.StartsWith("STD")) + { + memAddr = memAddr.Replace("STD.", ""); + } + return memAddr; + } + } + + private string memAddrPzCntTot + { + get + { + string memAddr = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("ContatoreAssoluto")) + { + memAddr = memMap.mMapWrite["ContatoreAssoluto"].memAddr; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memAddr)) + { + memAddr = getOptPar("PZGTOT_MODE"); + } + // bonifica variabile da definizione STD iniziale... + if (memAddr.StartsWith("STD")) + { + memAddr = memAddr.Replace("STD.", ""); + } + return memAddr; + } + } + + private string memAddrPzReq + { + get + { + string memAddr = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("setPzComm")) + { + memAddr = memMap.mMapWrite["setPzComm"].memAddr; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memAddr)) + { + memAddr = getOptPar("PZREQ_MODE"); + } + // bonifica variabile da definizione STD iniziale... + if (memAddr.StartsWith("STD")) + { + memAddr = memAddr.Replace("STD.", ""); + } + return memAddr; + } + } + + /// + /// Area memoria PzOdl, NON abilitata in scrittura utente (è duplo/copia) + /// + private string memAddrPzReqOdl + { + get + { + string memAddr = ""; + //cerco prima in read area + if (memMap != null && memMap.mMapRead != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapRead.ContainsKey("setPzCommOdl")) + { + memAddr = memMap.mMapRead["setPzCommOdl"].memAddr; + } + } + // cerco anche in write se non trovata.. + if (string.IsNullOrEmpty(memAddr)) + { + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("setPzCommOdl")) + { + memAddr = memMap.mMapWrite["setPzCommOdl"].memAddr; + } + } + } + // bonifica variabile da definizione STD iniziale... + if (memAddr.StartsWith("STD")) + { + memAddr = memAddr.Replace("STD.", ""); + } + return memAddr; + } + } + + private string memNameArt + { + get + { + string memName = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("setArtNum")) + { + memName = "setArtNum"; + } + // se vuoto provo altra alternativa... + if (string.IsNullOrEmpty(memName) && memMap.mMapWrite.ContainsKey("setArt")) + { + memName = "setArt"; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memName)) + { + memName = "PZ_COUNT"; + } + return memName; + } + } + + private string memNameCaden + { + get + { + string memName = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("Cadenza")) + { + memName = "Cadenza"; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memName)) + { + memName = "CICLE_CAD"; + } + return memName; + } + } + + private string memNameCom + { + get + { + string memName = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("setCommNum")) + { + memName = "setCommNum"; + } + // se vuoto provo altra alternativa... + if (string.IsNullOrEmpty(memName) && memMap.mMapWrite.ContainsKey("setComm")) + { + memName = "setComm"; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memName)) + { + memName = "SET_NUM_COM"; + } + return memName; + } + } + + private string memNamePzCnt + { + get + { + string memName = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("ContatoreParziale")) + { + memName = "ContatoreParziale"; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memName)) + { + memName = "PZ_COUNT"; + } + return memName; + } + } + + private string memNamePzCntTot + { + get + { + string memName = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("ContatoreAssoluto")) + { + memName = "ContatoreAssoluto"; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memName)) + { + memName = "PZ_GTOT"; + } + return memName; + } + } + + private string memNamePzReq + { + get + { + string memName = ""; + if (memMap != null && memMap.mMapWrite != null) + { + //cerco in primis modalità NUM altrimenti standard... + if (memMap.mMapWrite.ContainsKey("setPzComm")) + { + memName = "setPzComm"; + } + } + // se non trovato... leggo da OPT_PAR + if (string.IsNullOrEmpty(memName)) + { + memName = "PZ_REQ"; + } + return memName; + } + } + + #endregion Private Properties + + #region Private Methods + + /// + /// Effettua decodifica aree memoria alla bitmap usata x MAPO + /// + private void decodeToBitmap() + { + /*------------------------------------------ + * Bitmap MAPO STD 54 + * B0: POWER_ON + * B1: RUN + * B2: pzCount + * B3: allarme + * B4: manuale + * B5: Emerg (1 = emergenza, 0 = NON emergenza) + * + *------------------------------------------*/ + // init a zero... + B_input = 0; + if (connectionOk) + { + // vedere conf: + // Y60: RED + // Y61: YELLOW + // Y62: GREEN + // Y63: BLUE + + // default connesso = poweron, valutare se blue? + B_input += 1 << 0; + + string bKey = ""; + string bVal = ""; + // decodifico impiegando dictionary... cercando il TIPO di memoria & co... + char area; + // valore INVERTED (default è false) + bool invSignal = false; + string memArea = ""; + string cVal = ""; + string[] memIdx; + int bitNum = 0; + int byteNum = 0; + int byte2check = 0; + for (int i = 0; i < 8; i++) + { + bKey = $"BIT{i}"; + // cerco se ci sia in LUT + if (signLUT.ContainsKey(bKey)) + { + // recupero nome variabile... + bVal = signLUT[bKey]; + // se l'area è PZCOUNT... processo PUNTUALMENTE il CONTAPEZZI... + if (bVal.StartsWith("PZCOUNT")) + { + // disabilito pzcount singolo +#if false + // 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(string.Format("MITSUBISHI | Lettura ODL andata a vuoto: currODL: {0}", currODL)); + } + } + else + { + // se variato o scaduto timeout log... + if (periodicLog || ($"{currIdxODL}" != currODL)) + { + lgInfo(string.Format("MITSUBISHI | 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($"MITSUBISHI | Lettura ODL non effettuata: IobOnline: {IobOnline} | currODL impostato a vuoto"); + } + } + if (!string.IsNullOrEmpty(currODL) && currODL != "0") + { + // 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}"); + } + + if ((enablePzCountByApp || enablePzCountByIob) && !(disablePzCountByIob)) + { + // verifico se variato contapezzi... + 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 MITSUBISHI: {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 MITSUBISHI: 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 MITSUBISHI: {contapezziPLC} | contapezziIOB {contapezziIOB}"); + // resetto timer... + lastPzCountSend = DateTime.Now; + } + } +#endif + } + else // area "normale" byte.bit + { + // di norma è segnale normale => 1, altrimenti inverse => 0... + invSignal = false; + // cerco se sia inverse (primo char "!") --> registro e elimino char... + invSignal = bVal.StartsWith("!"); + // se è da tracciare... + if (mem2trace.Contains($"|{bKey}|")) + { + if (invSignal) + { + lgTrace($"Segnale invertito | bVal: {bVal}"); + } + } + // tolgo comunque inversione... + bVal = bVal.Replace("!", ""); + + // recupero int key + int iKey = 0; + int.TryParse(bVal, out iKey); + // leggo dizionario richiesto + if (DictSign.ContainsKey(iKey)) + { + cVal = DictSign[iKey]; + } + + // a secondo che sia segnale normale o inverso... + if (invSignal) + { + // controllo se il bit sia NON attivo (basso)... == 0 + if (cVal == "0") + { + B_input += 1 << i; + } + } + else + { + // controllo se il bit sia attivo (alto)... == 1 + if (cVal == "1") + { + B_input += 1 << i; + } + } + + // se è da tracciare... + if (mem2trace.Contains($"|{bKey}|")) + { + var bMapAct = Convert.ToString(byte2check, 2).PadLeft(8, '0'); + var bMapReq = Convert.ToString((1 << bitNum), 2).PadLeft(8, '0'); + lgTrace($"Valore | bKey: {bKey} | bVal: {bVal} | byte: {bMapAct} | tgt: {bMapReq} | B_input: {B_input}"); + } + } + } + } + } + // log opzionale! + if (verboseLog) + { + lgInfo(string.Format("Trasformazione B_input: {0}", B_input)); + } + } + + /// + /// Recupera il valore da memoria per successivo processing + /// + /// + /// + private string getValByMemAddr(string memAddr) + { + lgTrace($"inizio getValByMemAddr | memAddr: {memAddr}"); + string answ = ""; + // verifico quale modalità sia richiesta: STD (6711) oppure BIT (Custom, con indicazione area) + if (memAddr.StartsWith("STD")) + { + // inizio verifica area memoria/parametro levando prima parte codice + memAddr = memAddr.Replace("STD.", ""); + } + // var di appoggio + int cntAddr = 0; + // verifico se si tratta di lettura parametro... formato tipo STD.PAR.8001 + if (memAddr.StartsWith("PAR.")) + { + // recupero parametro... + int.TryParse(memAddr.Replace("PAR.", ""), out cntAddr); + // cerco in dizionario... + if (DictParam.ContainsKey(cntAddr)) + { + answ = DictParam[cntAddr]; + } + } + else if (memAddr.StartsWith("VAR.")) + { + // recupero parametro... + int.TryParse(memAddr.Replace("VAR.", ""), out cntAddr); + // cerco in dizionario... + if (DictVar.ContainsKey(cntAddr)) + { + answ = $"{DictVar[cntAddr]}"; + } + } + return answ; + } + + /// + /// Recupera il valore INT dal nome del parametro per successivo processing + /// + /// + /// + private string getValByParam(string varName) + { + string memAddr = getOptPar(varName); + string answ = getValByMemAddr(memAddr); + if (isVerboseLog) + { + lgInfo($"[3] PAR letto: {varName} | {answ}"); + } + return answ; + } + + /// + /// Lettura dati generici (es var Y) + /// + private void ReadMitsubGenData() + { + DateTime adesso = DateTime.Now; + int parSPeriod = samplePeriod; + // controllo se sia passato il samplePeriod minimo... + if (adesso.Subtract(lastSigRefr.AddMilliseconds(parSPeriod)).TotalSeconds > 0) + { + lastSigRefr = adesso; + stopwatch.Restart(); + // in primis: leggo i valor in sequenza e salvo in dizionario... + object pvRead = "bbb"; + // sezione segnali: cablata 53... + int sec = 53; + // Start da Y60 (Hex) --> 10000+96 + for (int i = SignStart; i < SignStart + SignSize; i++) + { + oEZNcAutCom.Generic_ReadData(0, sec, i, ref pvRead); + UpsertSign(i, $"{pvRead}"); + if (verboseLog) + { + lgTrace($"Sign | {i} : {pvRead}"); + } + } + // recording tempi + if (utils.CRB("recTime")) + { + TimingData.addResult(cIobConf.codIOB, $"Sign{SignSize}-R", stopwatch.ElapsedTicks); + } + stopwatch.Stop(); + } + else + { + lgTrace($"Saltata ReadMitsubGenData x periodo minimo {parSPeriod} ms"); + } + } + + /// + /// Lettura area parametri mitsubishi come configurato + /// + private void ReadMitsubParams() + { + DateTime adesso = DateTime.Now; + int parSPeriod = samplePeriod * 3; + // controllo se sia passato il samplePeriod minimo... + if (adesso.Subtract(lastParRefr.AddMilliseconds(parSPeriod)).TotalSeconds > 0) + { + lastParRefr = adesso; + // per prima cosa processo la lettura parametri e li salvo in DICT + int lAxis = 0; + object parValue = ""; + stopwatch.Restart(); + int iRet = oEZNcAutCom.Parameter_GetData3(0, ParamStart, ParamSize, lAxis, out parValue); + if (utils.CRB("recTime")) + { + TimingData.addResult(cIobConf.codIOB, $"R{ParamSize}-PAR", stopwatch.ElapsedTicks); + } + // converto in array di string... + string[] rawData = (string[])parValue; + // salvo in dict... + for (int i = 0; i < ParamSize; i++) + { + UpsertParam(ParamStart + i, rawData[i]); + } + } + else + { + lgTrace($"Saltata ReadMitsubParams x periodo minimo {parSPeriod} ms"); + } + } + + /// + /// Lettura area Var100/Var500 mitsubishi come configurato + /// + private void ReadMitsubVars() + { + DateTime adesso = DateTime.Now; + int parSPeriod = samplePeriod * 5; + // controllo se sia passato il samplePeriod minimo... + if (adesso.Subtract(lastVarRefr.AddMilliseconds(parSPeriod)).TotalSeconds > 0) + { + lastVarRefr = adesso; + // per prima cosa processo la lettura Variabili e li salvo in DICT + double pData = 0; + int pType = 0; + stopwatch.Restart(); + for (int i = MemVarStart; i < MemVarStart + MemVarSize; i++) + { + oEZNcAutCom.CommonVariable_Read2(i, out pData, out pType); + UpsertVar(i, pData); + if (verboseLog) + { + lgTrace($"Var | {i} : {pData}"); + } + } + if (utils.CRB("recTime")) + { + TimingData.addResult(cIobConf.codIOB, $"R{MemVarSize}-VAR", stopwatch.ElapsedTicks); + } + } + else + { + lgTrace($"Saltata ReadMitsubVars x periodo minimo {parSPeriod} ms"); + } + } + + /// + /// Upsert info in DICT dei Params (es 8001..8003 contatori pezzi) + /// + /// + /// + private void UpsertParam(int key, string value) + { + if (DictParam.ContainsKey(key)) + { + DictParam[key] = value; + } + else + { + DictParam.Add(key, value); + } + } + + /// + /// Upsert info in DICT dei SIGNAL (es Y) + /// + /// + /// + private void UpsertSign(int key, string value) + { + if (DictSign.ContainsKey(key)) + { + DictSign[key] = value; + } + else + { + DictSign.Add(key, value); + } + } + + /// + /// Upsert info in DICT dei VAR (es Var100, Var500) + /// + /// + /// + private void UpsertVar(int key, double value) + { + if (DictVar.ContainsKey(key)) + { + DictVar[key] = value; + } + else + { + DictVar.Add(key, value); + } + } + +#if false + /// + /// Scrive valore richiesto nella memoria richiesta + /// + /// + /// + /// + /// + private bool writeMitsubMem(string memName, string memAddr, int valReq) + { + bool answ = false; + lgTrace($"INIT {memName} | memAddr: {memAddr}"); + // contapezzi ATTUALE + if (!string.IsNullOrEmpty(memAddr)) + { + if (memAddr.StartsWith("STD")) + { + // inizio verifica area memoria/parametro levando prima parte codice + memAddr = memAddr.Replace("STD.", ""); + } + // var di appoggio + int cntAddr = 0; + // verifico se si tratta di tipo VAR... formato tipo VAR.501 + if (memAddr.StartsWith("VAR.")) + { + // recupero parametro... + int.TryParse(memAddr.Replace("VAR.", ""), out cntAddr); + lgTrace($"VAR | {memName} Write 01 | memAddr: {memAddr} | idx: {cntAddr}"); + // processo SET valore + stopwatch.Restart(); + if (cntAddr > 0) + { + double vTransf = (double)valReq; + // scrivo valore + int iRet = oEZNcAutCom.CommonVariable_Write2(cntAddr, vTransf, 1); + // trimmo se necessario memName... + if (memName.Length > maxVarStrLen) + { + memName = memName.Substring(0, maxVarStrLen); + } + // scrivo label + iRet = oEZNcAutCom.CommonVariable_SetName(cntAddr, memName); + lgTrace($"VAR | {memName} Write 02 | memAddr: {memAddr} | valReq: {valReq} | vTransf: {vTransf}"); + if (utils.CRB("recTime")) + { + TimingData.addResult(cIobConf.codIOB, "VAR-W", stopwatch.ElapsedTicks); + } + answ = iRet == 0; + // se successo --> rileggo! + if (answ) + { + ReadMitsubVars(); + } + } + stopwatch.Stop(); + } + else if (memAddr.StartsWith("PAR.")) + { + // recupero parametro... + int.TryParse(memAddr.Replace("PAR.", ""), out cntAddr); + lgTrace($"PAR | {memName} Write 01 | memAddr: {memAddr} | idx: {cntAddr}"); + // processo SET valore + stopwatch.Restart(); + if (cntAddr > 0) + { + // scrivo pz req come PAR... + int lAxis = 0; + string[] sValue = new string[1]; + sValue[0] = $"{valReq}"; + int iRet = oEZNcAutCom.Parameter_SetData3(0, cntAddr, lAxis, (object)sValue); + lgTrace($"PAR | {memName} Write 02 | memAddr: {memAddr} | valReq: {valReq}"); + if (utils.CRB("recTime")) + { + TimingData.addResult(cIobConf.codIOB, "PAR-W", stopwatch.ElapsedTicks); + } + answ = iRet == 0; + // se successo --> rileggo! + if (answ) + { + ReadMitsubParams(); + } + } + stopwatch.Stop(); + } + } + return answ; + } +#endif + + /// + /// Scrive valore richiesto nella memoria richiesta + /// + /// + /// + /// + /// + private bool writeMitsubMem(string memName, string memAddr, double valReq) + { + bool answ = false; + lgTrace($"INIT {memName} | memAddr: {memAddr}"); + // contapezzi ATTUALE + if (!string.IsNullOrEmpty(memAddr)) + { + if (memAddr.StartsWith("STD")) + { + // inizio verifica area memoria/parametro levando prima parte codice + memAddr = memAddr.Replace("STD.", ""); + } + // var di appoggio + int cntAddr = 0; + // verifico se si tratta di tipo VAR... formato tipo VAR.501 + if (memAddr.StartsWith("VAR.")) + { + // recupero parametro... + int.TryParse(memAddr.Replace("VAR.", ""), out cntAddr); + lgTrace($"VAR | {memName} Write 01 | memAddr: {memAddr} | idx: {cntAddr}"); + // processo SET valore + stopwatch.Restart(); + if (cntAddr > 0) + { + // scrivo valore + int iRet = oEZNcAutCom.CommonVariable_Write2(cntAddr, valReq, 1); + // trimmo se necessario memName... + if (memName.Length > maxVarStrLen) + { + memName = memName.Substring(0, maxVarStrLen); + } + // scrivo label + iRet = oEZNcAutCom.CommonVariable_SetName(cntAddr, memName); + lgTrace($"VAR | {memName} Write 02 | memAddr: {memAddr} | valReq: {valReq}"); + if (utils.CRB("recTime")) + { + TimingData.addResult(cIobConf.codIOB, "VAR-W", stopwatch.ElapsedTicks); + } + answ = iRet == 0; + // se successo --> rileggo! + if (answ) + { + ReadMitsubVars(); + } + } + stopwatch.Stop(); + } + else if (memAddr.StartsWith("PAR.")) + { + // recupero parametro... + int.TryParse(memAddr.Replace("PAR.", ""), out cntAddr); + lgTrace($"PAR | {memName} Write 01 | memAddr: {memAddr} | idx: {cntAddr}"); + // processo SET valore + stopwatch.Restart(); + if (cntAddr > 0) + { + // scrivo pz req come PAR... + int lAxis = 0; + string[] sValue = new string[1]; + // cablato: zero decimali... + sValue[0] = $"{valReq:N0}"; + int iRet = oEZNcAutCom.Parameter_SetData3(0, cntAddr, lAxis, (object)sValue); + lgTrace($"PAR | {memName} Write 02 | memAddr: {memAddr} | valReq: {valReq}"); + if (utils.CRB("recTime")) + { + TimingData.addResult(cIobConf.codIOB, "PAR-W", stopwatch.ElapsedTicks); + } + answ = iRet == 0; + // se successo --> rileggo! + if (answ) + { + ReadMitsubParams(); + } + } + stopwatch.Stop(); + } + } + return answ; + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/MainFormNext.cs b/IOB-WIN-MITSUBISHII/MainFormNext.cs new file mode 100644 index 00000000..e403ec30 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/MainFormNext.cs @@ -0,0 +1,40 @@ +using IOB_UT_NEXT; +using IOB_WIN_MITSUBISHI.Iob; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IOB_WIN_MITSUBISHI +{ + public class MainFormNext : IOB_WIN_FORM.MainForm + { + + /// + /// Avvio MainForm + /// + /// + public MainFormNext(string[] args) : base(args) + { + } + + /// + /// Apre la finestra child con conf + /// + 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; + } + } +} diff --git a/IOB-WIN-MITSUBISHII/NLog.config b/IOB-WIN-MITSUBISHII/NLog.config new file mode 100644 index 00000000..cd1bcc98 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/NLog.config @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + diff --git a/IOB-WIN-MITSUBISHII/Program.cs b/IOB-WIN-MITSUBISHII/Program.cs new file mode 100644 index 00000000..e32b68ff --- /dev/null +++ b/IOB-WIN-MITSUBISHII/Program.cs @@ -0,0 +1,24 @@ +using System; +using System.Windows.Forms; + +namespace IOB_WIN_MITSUBISHI +{ + internal static class Program + { + #region Private Methods + + /// + /// Punto di ingresso principale dell'applicazione. + /// Parametri di avvio + /// + [STAThread] + private static void Main(string[] args) + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainFormNext(args)); + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/Properties/AssemblyInfo.cs b/IOB-WIN-MITSUBISHII/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..fb95eb3a --- /dev/null +++ b/IOB-WIN-MITSUBISHII/Properties/AssemblyInfo.cs @@ -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-MITSUBISHII")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyProduct("IOB-WIN-MITSUBISHII")] +[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("4fb0abd9-84b9-4da8-9ad4-cdd8cff74f66")] diff --git a/IOB-WIN-MITSUBISHII/Properties/Resources.Designer.cs b/IOB-WIN-MITSUBISHII/Properties/Resources.Designer.cs new file mode 100644 index 00000000..aec810c0 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +namespace IOB_WIN_MITSUBISHII.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // 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() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [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_MITSUBISHII.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/IOB-WIN-MITSUBISHII/Properties/Resources.resx b/IOB-WIN-MITSUBISHII/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/IOB-WIN-MITSUBISHII/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/Properties/Settings.Designer.cs b/IOB-WIN-MITSUBISHII/Properties/Settings.Designer.cs new file mode 100644 index 00000000..48432f89 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +namespace IOB_WIN_MITSUBISHII.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; + } + } + } +} diff --git a/IOB-WIN-MITSUBISHII/Properties/Settings.settings b/IOB-WIN-MITSUBISHII/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/IOB-WIN-MITSUBISHII/Resources/ChangeLog.html b/IOB-WIN-MITSUBISHII/Resources/ChangeLog.html new file mode 100644 index 00000000..7ab91d78 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/Resources/ChangeLog.html @@ -0,0 +1,120 @@ + +

MAPO-IOB-WIN

+ v: {{CURRENT-REL}} +
+ Acquisitore MAPO-IOB per sistemi Windows +
+ Note di rilascio: +
    +
  • + v.3.1.* → v.3.2.* +
      +
    • Nuovi simulatori con gestione emergenza
    • +
    • Fix gestione invio dati Redis
    • +
    • Implementazione IOB Eurom63
    • +
    +
  • +
  • + v.2.6.* → v.3.0.* +
      +
    • revisione sistema metodi invio in blocco
    • +
    • Gestione invio contapezzi in step > 1
    • +
    • Gestione eventi in blocco (indipendente e prioritario su EvBlock)
    • +
    • Gestione limite eventi memorizzabili
    • +
    • Integrazione REDIS
    • +
    • Integrazione IOB-MAN
    • +
    +
  • +
  • + v.2.5.* → v.2.6.* +
      +
    • revisione sistema timeout Ping
    • +
    • Gestione AutoODL in prod generale (non solo SIM)
    • +
    +
  • +
  • + v.2.4.* → v.2.5.* +
      +
    • Aggiunto adapter MTConnect
    • +
    • Ottimizzazione gestione SIEMENS
    • +
    +
  • +
  • + v.2.3.* → v.2.4.* +
      +
    • inserita gestione conf json x Flog acquisiti
    • +
    • gestione invio Json blocchi dati FLog
    • +
    • ottimizzazioni varie adapter Siemens
    • +
    • ottimizzazione processo svuotamento code
    • +
    • riduzione interferenza e interblocchi in fase di PLC assente
    • +
    +
  • +
  • + Ultime modifiche: +
      {{LAST-CHANGES}}
    +
  • +
  • + v.1.18.* → v.2.3.* +
      +
    • inserimento WPS x acontrolli WebPage human readable
    • +
    • fix gestione task2exe
    • +
    • aggiunte varie versioni PLC siemens
    • +
    • aggiunto PLC WPS x generiche web pages
    • +
    • revisitazione LOG ODL e contapezzi
    • +
    • modifica pagina presentazione dati (master) x resize
    • +
    • Attivazione IOB SIMULATOR per test di carico (sostituito type DEMO)
    • +
    • Aggiunto simulatore macchine MULTI pallet
    • +
    • Ottimizzazione simulatore
    • +
    • Ottimizzazioni PLC Siemens x riavvio post disconnessione (es spegnimento notturno)
    • +
    • Ottimizzazione processo chiusura in update applicazione
    • +
    • Aggiunta simulazione spegnimento con WU/CD
    • +
    +
  • +
  • + v.1.11.* → v.1.18.* +
      +
    • Inserimento controller SIEMENS con S7+ library
    • +
    • Inserimento nuove letture FANUC x programmi
    • +
    • Inserimento nuove letture FANUC x SysEx (informazioni sistema)
    • +
    • Inserimento invio FluxLog x parametri estesi (es SysEx, ProgName,...)
    • +
    • FIX visualizzazione dati FluxLog e URL inviati
    • +
    • FIX MAIN program da FANUC (non il current)
    • +
    • Inserita modalita' DUMP memoria (iniziale full + periodica)
    • +
    • Inserimento gestione contapezzi standard/checkBit in IOB.cfg
    • +
    • Inserimento contapezzi da area memoria X
    • +
    • NUOVA Gestione rami cliente e URL di update
    • +
    • Gestione modi CNC
    • +
    • Lettura dari dinamycs FANUC (feed, speed)
    • +
    • aggiunta gestione aree G0..G30 (overrides?)
    • +
    • fix errore disconnessione FANUC (allo spegnimento dl CNC) e memoria valori persistente a 1
    • +
    • fix globali x gestione log IN / FLOG + ottimizzaizone check FANUC (PING)
    • +
    • ottimizzazione fasi di restart in caso di assenza del server (evita reinvii inutili e migliora tempo ripartenza invio)
    • +
    • review procedure controllo connessione x FANUC (es Tornos II)
    • +
    • non richeide più privilegi admin x fare update
    • +
    • gestione segnali inverted
    • +
    • completata gestione configurabilità parametrica segnali (Tornos, CMZ, Biglia)
    • +
    • revisitazione LOG x distinguere processi IOB
    • +
    +
  • +
  • + v.0.1.* → v.0.10.* +
      +
    • Testato in produzione x update ad avvio e su richiesta
    • +
    • Testato in produzione x lettura dati da Fanuc
    • +
    • Inizio deploy con copia file su area IIS
    • +
    • Prima versione con autoupdate
    • +
    • Test PrettyBin x spostamento dll
    • +
    • Base acquisitore FANUC
    • +
    • Sistema base sw controllo in tray
    • +
    +
  • +
+ + \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/Resources/Circuit.ico b/IOB-WIN-MITSUBISHII/Resources/Circuit.ico new file mode 100644 index 0000000000000000000000000000000000000000..a05b27a67818d3faeddecb49c4a9fba3c8e30b28 GIT binary patch literal 164031 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 N9L6B!q@oYs{|5s6j{5)r literal 0 HcmV?d00001 diff --git a/IOB-WIN-MITSUBISHII/Resources/Net.ico b/IOB-WIN-MITSUBISHII/Resources/Net.ico new file mode 100644 index 0000000000000000000000000000000000000000..a33a9ecae52b0604d3f28293f0c19178a523a914 GIT binary patch literal 104399 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 HOwa#+TbYJK literal 0 HcmV?d00001 diff --git a/IOB-WIN-MITSUBISHII/Resources/STEAM-IOB-WIN.xml b/IOB-WIN-MITSUBISHII/Resources/STEAM-IOB-WIN.xml new file mode 100644 index 0000000000000000000000000000000000000000..ba4e78f6ce10c6adc0ea87773115ddfc1fa017b8 GIT binary patch literal 3688 zcmbW4S#KIi6ov2eNcj&a@7RWT$wWOwPVB@;ac1O2e(?)q@FGKF(ZnS4<7ehOx9CvS zjWMxWy-;=QoV!=?-@lo?x9>Kxp*8H$1~#$6?rdzi{b8@IWgE7|yTMFuSB&?W&F#i# z&+W`USre&UWZqlHUfFM!G1>#={z=5PBL>zSNip5pl)7ogfW!rph@xAG5r@W_gtzOUdY@lCeC$QXrP%uA1V#>Fy z?{Z)B6>O4hkUwyl0psFn*`C|q^5-^|x47Oh*Y@WQdT!fWuAtRh7&mQ!A%88f_w5_} zx3EsYKLzd3_U+g%c%JZmiB^Bw2ggWdQ=9{Ak_RW)^6=B54k(XYvaf*^4_rfjUGe?T z-0A@{fujj)*S^m6U5=Nso}*(Iy)Prpn@iA2xpK8UvVIhlU9#(jD`aamLSL}&hC8oF zrg9;g;(g#&)XT`%<$|m-V(Ofacx;HJe|fx*-ADD=(!Mgj0p%2oF`WCn4~Tc1bB8eW z!M%3;0xtPxofTEC(x=bcmXTLEe1Bunz}Zy?-{#!axtK>B&-+?ZPe&}nhl-|pi*i+d zE$~3fQKwcCxgC4M z)ndNwHLMlC^INyZ_qc@9VwHN0Y)#o>J3{!4YgSv~xqJX9w>BTw#m=Z?E< zT^;>|$mK+3;0Vf5eXAQ!=bl#mE7Gc-kR{a>F{&i$-e1IL`FtF~jQmx7$tvv|@m%o8 zF**-@Uj1m`-jKdMS?S{Zj2^*b>#+aY%9M2<-v+CXuyI0_oMGR@ z_f2&M*__(C-ink(8U~ME_|BgDZq&oZA>*O@EbDyFuSt1A1;}SZvPGU$j!cQEGUk2_ z)|VipI;hhqlUHYcx*tg6a$UI(#Q9Z5c$r+x9#FNf6+b;5uc`WYm1K;oN-y(>Rh_=h^*^#skc`BkX}h`q>8diGR3^W zAL{bz_F+{OYneofamWdNKzG#XF`Qn{c#jzS;%}X8%G1h`cgyuwq%2_{P!$PJop{f& z>f`CUdWL<%X4Sn;Kk6;9e8}I$j`*^(R%RdZr*<}3uKij08;`}DnpNk3fy%Kos2 zk6|x3Pm49|@88iz|8-WKS#%x?(Ol*iVU401`pCZwowwDadyLO`%BPq3cT87pGNN51 i$b?>6J(F)Br!HT5D8{dPsjiz=r4|RhHD3M??AZU;C_$_M literal 0 HcmV?d00001 diff --git a/IOB-WIN-MITSUBISHII/Resources/Start-IOB-WIN.bat b/IOB-WIN-MITSUBISHII/Resources/Start-IOB-WIN.bat new file mode 100644 index 00000000..3f8ecaa1 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/Resources/Start-IOB-WIN.bat @@ -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 diff --git a/IOB-WIN-MITSUBISHII/Resources/SteamWare.ico b/IOB-WIN-MITSUBISHII/Resources/SteamWare.ico new file mode 100644 index 0000000000000000000000000000000000000000..70ccadaff4b65965acc2004f6197e552114aa937 GIT binary patch literal 279582 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 literal 0 HcmV?d00001 diff --git a/IOB-WIN-MITSUBISHII/Resources/manifest.xml b/IOB-WIN-MITSUBISHII/Resources/manifest.xml new file mode 100644 index 00000000..f66a7e99 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/Resources/manifest.xml @@ -0,0 +1,7 @@ + + + 1.0.0.0 + http://seriate.steamware.net:8083/SWS/MAPO/IOB-WIN/{{BRANCHNAME}}/MAPO-IOB-WIN.zip + http://seriate.steamware.net:8083/SWS/MAPO/IOB-WIN/{{BRANCHNAME}}/ChangeLog.html + false + \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/docfx.json b/IOB-WIN-MITSUBISHII/docfx.json new file mode 100644 index 00000000..bacb80c9 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/docfx.json @@ -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" + ] + } +} \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/index.md b/IOB-WIN-MITSUBISHII/index.md new file mode 100644 index 00000000..fdb4be99 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/index.md @@ -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 \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/logs/.placeholder.txt b/IOB-WIN-MITSUBISHII/logs/.placeholder.txt new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/logs/.placeholder.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/packages.config b/IOB-WIN-MITSUBISHII/packages.config new file mode 100644 index 00000000..7bf5c7b6 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/packages.config @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/postBuildTgt.bat b/IOB-WIN-MITSUBISHII/postBuildTgt.bat new file mode 100644 index 00000000..26a831a0 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/postBuildTgt.bat @@ -0,0 +1,52 @@ +@echo off +echo Inizio processing After Build: configurazione %1 , directory %2 + +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-MITSUBISHI-DEB /MIR +REM Baglietto +REM ROBOCOPY %2 \\192.168.60.15\Steamware\IOB-WIN-MITSUBISHI-DEB /MIR +REM GIACOVELLI LOCOROTONDO +REM ROBOCOPY %2 \\192.168.1.93\Steamware\IOB-WIN-MITSUBISHI-DEB /MIR +REM IMI Remosa +REM ROBOCOPY %2 \\192.168.0.12\Steamware\IOB-WIN-MITSUBISHI-DEB /MIR + +REM IOB-WIN-SIM +REM ROBOCOPY %2 \\IOB-WIN-SIMULA\Steamware\IOB-WIN-MITSUBISHI-DEB /MIR + +REM IOBVPN4MACHINE +REM ROBOCOPY %2 \\10.51.90.5\Steamware\IOB-WIN-MITSUBISHI-DEB /MIR +REM ROBOCOPY %2 \\10.51.90.5\Steamware\IOB-WIN-MITSUBISHI-DEB /MIR /log:RobocopyTransfer.log +REM ROBOCOPY %2 Z:\IOB-WIN-MITSUBISHI-DEB /MIR +REM ROBOCOPY %2 \\10.51.90.10\Steamware\IOB-WIN-MITSUBISHI-DEB /MIR +ROBOCOPY %2 \\10.51.90.9\Steamware\IOB-WIN-MITSUBISHI-DEB /MIR + +goto END + +:END +echo Fatto! \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/setupTgt.bat b/IOB-WIN-MITSUBISHII/setupTgt.bat new file mode 100644 index 00000000..ba685c02 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/setupTgt.bat @@ -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! \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/temp/.placeholder b/IOB-WIN-MITSUBISHII/temp/.placeholder new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/IOB-WIN-MITSUBISHII/temp/.placeholder @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/IOB-WIN-MITSUBISHII/toc.yml b/IOB-WIN-MITSUBISHII/toc.yml new file mode 100644 index 00000000..7eee9ffb --- /dev/null +++ b/IOB-WIN-MITSUBISHII/toc.yml @@ -0,0 +1,6 @@ + +- name: Articles + href: articles/ +- name: API Documentation + href: obj/api/ + homepage: api/index.md diff --git a/IOB-WIN-NEXT/AdapterFormNext.cs b/IOB-WIN-NEXT/AdapterFormNext.cs index 2da82a1f..22a0a86c 100644 --- a/IOB-WIN-NEXT/AdapterFormNext.cs +++ b/IOB-WIN-NEXT/AdapterFormNext.cs @@ -71,12 +71,12 @@ namespace IOB_WIN_NEXT iobObj = new IobSql.IcoelDb(this, IOBConf); btnStart.Enabled = true; break; -#endif case tipoAdapter.MITSUBISHI: iobObj = new Mitsubishi(this, IOBConf); btnStart.Enabled = true; break; +#endif case tipoAdapter.OMRON: iobObj = new Iob.Omron(this, IOBConf); From 950199211a91c40879954a51c9de7a71bd198376 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 22 Jan 2025 12:09:04 +0100 Subject: [PATCH 3/3] Modifica yaml x compilazione Mitsubishi --- .gitlab-ci.yml | 98 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 78 insertions(+), 20 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 59b493a2..c80ac6cb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -259,6 +259,19 @@ IOB-WIN-MBUS:build: - *version-fix script: - '& "$env:MSBUILD_PATH" "$env:APP_NAME\$env:APP_NAME.csproj" -target:Build /p:Configuration=Release /p:Platform="x86" /p:OutputPath=bin/ /nodeReuse:false /verbosity:minimal /m' + +IOB-WIN-MITSUBISHI:build: + stage: build + tags: + - win + variables: + APP_NAME: IOB-WIN-MITSUBISHI + before_script: + - *nuget-fix + - '& "$env:NUGET_PATH" restore "$env:APP_NAME.sln" -verbosity quiet' + - *version-fix + script: + - '& "$env:MSBUILD_PATH" "$env:APP_NAME\$env:APP_NAME.csproj" -target:Build /p:Configuration=Release /p:Platform="x86" /p:OutputPath=bin/ /nodeReuse:false /verbosity:minimal /m' IOB-WIN-MTC:build: stage: build @@ -492,6 +505,31 @@ IOB-WIN-MBUS:release: - *nexusUpload - *SendToVersionsLog +IOB-WIN-MITSUBISHI:release: + stage: release + needs: ["IOB-WIN-MITSUBISHI:build"] + tags: + - win + variables: + APP_NAME: IOB-WIN-MITSUBISHI + NEXUS_PATH: MAPO/IOB-WIN-MITSUBISHI + rules: + - if: $CI_COMMIT_BRANCH == 'master' + changes: + - IOB-WIN-MITSUBISHI/* + when: always + before_script: + - *nuget-fix + - '& "$env:NUGET_PATH" restore "$env:APP_NAME.sln" -verbosity quiet' + - *version-fix + - *cleanup-zip + script: + - '& "$env:MSBUILD_PATH" "$env:APP_NAME\$env:APP_NAME.csproj" -target:Build /p:Configuration=Release /p:Platform="x86" /p:OutputPath=bin/ /nodeReuse:false /verbosity:minimal /m' + - *zipper + - *hashBuild + - *nexusUpload + - *SendToVersionsLog + IOB-WIN-MTC:release: stage: release needs: ["IOB-WIN-MTC:build"] @@ -696,26 +734,6 @@ IOB-WIN-WS:release: # DocFx # -------------------------------- -IOB-WIN-MBUS:docfx: - stage: docfx - needs: ["IOB-WIN-MBUS:build"] - tags: - - win - variables: - APP_NAME: IOB-WIN-MBUS - rules: - - if: $CI_COMMIT_BRANCH == 'master' - changes: - - IOB-WIN-MBUS/* - when: always - before_script: - - *nuget-fix - - '& "$env:NUGET_PATH" restore "$env:APP_NAME.sln" -verbosity quiet' - script: - - docfx $env:APP_NAME/docfx.json - - mv $env:APP_NAME/_site "docfx" - - *DocReplica - IOB-WIN-FANUC:docfx: stage: docfx needs: ["IOB-WIN-FANUC:build"] @@ -776,6 +794,46 @@ IOB-WIN-FTP:docfx: - mv $env:APP_NAME/_site "docfx" - *DocReplica +IOB-WIN-MBUS:docfx: + stage: docfx + needs: ["IOB-WIN-MBUS:build"] + tags: + - win + variables: + APP_NAME: IOB-WIN-MBUS + rules: + - if: $CI_COMMIT_BRANCH == 'master' + changes: + - IOB-WIN-MBUS/* + when: always + before_script: + - *nuget-fix + - '& "$env:NUGET_PATH" restore "$env:APP_NAME.sln" -verbosity quiet' + script: + - docfx $env:APP_NAME/docfx.json + - mv $env:APP_NAME/_site "docfx" + - *DocReplica + +IOB-WIN-MITSUBISHI:docfx: + stage: docfx + needs: ["IOB-WIN-MITSUBISHI:build"] + tags: + - win + variables: + APP_NAME: IOB-WIN-MITSUBISHI + rules: + - if: $CI_COMMIT_BRANCH == 'master' + changes: + - IOB-WIN-MITSUBISHI/* + when: always + before_script: + - *nuget-fix + - '& "$env:NUGET_PATH" restore "$env:APP_NAME.sln" -verbosity quiet' + script: + - docfx $env:APP_NAME/docfx.json + - mv $env:APP_NAME/_site "docfx" + - *DocReplica + IOB-WIN-MTC:docfx: stage: docfx needs: ["IOB-WIN-MTC:build"]