diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e55ad93b..59b493a2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -221,6 +221,19 @@ IOB-WIN-FANUC:build:
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-FILE:build:
+ stage: build
+ tags:
+ - win
+ variables:
+ APP_NAME: IOB-WIN-FILE
+ 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-FTP:build:
stage: build
tags:
@@ -404,6 +417,31 @@ IOB-WIN-FANUC:release:
- *nexusUpload
- *SendToVersionsLog
+IOB-WIN-FILE:release:
+ stage: release
+ needs: ["IOB-WIN-FILE:build"]
+ tags:
+ - win
+ variables:
+ APP_NAME: IOB-WIN-FILE
+ NEXUS_PATH: MAPO/IOB-WIN-FILE
+ rules:
+ - if: $CI_COMMIT_BRANCH == 'master'
+ changes:
+ - IOB-WIN-FILE/*
+ 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-FTP:release:
stage: release
needs: ["IOB-WIN-FTP:build"]
@@ -698,6 +736,26 @@ IOB-WIN-FANUC:docfx:
- mv $env:APP_NAME/_site "docfx"
- *DocReplica
+IOB-WIN-FILE:docfx:
+ stage: docfx
+ needs: ["IOB-WIN-FILE:build"]
+ tags:
+ - win
+ variables:
+ APP_NAME: IOB-WIN-FILE
+ rules:
+ - if: $CI_COMMIT_BRANCH == 'master'
+ changes:
+ - IOB-WIN-FILE/*
+ 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-FTP:docfx:
stage: docfx
needs: ["IOB-WIN-FTP:build"]
diff --git a/IOB-WIN-FILE.sln b/IOB-WIN-FILE.sln
index a62eceed..2ab36307 100644
--- a/IOB-WIN-FILE.sln
+++ b/IOB-WIN-FILE.sln
@@ -14,7 +14,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOB-UT-NEXT", "IOB-UT-NEXT\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOB-WIN-FORM", "IOB-WIN-FORM\IOB-WIN-FORM.csproj", "{9BA331BB-9BF1-40E0-AC03-74B43D73A097}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOB-WIN-FTP", "IOB-WIN-FTP\IOB-WIN-FTP.csproj", "{3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOB-WIN-FILE", "IOB-WIN-FILE\IOB-WIN-FILE.csproj", "{FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -61,18 +61,18 @@ Global
{9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Remote_DEBUG|Any CPU.Build.0 = Debug|Any CPU
{9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Remote_DEBUG|x86.ActiveCfg = Release|Any CPU
{9BA331BB-9BF1-40E0-AC03-74B43D73A097}.Remote_DEBUG|x86.Build.0 = Release|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Debug|x86.ActiveCfg = Debug|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Debug|x86.Build.0 = Debug|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Release|Any CPU.Build.0 = Release|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Release|x86.ActiveCfg = Release|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Release|x86.Build.0 = Release|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Remote_DEBUG|Any CPU.ActiveCfg = Release_DEBUG|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Remote_DEBUG|Any CPU.Build.0 = Release_DEBUG|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Remote_DEBUG|x86.ActiveCfg = Release|Any CPU
- {3ED97EEA-9EAB-480D-8E53-EDB3662DCB79}.Remote_DEBUG|x86.Build.0 = Release|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Debug|x86.Build.0 = Debug|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Release|x86.ActiveCfg = Release|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Release|x86.Build.0 = Release|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Remote_DEBUG|Any CPU.ActiveCfg = Remote_DEBUG|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Remote_DEBUG|Any CPU.Build.0 = Remote_DEBUG|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Remote_DEBUG|x86.ActiveCfg = Release|Any CPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}.Remote_DEBUG|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/IOB-WIN-FILE/AdapterFormNext.cs b/IOB-WIN-FILE/AdapterFormNext.cs
new file mode 100644
index 00000000..6c9396cd
--- /dev/null
+++ b/IOB-WIN-FILE/AdapterFormNext.cs
@@ -0,0 +1,65 @@
+using IOB_UT_NEXT;
+using IOB_WIN_FILE.Iob;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IOB_WIN_FILE
+{
+ 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.FILE_GEN:
+ iobObj = new IobFile.FileGen(this, IOBConf);
+ btnStart.Enabled = true;
+ break;
+
+ case tipoAdapter.FILE_EUROM63:
+ iobObj = new IobFile.FileEurom63(this, IOBConf);
+ btnStart.Enabled = true;
+ break;
+
+ case tipoAdapter.FILE_SOITAAB:
+ iobObj = new IobFile.IobFileSoitaab(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-FILE/App.Debug.config b/IOB-WIN-FILE/App.Debug.config
new file mode 100644
index 00000000..42297ccc
--- /dev/null
+++ b/IOB-WIN-FILE/App.Debug.config
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/IOB-WIN-FILE/App.Release.config b/IOB-WIN-FILE/App.Release.config
new file mode 100644
index 00000000..0f80d173
--- /dev/null
+++ b/IOB-WIN-FILE/App.Release.config
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/IOB-WIN-FILE/App.config b/IOB-WIN-FILE/App.config
new file mode 100644
index 00000000..6ebaa918
--- /dev/null
+++ b/IOB-WIN-FILE/App.config
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/IOB-WIN-FILE/DATA/CONF/EM63.ini b/IOB-WIN-FILE/DATA/CONF/EM63.ini
new file mode 100644
index 00000000..d5aa54da
--- /dev/null
+++ b/IOB-WIN-FILE/DATA/CONF/EM63.ini
@@ -0,0 +1,70 @@
+;Configurazione IOB-WIN
+[IOB]
+;MAcchina con protocollo Euromap63 PlasticMetal NPM
+CNCTYPE=FILE_EUROM63
+PING_MS_TIMEOUT=500
+
+[MACHINE]
+VENDOR=PlasticMetal
+MODEL=MPW280SP
+
+[CNC]
+IP=10.74.82.253
+;IP=192.168.1.151
+
+[SERVER]
+MPIP=http://10.74.82.218
+;MPIP=http://192.168.1.150
+MPURL=/MP/IO
+CMDBASE=/IOB/input/
+CMDFLOG=/IOB/flog/
+CMDALIVE=/IOB
+CMDENABLED=/IOB/enabled/
+CMDADV1=?valore=
+CMDREBO=/sendReboot.aspx?idxMacchina=
+
+[MEMORY]
+ADDR_READ=DB0.DBB0
+ADDR_WRITE=DB0.DBB0
+SIZE_READ=1
+SIZE_WRITE=0
+;BIT0=CONN
+BIT1=DB0.DBB1
+;BIT2=PZCOUNT.STD.DB700.DBW22
+BIT3=DB0.DBB3
+BIT4=DB0.DBB4
+
+
+[BLINK]
+;MAX_COUNTER_BLINK = 30
+MAX_COUNTER_BLINK = 15
+;bit0 = 0
+;bit1 = 0
+;bit2 = 1
+;bit3 = 1
+;bit4 = 1
+;bit5 = 0
+;bit6 = 0
+;bit7 = 0
+BLINK_FILT=0
+;BLINK_FILT=28
+
+[OPTPAR]
+;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice
+; attenzione memoria sempre base BYTE (1604 DW --> 6416...)
+;PZCOUNT_MODE=STD.DB550.DBDW0
+PZCOUNT_MODE=NONE
+DISABLE_PZCOUNT=TRUE
+ENABLE_DYN_DATA=TRUE
+FORCE_DYN_DATA=TRUE
+ENABLE_SEND_PZC_BLOCK=TRUE
+MIN_SEND_PZC_BLOCK=0
+MAX_SEND_PZC_BLOCK=1200
+MAX_DELAY_SEC=30
+CACHE_MULT=6
+; CONF variabili da recuperare in WebPage (stato macchina, contatori, variabili, ...)
+LUT_CONF=EM63.json
+timerIntMs=10
+
+[BRANCH]
+NAME=master
diff --git a/IOB-WIN-FILE/DATA/CONF/EM63.json b/IOB-WIN-FILE/DATA/CONF/EM63.json
new file mode 100644
index 00000000..26ca3b51
--- /dev/null
+++ b/IOB-WIN-FILE/DATA/CONF/EM63.json
@@ -0,0 +1,188 @@
+{
+ "BaseDir": "C:\\NPM_E63\\E63\\MPW280SP",
+ "CleanupExt": [
+ "*.dat",
+ "*.job",
+ "*.log",
+ "*.req",
+ "*.rsp"
+ ],
+ "DynData": [
+ {
+ "key": "CLOCK_1",
+ "name": "CLOCK_1",
+ "val": "ct4",
+ "unit": "DateTime",
+ "func": "CHANGE",
+ "sPeriod": 10
+ },
+ {
+ "key": "CLOCK_2",
+ "name": "CLOCK_2",
+ "val": "ct4",
+ "unit": "DateTime",
+ "func": "SAMPLE",
+ "sPeriod": 10
+ }
+ ],
+ "PzPallet": 24,
+ "ActiveSessions": {
+ "0": {
+ "Cycle": false,
+ "Description": "Check Connection Status",
+ "Max2Keep": 10,
+ "RetrySec": 20,
+ "SessionName": "SESS0000",
+ "SessionType": "IsConnected",
+ "StepOrder": 0,
+ "ValidityMinutes": 0.0,
+ "FileList": [
+ {
+ "Path": "EUR63_JOB\\SESS0000.REQ",
+ "OprReq": "Copy"
+ }
+ ]
+ },
+ "1": {
+ "Cycle": false,
+ "Description": "Get ID data",
+ "Max2Keep": 10,
+ "RetrySec": 10,
+ "SessionName": "SESS0001",
+ "SessionType": "GetId",
+ "StepOrder": 1,
+ "ValidityMinutes": 0.0,
+ "FileList": [
+ {
+ "Path": "EUR63_JOB\\SESS0001.JOB",
+ "OprReq": "Copy"
+ },
+ {
+ "Path": "EUR63_JOB\\SESS0001.REQ",
+ "OprReq": "Copy"
+ }
+ ]
+ },
+ "2": {
+ "Cycle": false,
+ "Description": "Set DateTime on machine at start",
+ "RetrySec": 10,
+ "SessionName": "SESS0002",
+ "SessionType": "SetDateTime",
+ "ValidityMinutes": 0.0,
+ "Max2Keep": 10,
+ "StepOrder": 2,
+ "FileList": [
+ {
+ "Path": "EUR63_JOB\\SESS0002.JOB",
+ "OprReq": "ReplaceAndCopy"
+ },
+ {
+ "Path": "EUR63_JOB\\SESS0002.REQ",
+ "OprReq": "Copy"
+ }
+ ]
+ },
+ "3": {
+ "Cycle": false,
+ "Description": "Abort All prev requests",
+ "RetrySec": 10,
+ "SessionName": "SESS0003",
+ "SessionType": "AbortAll",
+ "ValidityMinutes": 0.0,
+ "Max2Keep": 10,
+ "StepOrder": 3,
+ "FileList": [
+ {
+ "Path": "EUR63_JOB\\SESS0003.JOB",
+ "OprReq": "Copy"
+ },
+ {
+ "Path": "EUR63_JOB\\SESS0003.REQ",
+ "OprReq": "Copy"
+ }
+ ]
+ },
+ "4": {
+ "Cycle": true,
+ "Description": "Get Machine Status",
+ "RetrySec": 30,
+ "SessionName": "SESS0004",
+ "SessionType": "GetStatus",
+ "ValidityMinutes": 10.0,
+ "Max2Keep": 120,
+ "StepOrder": 4,
+ "FileList": [
+ {
+ "Path": "EUR63_JOB\\SESS0004.JOB",
+ "OprReq": "Copy"
+ },
+ {
+ "Path": "EUR63_JOB\\SESS0004.REQ",
+ "OprReq": "Copy"
+ }
+ ]
+ },
+ "5": {
+ "Cycle": true,
+ "Description": "Get Production",
+ "RespOk": "PROCESSED|already running",
+ "RetrySec": 30,
+ "SessionName": "SESS0005",
+ "SessionType": "GetProduction",
+ "ValidityMinutes": 10.0,
+ "Max2Keep": 120,
+ "StepOrder": 5,
+ "FileList": [
+ {
+ "Path": "EUR63_JOB\\SESS0005.JOB",
+ "OprReq": "Copy"
+ },
+ {
+ "Path": "EUR63_JOB\\SESS0005.REQ",
+ "OprReq": "Copy"
+ }
+ ]
+ },
+ "10": {
+ "Cycle": false,
+ "Description": "Set Param ODL at Setup",
+ "RetrySec": 30,
+ "SessionName": "SESS0010",
+ "SessionType": "SetParamOdl",
+ "ValidityMinutes": 0.0,
+ "Max2Keep": 10,
+ "StepOrder": 10,
+ "FileList": [
+ {
+ "Path": "EUR63_JOB\\SESS0010.JOB",
+ "OprReq": "ReplaceAndCopy"
+ },
+ {
+ "Path": "EUR63_JOB\\SESS0010.REQ",
+ "OprReq": "Copy"
+ }
+ ]
+ },
+ "19": {
+ "Cycle": false,
+ "Description": "Get INFO data",
+ "Max2Keep": 10,
+ "RetrySec": 30,
+ "SessionName": "SESS0019",
+ "SessionType": "GetInfo",
+ "StepOrder": 19,
+ "ValidityMinutes": 0.0,
+ "FileList": [
+ {
+ "Path": "EUR63_JOB\\SESS0019.JOB",
+ "OprReq": "Copy"
+ },
+ {
+ "Path": "EUR63_JOB\\SESS0019.REQ",
+ "OprReq": "Copy"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-FILE/DATA/CONF/IMI_SOITAAB_Z2342_02.ini b/IOB-WIN-FILE/DATA/CONF/IMI_SOITAAB_Z2342_02.ini
new file mode 100644
index 00000000..1055e433
--- /dev/null
+++ b/IOB-WIN-FILE/DATA/CONF/IMI_SOITAAB_Z2342_02.ini
@@ -0,0 +1,87 @@
+;Configurazione IOB-WIN
+[IOB]
+;Accesso gestione sync con FILE SOITAAB
+CNCTYPE=FILE_SOITAAB
+PING_MS_TIMEOUT=500
+MinDeltaSec=5
+IOB_NAME=IMI_SOITAAB_Z2342
+DIS_EXE_TASK=TRUE
+DIS_STATE_CH=FALSE
+
+[MACHINE]
+VENDOR=SOITAAB
+MODEL=Ossitaglio Z2342
+
+[CNC]
+;IP=ecs900
+IP=172.28.30.53
+PORT=0
+GETPRGNAME=false
+
+[SERVER]
+MPIP=http://192.168.0.110
+MPURL=/MP/IO
+CMDBASE=/IOB/input/
+CMDFLOG=/IOB/flog/
+CMDALIVE=/IOB
+CMDENABLED=/IOB/enabled/
+CMDADV1=?valore=
+CMDREBO=/sendReboot.aspx?idxMacchina=
+CMDRAWTRANSF=/IOB/rawTransfJson/
+
+[MEMORY]
+ADDR_READ=DB9999.DBB0
+ADDR_WRITE=DB9999.DBB0
+SIZE_READ=0
+SIZE_WRITE=0
+;BIT0=CONN
+;BIT1=DB60.DBB1
+;BIT2=PZCOUNT.STD.DB700.DBW22
+;BIT3=DB60.DBB3
+;BIT4=DB60.DBB4
+
+
+[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]
+AUTO_CHANGE_ODL=false
+CHANGE_ODL_MODE=TIME
+CHANGE_ODL_HOURS=24
+CHANGE_ODL_IDLE_MIN=5
+PZCOUNT_MODE=SOITAAB
+DISABLE_PZCOUNT=FALSE
+ENABLE_SEND_PZC_BLOCK=TRUE
+MIN_SEND_PZC_BLOCK=0
+MAX_SEND_PZC_BLOCK=100
+ENABLE_DYN_DATA=TRUE
+FORCE_DYN_DATA=TRUE
+DEM_FACT_DYN_DATA=5
+ENABLE_DATA_FILTER=TRUE
+ENABLE_CLI_RESTART=TRUE
+DISABLE_SEND_WDST=TRUE
+VetoReadSec=5
+EnabelPodlManFull=true
+CodGruppoIob=GRP-CC-025
+; invio flux alla lettura file
+sendFluxOnRead=true
+
+; clock base (da 10ms)
+timerIntMs=20
+
+; conf parametri memoria READ/WRITE
+PARAM_CONF=IMI_SOITAAB_Z2342_02.json
+
+[BRANCH]
+NAME=master
\ No newline at end of file
diff --git a/IOB-WIN-FILE/DATA/CONF/IMI_SOITAAB_Z2342_02.json b/IOB-WIN-FILE/DATA/CONF/IMI_SOITAAB_Z2342_02.json
new file mode 100644
index 00000000..b689eced
--- /dev/null
+++ b/IOB-WIN-FILE/DATA/CONF/IMI_SOITAAB_Z2342_02.json
@@ -0,0 +1,10 @@
+{
+ "mMapWrite": {
+ },
+ "mMapRead": {
+ },
+ "optKVP": {
+ //"path-remBase": "C:\\Temp"
+ "path-remBase": "\\\\ecs900\\Logs"
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-FILE/DATA/CONF/MAIN.ini b/IOB-WIN-FILE/DATA/CONF/MAIN.ini
new file mode 100644
index 00000000..bdc436ad
--- /dev/null
+++ b/IOB-WIN-FILE/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_SOITAAB_Z2342_02
+STARTLIST=IMI_SOITAAB_Z2342_02
+
+
+MAXCNC=10
\ No newline at end of file
diff --git a/IOB-WIN-FILE/DATA/CONF/SIMUL_01.ini b/IOB-WIN-FILE/DATA/CONF/SIMUL_01.ini
new file mode 100644
index 00000000..08975356
--- /dev/null
+++ b/IOB-WIN-FILE/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-FILE/DATA/CONF/SIMUL_01.json b/IOB-WIN-FILE/DATA/CONF/SIMUL_01.json
new file mode 100644
index 00000000..d2895eb1
--- /dev/null
+++ b/IOB-WIN-FILE/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-FILE/DATA/CONF/SIMUL_01_WD.ini b/IOB-WIN-FILE/DATA/CONF/SIMUL_01_WD.ini
new file mode 100644
index 00000000..56bca173
--- /dev/null
+++ b/IOB-WIN-FILE/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-FILE/DATA/CONF/SIMUL_01_alarm.json b/IOB-WIN-FILE/DATA/CONF/SIMUL_01_alarm.json
new file mode 100644
index 00000000..4f6ed310
--- /dev/null
+++ b/IOB-WIN-FILE/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-FILE/IOB-WIN-FILE.csproj b/IOB-WIN-FILE/IOB-WIN-FILE.csproj
new file mode 100644
index 00000000..3af5b7e6
--- /dev/null
+++ b/IOB-WIN-FILE/IOB-WIN-FILE.csproj
@@ -0,0 +1,196 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {FBA5A5AE-9CBE-4DC9-AC1B-44E9B087BBCA}
+ WinExe
+ IOB_WIN_FILE
+ IOB-WIN-FILE
+ 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\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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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-FILE/Iob/GenericNext.cs b/IOB-WIN-FILE/Iob/GenericNext.cs
new file mode 100644
index 00000000..523363a5
--- /dev/null
+++ b/IOB-WIN-FILE/Iob/GenericNext.cs
@@ -0,0 +1,17 @@
+using IOB_UT_NEXT;
+using System;
+using System.IO;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace IOB_WIN_FILE.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-FILE/IobFile/FileEurom63.cs b/IOB-WIN-FILE/IobFile/FileEurom63.cs
new file mode 100644
index 00000000..f96c139f
--- /dev/null
+++ b/IOB-WIN-FILE/IobFile/FileEurom63.cs
@@ -0,0 +1,923 @@
+using IOB_UT_NEXT;
+using MapoSDK;
+using Newtonsoft.Json;
+using System;
+using System.Globalization;
+using System.IO;
+using System.Text.RegularExpressions;
+using System.Threading;
+using System.Windows.Forms;
+
+namespace IOB_WIN_FILE.IobFile
+{
+ public class FileEurom63 : IobFile.FileGen
+ {
+ #region Public Constructors
+
+ ///
+ /// Estende l'init della classe base...
+ ///
+ ///
+ ///
+ public FileEurom63(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
+ {
+ lgInfo("INIT IobFileEurom63");
+ appPath = Path.GetDirectoryName(Application.ExecutablePath);
+
+ string MAX_DELAY_SEC = getOptPar("MAX_DELAY_SEC");
+ string CACHE_MULT = getOptPar("CACHE_MULT");
+ int.TryParse(MAX_DELAY_SEC, out maxDelaySec);
+ int.TryParse(CACHE_MULT, out cacheMult);
+
+#if DEBUG
+ maxDelaySec = 60 * 60 * 24;
+#endif
+ }
+
+ #endregion Public Constructors
+
+ #region Public Methods
+
+ ///
+ /// Effettua vero processing contapezzi
+ ///
+ public override void processContapezzi()
+ {
+ if (utils.CRB("enableContapezzi"))
+ {
+ try
+ {
+ // controllo se sono in sampling della produzione
+ if (actLevel >= Eurom63.ComLevel.ProdRequested)
+ {
+ /************************************************************
+ *
+ * EXAMPLE
+ * DATE, TIME, ActCntCyc, ActTimCyc, ActTimFill, @OutXhour, SetDescJob
+ * 20201007, 21:29:52, 5302, 8.61, 0.50, 10058, Nr. 1000987654.01
+ *
+ * devo prendere il 3° valore
+ *
+ *
+ ************************************************************/
+
+ // leggo il file della produzione HARD CODED...
+ var sessProd = confE63.ActiveSessions[5];
+ string currPzCount = "";
+ if (sessProd != null)
+ {
+ if (sessProd.Active)
+ {
+ // nome file...
+ string fileName = $"{BaseDir}\\{sessProd.SessionName}.DAT";
+ if (File.Exists(fileName))
+ {
+ string rawData = "";
+ using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
+ using (var textReader = new StreamReader(fileStream))
+ {
+ rawData = textReader.ReadToEnd();
+ }
+ // ora splitto in linee
+ string[] rawLines = Regex.Split(rawData, "\r\n|\r|\n");
+ int numRow = rawLines.Length;
+
+ // devo avere almeno 2 righe...
+ if (numRow >= 2)
+ {
+ string[] statusData = rawLines[1].Split(',');
+ currPzCount = statusData[2].Trim();
+ // salvo se valido
+ if (!string.IsNullOrEmpty(currPzCount))
+ {
+ int newVal = -1;
+ Int32.TryParse(currPzCount, out newVal);
+ // verifico SE il contapezzi vada moltiplicato x il
+ // fattore pzPallet...
+ if (confE63.PzPallet > 1)
+ {
+ newVal = newVal * confE63.PzPallet;
+ }
+ // aggiorno contapezzi
+ contapezziPLC = newVal > -1 ? newVal : contapezziPLC;
+ }
+ // ora verifico SE siano validi anche le dataora dei valori
+ // letti (< 20 sec ritardo da ora...)
+ string data = statusData[0].Trim();
+ string ora = statusData[1].Trim();
+ DateTime adesso = DateTime.Now;
+ DateTime lastPub = adesso.AddMinutes(-1);
+ CultureInfo provider = CultureInfo.InvariantCulture;
+ try
+ {
+ lastPub = DateTime.ParseExact($"{data} {ora}", "yyyyMMdd HH:mm:ss", provider);
+ }
+ catch
+ { }
+ if (Math.Abs(lastPub.Subtract(adesso).TotalSeconds) > maxDelaySec)
+ {
+ sessProd.SessionValidUntil = adesso;
+ // elimino file RSP...
+ cleanupResp(sessProd.SessionName);
+ }
+ }
+ }
+ }
+ else
+ {
+ actLevel = Eurom63.ComLevel.StatusRequested;
+ }
+ }
+ else
+ {
+ actLevel = Eurom63.ComLevel.StatusRequested;
+ }
+ }
+ }
+ catch (Exception exc)
+ {
+ lgError($"Eccezione in processContapezzi:{Environment.NewLine}{exc}");
+ }
+ }
+ }
+
+ ///
+ /// Effettua lettura semafori principale Parametri da
+ /// aggiornare x display in form
+ ///
+ public override void readSemafori(ref newDisplayData currDispData)
+ {
+ base.readSemafori(ref currDispData);
+ // in primis controllo status...
+ checkCommStatus();
+
+ // init a zero...
+ B_input = 0;
+ string currStatus = "99999";
+ bool readDone = false;
+ DateTime adesso = DateTime.Now;
+ // leggo il file dela produzione HARD CODED...
+ var sessStatus = confE63.ActiveSessions[4];
+ // ciclo!
+ try
+ {
+ // controllo se sono in sampling dello stato
+ if (actLevel >= Eurom63.ComLevel.StatusRequested)
+ {
+ /* -----------------------------------------------------
+ * bitmap MAPO
+ * B0: POWER_ON
+ * B1: RUN
+ * B2: pzCount
+ * B3: allarme
+ * B4: manuale
+ * B5: allarme TCiclo (SLOW)
+ * B6: avvio/spegnimento
+ * B7: Emergenza armata (1= pronto, 0 = emergenza) --> DA INVIARE!!!
+ ----------------------------------------------------- */
+
+ /******************************************************************
+ *
+ * EXAMPLE file content
+ * DATE, TIME, ActStsMach
+ * 20201007, 21:28:10, 0A000
+ *
+ * Configurazione array status: 5 char status decoding
+ *
+ * Pos1: (status)
+ * 0: poweron
+ * 1: poweroff
+ *
+ * Pos2: (mode)
+ * A: AUTO
+ * S: SEMI auto
+ * M: Manual
+ * U: Setup
+ * H: Hord
+ * C: Maintenance
+ * 0: Unknown
+ * I: Idle
+ *
+ * Pos3: (assist call)
+ * 0: No assistance
+ * 2: Assistance required
+ *
+ * Pos4: (Bad part)
+ * 0: last cycle not bad
+ * 1: last cycle bad
+ *
+ * Pos5: Active Alarm
+ * 0: No alarm
+ * 1: Alarm
+ *
+ *
+ *
+ *******************************************************************/
+
+ if (sessStatus != null)
+ {
+ if (sessStatus.Active)
+ {
+ // nome file...
+ string fileName = $"{BaseDir}\\{sessStatus.SessionName}.DAT";
+ if (File.Exists(fileName))
+ {
+ string rawData = "";
+ using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
+ using (var textReader = new StreamReader(fileStream))
+ {
+ rawData = textReader.ReadToEnd();
+ }
+ if (!string.IsNullOrEmpty(rawData))
+ {
+ // ora splitto in linee
+ string[] rawLines = Regex.Split(rawData, "\r\n|\r|\n");
+ int numRow = rawLines.Length;
+
+ // devo avere almeno 2 righe...
+ if (numRow >= 2)
+ {
+ string[] statusData = rawLines[1].Split(',');
+ if (statusData.Length >= 3)
+ {
+ currStatus = statusData[2].Trim();
+ if (!string.IsNullOrEmpty(currStatus))
+ {
+ currDispData.semIn = Semaforo.SV;
+ }
+ // salvo in cache!
+ Last_CurrStatus.Value = currStatus;
+ Last_CurrStatus.ValidUntil = DateTime.Now.AddSeconds(maxDelaySec * cacheMult);
+
+ // ora verifico SE siano validi anche le dataora dei
+ // valori letti (< 20 sec ritardo da ora...)
+ string data = statusData[0].Trim();
+ string ora = statusData[1].Trim();
+ DateTime lastPub = adesso.AddMinutes(-1);
+ CultureInfo provider = CultureInfo.InvariantCulture;
+ try
+ {
+ lastPub = DateTime.ParseExact($"{data} {ora}", "yyyyMMdd HH:mm:ss", provider);
+ }
+ catch
+ { }
+ if (Math.Abs(lastPub.Subtract(adesso).TotalSeconds) > maxDelaySec)
+ {
+ sessStatus.SessionValidUntil = adesso;
+ // elimino file RSP...
+ cleanupResp(sessStatus.SessionName);
+ }
+ readDone = true;
+ }
+ else
+ {
+ lgError($"Decodifica StatusData in errore: trovati {statusData.Length} campi in {rawLines}");
+ // se valido RILEGGO ultimo curr status
+ if (Last_CurrStatus.ValidUntil > adesso)
+ {
+ currStatus = Last_CurrStatus.Value;
+ }
+ }
+ }
+ else
+ {
+ lgError($"Lettura file stato in errore: trovate {numRow} linee");
+ }
+ }
+ // se valido RILEGGO ultimo curr status
+ if (Last_CurrStatus.ValidUntil > adesso)
+ {
+ currStatus = Last_CurrStatus.Value;
+ }
+ }
+ else
+ {
+ // se valido RILEGGO ultimo curr status
+ if (Last_CurrStatus.ValidUntil > adesso)
+ {
+ currStatus = Last_CurrStatus.Value;
+ }
+ // abbasso status...
+ actLevel--;
+ }
+ }
+ else
+ {
+ // se valido RILEGGO ultimo curr status
+ if (Last_CurrStatus.ValidUntil > adesso)
+ {
+ currStatus = Last_CurrStatus.Value;
+ }
+ }
+ }
+ else
+ {
+ // se valido RILEGGO ultimo curr status
+ if (Last_CurrStatus.ValidUntil > adesso)
+ {
+ currStatus = Last_CurrStatus.Value;
+ }
+ }
+
+ // processo il currentStatus... parto da poweron
+ B_input = currStatus[0] == '1' ? 0 : 1;
+
+ // aggiungo il bit NON emergenza
+ B_input += (1 << 7);
+
+ // ora MODE
+ switch (currStatus[1])
+ {
+ case 'A':
+ B_input += (1 << 1);
+ break;
+
+ case 'S':
+ case 'M':
+ case 'U':
+ B_input += (1 << 4);
+ break;
+
+ default:
+ // loggo cosa trovo (CREDO
+ break;
+ }
+ // ora cerco allarmi
+ if (currStatus[4] == '1')
+ {
+ B_input += (1 << 3);
+ }
+ // controllo se diverso faccio log!
+ if (!B_input.Equals(Last_B_Input.Value))
+ {
+ lgInfo($"B_Input variato: {Last_B_Input.Value} --> {B_input} | currStatus: {currStatus}");
+ }
+ // salvo B_Input in cache!
+ Last_B_Input.Value = B_input;
+ Last_B_Input.ValidUntil = DateTime.Now.AddSeconds(maxDelaySec * cacheMult);
+ }
+ // se disponibile riporto B_Input precedente
+ else
+ {
+ if (Last_B_Input.ValidUntil > adesso)
+ {
+ B_input = Last_B_Input.Value;
+ }
+ }
+ // riporto bitmap...
+ reportRawInput(ref currDispData);
+ }
+ catch (Exception exc)
+ {
+ lgError(exc, "Errore in readSemafori x IOB FILE");
+ if (currDispData != null)
+ currDispData.semIn = Semaforo.SR;
+ }
+
+ // ultimo controllo...
+ if (!readDone)
+ {
+ // se valido RILEGGO ultimo B_INPUT
+ if (Last_B_Input.ValidUntil > adesso)
+ {
+ B_input = Last_B_Input.Value;
+ }
+ }
+ }
+
+ ///
+ /// Effettua reset del contapezzi, NON PERMESSO per EM63 (read only)
+ ///
+ ///
+ public override bool resetContapezziPLC()
+ {
+ bool answ = false;
+ return answ;
+ }
+
+ ///
+ /// Effettua IMPOSTAZIONE FORZATA del contapezzi, NON PERMESSO per EM63 (read only)
+ ///
+ ///
+ public override bool setcontapezziPLC(int newPzCount)
+ {
+ bool answ = false;
+ return answ;
+ }
+
+ ///
+ /// Connessione
+ ///
+ public override void tryConnect()
+ {
+ var nextLevel = Eurom63.ComLevel.IsConnected;
+ var connectSession = confE63.ActiveSessions[0];
+ processSession(nextLevel, ref connectSession);
+ queueInEnabCurr = true;
+ }
+
+ ///
+ /// Disconnessione
+ ///
+ public override void tryDisconnect()
+ {
+ connectionOk = false;
+ queueInEnabCurr = false;
+ try
+ {
+ abortPrevJob();
+ cleanupFolder();
+ }
+ catch (Exception exc)
+ {
+ lgError(exc, "Eccezione in tryDisconnect");
+ }
+ }
+
+ #endregion Public Methods
+
+ #region Internal Methods
+
+ ///
+ /// Metodi preliminari x comunicazione:
+ /// - richiesta connessione
+ /// - richiesta stato attivo
+ ///
+ internal void checkCommStatus()
+ {
+ // init obj display
+ newDisplayData currDispData = new newDisplayData();
+ currDispData.semIn = Semaforo.ND;
+
+ switch (actLevel)
+ {
+ case Eurom63.ComLevel.None:
+ tryConnect();
+ currDispData.semIn = Semaforo.SS;
+ break;
+
+ case Eurom63.ComLevel.IsConnected:
+ requestInfo();
+ currDispData.semIn = Semaforo.SS;
+ break;
+
+ case Eurom63.ComLevel.HasInfo:
+ setMachineTime();
+ currDispData.semIn = Semaforo.SS;
+ break;
+
+ case Eurom63.ComLevel.TimeSet:
+ abortPrevJob();
+ currDispData.semIn = Semaforo.SG;
+ break;
+
+ case Eurom63.ComLevel.ChannelOk:
+ requestStatusData();
+ currDispData.semIn = Semaforo.SG;
+ break;
+
+ case Eurom63.ComLevel.StatusRequested:
+ requestProdData();
+ currDispData.semIn = Semaforo.SV;
+ break;
+
+ case Eurom63.ComLevel.ProdRequested:
+ checkSampling();
+ currDispData.semIn = Semaforo.SV;
+ break;
+
+ default:
+ break;
+ }
+ if (utils.CRB("verbose"))
+ {
+ lgInfo($"DONE checkCommStatus | actLevel {actLevel}");
+ }
+ raiseRefresh(currDispData);
+ }
+
+ ///
+ /// Pulizia preliminare folder comunicazione
+ ///
+ internal override void cleanupFolder()
+ {
+ // elimino OGNI file per tipo configurato
+ foreach (var cleanExt in confE63.cleanupExt)
+ {
+ string[] file2del = Directory.GetFiles(BaseDir, cleanExt);
+ foreach (var file in file2del)
+ {
+ try
+ {
+ File.Delete(file);
+ }
+ catch
+ { }
+ }
+ }
+ }
+
+ ///
+ /// Pulizia folder dai file RSP della sessione
+ ///
+ internal void cleanupResp(string sessionName)
+ {
+ string[] file2del = Directory.GetFiles(BaseDir, $"{sessionName}.RSP");
+ foreach (var file in file2del)
+ {
+ try
+ {
+ File.Delete(file);
+ }
+ catch
+ { }
+ }
+ }
+
+ ///
+ /// Ricarica conf adapter...
+ ///
+ internal override void reloadAdapterConf()
+ {
+ // init obj display
+ newDisplayData currDispData = new newDisplayData();
+ lgInfo("BEGIN reloadAdapterConf");
+ // inizializzo LUT decodifica
+ string jsonConf = getOptPar("LUT_CONF");
+ if (!string.IsNullOrEmpty(jsonConf))
+ {
+ string jsonFullPath = $"{Application.StartupPath}/DATA/CONF/{jsonConf}";
+ lgInfo($"Apertura file {jsonFullPath}");
+ StreamReader reader = new StreamReader(jsonFullPath);
+ string jsonData = reader.ReadToEnd();
+ if (!string.IsNullOrEmpty(jsonData))
+ {
+ try
+ {
+ confE63 = JsonConvert.DeserializeObject(jsonData);
+
+ // salvo baseUri
+ BaseDir = confE63.BaseDir;
+ lgInfo($"baseDir = {BaseDir}");
+ // imposto a zero la bitmap x riavvio!
+ B_input = 0;
+ // FORZO invio dati...
+ accodaSigIN(ref currDispData);
+ // loggo!
+ lgInfo($"init input bitmap to zero: {B_input}");
+ }
+ catch (Exception exc)
+ {
+ lgError(exc, "Eccezione in decodifica conf json");
+ }
+ }
+ reader.Dispose();
+ }
+ lgInfo("DONE reloadAdapterConf");
+ raiseRefresh(currDispData);
+ }
+
+ #endregion Internal Methods
+
+ #region Protected Fields
+
+ protected static DateTime lastStatusDecr = DateTime.Now;
+
+ ///
+ /// step di comunicazione attivo
+ ///
+ protected Eurom63.ComLevel actLevel = Eurom63.ComLevel.None;
+
+ ///
+ /// DIrectory eseguibile corrente
+ ///
+ protected string appPath = Directory.GetCurrentDirectory();
+
+ ///
+ /// Moltiplicatore durata cache
+ ///
+ protected int cacheMult = 4;
+
+ ///
+ /// Oggetti decodificati da pagina
+ ///
+ protected Eurom63.ProtoConf confE63;
+
+ ///
+ /// Valore currStatus validato (per gestione "disconnessioni")
+ ///
+ protected CachedInt Last_B_Input = new CachedInt() { Value = 0 };
+
+ ///
+ /// Valore currStatus validato (per gestione "disconnessioni")
+ ///
+ protected CachedString Last_CurrStatus = new CachedString() { Value = "00000" };
+
+ ///
+ /// Massimo delay lettura dati prima di considerarli scaduti (30 sec, ma x test 1 gg)
+ ///
+ protected int maxDelaySec = 30;
+
+ #endregion Protected Fields
+
+ #region Protected Methods
+
+ protected void abortPrevJob()
+ {
+ var nextLevel = Eurom63.ComLevel.ChannelOk;
+ var connectSession = confE63.ActiveSessions[3];
+ processSession(nextLevel, ref connectSession);
+#if false
+ // qui per sicurezza PULISCE TUTTO
+ cleanupFolder();
+#endif
+ }
+
+ ///
+ /// Verifica una sessione configurata (ovvero la comunicazione su TUTTI i file associati)
+ ///
+ ///
+ ///
+ protected bool checkRequest(Eurom63.Session session)
+ {
+ bool answ = false;
+ string fileName = "";
+ if (session != null)
+ {
+ fileName = $"{BaseDir}\\{session.SessionName}.REQ";
+ answ = File.Exists(fileName);
+ }
+ return answ;
+ }
+
+ ///
+ /// Verifica se ci sia una risposta POSITIVA
+ ///
+ ///
+ ///
+ protected bool checkResp(Eurom63.Session session)
+ {
+ bool answ = false;
+ string fileName = "";
+ if (session != null)
+ {
+ fileName = $"{BaseDir}\\{session.SessionName}.RSP";
+ if (File.Exists(fileName))
+ {
+ // verifico contenuto
+ //string rawData = File.ReadAllText(fileName);
+ string rawData = "";
+ // lettura in modo NON esclusivo...
+ using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
+ using (var textReader = new StreamReader(fileStream))
+ {
+ rawData = textReader.ReadToEnd();
+ }
+ // se la stringa session.RespOk contiene | significa ci sono + valori ammessi e
+ // li controlla tutti
+ if (session.RespOk.Contains("|"))
+ {
+ // splitto e testo tutti...
+ string[] validRespOk = session.RespOk.Split('|');
+ foreach (var item in validRespOk)
+ {
+ answ = answ || rawData.Contains(item);
+ }
+ }
+ else
+ {
+ answ = rawData.Contains(session.RespOk);
+ }
+ }
+ }
+ return answ;
+ }
+
+ ///
+ /// verifica periodica dei campionamenti:
+ /// - i due jobs devono essere attivi e non scaduti
+ /// - non devo aver già resettato...
+ ///
+ protected void checkSampling()
+ {
+ var currSession = confE63.ActiveSessions[4];
+ checkSessionActive(currSession, Eurom63.ComLevel.ChannelOk);
+
+ currSession = confE63.ActiveSessions[5];
+ checkSessionActive(currSession, Eurom63.ComLevel.ChannelOk);
+ }
+
+ ///
+ /// Elimina i file della sessione indicata (SE è un task ciclico --> solo RSP)
+ ///
+ ///
+ ///
+ protected bool cleanupSession(Eurom63.Session session)
+ {
+ bool answ = false;
+ if (session != null)
+ {
+ // solo se scaduta validità ...
+ if (session.SessionValidUntil < DateTime.Now)
+ {
+ string searchPattern = $"{session.SessionName}.*";
+ // task ciclico?
+ if (session.Cycle)
+ {
+ // solo risposta!
+ searchPattern = $"{session.SessionName}.RSP";
+ }
+ string[] file2del = Directory.GetFiles(BaseDir, searchPattern);
+ foreach (var file in file2del)
+ {
+ try
+ {
+ File.Delete(file);
+ }
+ catch
+ { }
+ }
+ }
+ }
+ return answ;
+ }
+
+ ///
+ /// Processa una sessione
+ /// - andando a verificare l'esistenza della REQ + se esito positivo pulizia
+ /// - andando a richeidere di nuovo risposta
+ ///
+ ///
+ ///
+ protected void processSession(Eurom63.ComLevel nextLevel, ref Eurom63.Session connectSession)
+ {
+ if (connectSession != null)
+ {
+ // controllo esistenza directory --> segno connected...
+ connectionOk = Directory.Exists(BaseDir);
+ DateTime adesso = DateTime.Now;
+ if (connectionOk)
+ {
+ // verifico se ci sia risp CONNECT
+ if (checkResp(connectSession))
+ {
+ // aggiorno livello
+ actLevel = nextLevel;
+ parentForm.displayTaskAndLog($"Adp Level: {nextLevel}");
+ // elimino file sessione
+ cleanupSession(connectSession);
+ connectSession.Active = connectSession.Cycle;
+ connectSession.Passed = true;
+ }
+ // verifico SE ci sia la richiesta sennò la chiedo...
+ else if (!checkRequest(connectSession))
+ {
+ copyRequestFiles(connectSession, adesso);
+ }
+ // richiedo SE non ci fosse i dati CONNECT...
+ else
+ {
+ // evito di richiedere SE non fosse già scaduta richiesta...
+ if (adesso > connectSession.RetryVeto || !checkRequest(connectSession))
+ {
+ // pulisco eventuali risp vecchie
+ cleanupResp(connectSession.SessionName);
+ copyRequestFiles(connectSession, adesso);
+ }
+ }
+ }
+ else
+ {
+ // aspetto prima di riprovare...
+ Thread.Sleep(50);
+ }
+ }
+ else
+ {
+ // aspetto prima di riprovare...
+ Thread.Sleep(50);
+ }
+ }
+
+ ///
+ /// Processa i file della sessione indicata (copy + transform)
+ ///
+ ///
+ ///
+ protected bool processSessionFile(Eurom63.Session session)
+ {
+ bool answ = false;
+ if (session != null)
+ {
+ string fileFrom = "";
+ string fileTo = "";
+ // processo OGNI file sessione x farne copia
+ foreach (var file2Proc in session.FileList)
+ {
+ fileFrom = $"{appPath}\\{file2Proc.Path}";
+ fileTo = $"{BaseDir}\\{Path.GetFileName(file2Proc.Path)}";
+ string rawData = File.ReadAllText(fileFrom);
+
+ if (file2Proc.OprReq == Eurom63.FileOpr.Copy)
+ {
+ // scrivo!
+ File.WriteAllText(fileTo, rawData);
+ }
+ else
+ {
+ // leggo file originale... e processo sostituzioni
+ rawData = rawData.Replace("{DTNow}", DateTime.Now.ToString("HHmmssyyyyMMdd"));
+ // ora in posizione definitiva
+ File.WriteAllText(fileTo, rawData);
+ }
+ }
+ }
+ return answ;
+ }
+
+ ///
+ /// Effettua richiesta info x macchina (validare startup process)
+ ///
+ protected void requestInfo()
+ {
+ var nextLevel = Eurom63.ComLevel.HasInfo;
+ var connectSession = confE63.ActiveSessions[1];
+ processSession(nextLevel, ref connectSession);
+ }
+
+ protected void requestProdData()
+ {
+ var nextLevel = Eurom63.ComLevel.ProdRequested;
+ var connectSession = confE63.ActiveSessions[5];
+ processSession(nextLevel, ref connectSession);
+ }
+
+ protected void requestStatusData()
+ {
+ var nextLevel = Eurom63.ComLevel.StatusRequested;
+ var connectSession = confE63.ActiveSessions[4];
+ processSession(nextLevel, ref connectSession);
+ }
+
+ protected void setMachineTime()
+ {
+ var nextLevel = Eurom63.ComLevel.TimeSet;
+ var connectSession = confE63.ActiveSessions[2];
+ processSession(nextLevel, ref connectSession);
+ }
+
+ #endregion Protected Methods
+
+ #region Private Methods
+
+ ///
+ /// Se la sessione fosse scaduta o non attiva --> torna al livello indicato
+ ///
+ ///
+ private void checkSessionActive(Eurom63.Session currSession, Eurom63.ComLevel nextLevel)
+ {
+ // SOLO SE ha senso che controllo (sono in sampling...)
+ if (actLevel > Eurom63.ComLevel.HasInfo)
+ {
+ DateTime adesso = DateTime.Now;
+ // devono essere ATTIVE le sessioni di campionamento... e NON scadute
+ if (!currSession.Active || currSession.SessionValidUntil < adesso)
+ {
+ // controllo ultimo downgrade status
+ if (lastStatusDecr.AddSeconds(3) < adesso)
+ {
+ // elimino TUTTE le risposte...
+ cleanupResp(currSession.SessionName);
+ // registro downgrade status...
+ lastStatusDecr = adesso;
+ // imposto livellotornando indietro di 1 alla volta... senza andare in negativoS
+ actLevel = actLevel - 1;
+ actLevel = actLevel > 0 ? actLevel : 0;
+ lgInfo($"Sessione inattiva, {actLevel + 1} --> {actLevel}");
+ }
+ }
+ }
+ }
+
+ ///
+ /// Effettua copia file richeiste + update timing
+ ///
+ ///
+ ///
+ private void copyRequestFiles(Eurom63.Session connectSession, DateTime adesso)
+ {
+ // processo richiesta
+ processSessionFile(connectSession);
+ if (adesso > connectSession.SessionValidUntil)
+ {
+ connectSession.Active = !connectSession.Cycle;
+ }
+ connectSession.Passed = false;
+ connectSession.SessionStarted = adesso;
+ connectSession.SessionValidUntil = adesso.AddMinutes(connectSession.ValidityMinutes);
+ connectSession.RetryVeto = adesso.AddSeconds(connectSession.RetrySec);
+ }
+
+ #endregion Private Methods
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-FILE/IobFile/FileGen.cs b/IOB-WIN-FILE/IobFile/FileGen.cs
new file mode 100644
index 00000000..8903419d
--- /dev/null
+++ b/IOB-WIN-FILE/IobFile/FileGen.cs
@@ -0,0 +1,358 @@
+using IOB_UT_NEXT;
+using MapoSDK;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+
+namespace IOB_WIN_FILE.IobFile
+{
+ ///
+ /// Generica classe per implementare IOB basato su scambio FILE
+ ///
+ public class FileGen : Iob.GenericNext, IDisposable
+ {
+ /* --------------------------------------------------------------------------------
+ * Controlli dotati di GENERICA funzionalità scambio info tramite file
+ *
+ * -------------------------------------------------------------------------------- */
+
+ #region Public Constructors
+
+ ///
+ /// Estende l'init della classe base...
+ ///
+ ///
+ ///
+ public FileGen(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
+ {
+ lgInfo("INIT FileGen");
+ //reloadAdapterConf();
+ }
+
+ #endregion Public Constructors
+
+ #region Public Methods
+
+ public void Dispose()
+ {
+ GC.SuppressFinalize(this);
+ }
+
+ ///
+ /// Recupero dati dinamici in formato dictionary
+ ///
+ ///
+ public override Dictionary getDynData()
+ {
+ lgInfo("Chiamata getDynData x IOB FILE!");
+ Dictionary outVal = new Dictionary();
+#if false
+ try
+ {
+ /* ----------------------------------------------------------
+ * Recupero dalla TUTTE le chiavi richieste...
+ * */
+
+ string cKey = "";
+ string cVal = "";
+ // processo tutti i DynData...
+ foreach (var item in monitoredItems.DynData)
+ {
+ // cerco elemento indicato
+ element = driver.FindElement(By.Id(item.val));
+ cVal = element.Text;
+ // verifico nome o key...
+ if (!string.IsNullOrEmpty(item.name))
+ {
+ cKey = item.name;
+ }
+ else
+ {
+ element = driver.FindElement(By.Id(item.key));
+ cKey = element.Text;
+ }
+ // controllo se devo inviare (per tipo di dato, x scadenza)
+ if (monItem2Send(cVal, item))
+ {
+ item.actVal = cVal;
+ item.DTScad = DateTime.Now.AddSeconds(item.sPeriod);
+ // accodo!
+ outVal.Add(cKey, cVal);
+ }
+ }
+ }
+ catch (Exception exc)
+ {
+ lgError(exc, "Errore in getDynData x IOB FILE");
+ }
+#endif
+ return outVal;
+ }
+
+ ///
+ /// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
+ ///
+ public override void processOverride()
+ {
+ }
+
+ ///
+ /// Effettua lettura semafori principale
+ /// Parametri da aggiornare x display in form
+ ///
+ public override void readSemafori(ref newDisplayData currDispData)
+ {
+ base.readSemafori(ref currDispData);
+ // init a zero...
+ B_input = 0;
+ // ciclo!
+ try
+ {
+#if false
+ // controllo SE il driver SIA attivo...
+ if (driver != null)
+ {
+ string cKey = "";
+ string cVal = "";
+ // IPOTESI: un UNICO oggetto decodifica status
+ if (monitoredItems.Status.Count == 1)
+ {
+ var item = monitoredItems.Status[0];
+ // cerco elemento indicato
+ element = driver.FindElement(By.Id(item.val));
+ cKey = element.Text;
+ // verifico se mancasse il mapping...
+ if (!item.codeMapping.ContainsKey(cKey))
+ {
+ processUnknStatus(cKey);
+ }
+ else
+ {
+ // ora decodifico da variabile status a valore secondo impostazione "codeMapping"
+ cVal = item.codeMapping[cKey];
+ B_input = int.Parse(cVal, System.Globalization.NumberStyles.HexNumber);
+ if (currDispData != null)
+ {
+ currDispData.semIn = Semaforo.SV;
+ }
+ }
+ }
+ }
+ else
+ {
+ lgError("Errore: driver non pronto (null)");
+ }
+#endif
+ // riporto bitmap...
+ reportRawInput(ref currDispData);
+ }
+ catch (Exception exc)
+ {
+ lgError(exc, "Errore in readSemafori x IOB FILE");
+ if (currDispData != null)
+ currDispData.semIn = Semaforo.SR;
+ }
+ }
+
+ public override void startAdapter(bool resetQueue)
+ {
+ // in primis RICARICO conf specifica...
+ reloadAdapterConf();
+ // pulizia preliminare folder
+ cleanupFolder();
+ // continuo con start...
+ base.startAdapter(resetQueue);
+ }
+
+ ///
+ /// Override x chiusura driver...
+ ///
+ ///
+ ///
+ public override void stopAdapter(bool tryRestart, bool forceDequeue)
+ {
+ try
+ {
+#if false
+ // in primis chiudo driver...
+ if (driver != null)
+ {
+ driver.Quit();
+ }
+#endif
+ }
+ catch (Exception exc)
+ {
+ lgError(exc, "Eccezione in tryDisconnect");
+ }
+ // continuo
+ base.stopAdapter(tryRestart, forceDequeue);
+ }
+
+ ///
+ /// Connessione
+ ///
+ public override void tryConnect()
+ {
+ // controllo ping --> segno connected...
+ connectionOk = Directory.Exists(BaseDir);
+ if (connectionOk)
+ {
+ queueInEnabCurr = true;
+#if false
+ try
+ {
+ // modalità sincrona
+ startDriver();
+ lgInfo("Completato start driver");
+ }
+ catch (Exception exc)
+ {
+ lgError(exc, "Eccezione in tryConnect");
+ }
+#endif
+ }
+ else
+ {
+ // aspetto prima di riprovare...
+ Thread.Sleep(200);
+ }
+ }
+
+ ///
+ /// Disconnessione
+ ///
+ public override void tryDisconnect()
+ {
+ connectionOk = false;
+ queueInEnabCurr = false;
+ try
+ {
+#if false
+ // in primis chiudo driver...
+ if (driver != null)
+ //if (driver != null && driver.WindowHandles.Count > 0)
+ {
+ driver.Quit();
+ }
+#endif
+ }
+ catch (Exception exc)
+ {
+ lgError(exc, "Eccezione in tryDisconnect");
+ }
+ }
+
+ #endregion Public Methods
+
+ #region Internal Methods
+
+ ///
+ /// Pulizia preliminare folder comunicazione
+ ///
+ internal virtual void cleanupFolder()
+ {
+
+ }
+
+ ///
+ /// Ricarica conf adapter...
+ ///
+ internal virtual void reloadAdapterConf()
+ {
+#if false
+ // init obj display
+ newDisplayData currDispData = new newDisplayData();
+ lgInfo("BEGIN reloadAdapterConf");
+ // inizializzo LUT decodifica
+ string jsonConf = getOptPar("LUT_CONF");
+ if (!string.IsNullOrEmpty(jsonConf))
+ {
+ string jsonFullPath = $"{Application.StartupPath}/DATA/CONF/{jsonConf}";
+ lgInfo($"Apertura file {jsonFullPath}");
+ StreamReader reader = new StreamReader(jsonFullPath);
+ string jsonData = reader.ReadToEnd();
+ if (!string.IsNullOrEmpty(jsonData))
+ {
+ try
+ {
+ monitoredItems = JsonConvert.DeserializeObject(jsonData);
+ // salvo baseUri
+ baseDir = monitoredItems.SrvData.baseUri;
+ lgInfo($"baseUri = {baseDir}");
+ // imposto a zero la bitmap x riavvio!
+ B_input = 0;
+ // FORZO invio dati...
+ accodaSigIN(ref currDispData);
+ // loggo!
+ lgInfo($"init input bitmap to zero: {B_input}");
+ }
+ catch (Exception exc)
+ {
+ lgError(exc, "Eccezione in decodifica conf json");
+ }
+ }
+ reader.Dispose();
+ }
+ lgInfo("DONE reloadAdapterConf");
+ raiseRefresh(currDispData);
+#endif
+ }
+
+ #endregion Internal Methods
+
+ #region Protected Fields
+
+ ///
+ /// Cartella di base per interscambio
+ ///
+ protected string BaseDir = @"C:\Steamware";
+
+ ///
+ /// Array di configurazione degli oggetti da cercare x decodifica e recupero info
+ ///
+ protected Dictionary dataLocatorLUT;
+
+ ///
+ /// Vettore della frequenza di ogni status trovato... invio ogni 100 rilevazioni (modulo
+ /// 100, resto == 1)
+ ///
+ protected Dictionary freqUnknStatus = new Dictionary();
+
+ #endregion Protected Fields
+
+ #region Private Methods
+
+ ///
+ /// Processo stati unknown...
+ ///
+ ///
+ private void processUnknStatus(string cKey)
+ {
+ // cerco se avevo già una key nella dictionary...
+ if (freqUnknStatus.ContainsKey(cKey))
+ {
+ freqUnknStatus[cKey]++;
+ // se è 1 ogni 100 (%100, resto ==1) --> loggo...
+ if (freqUnknStatus[cKey] % 100 == 1)
+ {
+ lgInfo($"Errore in decodifica status: MAPPING non trovato per {cKey} | freq: {freqUnknStatus[cKey]}");
+ // accodo come invio di tipo FLOG...
+ string sVal = string.Format("[UnknStatus] {0}, freq: {1}", cKey, freqUnknStatus);
+ // chiamo accodamento...
+ accodaFLog(sVal, qEncodeFLog("UnknStatus", sVal));
+ }
+ }
+ else
+ {
+ // creo chiave con freq = 1
+ freqUnknStatus.Add(cKey, 1);
+ // log iniziale
+ lgInfo($"Errore in decodifica status: MAPPING non trovato per {cKey}");
+ }
+ }
+
+ #endregion Private Methods
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-FILE/IobFile/IobFileSoitaab.cs b/IOB-WIN-FILE/IobFile/IobFileSoitaab.cs
new file mode 100644
index 00000000..59b2b4c4
--- /dev/null
+++ b/IOB-WIN-FILE/IobFile/IobFileSoitaab.cs
@@ -0,0 +1,629 @@
+#if false
+using EgwProxy.SqlDb.DbModels;
+#endif
+using IOB_UT_NEXT;
+using MapoSDK;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net.NetworkInformation;
+using static IOB_UT_NEXT.CustomObj;
+
+namespace IOB_WIN_FILE.IobFile
+{
+ ///
+ /// Adapter specializzato per SOITAAB x la SOLA lettura stato macchina da log, da accoppiare a
+ /// adapter x IOB LANTEK x scrittura PODL
+ /// - IN: LOGFile macchina diretto
+ /// - OUT: --> sigLog
+ /// --> fluxLog
+ ///
+
+ public class IobFileSoitaab : Iob.GenericNext
+ {
+ #region Public Constructors
+
+ ///
+ /// Costruttore dell'IOB FileBased SOITAAB
+ ///
+ /// AdapterForm chiamante
+ /// Configurazione IOB per avvio
+ public IobFileSoitaab(AdapterFormNext caller, IobConfiguration IOBConf) : base(caller, IOBConf)
+ {
+ DateTime adesso = DateTime.Now;
+ string VetoReadSec = getOptPar("VetoReadSec");
+
+ setupSpecialParams();
+ if (pathList.ContainsKey("path-remBase"))
+ {
+ logDirPath = pathList["path-remBase"];
+ }
+ // fix parametri veto
+ if (!string.IsNullOrEmpty(VetoReadSec))
+ {
+ int.TryParse(VetoReadSec, out vetoReadFileSec);
+ }
+
+ string sFluxOnRead = getOptPar("sendFluxOnRead");
+ if (!string.IsNullOrEmpty("sendFluxOnRead"))
+ {
+ bool.TryParse(sFluxOnRead, out sendFluxOnRead);
+ }
+
+ // init a zero....
+ B_input = 0;
+
+ // provo prima lettura logfile
+ try
+ {
+ // eseguo subito un ciclo acquisizione log + processing
+ bool acquireLog = getRemoteLog();
+ if (acquireLog)
+ {
+ bool sentSignLog = processSignLogTable(adesso);
+ }
+ }
+ catch (Exception exc)
+ {
+ lgError($"Eccezione in IobFileSoitaab{Environment.NewLine}{exc}");
+ }
+
+ lastPING = DateTime.Now.AddHours(-1);
+ }
+
+ #endregion Public Constructors
+
+ #region Public Methods
+
+ ///
+ /// Implementazione custom esecuzione task specifici
+ ///
+ ///
+ ///
+ public override Dictionary executeTasks(Dictionary task2exe)
+ {
+ DateTime adesso = DateTime.Now;
+ // NON fa nulla... anche se non dovrebbe richiamarlo
+ Dictionary taskDone = new Dictionary();
+ lastReadPLC = DateTime.Now;
+ return taskDone;
+ }
+
+ ///
+ /// Recupero dati dinamici...
+ ///
+ public override Dictionary getDynData()
+ {
+ DateTime adesso = DateTime.Now;
+ // dizionario vuoto / faccio direttamente accodamento in FluxLog
+ Dictionary outVal = new Dictionary();
+ // processo ed accodo!
+ processFluxLogTable(adesso);
+ lastReadPLC = DateTime.Now;
+ return outVal;
+ }
+
+ ///
+ /// Effettua lettura semafori principale Parametri da
+ /// aggiornare x display in form
+ ///
+ public override void readSemafori(ref newDisplayData currDispData)
+ {
+ DateTime adesso = DateTime.Now;
+ if (connectionOk)
+ {
+ // controllo veto checkDB
+ if (adesso > vetoDataRead)
+ {
+ // predispongo prox veto...
+ vetoDataRead = adesso.AddSeconds(vetoReadFileSec);
+ // semaforo
+ currDispData.semIn = Semaforo.SV;
+ // verifico SignLog e processo
+ bool acquireLog = getRemoteLog();
+ bool sentSignLog = processSignLogTable(adesso);
+ // verifico ProdData e processo
+ bool sentProdData = processProdDataTable(adesso);
+ }
+ }
+ else
+ {
+ B_input = 0;
+ currDispData.semIn = Semaforo.SR;
+ }
+ }
+
+ ///
+ /// 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("FileSoitaab: ConnKO - tryConnect");
+ }
+ // in primis salvo data ping...
+ lastPING = DateTime.Now;
+ // se passa il ping faccio il resto...
+ if (testPingMachine == IPStatus.Success)
+ {
+ string szStatusConnection = "";
+ try
+ {
+ // ora provo connessione...
+ parentForm.commPlcActive = true;
+
+ // connessione OK se oltre al PING riesco a leggere la folder di base
+ if (Directory.Exists(logDirPath))
+ {
+ parentForm.commPlcActive = false;
+ connectionOk = true;
+ }
+ // refresh stato connessione!!!
+ if (connectionOk)
+ {
+ queueInEnabCurr = true;
+ if (adpRunning)
+ {
+ lgInfo($"Connessione OK alla folder {logDirPath}");
+ lastReadPLC = DateTime.Now;
+ }
+ }
+ else
+ {
+ lgError("Impossibile procedere, connessione mancante...");
+ }
+ }
+ catch (Exception exc)
+ {
+ lgFatal($"Errore nella connessione all'adapter IobFileSoitaab: {szStatusConnection}{Environment.NewLine}{exc}");
+ connectionOk = false;
+ lgInfo($"Eccezione in TryConnect, Adapter IobFileSoitaab NON running, pausa di {utils.CRI("waitRecMSec")} msec prima di ulteriori tentativi di riconnessione");
+ }
+ }
+ else
+ {
+ // loggo no risposta ping ...
+ connectionOk = false;
+ B_input = 0;
+ if (verboseLog || periodicLog)
+ {
+ lgInfo($"Attenzione: IobFileSoitaab controllo PING fallito per IP {cIobConf.cncPingAddr}");
+ }
+ }
+ }
+ }
+ else
+ {
+ needRefresh = true;
+ }
+ }
+
+ public override void tryDisconnect()
+ {
+ // registro solo che è disconnesso
+ connectionOk = false;
+ queueInEnabCurr = false;
+ }
+
+ #endregion Public Methods
+
+ #region Protected Fields
+
+ protected bool sendFluxOnRead = false;
+ protected int vetoReadFileSec = 3;
+
+ #endregion Protected Fields
+
+ #region Protected Properties
+
+#if false
+ ///
+ /// Stato di sync delle tab gestite
+ ///
+ protected List elencoSyncState { get; set; } = new List();
+#endif
+
+ #endregion Protected Properties
+
+ #region Protected Methods
+
+ ///
+ /// Conversione string row in log generico
+ ///
+ ///
+ ///
+ protected override GenLogRow convertToMachineLog(string dailyLog)
+ {
+ GenLogRow answ = new GenLogRow();
+ if (!string.IsNullOrEmpty(dailyLog))
+ {
+ // preventivamente: doppio ";;" --> ";"
+ dailyLog = dailyLog.Replace(";;", ";");
+ var sSplit = dailyLog.Split(';');
+ answ.dtRif = DateTime.ParseExact($"{sSplit[0]} {sSplit[1]}", "yyyy-M-d HH:mm:ss", null);
+ answ.valString = $"{sSplit[2]};{sSplit[3]}";
+ }
+ return answ;
+ }
+
+ ///
+ /// Recupera file log da analizzare
+ ///
+ ///
+ protected override bool getRemoteLog()
+ {
+ bool answ = false;
+ bool pingOk = testPingMachine == IPStatus.Success;
+ if (pingOk && Directory.Exists(logDirPath))
+ {
+ string filePath = Path.Combine(logDirPath, $"Report-{DateTime.Today.Day}.txt");
+ bool hasDaily = File.Exists(filePath);
+ // cerco file quotidiano...
+ if (!hasDaily)
+ {
+ var fileList = Directory.GetFiles(logDirPath, "Report-*.txt");
+ DateTime lastMod = DateTime.Today.AddYears(-1);
+ foreach (var cFile in fileList)
+ {
+ var tempFile = Path.Combine(logDirPath, cFile);
+ var lwTime = File.GetLastWriteTime(tempFile);
+ if (lwTime >= lastMod)
+ {
+ lastMod = lwTime;
+ filePath = tempFile;
+ }
+ }
+ }
+ // leggo file
+ string rawVal = File.ReadAllText(Path.Combine(logDirPath, filePath));
+ if (!string.IsNullOrEmpty(rawVal))
+ {
+ // salvo in redis
+ string redKey = redisMan.redHash($"IOB:CurrData:{cIobConf.codIOB}:LogFile:Act");
+ redisMan.setRSV(redKey, rawVal);
+ answ = true;
+ }
+ }
+ return answ;
+ }
+
+ #endregion Protected Methods
+
+ #region Private Properties
+
+ private string logDirPath { get; set; } = "\\\\ecs900\\Logs";
+
+ #endregion Private Properties
+
+ #region Private Methods
+
+ private static int decodeSoitaabLog(string val2test)
+ {
+ // di default NON EMERGENZA...
+ int valInt = 128;
+ switch (val2test)
+ {
+ case "START;1":
+ valInt = 1 + 2 + 128;
+ break;
+
+ case "END;1":
+ valInt = 1 + 128;
+ break;
+
+ case "START;0":
+ case "END;0":
+ case "HOLD;":
+ valInt = 1 + 16 + 128;
+ break;
+
+ default:
+ break;
+ }
+
+ return valInt;
+ }
+
+ ///
+ /// Esegue processing + invio dati tab SignLog
+ ///
+ ///
+ ///
+ private bool processFluxLogTable(DateTime adesso)
+ {
+ bool fatto = false;
+ // leggo eventuali dati di fluxlog ed invio...
+ if (fluxLogData != null && fluxLogData.Count > 0)
+ {
+ string sVal = "";
+ foreach (var fLog2send in fluxLogData)
+ {
+ var kvpFlux = fLog2send.valString.Split(';');
+ if (kvpFlux.Count() > 1)
+ {
+ sVal = $"[DYNDATA] |{fLog2send.dtRif:yyyy-MM-dd HH:mm:ss}|{kvpFlux[0]}|{kvpFlux[1]}";
+ // chiamo accodamento con dataora corretta...
+ accodaFLog(sVal, qEncodeFLog(fLog2send.dtRif, kvpFlux[0], kvpFlux[1]));
+ }
+ }
+ // svuoto coda invio fluxlog...
+ fluxLogData = new List();
+ // fatto!
+ fatto = true;
+ }
+ return fatto;
+ }
+
+ ///
+ /// Esegue processing + invio dati tab ProdData
+ ///
+ ///
+ ///
+ private bool processProdDataTable(DateTime adesso)
+ {
+ bool fatto = false;
+ return fatto;
+ }
+
+ ///
+ /// Esegue processing + invio dati tab SignLog
+ ///
+ ///
+ ///
+ private bool processSignLogTable(DateTime adesso)
+ {
+ bool fatto = false;
+ // init oggetto x processing
+ Dictionary sigLogFromFile = new Dictionary();
+ // recupero i dati dai logs files, attuale e nuovo...
+ string fileAct = redisMan.getRSV(redKeyLogfileAct);
+ string fileLast = redisMan.getRSV(redKeyLogfileLast);
+ // confronto con i dati dell'ultimo LOG FILE processato
+ int lenghtAct = fileAct != null ? fileAct.Length : 0;
+ int lenghtLast = fileLast != null ? fileLast.Length : 0;
+ //if (lenghtAct > 0 && lenghtAct != lenghtLast)
+ if (lenghtAct > 0)
+ {
+ List logNew = new List();
+ List sigLogData = new List();
+ List logLast = getGenLogFromMachineLog(fileLast);
+ List logAct = getGenLogFromMachineLog(fileAct);
+ // SE c'è prendo ultima riga inviata x confronto...
+ var fileLastEnd = logLast.LastOrDefault();
+ if (fileLastEnd != null)
+ {
+ // ora prendo SOLAMENTE le righe nuove
+ logNew = logAct
+ .Where(x => x.dtRif > fileLastEnd.dtRif)
+ .OrderBy(x => x.dtRif)
+ .ToList();
+ }
+ else
+ {
+ logNew = logAct;
+ }
+ // solo SE ho nuovi dati....
+ if (logNew.Count > 0)
+ {
+ // processo le righe nuove e le accodo in redis come elenco FluxLog da inviare
+ // (appoggio in redis)... andando ad accodarle...
+ var currFLD = fluxLogData;
+ currFLD.AddRange(logNew);
+ fluxLogData = currFLD;
+
+ // estraggo solo info x sig log
+ sigLogData = logNew
+ .Where(x => x.valString.StartsWith("START") || x.valString.StartsWith("HOLD") || x.valString.StartsWith("END"))
+ .OrderBy(x => x.dtRif)
+ .ToList();
+
+ // processo le righe nuove trasformando al volo SOLO eventi...
+ foreach (var sLog2send in sigLogData)
+ {
+ /* -----------------------------------------------------
+ * bitmap MAPO STANDARD 60
+ * B0: 001 POWER_ON
+ * B1: 002 RUN
+ * B2: 004 pzCount
+ * B3: 008 allarme
+ * B4: 016 manuale
+ * B5: 032 slowTC
+ * B6: 064 WarmUpCoolDown
+ * B7: 128 EmergArmata
+ *
+ ----------------------------------------------------- */
+
+ int valInt = decodeSoitaabLog(sLog2send.valString);
+
+ string currVal = getEncodSigLog(sLog2send.dtRif, valInt, counterSigIN);
+ // verifico non sia in veto invio iniziale...
+ if (queueInEnabCurr)
+ {
+ // --> accodo (valore già formattato)!
+ QueueIN.Enqueue(currVal);
+ // loggo!
+ lgTrace(string.Format("[QUEUE-IN] {0}", currVal));
+ counterSigIN++;
+ if (counterSigIN > 9999)
+ {
+ counterSigIN = 0;
+ }
+ }
+ else
+ {
+ lgDebug($"[VETO FOR QUEUE-IN] | {currVal} - MESSAGE NOT SENT | {adesso:yyyyMMdd_HHmmss}");
+ checkVetoQueueIn();
+ }
+ }
+
+ /* ----------------------------------------------------------
+ * processo righe x costruire una lista di eventi produzione:
+ * - elenco di eventi contapezzi
+ * - lista xODL come articolo + quantità prodotta (_1, _2, ...)
+ * - eventuale ultimo xODL che resta aperto
+ *
+ * successivamente processing + invio info raccolte
+ * - recupero PODL aperti
+ * - apertura/chiusura PODL esistenti
+ * - creazione PODL mancanti
+ * - dichiarazione contapezzi
+ *
+ * ---------------------------------------------------------- */
+
+ string sVal = "";
+ string descrArt = "";
+ List elencoProdBatch = new List();
+ ProdBatchData lastProdBatch = new ProdBatchData();
+
+ // ora processo TUTTO x il generico caso fluxLog......
+ foreach (var fLog2send in logNew)
+ {
+ // separo per ";"
+ var currData = fLog2send.valString.Split(';');
+ if (currData.Length > 1)
+ {
+ if (sendFluxOnRead)
+ {
+ // per prima cosa fluxLog a prescindere...
+ sVal = $"[LOGFILE]{currData[0]}|{currData[1]}";
+ // ...e chiamo accodamento
+ accodaFLog(sVal, qEncodeFLog(fLog2send.dtRif, currData[0], currData[1]));
+ }
+
+ switch (currData[0])
+ {
+ case "END":
+ // se è un end --> è comunque NON + runnning
+ isRunningState = false; // chiudo batch precedente + in elenco (SE era valido...)
+ if (!string.IsNullOrEmpty(lastProdBatch.codArt))
+ {
+ lastProdBatch.dtEnd = fLog2send.dtRif;
+ elencoProdBatch.Add(lastProdBatch);
+ }
+ // reset articolo..
+ lastArtDescr = "";
+ // nuovo batch VUOTO
+ lastProdBatch = new ProdBatchData();
+ contapezziPLC = 0;
+ break;
+
+ case "START":
+ isRunningState = currData[1] == "1";
+ break;
+
+ case "PARTCODE":
+ // inizio confronto articolo con precedente x capire se sia NUOVO
+ descrArt = currData[1];
+ // devo scartare i "doppi percorsi"
+ if (descrArt != lastArtDescr)
+ {
+ // verifico se sia DAVVERO cambiato articolo... prendo
+ // articolo senza indice (_1, _2, _3, ...)
+ var artDataLast = lastArtDescr.Split('_');
+ var artDataNew = descrArt.Split('_');
+ // nuovo articolo (NON vuoto)
+ if (!string.IsNullOrEmpty(artDataNew[0]) && artDataLast[0] != artDataNew[0])
+ {
+ // chiudo batch precedente + in elenco (SE era valido...)
+ if (!string.IsNullOrEmpty(lastProdBatch.codArt))
+ {
+ // chiudo prod
+ lastProdBatch.dtEnd = fLog2send.dtRif;
+ elencoProdBatch.Add(lastProdBatch);
+ }
+ // nuovo batch
+ lastProdBatch = new ProdBatchData()
+ {
+ codArt = artDataNew[0],
+ dtStart = fLog2send.dtRif,
+ numPz = 1
+ };
+ }
+ // solo nuova copia articolo
+ else
+ {
+ // aumento numPezzi batch
+ lastProdBatch.numPz++;
+ }
+
+ // salvo nuovo art processato
+ lastArtDescr = descrArt;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ // recupero elenco PODL corrente...
+ List reqPOdlList = MachineNextPodl();
+ // adesso processo tutti i prodBatch collezionati x invio
+ foreach (var item in elencoProdBatch)
+ {
+ int currIdxPOdl = 0;
+ // cerco se articolo sia in elenco PODL
+ var listPOdl = reqPOdlList
+ .Where(x => x.CodArticolo.Equals(item.codArt, StringComparison.InvariantCultureIgnoreCase))
+ .ToList();
+
+ // se trovato --> invio start/stop PODL
+ if (listPOdl != null && listPOdl.Count > 0)
+ {
+ var currPodl = listPOdl.FirstOrDefault();
+ if (currPodl != null)
+ {
+ currIdxPOdl = currPodl.IdxPromessa;
+ // elimino da elenco PODL
+ reqPOdlList.Remove(currPodl);
+ }
+ }
+ else
+ {
+ // se NON trovato --> creo PODL, poi avvio/chiudo
+ currIdxPOdl = TryCreatePodl(item.codArt, CodGruppoIob, item.numPz);
+ }
+ // se idxPOdl valido
+ if (currIdxPOdl > 0)
+ {
+ // mando apertura PODL
+ SendStartPodl(currIdxPOdl, item.dtStart);
+ // chiudo PODL...
+ if (item.dtEnd != null)
+ {
+ // invio pezzi 3 sec prima di chiusura
+ SendPzIncrAtDate(item.numPz, ((DateTime)item.dtEnd).AddSeconds(-3));
+ // chiudo
+ SendClosePOdl(currIdxPOdl, (DateTime)item.dtEnd);
+ }
+ }
+ }
+
+ // salvo in last il valore di act...
+ redisMan.setRSV(redKeyLogfileLast, fileAct);
+
+ // calcolo B_input valido
+ var lastRec = sigLogData.LastOrDefault();
+ if (lastRec != null)
+ {
+ // salvo in B_input ultimo valore letto...
+ int lastValInt = decodeSoitaabLog(lastRec.valString);
+ B_input = lastValInt;
+ }
+ }
+ fatto = true;
+ }
+ return fatto;
+ }
+
+ #endregion Private Methods
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-FILE/MainFormNext.cs b/IOB-WIN-FILE/MainFormNext.cs
new file mode 100644
index 00000000..bfe925fc
--- /dev/null
+++ b/IOB-WIN-FILE/MainFormNext.cs
@@ -0,0 +1,40 @@
+using IOB_UT_NEXT;
+using IOB_WIN_FILE.Iob;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IOB_WIN_FILE
+{
+ 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-FILE/NLog.config b/IOB-WIN-FILE/NLog.config
new file mode 100644
index 00000000..cd1bcc98
--- /dev/null
+++ b/IOB-WIN-FILE/NLog.config
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IOB-WIN-FILE/Program.cs b/IOB-WIN-FILE/Program.cs
new file mode 100644
index 00000000..56962f30
--- /dev/null
+++ b/IOB-WIN-FILE/Program.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Windows.Forms;
+
+namespace IOB_WIN_FILE
+{
+ 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-FILE/Properties/AssemblyInfo.cs b/IOB-WIN-FILE/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..d7c5fb54
--- /dev/null
+++ b/IOB-WIN-FILE/Properties/AssemblyInfo.cs
@@ -0,0 +1,18 @@
+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-FILE")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyProduct("IOB-WIN-FILE")]
+[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)]
diff --git a/IOB-WIN-FILE/Properties/Resources.Designer.cs b/IOB-WIN-FILE/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..6f127a7f
--- /dev/null
+++ b/IOB-WIN-FILE/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_FILE.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_FILE.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-FILE/Properties/Resources.resx b/IOB-WIN-FILE/Properties/Resources.resx
new file mode 100644
index 00000000..af7dbebb
--- /dev/null
+++ b/IOB-WIN-FILE/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-FILE/Properties/Settings.Designer.cs b/IOB-WIN-FILE/Properties/Settings.Designer.cs
new file mode 100644
index 00000000..17aa149f
--- /dev/null
+++ b/IOB-WIN-FILE/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_FILE.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-FILE/Properties/Settings.settings b/IOB-WIN-FILE/Properties/Settings.settings
new file mode 100644
index 00000000..39645652
--- /dev/null
+++ b/IOB-WIN-FILE/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/IOB-WIN-FILE/Resources/ChangeLog.html b/IOB-WIN-FILE/Resources/ChangeLog.html
new file mode 100644
index 00000000..7ab91d78
--- /dev/null
+++ b/IOB-WIN-FILE/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:
+
+
+ -
+ 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-FILE/Resources/Circuit.ico b/IOB-WIN-FILE/Resources/Circuit.ico
new file mode 100644
index 00000000..a05b27a6
Binary files /dev/null and b/IOB-WIN-FILE/Resources/Circuit.ico differ
diff --git a/IOB-WIN-FILE/Resources/Net.ico b/IOB-WIN-FILE/Resources/Net.ico
new file mode 100644
index 00000000..a33a9eca
Binary files /dev/null and b/IOB-WIN-FILE/Resources/Net.ico differ
diff --git a/IOB-WIN-FILE/Resources/STEAM-IOB-WIN.xml b/IOB-WIN-FILE/Resources/STEAM-IOB-WIN.xml
new file mode 100644
index 00000000..ba4e78f6
Binary files /dev/null and b/IOB-WIN-FILE/Resources/STEAM-IOB-WIN.xml differ
diff --git a/IOB-WIN-FILE/Resources/Start-IOB-WIN.bat b/IOB-WIN-FILE/Resources/Start-IOB-WIN.bat
new file mode 100644
index 00000000..3f8ecaa1
--- /dev/null
+++ b/IOB-WIN-FILE/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-FILE/Resources/SteamWare.ico b/IOB-WIN-FILE/Resources/SteamWare.ico
new file mode 100644
index 00000000..70ccadaf
Binary files /dev/null and b/IOB-WIN-FILE/Resources/SteamWare.ico differ
diff --git a/IOB-WIN-FILE/Resources/logoSteamware.png b/IOB-WIN-FILE/Resources/logoSteamware.png
new file mode 100644
index 00000000..0958b50a
Binary files /dev/null and b/IOB-WIN-FILE/Resources/logoSteamware.png differ
diff --git a/IOB-WIN-FILE/Resources/manifest.xml b/IOB-WIN-FILE/Resources/manifest.xml
new file mode 100644
index 00000000..f66a7e99
--- /dev/null
+++ b/IOB-WIN-FILE/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-FILE/logs/.placeholder.txt b/IOB-WIN-FILE/logs/.placeholder.txt
new file mode 100644
index 00000000..5f282702
--- /dev/null
+++ b/IOB-WIN-FILE/logs/.placeholder.txt
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/IOB-WIN-FILE/packages.config b/IOB-WIN-FILE/packages.config
new file mode 100644
index 00000000..1981bc6a
--- /dev/null
+++ b/IOB-WIN-FILE/packages.config
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/IOB-WIN-FILE/postBuildTgt.bat b/IOB-WIN-FILE/postBuildTgt.bat
new file mode 100644
index 00000000..e90f5712
--- /dev/null
+++ b/IOB-WIN-FILE/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-FILE-DEB /MIR
+REM Baglietto
+REM ROBOCOPY %2 \\192.168.60.15\Steamware\IOB-WIN-FILE-DEB /MIR
+REM GIACOVELLI LOCOROTONDO
+REM ROBOCOPY %2 \\192.168.1.93\Steamware\IOB-WIN-FILE-DEB /MIR
+REM IMI Remosa
+REM ROBOCOPY %2 \\192.168.0.12\Steamware\IOB-WIN-FILE-DEB /MIR
+
+REM IOB-WIN-SIM
+REM ROBOCOPY %2 \\IOB-WIN-SIMULA\Steamware\IOB-WIN-FILE-DEB /MIR
+
+REM IOBVPN4MACHINE
+REM ROBOCOPY %2 \\10.51.90.5\Steamware\IOB-WIN-FILE-DEB /MIR
+REM ROBOCOPY %2 \\10.51.90.5\Steamware\IOB-WIN-FILE-DEB /MIR /log:RobocopyTransfer.log
+REM ROBOCOPY %2 Z:\IOB-WIN-FILE-DEB /MIR
+REM ROBOCOPY %2 \\10.51.90.10\Steamware\IOB-WIN-FILE-DEB /MIR
+ROBOCOPY %2 \\10.51.90.9\Steamware\IOB-WIN-FILE-DEB /MIR
+
+goto END
+
+:END
+echo Fatto!
\ No newline at end of file
diff --git a/IOB-WIN-FILE/setupTgt.bat b/IOB-WIN-FILE/setupTgt.bat
new file mode 100644
index 00000000..ba685c02
--- /dev/null
+++ b/IOB-WIN-FILE/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-FILE/temp/.placeholder b/IOB-WIN-FILE/temp/.placeholder
new file mode 100644
index 00000000..5f282702
--- /dev/null
+++ b/IOB-WIN-FILE/temp/.placeholder
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/AdapterFormNext.cs b/IOB-WIN-NEXT/AdapterFormNext.cs
index 418652c6..2da82a1f 100644
--- a/IOB-WIN-NEXT/AdapterFormNext.cs
+++ b/IOB-WIN-NEXT/AdapterFormNext.cs
@@ -44,6 +44,7 @@ namespace IOB_WIN_NEXT
btnStart.Enabled = true;
break;
+#if false
case tipoAdapter.FILE_GEN:
iobObj = new IobFile.FileGen(this, IOBConf);
btnStart.Enabled = true;
@@ -54,7 +55,6 @@ namespace IOB_WIN_NEXT
btnStart.Enabled = true;
break;
-#if false
case tipoAdapter.FILE_SOITAAB:
iobObj = new IobFile.IobFileSoitaab(this, IOBConf);
btnStart.Enabled = true;
diff --git a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
index 257f6b78..4b7d37b6 100644
--- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
+++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
@@ -395,10 +395,8 @@
-
-
@@ -543,8 +541,6 @@
Always
-
-
Always
@@ -600,6 +596,7 @@
+
diff --git a/IOB-WIN-NEXT/postBuildTgt.bat b/IOB-WIN-NEXT/postBuildTgt.bat
index a910c07a..f5d0a60a 100644
--- a/IOB-WIN-NEXT/postBuildTgt.bat
+++ b/IOB-WIN-NEXT/postBuildTgt.bat
@@ -1,51 +1,6 @@
@echo off
echo Inizio processing After Build: configurazione %1 , directory %2
-RD /S /Q %2"\lib\ar"
-RD /S /Q %2"\lib\cs"
-RD /S /Q %2"\lib\da"
-RD /S /Q %2"\lib\de"
-RD /S /Q %2"\lib\es"
-RD /S /Q %2"\lib\fr"
-RD /S /Q %2"\lib\it"
-RD /S /Q %2"\lib\ja-JP"
-RD /S /Q %2"\lib\ko"
-RD /S /Q %2"\lib\lv"
-RD /S /Q %2"\lib\nl"
-RD /S /Q %2"\lib\pl"
-RD /S /Q %2"\lib\pt"
-RD /S /Q %2"\lib\pt-BR"
-RD /S /Q %2"\lib\ru"
-RD /S /Q %2"\lib\sk"
-RD /S /Q %2"\lib\sv"
-RD /S /Q %2"\lib\th"
-RD /S /Q %2"\lib\tr"
-RD /S /Q %2"\lib\zh"
-RD /S /Q %2"\lib\zh-TW"
-
-MOVE /Y %2"ar" %2"lib\"
-MOVE /Y %2"cs" %2"lib\"
-MOVE /Y %2"da" %2"lib\"
-MOVE /Y %2"de" %2"lib\"
-MOVE /Y %2"es" %2"lib\"
-MOVE /Y %2"fr" %2"lib\"
-MOVE /Y %2"it" %2"lib\"
-MOVE /Y %2"ja-JP" %2"lib\"
-MOVE /Y %2"ko" %2"lib\"
-MOVE /Y %2"lv" %2"lib\"
-MOVE /Y %2"nl" %2"lib\"
-MOVE /Y %2"pl" %2"lib\"
-MOVE /Y %2"pt" %2"lib\"
-MOVE /Y %2"pt-BR" %2"lib\"
-MOVE /Y %2"ru" %2"lib\"
-MOVE /Y %2"sk" %2"lib\"
-MOVE /Y %2"sv" %2"lib\"
-MOVE /Y %2"th" %2"lib\"
-MOVE /Y %2"tr" %2"lib\"
-MOVE /Y %2"zh" %2"lib\"
-MOVE /Y %2"zh-TW" %2"lib\"
-
-
if %1 == "Release" goto ReleaseExec
if %1 == Release goto ReleaseExec
if %1 == "Debug" goto DebugExec