From ae931a255d8718d4493211c093e5665d89f582d9 Mon Sep 17 00:00:00 2001
From: aschwinn <al.schwinn@gsi.de>
Date: Tue, 6 Jun 2017 15:12:54 +0200
Subject: [PATCH] Bug 1407 - Remove Plugin specific design validation Rules

---
 .../src/xml/fesa/fesa_3_0_0/fesaTemplates.py  |  173 +--
 .../xml/fesa/fesa_3_0_0/generateSourceCode.py |    9 -
 silecs-codegen/src/xml/iecommon.py            |    4 +
 .../xml/test/generated_correct/AllTypes.cpp   | 1004 ++++++++++-------
 4 files changed, 705 insertions(+), 485 deletions(-)

diff --git a/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py b/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py
index 1c74d2f..7aed315 100644
--- a/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py
+++ b/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py
@@ -464,36 +464,25 @@ cCommonGet = """
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
 """
 
-cRegVar = """        Silecs::Register*  pRegister = NULL;
-"""
-
-cGetArrayVar = """        uint32_t dim1 = 1;
-"""
-cGetArray2DVar = """        uint32_t dim2 = 1;
-"""
-cSetArrayVar = """        uint32_t dim1 = 1;
-        uint32_t fesaDim1;
-"""
-cSetArray2DVar = """        uint32_t dim2 = 1;
-        uint32_t fesaDim2;
-"""
-
 cRecv = """        if (recvNow) pPLCDevice -> recv(blockName_);        
     """
 
 cGetStringReg = """
-        pRegister = pPLCDevice->getRegister("${regName}");
-        pDevice->${fieldName}.set(pRegister->getValString().c_str(), pContext);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            pDevice->${fieldName}.set(pRegister->getValString().c_str(), pContext);
+        }
 """
 
 cGetStringArrayReg = """
         {
-        pRegister = pPLCDevice->getRegister("${regName}");
-        dim1 = pRegister->getDimension1();
-        const std::string** stdStringArray = pRegister->getRefStringArray(dim1);
-        for (unsigned int i=0; i<dim1; i++)
-        {   pDevice->${fieldName}.setString(stdStringArray[i]->c_str(), i, pContext);
-        }
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            const std::string** stdStringArray = pRegister->getRefStringArray(dim1);
+            for (unsigned int i=0; i<dim1; i++)
+            {
+                pDevice->${fieldName}.setString(stdStringArray[i]->c_str(), i, pContext);
+            }
         }
 """
 
@@ -501,34 +490,42 @@ cGetScalarReg = """
         pDevice->${fieldName}.set( pPLCDevice->getRegister("${regName}")->getVal${regType}(), pContext);"""
 
 cGetArrayReg = """
-        pRegister = pPLCDevice->getRegister("${regName}");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
             pDevice->${fieldName}.set(pRegister->getRef${regType}Array(dim1), dim1, pContext);
+        }
         """
 cGetArray2DReg = """
-        pRegister = pPLCDevice->getRegister("${regName}");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->${fieldName}.set(pRegister->getRef${regType}Array2D(dim1, dim2), dim1, dim2, pContext);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->${fieldName}.set(pRegister->getRef${regType}Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
 """
 
 cGetUnsignedArrayReg = """
-        pRegister = pPLCDevice->getRegister("${regName}");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
             ${regType}* ${regName} = (${regType}*)calloc(dim1, sizeof(${regType}));
             pRegister->getVal${regType}Array(${regName}, dim1);\t//use automatic conversion for JAVA non-supported type
             pDevice->${fieldName}.set(${regName}, dim1, pContext);
             free(${regName});
+        }
     """
 
 cGetUnsignedArray2DReg = """
-        pRegister = pPLCDevice->getRegister("${regName}");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        ${fesaType]* ${regName} = (${fesaType]*)calloc(dim1*dim2, sizeof(${fesaType]));
-        pRegister->getVal${regType}Array2D(${regName}, dim1, dim2);\t//use automatic conversion for JAVA non-supported type
-        pDevice->${fieldName}.set(${regName}, dim1, dim2, pContext);
-    free(${regName});
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            ${fesaType}* ${regName} = (${fesaType}*)calloc(dim1*dim2, sizeof(${fesaType}));
+            pRegister->getVal${regType}Array2D(${regName}, dim1, dim2);\t//use automatic conversion for JAVA non-supported type
+            pDevice->${fieldName}.set(${regName}, dim1, dim2, pContext);
+            free(${regName});
+        }
 """
 
 cCommonSet = """    
@@ -563,12 +560,13 @@ cSetStringReg = """
 
 cSetStringArrayReg = """
         {
-        pRegister = pPLCDevice->getRegister("${regName}");
-        dim1 = pRegister->getDimension1();
-        std::string stdStringArray[dim1];
-        const char** cStringArray = pDevice->${fieldName}.get(fesaDim1, pContext);
-        for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
-        pRegister->setValStringArray(stdStringArray, dim1);
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            std::string stdStringArray[dim1];
+            uint32_t fesaDim1;
+            const char** cStringArray = pDevice->${fieldName}.get(fesaDim1, pContext);
+            for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
+            pRegister->setValStringArray(stdStringArray, dim1);
         }
 """
 
@@ -579,29 +577,41 @@ cSetScalarUReg = """
         pPLCDevice->getRegister("${regName}")->setVal${regType}( (${lowerType})pDevice->${fieldName}.get(pContext));"""
 
 cSetArrayReg = """
-        pRegister = pPLCDevice->getRegister("${regName}");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setVal${regType}Array(pDevice->${fieldName}.get(fesaDim1, pContext), dim1);
+        }
     """
 
 cSetArray2DReg = """
-    pRegister = pPLCDevice->getRegister("${regName}");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setVal${regType}Array2D(pDevice->${fieldName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setVal${regType}Array2D(pDevice->${fieldName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
 """
 
 cSetUnsignedArrayReg = """
-        pRegister = pPLCDevice->getRegister("${regName}");
-        dim1 = pRegister->getDimension1();
-        pRegister->setVal${regType}Array(pDevice->${fieldName}.get(fesaDim1, pContext), dim1);\t//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setVal${regType}Array(pDevice->${fieldName}.get(fesaDim1, pContext), dim1);\t//use automatic conversion for JAVA non-supported type
+        }
 """
 
 cSetUnsignedArray2DReg = """
-        pRegister = pPLCDevice->getRegister("${regName}");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setVal${regType}Array2D( pDevice->${fieldName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);\t//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setVal${regType}Array2D( pDevice->${fieldName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);\t//use automatic conversion for JAVA non-supported type
+        }
 """
 
 cSetStringRegData = """
@@ -610,31 +620,41 @@ cSetStringRegData = """
                                     
 cSetStringArrayRegData = """
         {
-        pRegister = pPLCDevice->getRegister("${regName}");
-        dim1 = pRegister->getDimension1();
-        std::string stdStringArray[dim1];
-        const char** cStringArray = (data.is${fieldName_upper}Available() ? data.${fieldName}.get(fesaDim1) : pDevice->${fieldName}.get(fesaDim1, pContext));
-        for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
-        pRegister->setValStringArray(stdStringArray, dim1);
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            std::string stdStringArray[dim1];
+            uint32_t fesaDim1;
+            const char** cStringArray = (data.is${fieldName_upper}Available() ? data.${fieldName}.get(fesaDim1) : pDevice->${fieldName}.get(fesaDim1, pContext));
+            for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
+            pRegister->setValStringArray(stdStringArray, dim1);
         }
 """
 
 cSetScalarRegData = """
-        (data.is${fieldName_upper}Available()) ? pPLCDevice->getRegister("${regName}")->setVal${regType}( (${fesaType})data.${fieldName}.get()) :
-                                          pPLCDevice->getRegister("${regName}")->setVal${regType}( (${fesaType})pDevice->${fieldName}.get(pContext));"""
+        (data.is${fieldName_upper}Available()) ? pPLCDevice->getRegister("${regName}")->setVal${regType}( data.${fieldName}.get()) :
+                                          pPLCDevice->getRegister("${regName}")->setVal${regType}( pDevice->${fieldName}.get(pContext));"""
 
+cSetScalarURegData = """
+        (data.is${fieldName_upper}Available()) ? pPLCDevice->getRegister("${regName}")->setVal${regType}( (${lowerType})data.${fieldName}.get()) :
+                                          pPLCDevice->getRegister("${regName}")->setVal${regType}( (${lowerType})pDevice->${fieldName}.get(pContext));"""
 cSetArrayRegData = """
-        pRegister = pPLCDevice->getRegister("${regName}");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.is${fieldName_upper}Available()) ? pRegister->setVal${regType}Array( data.${fieldName}.get(fesaDim1), dim1) :
-                                         pRegister->setVal${regType}Array( pDevice->${fieldName}.get(fesaDim1, pContext), dim1);
+                                        pRegister->setVal${regType}Array( pDevice->${fieldName}.get(fesaDim1, pContext), dim1);
+        }
     """
 cSetArray2DRegData = """
-        pRegister = pPLCDevice->getRegister("${regName}");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.is${fieldName_upper}Available()) ? pRegister->setVal${regType}Array2D(data.${fieldName}.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setVal${regType}Array2D(pDevice->${fieldName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.is${fieldName_upper}Available()) ? pRegister->setVal${regType}Array2D(data.${fieldName}.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setVal${regType}Array2D(pDevice->${fieldName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
 """
 
 makeDesign = """# Include SILECS library path
@@ -761,7 +781,7 @@ def genCGetArrayReg(register):
 
 def genCGetArray2DReg(register):
     if iecommon.isUnsignedType(register.format):
-        return cGetUnsignedArray2DReg.replace('${regName}', register.name).replace('${regType}', iecommon.getSilecsDataTypeUpperCase(register.format)).replace('${fesaType]', iecommon.registerFormatType2FesaType(register.format)).replace('${fieldName}', register.getFesaName())
+        return cGetUnsignedArray2DReg.replace('${regName}', register.name).replace('${regType}', iecommon.getSilecsDataTypeUpperCase(register.format)).replace('${fesaType}', iecommon.registerFormatType2FesaType(register.format)).replace('${fieldName}', register.getFesaName())
     else:
         return cGetArray2DReg.replace('${regName}', register.name).replace('${regType}', iecommon.getSilecsDataTypeUpperCase(register.format)).replace('${fieldName}', register.getFesaName())
 
@@ -779,7 +799,7 @@ def genCSetStringArrayReg(register):
 
 def genCSetScalarReg(register):
     if iecommon.isUnsignedType(register.format):
-        return cSetScalarUReg.replace('${regName}', register.name).replace('${regType}', iecommon.getSilecsDataTypeUpperCase(register.format)).replace('${lowerType}', lowerType).replace('${fieldName}', register.getFesaName())
+        return cSetScalarUReg.replace('${regName}', register.name).replace('${regType}', iecommon.getSilecsDataTypeUpperCase(register.format)).replace('${lowerType}', iecommon.registerFormatType2CType(register.format)).replace('${fieldName}', register.getFesaName())
     else:
         return cSetScalarReg.replace('${regName}', register.name).replace('${regType}', iecommon.getSilecsDataTypeUpperCase(register.format)).replace('${fieldName}', register.getFesaName())
         
@@ -803,7 +823,10 @@ def genCSetStringArrayRegData(register):
     return cSetStringArrayRegData.replace('${regName}', register.name).replace('${fieldName_upper}', iecommon.capitalizeString(register.getFesaName())).replace('${fieldName}', register.getFesaName())
 
 def genCSetScalarRegData(register):
-	return cSetScalarRegData.replace('${regName}', register.name).replace('${fieldName_upper}', iecommon.capitalizeString(register.getFesaName())).replace('${regType}', iecommon.getSilecsDataTypeUpperCase(register.format)).replace('${fesaType}', iecommon.registerFormatType2FesaType(register.format)).replace('${fieldName}', register.getFesaName())
+    if iecommon.isUnsignedType(register.format):
+	    return cSetScalarURegData.replace('${regName}', register.name).replace('${fieldName_upper}', iecommon.capitalizeString(register.getFesaName())).replace('${regType}', iecommon.getSilecsDataTypeUpperCase(register.format)).replace('${fieldName}', register.getFesaName()).replace('${lowerType}', iecommon.registerFormatType2CType(register.format))
+    else:
+        return cSetScalarRegData.replace('${regName}', register.name).replace('${fieldName_upper}', iecommon.capitalizeString(register.getFesaName())).replace('${regType}', iecommon.getSilecsDataTypeUpperCase(register.format)).replace('${fieldName}', register.getFesaName())
 
 def genCSetArrayRegData(register):
     return cSetArrayRegData.replace('${regName}', register.name).replace('${fieldName_upper}', iecommon.capitalizeString(register.getFesaName())).replace('${regType}', iecommon.getSilecsDataTypeUpperCase(register.format)).replace('${fieldName}', register.getFesaName())
diff --git a/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateSourceCode.py b/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateSourceCode.py
index 4698210..d79b74f 100644
--- a/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateSourceCode.py
+++ b/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateSourceCode.py
@@ -122,9 +122,6 @@ def genCppSource(className, silecsRoot, fesaRoot, sourcePath,logTopics):
     for block in blockList:
         if block.prop('mode') != 'WRITE-ONLY':
             finalSource += fesaTemplates.genCCommonGet(block.prop('name'),className)
-            finalSource += fesaTemplates.cRegVar
-            finalSource += fesaTemplates.cGetArrayVar
-            finalSource += fesaTemplates.cGetArray2DVar
             finalSource += '\n'
             finalSource += fesaTemplates.cRecv
             for registerNode in  block.xpathEval('Register'):
@@ -145,9 +142,6 @@ def genCppSource(className, silecsRoot, fesaRoot, sourcePath,logTopics):
 
         if block.prop('mode') != 'READ-ONLY':
             finalSource += fesaTemplates.genCCommonSet(block.prop('name'),className)
-            finalSource += fesaTemplates.cRegVar
-            finalSource += fesaTemplates.cSetArrayVar
-            finalSource += fesaTemplates.cSetArray2DVar
             for registerNode in  block.xpathEval('Register'):
                 register = DesignRegister(registerNode)
                 if register.valueType == 'string':
@@ -165,9 +159,6 @@ def genCppSource(className, silecsRoot, fesaRoot, sourcePath,logTopics):
             finalSource += fesaTemplates.cSend
             finalSource += '    }\n'
             finalSource += fesaTemplates.genCDatatypeSet(block.prop('name'),getFesaName(block), className)
-            finalSource += fesaTemplates.cRegVar
-            finalSource += fesaTemplates.cSetArrayVar
-            finalSource += fesaTemplates.cSetArray2DVar
             
             for registerNode in block.xpathEval('Register'):
                 register = DesignRegister(registerNode)
diff --git a/silecs-codegen/src/xml/iecommon.py b/silecs-codegen/src/xml/iecommon.py
index 65cb502..120f37b 100644
--- a/silecs-codegen/src/xml/iecommon.py
+++ b/silecs-codegen/src/xml/iecommon.py
@@ -206,6 +206,10 @@ def getCDataType(silecsDataType):
              'dt'       :'double',
              'string'   :'std::string'
     }[silecsDataType]
+    
+def registerFormatType2CType(registerFormatType):
+    type = iecommon.getSilecsDataType(registerFormatType)
+    return getCDataType(type)
 #-------------------------------------------------------------------------
 # Given PLC data type, returns the corresponding
 # SILECS data type
diff --git a/silecs-codegen/src/xml/test/generated_correct/AllTypes.cpp b/silecs-codegen/src/xml/test/generated_correct/AllTypes.cpp
index 1ac635b..40f7be4 100644
--- a/silecs-codegen/src/xml/test/generated_correct/AllTypes.cpp
+++ b/silecs-codegen/src/xml/test/generated_correct/AllTypes.cpp
@@ -192,9 +192,6 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
-        uint32_t dim1 = 1;
-        uint32_t dim2 = 1;
 
         if (recvNow) pPLCDevice -> recv(blockName_);        
     
@@ -205,8 +202,10 @@ namespace AllTypes
         pDevice->RO_int32_fesa.set( pPLCDevice->getRegister("RO_int32")->getValInt32(), pContext);
         pDevice->RO_uint32_fesa.set( pPLCDevice->getRegister("RO_uint32")->getValUInt32(), pContext);
         pDevice->RO_float32_fesa.set( pPLCDevice->getRegister("RO_float32")->getValFloat32(), pContext);
-        pRegister = pPLCDevice->getRegister("RO_string");
-        pDevice->RO_string_fesa.set(pRegister->getValString().c_str(), pContext);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RO_string");
+            pDevice->RO_string_fesa.set(pRegister->getValString().c_str(), pContext);
+        }
 
         pDevice->RO_date_fesa.set( pPLCDevice->getRegister("RO_date")->getValDate(), pContext);
         pDevice->RO_char_fesa.set( pPLCDevice->getRegister("RO_char")->getValInt8(), pContext);
@@ -227,109 +226,138 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
-        uint32_t dim1 = 1;
-        uint32_t dim2 = 1;
 
         if (recvNow) pPLCDevice -> recv(blockName_);        
     
-        pRegister = pPLCDevice->getRegister("RW_int8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_int8.set(pRegister->getRefInt8Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_uint8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int16_t* RW_uint8 = (int16_t*)calloc(dim1*dim2, sizeof(int16_t));
-        pRegister->getValUInt8Array2D(RW_uint8, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_uint8_fesa.set(RW_uint8, dim1, dim2, pContext);
-    free(RW_uint8);
-
-        pRegister = pPLCDevice->getRegister("RW_int16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_int16_fesa.set(pRegister->getRefInt16Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_uint16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int32_t* RW_uint16 = (int32_t*)calloc(dim1*dim2, sizeof(int32_t));
-        pRegister->getValUInt16Array2D(RW_uint16, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_uint16_fesa.set(RW_uint16, dim1, dim2, pContext);
-    free(RW_uint16);
-
-        pRegister = pPLCDevice->getRegister("RW_int32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_int32_fesa.set(pRegister->getRefInt32Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_uint32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int64_t* RW_uint32 = (int64_t*)calloc(dim1*dim2, sizeof(int64_t));
-        pRegister->getValUInt32Array2D(RW_uint32, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_uint32_fesa.set(RW_uint32, dim1, dim2, pContext);
-    free(RW_uint32);
-
-        pRegister = pPLCDevice->getRegister("RW_float32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_float32_fesa.set(pRegister->getRefFloat32Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_date");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_date_fesa.set(pRegister->getRefDateArray2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_char");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_char_fesa.set(pRegister->getRefInt8Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_byte");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int16_t* RW_byte = (int16_t*)calloc(dim1*dim2, sizeof(int16_t));
-        pRegister->getValUInt8Array2D(RW_byte, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_byte_fesa.set(RW_byte, dim1, dim2, pContext);
-    free(RW_byte);
-
-        pRegister = pPLCDevice->getRegister("RW_word");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int32_t* RW_word = (int32_t*)calloc(dim1*dim2, sizeof(int32_t));
-        pRegister->getValUInt16Array2D(RW_word, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_word_fesa.set(RW_word, dim1, dim2, pContext);
-    free(RW_word);
-
-        pRegister = pPLCDevice->getRegister("RW_dword");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int64_t* RW_dword = (int64_t*)calloc(dim1*dim2, sizeof(int64_t));
-        pRegister->getValUInt32Array2D(RW_dword, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_dword_fesa.set(RW_dword, dim1, dim2, pContext);
-    free(RW_dword);
-
-        pRegister = pPLCDevice->getRegister("RW_int");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_int_fesa.set(pRegister->getRefInt16Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_dint");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_dint_fesa.set(pRegister->getRefInt32Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_real");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_real_fesa.set(pRegister->getRefFloat32Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_dt");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_dt_fesa.set(pRegister->getRefDateArray2D(dim1, dim2), dim1, dim2, pContext);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_int8.set(pRegister->getRefInt8Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int16_t* RW_uint8 = (int16_t*)calloc(dim1*dim2, sizeof(int16_t));
+            pRegister->getValUInt8Array2D(RW_uint8, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_uint8_fesa.set(RW_uint8, dim1, dim2, pContext);
+            free(RW_uint8);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_int16_fesa.set(pRegister->getRefInt16Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int32_t* RW_uint16 = (int32_t*)calloc(dim1*dim2, sizeof(int32_t));
+            pRegister->getValUInt16Array2D(RW_uint16, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_uint16_fesa.set(RW_uint16, dim1, dim2, pContext);
+            free(RW_uint16);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_int32_fesa.set(pRegister->getRefInt32Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int64_t* RW_uint32 = (int64_t*)calloc(dim1*dim2, sizeof(int64_t));
+            pRegister->getValUInt32Array2D(RW_uint32, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_uint32_fesa.set(RW_uint32, dim1, dim2, pContext);
+            free(RW_uint32);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_float32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_float32_fesa.set(pRegister->getRefFloat32Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_date");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_date_fesa.set(pRegister->getRefDateArray2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_char");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_char_fesa.set(pRegister->getRefInt8Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_byte");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int16_t* RW_byte = (int16_t*)calloc(dim1*dim2, sizeof(int16_t));
+            pRegister->getValUInt8Array2D(RW_byte, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_byte_fesa.set(RW_byte, dim1, dim2, pContext);
+            free(RW_byte);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_word");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int32_t* RW_word = (int32_t*)calloc(dim1*dim2, sizeof(int32_t));
+            pRegister->getValUInt16Array2D(RW_word, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_word_fesa.set(RW_word, dim1, dim2, pContext);
+            free(RW_word);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dword");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int64_t* RW_dword = (int64_t*)calloc(dim1*dim2, sizeof(int64_t));
+            pRegister->getValUInt32Array2D(RW_dword, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_dword_fesa.set(RW_dword, dim1, dim2, pContext);
+            free(RW_dword);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_int_fesa.set(pRegister->getRefInt16Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dint");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_dint_fesa.set(pRegister->getRefInt32Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_real");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_real_fesa.set(pRegister->getRefFloat32Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dt");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_dt_fesa.set(pRegister->getRefDateArray2D(dim1, dim2), dim1, dim2, pContext);
+        }
 
     }
     
@@ -341,91 +369,134 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
-        uint32_t dim1 = 1;
-        uint32_t fesaDim1;
-        uint32_t dim2 = 1;
-        uint32_t fesaDim2;
-
-    pRegister = pPLCDevice->getRegister("RW_int8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt8Array2D(pDevice->RW_int8.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt8Array2D( pDevice->RW_uint8_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-    pRegister = pPLCDevice->getRegister("RW_int16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt16Array2D(pDevice->RW_int16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt16Array2D( pDevice->RW_uint16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-    pRegister = pPLCDevice->getRegister("RW_int32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt32Array2D(pDevice->RW_int32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt32Array2D( pDevice->RW_uint32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-    pRegister = pPLCDevice->getRegister("RW_float32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValFloat32Array2D(pDevice->RW_float32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-    pRegister = pPLCDevice->getRegister("RW_date");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValDateArray2D(pDevice->RW_date_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-    pRegister = pPLCDevice->getRegister("RW_char");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt8Array2D(pDevice->RW_char_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_byte");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt8Array2D( pDevice->RW_byte_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-        pRegister = pPLCDevice->getRegister("RW_word");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt16Array2D( pDevice->RW_word_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-        pRegister = pPLCDevice->getRegister("RW_dword");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt32Array2D( pDevice->RW_dword_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-    pRegister = pPLCDevice->getRegister("RW_int");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt16Array2D(pDevice->RW_int_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-    pRegister = pPLCDevice->getRegister("RW_dint");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt32Array2D(pDevice->RW_dint_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-    pRegister = pPLCDevice->getRegister("RW_real");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValFloat32Array2D(pDevice->RW_real_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-    pRegister = pPLCDevice->getRegister("RW_dt");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValDateArray2D(pDevice->RW_dt_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int8");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt8Array2D(pDevice->RW_int8.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint8");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt8Array2D( pDevice->RW_uint8_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int16");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt16Array2D(pDevice->RW_int16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint16");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt16Array2D( pDevice->RW_uint16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int32");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt32Array2D(pDevice->RW_int32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint32");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt32Array2D( pDevice->RW_uint32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_float32");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValFloat32Array2D(pDevice->RW_float32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_date");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValDateArray2D(pDevice->RW_date_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_char");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt8Array2D(pDevice->RW_char_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_byte");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt8Array2D( pDevice->RW_byte_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_word");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt16Array2D( pDevice->RW_word_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dword");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt32Array2D( pDevice->RW_dword_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt16Array2D(pDevice->RW_int_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dint");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt32Array2D(pDevice->RW_dint_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_real");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValFloat32Array2D(pDevice->RW_real_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dt");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValDateArray2D(pDevice->RW_dt_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
 
         if (sendNow) pPLCDevice->send(blockName_);
     }
@@ -438,107 +509,150 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
-        uint32_t dim1 = 1;
-        uint32_t fesaDim1;
-        uint32_t dim2 = 1;
-        uint32_t fesaDim2;
-
-        pRegister = pPLCDevice->getRegister("RW_int8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_int8Available()) ? pRegister->setValInt8Array2D(data.RW_int8.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt8Array2D(pDevice->RW_int8.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_uint8_fesaAvailable()) ? pRegister->setValUInt8Array2D(data.RW_uint8_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt8Array2D(pDevice->RW_uint8_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_int16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_int16_fesaAvailable()) ? pRegister->setValInt16Array2D(data.RW_int16_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt16Array2D(pDevice->RW_int16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_uint16_fesaAvailable()) ? pRegister->setValUInt16Array2D(data.RW_uint16_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt16Array2D(pDevice->RW_uint16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_int32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_int32_fesaAvailable()) ? pRegister->setValInt32Array2D(data.RW_int32_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt32Array2D(pDevice->RW_int32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_uint32_fesaAvailable()) ? pRegister->setValUInt32Array2D(data.RW_uint32_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt32Array2D(pDevice->RW_uint32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_float32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_float32_fesaAvailable()) ? pRegister->setValFloat32Array2D(data.RW_float32_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValFloat32Array2D(pDevice->RW_float32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_date");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_date_fesaAvailable()) ? pRegister->setValDateArray2D(data.RW_date_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValDateArray2D(pDevice->RW_date_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_char");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_char_fesaAvailable()) ? pRegister->setValInt8Array2D(data.RW_char_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt8Array2D(pDevice->RW_char_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_byte");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_byte_fesaAvailable()) ? pRegister->setValUInt8Array2D(data.RW_byte_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt8Array2D(pDevice->RW_byte_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_word");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_word_fesaAvailable()) ? pRegister->setValUInt16Array2D(data.RW_word_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt16Array2D(pDevice->RW_word_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_dword");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_dword_fesaAvailable()) ? pRegister->setValUInt32Array2D(data.RW_dword_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt32Array2D(pDevice->RW_dword_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_int");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_int_fesaAvailable()) ? pRegister->setValInt16Array2D(data.RW_int_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt16Array2D(pDevice->RW_int_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_dint");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_dint_fesaAvailable()) ? pRegister->setValInt32Array2D(data.RW_dint_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt32Array2D(pDevice->RW_dint_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_real");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_real_fesaAvailable()) ? pRegister->setValFloat32Array2D(data.RW_real_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValFloat32Array2D(pDevice->RW_real_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_dt");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_dt_fesaAvailable()) ? pRegister->setValDateArray2D(data.RW_dt_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValDateArray2D(pDevice->RW_dt_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_int8Available()) ? pRegister->setValInt8Array2D(data.RW_int8.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt8Array2D(pDevice->RW_int8.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_uint8_fesaAvailable()) ? pRegister->setValUInt8Array2D(data.RW_uint8_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt8Array2D(pDevice->RW_uint8_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_int16_fesaAvailable()) ? pRegister->setValInt16Array2D(data.RW_int16_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt16Array2D(pDevice->RW_int16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_uint16_fesaAvailable()) ? pRegister->setValUInt16Array2D(data.RW_uint16_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt16Array2D(pDevice->RW_uint16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_int32_fesaAvailable()) ? pRegister->setValInt32Array2D(data.RW_int32_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt32Array2D(pDevice->RW_int32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_uint32_fesaAvailable()) ? pRegister->setValUInt32Array2D(data.RW_uint32_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt32Array2D(pDevice->RW_uint32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_float32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_float32_fesaAvailable()) ? pRegister->setValFloat32Array2D(data.RW_float32_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValFloat32Array2D(pDevice->RW_float32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_date");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_date_fesaAvailable()) ? pRegister->setValDateArray2D(data.RW_date_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValDateArray2D(pDevice->RW_date_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_char");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_char_fesaAvailable()) ? pRegister->setValInt8Array2D(data.RW_char_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt8Array2D(pDevice->RW_char_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_byte");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_byte_fesaAvailable()) ? pRegister->setValUInt8Array2D(data.RW_byte_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt8Array2D(pDevice->RW_byte_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_word");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_word_fesaAvailable()) ? pRegister->setValUInt16Array2D(data.RW_word_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt16Array2D(pDevice->RW_word_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dword");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_dword_fesaAvailable()) ? pRegister->setValUInt32Array2D(data.RW_dword_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt32Array2D(pDevice->RW_dword_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_int_fesaAvailable()) ? pRegister->setValInt16Array2D(data.RW_int_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt16Array2D(pDevice->RW_int_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dint");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_dint_fesaAvailable()) ? pRegister->setValInt32Array2D(data.RW_dint_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt32Array2D(pDevice->RW_dint_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_real");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_real_fesaAvailable()) ? pRegister->setValFloat32Array2D(data.RW_real_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValFloat32Array2D(pDevice->RW_real_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dt");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_dt_fesaAvailable()) ? pRegister->setValDateArray2D(data.RW_dt_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValDateArray2D(pDevice->RW_dt_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
 
         if (sendNow) pPLCDevice->send(blockName_);
 
@@ -552,84 +666,128 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
-        uint32_t dim1 = 1;
-        uint32_t fesaDim1;
-        uint32_t dim2 = 1;
-        uint32_t fesaDim2;
-
-        pRegister = pPLCDevice->getRegister("WO_int8");
-            dim1 = pRegister->getDimension1();
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setValInt8Array(pDevice->WO_int8.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_uint8");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt8Array(pDevice->WO_uint8_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt8Array(pDevice->WO_uint8_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_int16");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setValInt16Array(pDevice->WO_int16_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_uint16");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt16Array(pDevice->WO_uint16_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt16Array(pDevice->WO_uint16_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_int32");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setValInt32Array(pDevice->WO_int32_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_uint32");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt32Array(pDevice->WO_uint32_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt32Array(pDevice->WO_uint32_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_float32");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_float32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setValFloat32Array(pDevice->WO_float32_fesa.get(fesaDim1, pContext), dim1);
+        }
     
         {
-        pRegister = pPLCDevice->getRegister("WO_string");
-        dim1 = pRegister->getDimension1();
-        std::string stdStringArray[dim1];
-        const char** cStringArray = pDevice->WO_string_fesa.get(fesaDim1, pContext);
-        for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
-        pRegister->setValStringArray(stdStringArray, dim1);
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_string");
+            uint32_t dim1 = pRegister->getDimension1();
+            std::string stdStringArray[dim1];
+            uint32_t fesaDim1;
+            const char** cStringArray = pDevice->WO_string_fesa.get(fesaDim1, pContext);
+            for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
+            pRegister->setValStringArray(stdStringArray, dim1);
         }
 
-        pRegister = pPLCDevice->getRegister("WO_date");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_date");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setValDateArray(pDevice->WO_date_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_char");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_char");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setValInt8Array(pDevice->WO_char_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_byte");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt8Array(pDevice->WO_byte_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_byte");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt8Array(pDevice->WO_byte_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_word");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt16Array(pDevice->WO_word_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_word");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt16Array(pDevice->WO_word_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_dword");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt32Array(pDevice->WO_dword_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dword");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt32Array(pDevice->WO_dword_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_int");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setValInt16Array(pDevice->WO_int_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_dint");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dint");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setValInt32Array(pDevice->WO_dint_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_real");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_real");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setValFloat32Array(pDevice->WO_real_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_dt");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dt");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setValDateArray(pDevice->WO_dt_fesa.get(fesaDim1, pContext), dim1);
+        }
     
         if (sendNow) pPLCDevice->send(blockName_);
     }
@@ -642,100 +800,144 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
-        uint32_t dim1 = 1;
-        uint32_t fesaDim1;
-        uint32_t dim2 = 1;
-        uint32_t fesaDim2;
-
-        pRegister = pPLCDevice->getRegister("WO_int8");
-            dim1 = pRegister->getDimension1();
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_int8Available()) ? pRegister->setValInt8Array( data.WO_int8.get(fesaDim1), dim1) :
-                                         pRegister->setValInt8Array( pDevice->WO_int8.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValInt8Array( pDevice->WO_int8.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_uint8");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_uint8_fesaAvailable()) ? pRegister->setValUInt8Array( data.WO_uint8_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt8Array( pDevice->WO_uint8_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValUInt8Array( pDevice->WO_uint8_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_int16");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_int16_fesaAvailable()) ? pRegister->setValInt16Array( data.WO_int16_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValInt16Array( pDevice->WO_int16_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValInt16Array( pDevice->WO_int16_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_uint16");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_uint16_fesaAvailable()) ? pRegister->setValUInt16Array( data.WO_uint16_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt16Array( pDevice->WO_uint16_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValUInt16Array( pDevice->WO_uint16_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_int32");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_int32_fesaAvailable()) ? pRegister->setValInt32Array( data.WO_int32_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValInt32Array( pDevice->WO_int32_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValInt32Array( pDevice->WO_int32_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_uint32");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_uint32_fesaAvailable()) ? pRegister->setValUInt32Array( data.WO_uint32_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt32Array( pDevice->WO_uint32_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValUInt32Array( pDevice->WO_uint32_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_float32");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_float32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_float32_fesaAvailable()) ? pRegister->setValFloat32Array( data.WO_float32_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValFloat32Array( pDevice->WO_float32_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValFloat32Array( pDevice->WO_float32_fesa.get(fesaDim1, pContext), dim1);
+        }
     
         {
-        pRegister = pPLCDevice->getRegister("WO_string");
-        dim1 = pRegister->getDimension1();
-        std::string stdStringArray[dim1];
-        const char** cStringArray = (data.isWO_string_fesaAvailable() ? data.WO_string_fesa.get(fesaDim1) : pDevice->WO_string_fesa.get(fesaDim1, pContext));
-        for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
-        pRegister->setValStringArray(stdStringArray, dim1);
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_string");
+            uint32_t dim1 = pRegister->getDimension1();
+            std::string stdStringArray[dim1];
+            uint32_t fesaDim1;
+            const char** cStringArray = (data.isWO_string_fesaAvailable() ? data.WO_string_fesa.get(fesaDim1) : pDevice->WO_string_fesa.get(fesaDim1, pContext));
+            for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
+            pRegister->setValStringArray(stdStringArray, dim1);
         }
 
-        pRegister = pPLCDevice->getRegister("WO_date");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_date");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_date_fesaAvailable()) ? pRegister->setValDateArray( data.WO_date_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValDateArray( pDevice->WO_date_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValDateArray( pDevice->WO_date_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_char");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_char");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_char_fesaAvailable()) ? pRegister->setValInt8Array( data.WO_char_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValInt8Array( pDevice->WO_char_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValInt8Array( pDevice->WO_char_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_byte");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_byte");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_byte_fesaAvailable()) ? pRegister->setValUInt8Array( data.WO_byte_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt8Array( pDevice->WO_byte_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValUInt8Array( pDevice->WO_byte_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_word");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_word");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_word_fesaAvailable()) ? pRegister->setValUInt16Array( data.WO_word_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt16Array( pDevice->WO_word_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValUInt16Array( pDevice->WO_word_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_dword");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dword");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_dword_fesaAvailable()) ? pRegister->setValUInt32Array( data.WO_dword_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt32Array( pDevice->WO_dword_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValUInt32Array( pDevice->WO_dword_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_int");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_int_fesaAvailable()) ? pRegister->setValInt16Array( data.WO_int_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValInt16Array( pDevice->WO_int_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValInt16Array( pDevice->WO_int_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_dint");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dint");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_dint_fesaAvailable()) ? pRegister->setValInt32Array( data.WO_dint_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValInt32Array( pDevice->WO_dint_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValInt32Array( pDevice->WO_dint_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_real");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_real");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_real_fesaAvailable()) ? pRegister->setValFloat32Array( data.WO_real_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValFloat32Array( pDevice->WO_real_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValFloat32Array( pDevice->WO_real_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_dt");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dt");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_dt_fesaAvailable()) ? pRegister->setValDateArray( data.WO_dt_fesa.get(fesaDim1), dim1) :
-                                         pRegister->setValDateArray( pDevice->WO_dt_fesa.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValDateArray( pDevice->WO_dt_fesa.get(fesaDim1, pContext), dim1);
+        }
     
         if (sendNow) pPLCDevice->send(blockName_);
 
-- 
GitLab