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); }