Skip to content

Commit 20ab94b

Browse files
authored
Merge pull request #56 from siemens/22-how-do-i-include-typed-libraries
feat: add typed function block master copy example (#22)
2 parents 7e6d509 + 9a833f5 commit 20ab94b

12 files changed

+212
-131
lines changed

MAC_use_cases/MAC_use_cases.csproj

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,10 @@ where to where -->
9898
<Compile Include="Model\BaseMAC_use_casesEM.cs" />
9999
<Compile Include="Model\BaseMAC_use_casesEMGeneratedItems.cs" />
100100
<Compile Include="TiaImports\GeneratedClasses\Lib_MAC_use_cases.cs" />
101-
<Compile Include="TiaImports\GeneratedClasses\MAC_use_casesFB.cs" />
102-
<Compile Include="TiaImports\GeneratedClasses\MAC_use_casesFB_FailSafe.cs" />
103-
<Compile Include="TiaImports\GeneratedClasses\myDataType.cs" />
101+
<Compile Include="TiaImports\GeneratedClasses\MyDataType.cs" />
102+
<Compile Include="TiaImports\GeneratedClasses\MyFunctionBlock.cs" />
103+
<Compile Include="TiaImports\GeneratedClasses\MyFunctionBlock_FailSafe.cs" />
104+
<Compile Include="TiaImports\GeneratedClasses\MyFunctionBlock_Typed.cs" />
104105
<Compile Include="TiaImports\ResourceManagement.cs" />
105106
<Compile Include="Properties\AssemblyInfo.cs" />
106107
<Compile Include="UI\MultiPageFrame.xaml.cs">
@@ -210,4 +211,4 @@ where to where -->
210211
<Target Name="AfterBuild">
211212
</Target>
212213
-->
213-
</Project>
214+
</Project>

MAC_use_cases/MAC_use_cases.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package>
33
<metadata>
44
<id>MAC_use_cases</id>
5-
<version>1.0.9236-pre20250415123600</version>
5+
<version>1.0.9237-pre20250416105728</version>
66
<title>MAC_use_cases</title>
77
<authors>SIEMENS AG</authors>
88
<projectUrl>http://equipmentmodule.info/</projectUrl>

MAC_use_cases/MAC_use_cases.tiares

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@
99
<Group Name="LibraryRoot" GenerationName="Types.Groups[&quot;LibraryRoot&quot;]" RootGroupMemberName="LibraryTypesRootGroup">
1010
<Group Name="Lib_MAC_use_cases_Types" GenerationName="Types.Groups[&quot;LibraryRoot&quot;][&quot;Lib_MAC_use_cases_Types&quot;]" />
1111
</Group>
12-
<Types Name="myDataType" GroupPath="Types.Groups[&quot;LibraryRoot&quot;][&quot;Lib_MAC_use_cases_Types&quot;].Types" allowRename="false" createOnlyOnce="true" ContainingLibrary="Lib_MAC_use_cases" OriginalTypeName="myDataType" LibraryType="False" />
12+
<Types Name="MyDataType" GroupPath="Types.Groups[&quot;LibraryRoot&quot;][&quot;Lib_MAC_use_cases_Types&quot;].Types" allowRename="false" createOnlyOnce="true" ContainingLibrary="Lib_MAC_use_cases" OriginalTypeName="MyDataType" LibraryType="False" />
1313
</ResourceCategory>
1414
<ResourceCategory Name="SoftwareUnits" />
1515
<ResourceCategory Name="Blocks" GenerationName="Blocks.Groups[&quot;LibraryRoot&quot;][&quot;Lib_MAC_use_cases_Blocks&quot;]">
1616
<Group Name="LibraryRoot" GenerationName="Blocks.Groups[&quot;LibraryRoot&quot;]" RootGroupMemberName="LibraryBlocksRootGroup">
1717
<Group Name="Lib_MAC_use_cases_Blocks" GenerationName="Blocks.Groups[&quot;LibraryRoot&quot;][&quot;Lib_MAC_use_cases_Blocks&quot;]" />
1818
</Group>
19-
<Blocks Name="MAC_use_casesFB" GroupPath="Blocks.Groups[&quot;LibraryRoot&quot;][&quot;Lib_MAC_use_cases_Blocks&quot;].Blocks" BlockType="FB" allowRename="true" createOnlyOnce="false" ContainingLibrary="Lib_MAC_use_cases" OriginalTypeName="MAC_use_casesFB" LibraryType="False" />
20-
<Blocks Name="MAC_use_casesFB_FailSafe" GroupPath="Blocks.Groups[&quot;LibraryRoot&quot;][&quot;Lib_MAC_use_cases_Blocks&quot;].Blocks" BlockType="FB" allowRename="true" createOnlyOnce="false" ContainingLibrary="Lib_MAC_use_cases" OriginalTypeName="MAC_use_casesFB_FailSafe" LibraryType="False" />
19+
<Blocks Name="MyFunctionBlock" GroupPath="Blocks.Groups[&quot;LibraryRoot&quot;][&quot;Lib_MAC_use_cases_Blocks&quot;].Blocks" BlockType="FB" allowRename="true" createOnlyOnce="false" ContainingLibrary="Lib_MAC_use_cases" OriginalTypeName="MyFunctionBlock" LibraryType="False" />
20+
<Blocks Name="MyFunctionBlock_FailSafe" GroupPath="Blocks.Groups[&quot;LibraryRoot&quot;][&quot;Lib_MAC_use_cases_Blocks&quot;].Blocks" BlockType="FB" allowRename="true" createOnlyOnce="false" ContainingLibrary="Lib_MAC_use_cases" OriginalTypeName="MyFunctionBlock_FailSafe" LibraryType="False" />
21+
<Blocks Name="MyFunctionBlock_Typed" GroupPath="Blocks.Groups[&quot;LibraryRoot&quot;][&quot;Lib_MAC_use_cases_Blocks&quot;].Blocks" BlockType="FB" allowRename="true" createOnlyOnce="false" ContainingLibrary="Lib_MAC_use_cases" OriginalTypeName="MyFunctionBlock_Typed" DefaultVersionGuid="37350dd3-dc9a-4954-a0dd-22084d7f0321" DefaultVersionIsIndependent="True" LibraryType="True" />
2122
</ResourceCategory>
2223
<ResourceCategory Name="TOs" />
2324
<ResourceCategory Name="WatchTables" GenerationName="WatchTables.Groups[&quot;LibraryRoot&quot;][&quot;Lib_MAC_use_cases_WatchTables&quot;]">

MAC_use_cases/Model/MAC_use_casesEM.cs

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,13 @@ public ModuleEdge ModuleStart
8383
/// This attribute is the string which is used for the renaming of the FB.
8484
/// This string can be changed in the View
8585
/// </summary>
86-
public string NameOfMyFb { get; set; } = "myFB";
86+
public string NameOfMyFb { get; set; } = "MyFunctionBlock";
8787

8888
/// <summary>
8989
/// This attribute is the string which is used for the renaming of the safety-FB.
9090
/// This string can be changed in the View
9191
/// </summary>
92-
public string NameOfMyFailSafeFb { get; set; } = "myFailSafeFB";
92+
public string NameOfMyFailSafeFb { get; set; } = "MyFunctionBlock_FailSafe";
9393

9494
[JsonIgnore]
9595
public string NameAndType => NamingConventions.CreateModuleNameAndTypeForEM("MAC_use_cases", this);
@@ -131,54 +131,70 @@ public override bool GenerateTiaPortal(TiaTemplateContext tiaTemplateContext, st
131131
case TiaGenerationPhases.Build:
132132

133133
// Add equipment module specific code generation here.
134-
135134
var opennessTIAPortalProject = GeneralSupport.GetOpennessProject(tiaTemplateContext.TiaProject);
136135
var opennessCPU = GeneralSupport.GetOpennessDeviceItem(tiaTemplateContext.TiaDevice);
137136
m_softwareUnit = SoftwareUnits.GetOrCreateSoftwareUnit(m_plcDevice, "MyUnit", this);
138137

138+
// Configure a Technology Object
139139
myTO.ConfigureTO(myTO.TechnologicalObject, this);
140-
140+
// Log messages
141141
GeneralSupport.LogMessage(LogTypes.GenerationInfo, "Generate technology objects", this);
142+
// Create Technology Object
142143
TechnologyObjectClass.CreateTOs(m_plcDevice, this);
143144

144-
IntegrateLibraries.CreateInstanceDB(this, ResourceManagement.MAC_use_casesFB,
145-
"CreatedDbFromMasterCopy", ResourceManagement.ModuleBlocksRootGroup);
146-
147-
IntegrateLibraries.CreateInstanceDB(this, ResourceManagement.MAC_use_casesFB_FailSafe,
148-
"CreatedDbFromFailSafeFbMasterCopy", ResourceManagement.ModuleBlocksRootGroup);
149-
150-
IntegrateLibraries.CreateInstanceDB_via_XmlInstDB(this, ResourceManagement.MAC_use_casesFB,
145+
IntegrateLibraries.CreateInstanceDB_via_XmlInstDB(this, ResourceManagement.MyFunctionBlock,
151146
"CreatedDbFromMasterCopy_XmlInstDB", ResourceManagement.ModuleBlocksRootGroup, m_plcDevice);
152147

153-
GenericBlockCreation.GenerateDB("myDB", m_plcDevice, this);
148+
var myDataBlockGlobal =
149+
GenericBlockCreation.GenerateGlobalDataBlock("MyDataBlock_Global", m_plcDevice, this);
154150

155-
GenericBlockCreation.SetDefaultValue("myDB", "myParameterName", TIATYPE.INT, "99", this);
151+
GenericBlockCreation.SetDefaultValue(myDataBlockGlobal.Name, "myParameterName", TIATYPE.INT, "99",
152+
this);
156153

157154
GenericBlockCreation.GenerateMultiInstanceFB(m_plcDevice,
158155
tiaTemplateContext.TiaProject.GetEditingLanguage(), this);
159156

160-
GenericBlockCreation.GenerateOB_Main("CreatedDbFromMasterCopy", this,
157+
var dbFromMasterCopy = IntegrateLibraries.CreateInstanceDataBlock(this,
158+
ResourceManagement.MyFunctionBlock,
159+
$"{nameof(ResourceManagement.MyFunctionBlock)}Db", ResourceManagement.ModuleBlocksRootGroup);
160+
161+
GenericBlockCreation.GenerateOB_Main(dbFromMasterCopy.Name, this,
161162
tiaTemplateContext.TiaProject.GetEditingLanguage(), m_plcDevice);
162163

163164
GenericBlockCreation.GenerateMainOBWithMultipleCalls("myOB", 10,
164165
tiaTemplateContext.TiaProject.GetEditingLanguage(), m_plcDevice, this);
165166

166-
GenericBlockCreation.CreateFunctionBlock($"{NameOfMyFb}_FBD", "CreatedDbFromMasterCopy",
167+
GenericBlockCreation.CreateFunctionBlock($"{NameOfMyFb}_FBD", dbFromMasterCopy.Name,
167168
ProgrammingLanguage.FBD,
168169
m_plcDevice);
169-
GenericBlockCreation.CreateFunctionBlock($"{NameOfMyFb}_LAD", "CreatedDbFromMasterCopy",
170+
GenericBlockCreation.CreateFunctionBlock($"{NameOfMyFb}_LAD", dbFromMasterCopy.Name,
170171
ProgrammingLanguage.LAD,
171172
m_plcDevice);
172-
GenericBlockCreation.CreateFunctionBlock($"{NameOfMyFb}_SCL", "CreatedDbFromMasterCopy",
173+
GenericBlockCreation.CreateFunctionBlock($"{NameOfMyFb}_SCL", dbFromMasterCopy.Name,
173174
ProgrammingLanguage.SCL,
174175
m_plcDevice);
176+
177+
var dbFromFailSafeFbMasterCopy = IntegrateLibraries.CreateInstanceDataBlock(this,
178+
ResourceManagement.MyFunctionBlock_FailSafe,
179+
$"{nameof(ResourceManagement.MyFunctionBlock_FailSafe)}Db",
180+
ResourceManagement.ModuleBlocksRootGroup);
181+
175182
GenericBlockCreation.CreateFailSafeFunctionBlock($"{NameOfMyFailSafeFb}_F_LAD",
176-
"CreatedDbFromFailSafeFbMasterCopy",
183+
dbFromFailSafeFbMasterCopy.Name,
177184
ProgrammingLanguage.F_LAD,
178185
m_plcDevice);
179186
GenericBlockCreation.CreateFunctionBlockInSoftwareUnit(m_softwareUnit, "MyFb_FBD",
180187
ProgrammingLanguage.FBD);
181188

189+
var dbFromTypedMasterCopy = IntegrateLibraries.CreateInstanceDataBlock(this,
190+
ResourceManagement.MyFunctionBlock_Typed,
191+
$"{nameof(ResourceManagement.MyFunctionBlock_Typed)}Db", ResourceManagement.ModuleBlocksRootGroup);
192+
193+
GenericBlockCreation.CreateFunctionBlock($"{nameof(ResourceManagement.MyFunctionBlock_Typed)}_FBD",
194+
dbFromTypedMasterCopy.Name,
195+
ProgrammingLanguage.FBD,
196+
m_plcDevice);
197+
182198
var myTagTable = CreateVariables.CreateTagTable(m_plcDevice, "myTagTable");
183199
var mySoftwareUnitTagTable = CreateVariables.CreateTagTable(m_softwareUnit, "mySoftwareUnitTagTable");
184200

MAC_use_cases/Model/UseCases/GenericBlockCreation.cs

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,10 @@ public static void CreateFailSafeFunctionBlock(string blockName, string instance
144144
/// <param name="dbName"></param>
145145
/// <param name="plcDevice">The PLC on which the equipment module is implemented</param>
146146
/// <param name="module">The corresponding equipment module</param>
147-
public static void GenerateDB(string dbName, PlcDevice plcDevice, MAC_use_casesEM module)
147+
public static XmlGlobalDB GenerateGlobalDataBlock(string dbName, PlcDevice plcDevice, MAC_use_casesEM module)
148148
{
149-
var axesDataDB = new XmlGlobalDB(dbName);
150-
var itf = axesDataDB.Interface[InterfaceSections.Static];
149+
var dataBlock = new XmlGlobalDB(dbName);
150+
var itf = dataBlock.Interface[InterfaceSections.Static];
151151

152152
//Create new parameters. The custom parameter means you are using your own user defined data type.
153153
var standardParam = new InterfaceParameter(ParameterName, "Int");
@@ -161,7 +161,8 @@ public static void GenerateDB(string dbName, PlcDevice plcDevice, MAC_use_casesE
161161
itf.Add(customParam1);
162162
itf.Add(customParam2);
163163

164-
axesDataDB.GenerateXmlBlock(plcDevice);
164+
dataBlock.GenerateXmlBlock(plcDevice);
165+
return dataBlock;
165166
}
166167

167168
/// <summary>
@@ -260,40 +261,34 @@ public static void SetDefaultValue(string dbName, string parameterName, TIATYPE
260261
/// <param name="module">The Module</param>
261262
public static void GenerateMultiInstanceFB(PlcDevice plcDevice, string languageSettings, MAC_use_casesEM module)
262263
{
263-
var myFb = new XmlFB("MyMultiInstanceFB");
264-
myFb.BlockAttributes.ProgrammingLanguage = ProgrammingLanguage.LAD;
265-
266-
var myMultiInstanceFBCall = new MultiInstanceCall("MyMultiInstanceDbName", "MAC_use_casesFB", plcDevice)
264+
var myFb = new XmlFB("MyFunctionBlock_MultiInstance")
267265
{
268-
["Input1"] = "1", // inputVariable1
269-
["Input2"] = "0" // inputVariable1
270-
//["Input2"] = "inputVariable1",
271-
272-
//["Output1"] = "outputVariable1",
266+
BlockAttributes = { ProgrammingLanguage = ProgrammingLanguage.LAD }
273267
};
274268

275-
//manipulate interface
276-
//var axesDataDB = new XmlFB (dbName);
277-
var itf = myFb.Interface[InterfaceSections.Static];
269+
var multiInstanceDataBlockName = myFb.Name + "_Instance";
270+
var myMultiInstanceFbCall =
271+
new MultiInstanceCall(multiInstanceDataBlockName, module.ResourceManagement.MyFunctionBlock.Name, plcDevice)
272+
{
273+
["Input1"] = "1", // inputVariable1
274+
["Input2"] = "0" // inputVariable1
275+
};
278276

279-
//Define two interface parameters
280-
InterfaceParameter customParam;
277+
//manipulate interface
278+
var interfaceParameters = myFb.Interface[InterfaceSections.Static];
281279

282280
//Create new parameters. The custom parameter means you are using your own user defined data type.
283-
284-
customParam =
285-
new InterfaceParameter("MyMultiInstanceDbName", "\"" + "MAC_use_casesFB" + "\"")
286-
{
287-
Remanence = RemanenceSettings.IgnoreRemanence
288-
};
281+
var customParam =
282+
new InterfaceParameter(multiInstanceDataBlockName,
283+
module.ResourceManagement.MyFunctionBlock.Name) { Remanence = RemanenceSettings.IgnoreRemanence };
289284

290285
//Add your parameters
291-
itf.Add(customParam);
286+
interfaceParameters.Add(customParam);
292287

293288
var networkMultiInstance = new BlockNetwork();
294-
networkMultiInstance.Blocks.Add(myMultiInstanceFBCall);
289+
networkMultiInstance.Blocks.Add(myMultiInstanceFbCall);
295290
networkMultiInstance.GenerationLabel =
296-
new GenerationLabel(module.Name, "Generated by MAC2", module.ModuleID.ToString());
291+
new GenerationLabel(module.Name, "Generated by MAC", module.ModuleID.ToString());
297292
myFb.Networks.Add(networkMultiInstance);
298293
AddCodeBlockToOB(myFb, module.ResourceManagement, languageSettings, plcDevice);
299294
}
@@ -335,7 +330,7 @@ public static void GenerateOB_Main(string instanceDbName, MAC_use_casesEM module
335330
mainOb.Networks.Add(blockNetwork);
336331

337332
///Create a SCL-network with IF and ELSE Statements
338-
var content = "\"myDB\".myParameterName := 100;\n";
333+
var content = "\"MyDataBlock_Global\".myParameterName := 100;\n";
339334
content += "IF #Temp THEN\n";
340335
content += "#TempInt := 5;\n";
341336
content += "ELSE\n";
@@ -404,19 +399,19 @@ public static void GenerateMainOBWithMultipleCalls(string name, int numberOfCall
404399

405400
for (var i = 1; i <= numberOfCalls; i++)
406401
{
407-
IntegrateLibraries.CreateInstanceDB(module, module.ResourceManagement.MAC_use_casesFB,
408-
"CreatedDbFromMasterCopy" + i, module.ResourceManagement.ModuleBlocksRootGroup);
409-
var blockname = "CreatedDbFromMasterCopy" + i;
410-
var myOBCall = new BlockCall(blockname, plcDevice)
402+
var blockName = $"{nameof(module.ResourceManagement.MyFunctionBlock)}DB" + i;
403+
IntegrateLibraries.CreateInstanceDataBlock(module, module.ResourceManagement.MyFunctionBlock,
404+
blockName, module.ResourceManagement.ModuleBlocksRootGroup);
405+
var myOBCall = new BlockCall(blockName, plcDevice)
411406
{
412407
["Input1"] = "1", // inputVariable1
413408
["Input2"] = "0" // inputVariable1
414409
};
415410

416411
var myObBlockNetwork = new BlockNetwork();
417412
myObBlockNetwork.Blocks.Add(myOBCall);
418-
myObBlockNetwork.GenerationLabel = new GenerationLabel(blockname,
419-
"Generated by MAC. Blockname: \"" + blockname + "\"", module.ModuleID.ToString());
413+
myObBlockNetwork.GenerationLabel = new GenerationLabel(blockName,
414+
"Generated by MAC. Blockname: \"" + blockName + "\"", module.ModuleID.ToString());
420415
myOb.Networks.Add(myObBlockNetwork);
421416
}
422417

0 commit comments

Comments
 (0)