public static void Create(DataBlock block, string path, PortalPlc parentPlc, AlarmworxSettings settings)
 {
     AlarmWorxConfiguration.Create(new[] { block }, path, parentPlc, settings);
 }
        private static void CreateInternal(IEnumerable <DataBlock> dataBlocks, string path, PortalPlc parentPlc, AlarmworxSettings settings)
        {
            if (path == null)
            {
                throw new ArgumentNullException(nameof(path));
            }
            if (!FileHelpers.IsValidFilePath(path, ".csv"))
            {
                throw new ArgumentException(path + " is not a valid path.", nameof(path));
            }

            var tagSeparationCharacter = settings?.ExportStyle == OpcTagStyle.OpcUa ? "/" : ".";

            try
            {
                using (var file = File.Open(path, FileMode.Create, FileAccess.Write, FileShare.Read))
                    using (var writer = new StreamWriter(file))
                    {
                        AlarmWorxConfiguration.WriteHeaders(writer);

                        foreach (var block in dataBlocks)
                        {
                            if (block == null)
                            {
                                throw new ArgumentNullException(nameof(block));
                            }
                            if (block.Children?.Count <= 0)
                            {
                                throw new ArgumentException("Block '" + block.Name + "' contains no data", nameof(block));
                            }

                            foreach (var child in block)
                            {
                                WriteAlarmRow(writer, child, block.Name + tagSeparationCharacter, block.Comment);
                            }
                        }
                        AlarmWorxConfiguration.WriteFooter(writer);

                        writer.Flush();
                    }
            }
            catch (Exception e)
            {
                throw new SiemensException("Could not write AlarmWorX configuration", e);
            }

            void WriteAlarmRow(StreamWriter writer, DataEntry entry, string prependNameText, string prependCommentText)
            {
                string stackedComment;

                if (string.IsNullOrWhiteSpace(prependCommentText))
                {
                    stackedComment = entry.Comment;
                }
                else if (prependCommentText.EndsWith(" - "))
                {
                    stackedComment = prependCommentText + entry.Comment;
                }
                else
                {
                    stackedComment = prependCommentText + " - " + entry.Comment;
                }

                stackedComment = stackedComment.Replace(",", "-");

                switch (entry.DataType)
                {
                case DataType.ARRAY:
                    TagHelper.ResolveArrayChildren(entry, parentPlc);
                    foreach (var child in entry.Children)
                    {
                        WriteAlarmRow(writer, child, prependNameText, prependNameText);
                    }
                    break;

                case DataType.STRUCT:
                    foreach (var child in entry.Children)
                    {
                        WriteAlarmRow(writer, child, prependNameText + entry.Name + ".", stackedComment);
                    }
                    break;

                case DataType.UDT:
                    foreach (var child in parentPlc.UserDataTypes.FirstOrDefault(u => u.Name == entry.DataTypeName))
                    {
                        WriteAlarmRow(writer, child, prependNameText + entry.Name + ".", stackedComment);
                    }
                    break;

                case DataType.BOOL:
                    string tag = null;
                    if (settings.ExportStyle == OpcTagStyle.OpcDa)
                    {
                        tag = settings.OpcServerTagPrefix + "\\" + prependNameText + entry.Name;
                    }
                    else if (settings.ExportStyle == OpcTagStyle.OpcUa)
                    {
                        var indexOfLastDot  = prependNameText.LastIndexOf('.');
                        var modifiedPrepend = prependNameText.Replace('.', '/');
                        tag = settings.OpcServerTagPrefix + "/" + modifiedPrepend.Substring(0, indexOfLastDot)
                              + '.' + modifiedPrepend.Substring(indexOfLastDot + 1) + entry.Name;
                    }
                    var row = new AlarmWorxRow
                    {
                        LocationPath   = @"\Configurations\" + ALARM_FOLDER,
                        Name           = ALARM_FOLDER + "." + prependNameText + entry.Name,
                        Description    = stackedComment,
                        LastModified   = DateTime.UtcNow.ToString("yyyy'-'MM'-'dd' 'HH':'mm':'ss'Z'"),
                        Input1         = tag,
                        BaseText       = stackedComment, // Message text
                        DigMessageText = " ",            // Prevents 'Digital Alarm' text at the end of each message
                        DigLimit       = "1",            // Alarm state value needs to be 1 for a digital
                        DigSeverity    = "500",          // Default severity is 500
                        DigRequiresAck = "1"             // Require an acknowledge by default
                    };

                    writer.WriteLine(row.ToString());
                    break;

                default:
                    throw new ArgumentException("Cannot export datatype '" + entry.DataType.ToString() + "' to AlarmWorX configuration");
                }
            }
        }
        public static void Create(IEnumerable <IBlock> blocks, string path, PortalPlc parentPlc, AlarmworxSettings settings)
        {
            if (blocks == null)
            {
                throw new ArgumentNullException(nameof(blocks));
            }
            IEnumerable <DataBlock> dataBlocks;

            if ((dataBlocks = blocks.OfType <DataBlock>())?.Count() <= 0)
            {
                throw new ArgumentException("Blocks does not contain any valid DataBlocks.", nameof(blocks));
            }

            AlarmWorxConfiguration.CreateInternal(dataBlocks, path, parentPlc, settings);
        }