Comments (5)
Oh that's a great point! I guess I wasn't confident that I knew what the use case would be for a ComplexData
instance without any members. In theory, Studio should be able to resolve the AB:5000_DO16:O:0
data type if it loads in the Modules before it loads in the AOIs.
With that being said, being able to create tags for the Parameters of an AOI would be great!
from l5sharp.
Thanks for sharing this use case. I agree it would be nice to have something to convert the AOI instance to a Tag instance with populated members based on the parameters of the AOI. Perhaps even the same for DataType to Tag.
I added a few things to accomplish this, but before I publish it, I want to make sure we are on the same page. Is something like the following what you have in mind?
var aoi = new AddOnInstruction("MyAoi");
aoi.Parameters.Add(new Parameter("Param01", new DINT(123)));
aoi.Parameters.Add(new Parameter("Param02", new BOOL(true)));
aoi.Parameters.Add(new Parameter("Param02", new REAL(1.23f)));
var tag = aoi.ToTag("MyAoiTag");
tag.Should().NotBeNull();
tag.Name.Should().Be("MyAoiTag");
tag.Value.Should().BeOfType<ComplexData>();
tag.Value.Name.Should().Be("MyAoi");
tag.Members().ToList().Should().HaveCount(6); //this inclused built in EnableIn, EnableOut, root tag itself, as well as parameters.
In your case you would be able to do this
AOI = Content.Instructions.First();
AOITag = AOI.ToTag(aoiTagName);
The ToTag
method builds the tag using the provided name, the AOI name, and the AOI parameters. This only generates tag members for parameters that are configured as Input or Output. Studio requires those parameters to be atomic data types, and these are the only parameter types I see showing up as data members for an AOI tag. This is actually a good thing for us, since if we had to create complex types, there would be no way to generate the full data structure unless it was defined somewhere (either in the L5X or statically).
Let me know what you think.
from l5sharp.
That looks great! However, I'm using an AOI that does use an InOut parameter to reference a device. I understand the problem you said about the parameters. Maybe it can create the tag with a user-defined string tag type and we assume (scary!) the data type has been created?
Here's the AOI L5X if you want to take a look at it.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--Use this AOI to map all inputs using a single integer (DO_01.XX).-->
<RSLogix5000Content SchemaRevision="1.0" SoftwareRevision="36.00" TargetName="AOI_OB16_Mapping" TargetType="AddOnInstructionDefinition" TargetRevision="1.0 " TargetLastEdited="2024-04-25T07:19:42.160Z" ContainsContext="true" ExportDate="Mon Apr 29 11:54:21 2024" ExportOptions="References NoRawData L5KData DecoratedData Context Dependencies ForceProtectedEncoding AllProjDocTrans">
<Controller Use="Context" Name="autoGeneratedProject">
<DataTypes Use="Context">
</DataTypes>
<AddOnInstructionDefinitions Use="Context">
<AddOnInstructionDefinition Use="Target" Name="AOI_OB16_Mapping" Revision="1.0" Vendor="Koops" ExecutePrescan="false" ExecutePostscan="false" ExecuteEnableInFalse="false" CreatedDate="2024-04-25T07:19:42.149Z" CreatedBy="ProgramGenerator" EditedDate="2024-04-25T07:19:42.160Z" EditedBy="ProgramGenerator" SoftwareRevision="33.0">
<Description>
<![CDATA[Use this AOI to map all inputs using a single integer (DO_01.XX).]]></Description>
<Parameters>
<Parameter Name="EnableIn" TagType="Base" DataType="BOOL" Usage="Input" Radix="Decimal" Required="false" Visible="false" ExternalAccess="Read Only">
<Description>
<![CDATA[Enable Input - System Defined Parameter]]></Description>
</Parameter>
<Parameter Name="EnableOut" TagType="Base" DataType="BOOL" Usage="Output" Radix="Decimal" Required="false" Visible="false" ExternalAccess="Read Only">
<Description>
<![CDATA[Enable Output - System Defined Parameter]]></Description>
</Parameter>
<Parameter Name="Device" TagType="Base" DataType="AB:5000_DO16:O:0" Usage="InOut" Required="true" Visible="true" Constant="false"/>
<Parameter Name="Output_Data" TagType="Base" DataType="INT" Usage="Input" Radix="Decimal" Required="true" Visible="true" ExternalAccess="Read Only">
<DefaultData Format="L5K">
<![CDATA[0]]></DefaultData>
<DefaultData Format="Decorated">
<DataValue DataType="INT" Radix="Decimal" Value="0"/>
</DefaultData>
</Parameter>
</Parameters>
<LocalTags/>
<Routines>
<Routine Name="Logic" Type="RLL">
<RLLContent>
<Rung Number="0" Type="N">
<Text>
<![CDATA[NOP();]]></Text>
</Rung>
<Rung Number="1" Type="N">
<Comment>
<![CDATA[MAP INPUT CARD TO SINGLE INTEGER
---
INPUT CARD = AB:5000_DI16:O:0]]></Comment>
<Text>
<![CDATA[NOP();]]></Text>
</Rung>
<Rung Number="2" Type="N">
<Text>
<![CDATA[XIC(Device.Pt00.Data)OTE(Output_Data.0);]]></Text>
</Rung>
<Rung Number="3" Type="N">
<Text>
<![CDATA[XIC(Device.Pt01.Data)OTE(Output_Data.1);]]></Text>
</Rung>
<Rung Number="4" Type="N">
<Text>
<![CDATA[XIC(Device.Pt02.Data)OTE(Output_Data.2);]]></Text>
</Rung>
<Rung Number="5" Type="N">
<Text>
<![CDATA[XIC(Device.Pt03.Data)OTE(Output_Data.3);]]></Text>
</Rung>
<Rung Number="6" Type="N">
<Text>
<![CDATA[XIC(Device.Pt04.Data)OTE(Output_Data.4);]]></Text>
</Rung>
<Rung Number="7" Type="N">
<Text>
<![CDATA[XIC(Device.Pt05.Data)OTE(Output_Data.5);]]></Text>
</Rung>
<Rung Number="8" Type="N">
<Text>
<![CDATA[XIC(Device.Pt06.Data)OTE(Output_Data.6);]]></Text>
</Rung>
<Rung Number="9" Type="N">
<Text>
<![CDATA[XIC(Device.Pt07.Data)OTE(Output_Data.7);]]></Text>
</Rung>
<Rung Number="10" Type="N">
<Text>
<![CDATA[XIC(Device.Pt08.Data)OTE(Output_Data.8);]]></Text>
</Rung>
<Rung Number="11" Type="N">
<Text>
<![CDATA[XIC(Device.Pt09.Data)OTE(Output_Data.9);]]></Text>
</Rung>
<Rung Number="12" Type="N">
<Text>
<![CDATA[XIC(Device.Pt10.Data)OTE(Output_Data.10);]]></Text>
</Rung>
<Rung Number="13" Type="N">
<Text>
<![CDATA[XIC(Device.Pt11.Data)OTE(Output_Data.11);]]></Text>
</Rung>
<Rung Number="14" Type="N">
<Text>
<![CDATA[XIC(Device.Pt12.Data)OTE(Output_Data.12);]]></Text>
</Rung>
<Rung Number="15" Type="N">
<Text>
<![CDATA[XIC(Device.Pt13.Data)OTE(Output_Data.13);]]></Text>
</Rung>
<Rung Number="16" Type="N">
<Text>
<![CDATA[XIC(Device.Pt14.Data)OTE(Output_Data.14);]]></Text>
</Rung>
<Rung Number="17" Type="N">
<Text>
<![CDATA[XIC(Device.Pt15.Data)OTE(Output_Data.15);]]></Text>
</Rung>
</RLLContent>
</Routine>
</Routines>
</AddOnInstructionDefinition>
</AddOnInstructionDefinitions>
</Controller>
</RSLogix5000Content>
from l5sharp.
In your example Device would be a separate tag from the AOI tag instance though, correct?
Since InOut tags are references to other tags, you could just create them from the parameters, and then add them to the L5X alongside the AOI tag.
var content = L5X.Load("PathToFile");
var aoi = content.Instructions.Get("AOI_OB16_Mapping");
var aoiTag = aoi.ToTag("AOI_OB16_Mapping_Tag");
var aoiInOutTags = aoi.Parameters
.Where(p => p.Usage == TagUsage.InOut)
.Select(p => new Tag(p.Name, new ComplexData(p.DataType)));
content.Tags.Add(aoiTag);
content.Tags.AddRange(aoiInOutTags);
content.Save("PathToFile");
When you load this L5X, the Device
tag should be created with the members matching the specified AB:5000_DO16:O:0
data type, assuming that type exists in the project. ComplexData
is a "generic" data type container that you can just give a name (and optionally add members if desired), and it will refer to some type we don't know about until the Studio resolves it. In this case it looks like a module defined type, so that would depend on whether that module is also added to the project file.
Am I missing something you are still after? Do you want an easier way to just create a tag from a parameter? Do you want a method on AOI (maybe like GetTags() or something) that can generate all these tags (both AOI and InOut) in one go? Or does this solve your use case?
from l5sharp.
Version 2.3.0 adds ToTag
methods for AOI and Parameter as discussed here.
For parameter here is an example.
var parameter = new Parameter
{
Name = "Test",
DataType = "MyDataType"
};
var tag = parameter.ToTag("MyParameterTag");
tag.Should().NotBeNull();
tag.Name.Should().Be("MyParameterTag");
tag.DataType.Should().Be("MyDataType");
tag.Value.Should().BeOfType<ComplexData>();
from l5sharp.
Related Issues (20)
- Consumed Tag Attributes HOT 2
- Converting ACD files to L5X? HOT 1
- Updating rungs for routines HOT 2
- Creating Safety Programs HOT 3
- Proposal to Extend L5Sharp Support to .NET Standard 2.0 HOT 2
- Tag Data Type Modification HOT 2
- RLL Routine Rung Comment Generation HOT 5
- New FBD Routine Example HOT 3
- Problem Creating Array Tags HOT 3
- Working with SafetyInfo HOT 9
- Issue with DateTime Format in AOIs HOT 2
- AOI Rung Numbers HOT 9
- Bit Descriptions HOT 2
- Can't Derive from Sealed Type HOT 1
- Controller Module HOT 2
- Parsing to a DataType HOT 2
- Inconsistent use of bool and BOOL data type HOT 8
- Adding rung to routine with no rungs HOT 2
- Feature Request: AOI Rung Instruction HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from l5sharp.