private static void ExportDataBlockToFile(DataBlock block, TextWriter writer, PortalPlc parentPlc)
        {
            block.CalcluateAddresses(parentPlc);
            foreach (var entry in block)
            {
                AddDataEntry(entry, block.Name + ".", new Address());
            }

            void AddDataEntry(DataEntry entry, string entryPrefix, Address parentOffset)
            {
                var addressPrefix = "";
                var type          = "";

                switch (entry.DataType)
                {
                case DataType.ARRAY:
                    TagHelper.ResolveArrayChildren(entry, parentPlc);

                    // write a new entry for each of the children
                    foreach (var child in entry.Children)
                    {
                        AddDataEntry(child, entryPrefix, entry.Address.Value + parentOffset);
                    }
                    break;

                case DataType.BOOL:
                    addressPrefix = "DBX";
                    type          = "Boolean";
                    break;

                case DataType.BYTE:
                    addressPrefix = "DBB";
                    type          = "Byte";
                    break;

                case DataType.CHAR:
                    addressPrefix = "DBB";
                    type          = "Char";
                    break;

                case DataType.DATE:
                case DataType.DATE_AND_TIME:
                    addressPrefix = "DATE";
                    type          = "Date";
                    break;

                case DataType.TIME:
                case DataType.DINT:
                    addressPrefix = "DBD";
                    type          = "Long";
                    break;

                case DataType.DWORD:
                    addressPrefix = "DBD";
                    type          = "Dword";
                    break;

                case DataType.INT:
                    addressPrefix = "DBW";
                    type          = "Short";
                    break;

                case DataType.REAL:
                    addressPrefix = "DBD";
                    type          = "Float";
                    break;

                case DataType.STRING:
                    addressPrefix = "STRING";
                    type          = "String";
                    break;

                case DataType.UDT:
                case DataType.STRUCT:
                    entry.CalcluateAddresses(parentPlc);
                    foreach (var child in entry)
                    {
                        AddDataEntry(child, entryPrefix + entry.Name + ".", entry.Address.Value + parentOffset);
                    }
                    break;

                case DataType.WORD:
                    addressPrefix = "DBW";
                    type          = "Word";
                    break;

                default:
                    throw new SiemensException("Data type: '" + entry.DataType.ToString() + "' not supported.");
                }

                if (TagHelper.IsPrimitive(entry.DataType))
                {
                    var absoluteAddress = parentOffset + entry.Address.Value;

                    var addressString = "DB" + block.Number + "." + addressPrefix + absoluteAddress.Byte;
                    if (entry.DataType == DataType.BOOL)
                    {
                        addressString += "." + absoluteAddress.Bit;
                    }
                    else if (entry.DataType == DataType.STRING)
                    {
                        addressString += "." + (parentPlc?.GetConstantValue(entry.StringLength) ?? entry.StringLength.Value).ToString();
                    }

                    var entryItems = new string[16]
                    {
                        entryPrefix + entry.Name,
                        addressString,
                        type,
                        "1",
                        "R/W",
                        "100",
                        string.Empty,
                        string.Empty,
                        string.Empty,
                        string.Empty,
                        string.Empty,
                        string.Empty,
                        string.Empty,
                        string.Empty,
                        string.Empty,
                        entry.Comment
                    };

                    writer.WriteLine(string.Join(",", entryItems));
                }
            }
        }