5using Siemens.Automation.ModularApplicationCreator.ControlModules.ModuleEssentials.Objects.Generation.Openness.XML;
6using Siemens.Automation.ModularApplicationCreator.ControlModules.ModuleEssentials.Objects.Generation.Openness.XML.Parts;
7using Siemens.Automation.ModularApplicationCreator.Tia.Helper;
8using Siemens.Automation.ModularApplicationCreator.Tia.Helper.Create_XML_Block;
9using Siemens.Automation.ModularApplicationCreator.Tia.Helper.Create_XML_Block.XmlBlocks.BlockFrames;
10using Siemens.Automation.ModularApplicationCreator.Tia.Openness;
11using MacPLang = Siemens.Automation.ModularApplicationCreator.Tia.Helper.Create_XML_Block.ProgrammingLanguage;
12using MEPlang = Siemens.Automation.ModularApplicationCreator.ControlModules.ModuleEssentials.Objects.Generation.Openness.XML.ProgrammingLanguage;
28 var rsCall = parent.AddSystemBlockCall(
"Rs");
29 rsCall.AddCallParameter(
"q",
"Bool", Section.Output);
30 rsCall.AddCallParameter(
"r",
"Bool", Section.Input);
31 rsCall.AddCallParameter(
"s1",
"Bool", Section.Input);
32 rsCall.AddCallParameter(
"operand",
"Bool", Section.Output);
44 var coil = parent.AddSystemBlockCall(
"Coil");
45 coil.CallParameters.Add(
new CustomBlockCallParameter(coil,
"in",
"Bool", Section.Input));
46 coil.CallParameters.Add(
new CustomBlockCallParameter(coil,
"out",
"Bool", Section.Output));
47 coil.CallParameters.Add(
new CustomBlockCallParameter(coil,
"operand",
"Bool", Section.Output));
65 string rsOperandVariableName,
66 MEPlang opnsProgrammingLanguage)
68 var xmlNw =
new XmlNetwork(opnsProgrammingLanguage);
72 var rInputVar = xmlNw.AddVariable(rInputName);
73 xmlNw.AddConnection(rInputVar, rsCall.CallParameters.Single(x => x.Name ==
"r"));
75 var s1InputVar = xmlNw.AddVariable(s1InputName);
76 xmlNw.AddConnection(s1InputVar, rsCall.CallParameters.Single(x => x.Name ==
"s1"));
78 var operandOutputVar = xmlNw.AddVariable(rsOperandVariableName);
79 xmlNw.AddConnection(rsCall.CallParameters.Single(x => x.Name ==
"operand"), operandOutputVar);
107 string rsOperandVariableName)
111 var xmlNw =
new XmlNetwork(MEPlang.FBD);
115 var rInputVar = xmlNw.AddVariable(rInputName);
116 xmlNw.AddConnection(rInputVar, rsCall.CallParameters.Single(x => x.Name ==
"r"));
118 var s1InputVar = xmlNw.AddVariable(s1InputName);
119 xmlNw.AddConnection(s1InputVar, rsCall.CallParameters.Single(x => x.Name ==
"s1"));
121 var operandOutputVar = xmlNw.AddVariable(rsOperandVariableName);
122 xmlNw.AddConnection(rsCall.CallParameters.Single(x => x.Name ==
"operand"), operandOutputVar);
125 xmlNw.AddConnection(rsCall.CallParameters.Single(x => x.Name ==
"q"),
null);
158 var opnsProgrammingLanguage = (MEPlang)Enum.Parse(typeof(MEPlang), macProgrammingLanguage.ToString());
160 var block =
new XmlFB(blockName);
161 block.BlockAttributes.ProgrammingLanguage = macProgrammingLanguage;
163 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool_R",
"Bool"));
164 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool_S1",
"Bool"));
165 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool_R2",
"Bool"));
167 var staticItf = block.Interface[InterfaceSections.Static];
169 staticItf.Add(
new InterfaceParameter(
"RSOperand",
"Bool"));
170 staticItf.Add(
new InterfaceParameter(
"RSOperand2",
"Bool"));
172 staticItf.Add(
new InterfaceParameter(
"TempVariable",
"Bool"));
175 var rsNetwork1 =
CreateRSNetwork(
"#InputBool_R",
"#InputBool_S1",
"#RSOperand", opnsProgrammingLanguage);
176 block.Networks.Add(rsNetwork1.GenerateFixNetwork());
179 var rsNetwork2 =
CreateRSNetwork(
"#InputBool_R2",
"#RSOperand",
"#RSOperand2", opnsProgrammingLanguage);
180 block.Networks.Add(rsNetwork2.GenerateFixNetwork());
183 var sclCode =
"#TempVariable := #RSOperand;";
185 var sclNetworks =
new Parser().ParseSclSnippet(sclCode, block, plcDevice, GroupBlockCalls.NOGROUPING);
186 foreach (var sclNw
in sclNetworks)
188 block.Networks.Add(sclNw);
191 block.GenerateXmlBlock(plcDevice);
220 var block =
new XmlFB(blockName);
221 block.BlockAttributes.ProgrammingLanguage = MacPLang.LAD;
223 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool_R",
"Bool"));
224 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool_S1",
"Bool"));
225 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool_R2",
"Bool"));
227 var staticItf = block.Interface[InterfaceSections.Static];
228 staticItf.Add(
new InterfaceParameter(
"RSOperand",
"Bool"));
229 staticItf.Add(
new InterfaceParameter(
"RSOperand2",
"Bool"));
231 staticItf.Add(
new InterfaceParameter(
"TempVariable",
"Bool"));
235 block.Networks.Add(rsNetwork1.GenerateFixNetwork());
239 block.Networks.Add(rsNetwork2.GenerateFixNetwork());
242 var sclCode =
"#TempVariable := #RSOperand;";
243 var sclNetworks =
new Parser().ParseSclSnippet(sclCode, block, plcDevice, GroupBlockCalls.NOGROUPING);
244 foreach (var sclNw
in sclNetworks)
246 block.Networks.Add(sclNw);
264 public static SystemBlockCall
CreateANDCall(XmlNetwork parent,
int cardinality)
266 var andCall = parent.AddSystemBlockCall(
"A");
267 andCall.AddSystemParameter(
"Card",
"Cardinality", cardinality.ToString());
268 andCall.AddCallParameter(
"out",
"Bool", Section.Output);
269 for (
int i = 1; i <= cardinality; i++)
271 andCall.AddCallParameter(
"in" + i,
"Bool", Section.Input);
274 andCall.CallParameters.First(x => x.Section == Section.Output).Negated =
true;
275 andCall.CallParameters.Last(x => x.Section == Section.Input).Negated =
true;
287 System.Collections.Generic.List<
string> inputVariableNames,
288 string outputVariableName,
289 MEPlang opnsProgrammingLanguage)
291 var xmlNw =
new XmlNetwork(opnsProgrammingLanguage);
292 var andCall =
CreateANDCall(xmlNw, inputVariableNames.Count);
295 foreach (var varName
in inputVariableNames)
297 var inputVar = xmlNw.AddVariable(varName);
298 xmlNw.AddConnection(inputVar, andCall.CallParameters.Single(x => x.Name ==
"in" + currentIdx));
303 xmlNw.AddConnection(andCall.CallParameters.Single(x => x.Name.Contains(
"out")),
304 assignmentCall.CallParameters.First(x => x.Name.Contains(
"in")));
305 var assignmentOperandOutput = xmlNw.AddVariable(outputVariableName);
306 xmlNw.AddConnection(assignmentCall.CallParameters.First(x => x.Name.Contains(
"operand")),
307 assignmentOperandOutput);
328 System.Collections.Generic.List<
string> inputVariableNames,
330 string operandVariableName)
332 var xmlNw =
new XmlNetwork(MEPlang.FBD);
337 foreach (var varName
in inputVariableNames)
339 var inputVar = xmlNw.AddVariable(varName);
340 xmlNw.AddConnection(inputVar, andCall1.CallParameters.Single(x => x.Name ==
"in" + idx));
344 xmlNw.AddConnection(andCall1.CallParameters.Single(x => x.Name ==
"out"),
345 rsCall1.CallParameters.Single(x => x.Name ==
"s1"));
346 xmlNw.AddConnection(xmlNw.AddVariable(rInputName),
347 rsCall1.CallParameters.Single(x => x.Name ==
"r"));
348 xmlNw.AddConnection(rsCall1.CallParameters.Single(x => x.Name ==
"operand"),
349 xmlNw.AddVariable(operandVariableName));
351 xmlNw.AddConnection(rsCall1.CallParameters.Single(x => x.Name ==
"q"),
null);
356 foreach (var varName
in inputVariableNames)
358 var inputVar = xmlNw.AddVariable(varName);
359 xmlNw.AddConnection(inputVar, andCall2.CallParameters.Single(x => x.Name ==
"in" + idx));
363 xmlNw.AddConnection(andCall2.CallParameters.Single(x => x.Name ==
"out"),
364 rsCall2.CallParameters.Single(x => x.Name ==
"s1"));
365 xmlNw.AddConnection(xmlNw.AddVariable(rInputName),
366 rsCall2.CallParameters.Single(x => x.Name ==
"r"));
367 xmlNw.AddConnection(rsCall2.CallParameters.Single(x => x.Name ==
"operand"),
368 xmlNw.AddVariable(operandVariableName));
369 xmlNw.AddConnection(rsCall2.CallParameters.Single(x => x.Name ==
"q"),
null);
383 string operandVariableName)
385 var xmlNw =
new XmlNetwork(MEPlang.FBD);
388 xmlNw.AddConnection(xmlNw.AddVariable(andInput1), andCall.CallParameters.Single(x => x.Name ==
"in1"));
389 xmlNw.AddConnection(xmlNw.AddVariable(andInput2), andCall.CallParameters.Single(x => x.Name ==
"in2"));
392 xmlNw.AddConnection(andCall.CallParameters.Single(x => x.Name ==
"out"),
393 rsCall.CallParameters.Single(x => x.Name ==
"s1"));
394 xmlNw.AddConnection(xmlNw.AddVariable(rInputName),
395 rsCall.CallParameters.Single(x => x.Name ==
"r"));
396 xmlNw.AddConnection(rsCall.CallParameters.Single(x => x.Name ==
"operand"),
397 xmlNw.AddVariable(operandVariableName));
398 xmlNw.AddConnection(rsCall.CallParameters.Single(x => x.Name ==
"q"),
null);
425 var block =
new XmlFB(blockName);
426 block.BlockAttributes.ProgrammingLanguage = MacPLang.FBD;
428 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool1",
"Bool"));
429 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool2",
"Bool"));
430 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool3",
"Bool"));
432 var staticItf = block.Interface[InterfaceSections.Static];
433 staticItf.Add(
new InterfaceParameter(
"OutputBool",
"Bool"));
434 staticItf.Add(
new InterfaceParameter(
"AndOperand",
"Bool"));
437 var inputVars =
new System.Collections.Generic.List<
string>
438 {
"#InputBool1",
"#InputBool2",
"#InputBool3" };
440 block.Networks.Add(andNetwork.GenerateFixNetwork());
443 var assignNetwork =
new XmlNetwork(MEPlang.FBD);
445 var outputBoolVar = assignNetwork.AddVariable(
"#OutputBool");
446 assignNetwork.AddConnection(outputBoolVar,
447 assignCall.CallParameters.First(x => x.Name.Contains(
"in")));
448 var andOperandVar = assignNetwork.AddVariable(
"#AndOperand");
449 assignNetwork.AddConnection(
450 assignCall.CallParameters.First(x => x.Name.Contains(
"operand")),
452 block.Networks.Add(assignNetwork.GenerateFixNetwork());
454 block.GenerateXmlBlock(plcDevice);
476 var block =
new XmlFB(blockName);
477 block.BlockAttributes.ProgrammingLanguage = MacPLang.LAD;
479 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool1",
"Bool"));
480 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool2",
"Bool"));
481 block.Interface[InterfaceSections.Input].Add(
new InterfaceParameter(
"InputBool3",
"Bool"));
483 var staticItf = block.Interface[InterfaceSections.Static];
484 staticItf.Add(
new InterfaceParameter(
"OutputBool",
"Bool"));
485 staticItf.Add(
new InterfaceParameter(
"AndOperand",
"Bool"));
488 var inputVars =
new System.Collections.Generic.List<
string>
489 {
"#InputBool1",
"#InputBool2",
"#InputBool3" };
491 block.Networks.Add(andNetwork.GenerateFixNetwork());
494 var assignNetwork =
new XmlNetwork(MEPlang.FBD);
496 var outputBoolVar = assignNetwork.AddVariable(
"#OutputBool");
497 assignNetwork.AddConnection(outputBoolVar,
498 assignCall.CallParameters.First(x => x.Name.Contains(
"in")));
499 var andOperandVar = assignNetwork.AddVariable(
"#AndOperand");
500 assignNetwork.AddConnection(
501 assignCall.CallParameters.First(x => x.Name.Contains(
"operand")),
503 block.Networks.Add(assignNetwork.GenerateFixNetwork());
515 private static readonly XNamespace FlgNetNs =
516 "http://www.siemens.com/automation/Openness/SW/NetworkSource/FlgNet/v4";
530 var xdoc = block.GenerateXmlFile(MacPLang.FBD);
534 int nextUId = xdoc.Descendants()
535 .Select(e => e.Attribute(
"UId")?.Value)
536 .Where(v => v !=
null)
537 .Select(v => {
int n;
return int.TryParse(v, out n) ? n : 0; })
542 foreach (var compileUnit
in xdoc.Descendants(
"SW.Blocks.CompileUnit").ToList())
544 var langElem = compileUnit.Descendants(
"ProgrammingLanguage").FirstOrDefault();
545 if (langElem ==
null || langElem.Value !=
"FBD")
548 var flgNet = compileUnit.Descendants(FlgNetNs +
"FlgNet").FirstOrDefault();
552 langElem.Value =
"LAD";
556 foreach (var langElem
in xdoc.Descendants(
"ProgrammingLanguage")
557 .Where(e => e.Value ==
"FBD").ToList())
558 langElem.Value =
"LAD";
561 var tempFile = Path.ChangeExtension(Path.GetTempFileName(),
".xml");
565 OpennessFuncs.ImportBlockToPlc(tempFile, plcDevice);
569 if (File.Exists(tempFile))
570 File.Delete(tempFile);
587 var parts = flgNet.Element(FlgNetNs +
"Parts");
588 var wires = flgNet.Element(FlgNetNs +
"Wires");
589 if (parts ==
null || wires ==
null)
593 var powerrailWire =
new XElement(FlgNetNs +
"Wire",
594 new XAttribute(
"UId", nextUId++),
595 new XElement(FlgNetNs +
"Powerrail"));
603 if (powerrailWire.Elements(FlgNetNs +
"NameCon").Any())
604 wires.AddFirst(powerrailWire);
611 private static int GetUId(XElement e) =>
612 int.TryParse(e.Attribute(
"UId")?.Value, out
int v) ? v : 0;
620 XElement powerrailWire, ref
int nextUId)
622 var andParts = parts.Elements(FlgNetNs +
"Part")
623 .Where(p => p.Attribute(
"Name")?.Value ==
"A")
626 foreach (var andPart
in andParts)
628 int andUId = GetUId(andPart);
630 var negatedPins =
new System.Collections.Generic.HashSet<
string>(
631 andPart.Elements(FlgNetNs +
"Negated")
632 .Select(n => n.Attribute(
"Name")?.Value)
633 .Where(n => n !=
null));
636 var inputWires = wires.Elements(FlgNetNs +
"Wire")
639 var ch = w.Elements().ToList();
641 && ch[0].Name.LocalName ==
"IdentCon"
642 && ch[1].Name.LocalName ==
"NameCon"
643 && GetUId(ch[1]) == andUId;
647 var name = w.Elements(FlgNetNs +
"NameCon").First()
648 .Attribute(
"Name")?.Value ??
"";
649 return int.TryParse(name.Replace(
"in",
""), out
int idx) ? idx : 0;
654 var outputWire = wires.Elements(FlgNetNs +
"Wire")
657 var ch = w.Elements().ToList();
659 && ch[0].Name.LocalName ==
"NameCon"
660 && ch[0].Attribute(
"Name")?.Value ==
"out"
661 && GetUId(ch[0]) == andUId
662 && ch[1].Name.LocalName ==
"NameCon";
665 if (inputWires.Count == 0 || outputWire ==
null)
668 outputWire?.Remove();
672 var downstreamCon = outputWire.Elements(FlgNetNs +
"NameCon").Last();
674 int prevContactUId = -1;
675 foreach (var inWire
in inputWires)
677 var identCon = inWire.Elements(FlgNetNs +
"IdentCon").First();
678 string pinName = inWire.Elements(FlgNetNs +
"NameCon").First()
679 .Attribute(
"Name")?.Value ??
"";
680 bool isNc = negatedPins.Contains(pinName);
682 int cUId = nextUId++;
683 var contactPart =
new XElement(FlgNetNs +
"Part",
684 new XAttribute(
"UId", cUId),
685 new XAttribute(
"Name",
"Contact"));
687 contactPart.Add(
new XElement(FlgNetNs +
"Negated",
688 new XAttribute(
"Name",
"operand")));
689 parts.Add(contactPart);
692 wires.Add(
new XElement(FlgNetNs +
"Wire",
693 new XAttribute(
"UId", nextUId++),
694 new XElement(FlgNetNs +
"IdentCon",
695 new XAttribute(
"UId", identCon.Attribute(
"UId").Value)),
696 new XElement(FlgNetNs +
"NameCon",
697 new XAttribute(
"Name",
"operand"),
698 new XAttribute(
"UId", cUId))));
700 if (prevContactUId == -1)
703 powerrailWire.Add(
new XElement(FlgNetNs +
"NameCon",
704 new XAttribute(
"Name",
"in"),
705 new XAttribute(
"UId", cUId)));
710 wires.Add(
new XElement(FlgNetNs +
"Wire",
711 new XAttribute(
"UId", nextUId++),
712 new XElement(FlgNetNs +
"NameCon",
713 new XAttribute(
"Name",
"out"),
714 new XAttribute(
"UId", prevContactUId)),
715 new XElement(FlgNetNs +
"NameCon",
716 new XAttribute(
"Name",
"in"),
717 new XAttribute(
"UId", cUId))));
719 prevContactUId = cUId;
724 wires.Add(
new XElement(FlgNetNs +
"Wire",
725 new XAttribute(
"UId", nextUId++),
726 new XElement(FlgNetNs +
"NameCon",
727 new XAttribute(
"Name",
"out"),
728 new XAttribute(
"UId", prevContactUId)),
729 new XElement(FlgNetNs +
"NameCon",
730 new XAttribute(
"Name", downstreamCon.Attribute(
"Name")?.Value),
731 new XAttribute(
"UId", downstreamCon.Attribute(
"UId")?.Value))));
749 var partsEl = flgNet.Element(FlgNetNs +
"Parts");
750 var wiresEl = flgNet.Element(FlgNetNs +
"Wires");
751 if (partsEl ==
null || wiresEl ==
null)
return;
754 var accessNodes = partsEl.Elements()
755 .Where(e => e.Name.LocalName ==
"Access")
757 var instrNodes = partsEl.Elements()
758 .Where(e => e.Name.LocalName ==
"Part")
761 if (instrNodes.Count > 0)
763 var instrUIds =
new System.Collections.Generic.HashSet<
int>(instrNodes.Select(GetUId));
766 var powerrailOrder =
new System.Collections.Generic.List<
int>();
767 var powerrailWire = wiresEl.Elements(FlgNetNs +
"Wire")
768 .FirstOrDefault(w => w.Elements(FlgNetNs +
"Powerrail").Any());
769 if (powerrailWire !=
null)
771 foreach (var nameCon
in powerrailWire.Elements(FlgNetNs +
"NameCon"))
773 int uid = GetUId(nameCon);
774 if (instrUIds.Contains(uid))
775 powerrailOrder.Add(uid);
780 var outgoing =
new System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<
int>>();
781 var incoming =
new System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<
int>>();
783 foreach (var uid
in instrUIds)
785 outgoing[uid] =
new System.Collections.Generic.List<
int>();
786 incoming[uid] =
new System.Collections.Generic.List<
int>();
790 foreach (var wire
in wiresEl.Elements(FlgNetNs +
"Wire"))
792 var ch = wire.Elements().ToList();
793 if (ch.Count < 2)
continue;
796 if (ch[0].Name.LocalName ==
"Powerrail")
801 if (ch[0].Name.LocalName ==
"NameCon")
803 var pinName = ch[0].Attribute(
"Name")?.Value;
804 if (pinName ==
"out" || pinName ==
"q")
806 int uid = GetUId(ch[0]);
807 if (instrUIds.Contains(uid))
813 foreach (var target
in ch.Skip(1).Where(c => c.Name.LocalName ==
"NameCon"))
815 var pinName = target.Attribute(
"Name")?.Value ??
"";
816 if (pinName ==
"out" || pinName ==
"q" || pinName ==
"operand")
819 int dstUId = GetUId(target);
820 if (instrUIds.Contains(dstUId))
822 if (sourceUId > 0 && sourceUId != dstUId)
824 outgoing[sourceUId].Add(dstUId);
825 incoming[dstUId].Add(sourceUId);
833 var sorted =
new System.Collections.Generic.List<
int>();
834 var visited =
new System.Collections.Generic.HashSet<
int>();
837 foreach (var uid
in powerrailOrder)
845 foreach (var rootUId
in powerrailOrder)
847 var toVisit =
new System.Collections.Generic.Queue<
int>();
848 toVisit.Enqueue(rootUId);
850 while (toVisit.Count > 0)
852 int uid = toVisit.Dequeue();
853 foreach (var nextUId
in outgoing[uid])
855 if (!visited.Contains(nextUId))
858 bool allDepsVisited = incoming[nextUId].All(dep => visited.Contains(dep));
862 visited.Add(nextUId);
863 toVisit.Enqueue(nextUId);
871 foreach (var uid
in instrUIds.Where(u => !visited.Contains(u)))
874 var uidToNode = instrNodes.ToDictionary(GetUId);
876 foreach (var n
in accessNodes) partsEl.Add(n);
877 foreach (var uid
in sorted)
878 if (uidToNode.ContainsKey(uid)) partsEl.Add(uidToNode[uid]);
882 var allWires = wiresEl.Elements(FlgNetNs +
"Wire").ToList();
883 var powerrailWires = allWires.Where(w => w.Elements(FlgNetNs +
"Powerrail").Any()).ToList();
884 var otherWires = allWires.Except(powerrailWires).ToList();
887 foreach (var w
in powerrailWires) wiresEl.Add(w);
888 foreach (var w
in otherWires) wiresEl.Add(w);
896 XElement powerrailWire, ref
int nextUId)
898 var inputWires = wires.Elements(FlgNetNs +
"Wire")
901 var ch = w.Elements().ToList();
903 && ch[0].Name.LocalName ==
"IdentCon"
904 && ch[1].Name.LocalName ==
"NameCon"
905 && ch[1].Attribute(
"Name")?.Value !=
"operand";
909 foreach (var wire
in inputWires)
911 var identCon = wire.Elements(FlgNetNs +
"IdentCon").First();
912 var nameCon = wire.Elements(FlgNetNs +
"NameCon").First();
914 int cUId = nextUId++;
915 parts.Add(
new XElement(FlgNetNs +
"Part",
916 new XAttribute(
"UId", cUId),
917 new XAttribute(
"Name",
"Contact")));
919 powerrailWire.Add(
new XElement(FlgNetNs +
"NameCon",
920 new XAttribute(
"Name",
"in"),
921 new XAttribute(
"UId", cUId)));
923 wires.Add(
new XElement(FlgNetNs +
"Wire",
924 new XAttribute(
"UId", nextUId++),
925 new XElement(FlgNetNs +
"IdentCon",
926 new XAttribute(
"UId", identCon.Attribute(
"UId").Value)),
927 new XElement(FlgNetNs +
"NameCon",
928 new XAttribute(
"Name",
"operand"),
929 new XAttribute(
"UId", cUId))));
931 wires.Add(
new XElement(FlgNetNs +
"Wire",
932 new XAttribute(
"UId", nextUId++),
933 new XElement(FlgNetNs +
"NameCon",
934 new XAttribute(
"Name",
"out"),
935 new XAttribute(
"UId", cUId)),
936 new XElement(FlgNetNs +
"NameCon",
937 new XAttribute(
"Name", nameCon.Attribute(
"Name")?.Value),
938 new XAttribute(
"UId", nameCon.Attribute(
"UId")?.Value))));
Reusable helper methods for building bit-logic AND and RS networks using the Module Essentials XmlNet...
static void ConvertDirectInputWires(XElement parts, XElement wires, XElement powerrailWire, ref int nextUId)
Converts remaining direct IdentCon→NameCon(input) wires (e.g. variable driving RS....
static void ImportBlockAsLad(XmlFB block, PlcDevice plcDevice)
Generates the block XML using MacPLang.FBD (the only mode in which XmlNetwork produces valid graph XM...
static void GenerateFbWithANDNetworkFBD(string blockName, PlcDevice plcDevice)
Generates an FB in FBD language with two networks and imports it into plcDevice :
static void GenerateFbWithRSNetworkLAD(string blockName, PlcDevice plcDevice)
Generates a Function Block (FB) containing two chained RS flip-flop networks in LAD language and impo...
static void ConvertFlgNetToLad(XElement flgNet, ref int nextUId)
Rewrites the wiring inside a single FlgNet element from FBD topology to LAD topology: AND ("A") Parts...
static SystemBlockCall CreateRSCall(XmlNetwork parent)
Adds an RS flip-flop system block call to the given network and returns it. Pins: Q (output),...
static SystemBlockCall CreateANDCall(XmlNetwork parent, int cardinality)
Adds an AND ("A") system block call to the given network.
static void SortFlgNetInFlowOrder(XElement flgNet)
Re-orders <Parts> and <Wires> inside a single FlgNet element so that both collections are listed in s...
static void GenerateFbWithRSNetworkFBD(string blockName, PlcDevice plcDevice, MacPLang macProgrammingLanguage)
Generates a Function Block (FB) containing two chained RS flip-flop networks in FBD language and a th...
static void ExpandAndParts(XElement parts, XElement wires, XElement powerrailWire, ref int nextUId)
Expands every AND ("A") Part into a series Contact chain: powerrail → C1 → C2 → … → Ck → (what AND....
static XmlNetwork CreateRSNetwork(string rInputName, string s1InputName, string rsOperandVariableName, MEPlang opnsProgrammingLanguage)
Creates an RS flip-flop network for use in an FBD block. The RS Q output is routed through a Coil ele...
static XmlNetwork CreateSingleAndRsCircuitNetwork(string andInput1, string andInput2, string rInputName, string operandVariableName)
Creates one AND→RS circuit in a single network (FBD graph, usable for LAD import)....
static XmlNetwork CreateNetworkWith2Circuits(System.Collections.Generic.List< string > inputVariableNames, string rInputName, string operandVariableName)
Creates a single network that contains two independent parallel AND→RS circuits side by side (FBD onl...
static XmlNetwork CreateANDCallNetwork(System.Collections.Generic.List< string > inputVariableNames, string outputVariableName, MEPlang opnsProgrammingLanguage)
Creates a network that ANDs all inputVariableNames together and writes the result to outputVariableN...
static void GenerateFbWithANDNetworkLAD(string blockName, PlcDevice plcDevice)
Generates an FB in LAD language with two networks and imports it into plcDevice : Network 1: AND of t...
static SystemBlockCall CreateAssignmentCall(XmlNetwork parent)
Adds a Coil (assignment) system block call to the given network and returns it. Used in FBD RS networ...
static XmlNetwork CreateRSNetworkLAD(string rInputName, string s1InputName, string rsOperandVariableName)
Creates a single RS network intended for use inside a LAD-language FB.