Skip to content

Commit c0dbd8e

Browse files
committed
fix wrong substring usage
1 parent b6b6de9 commit c0dbd8e

4 files changed

Lines changed: 30 additions & 6 deletions

File tree

TiaCodegen-ts/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

TiaCodegen-ts/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@node-projects/tia-codegen-ts",
3-
"version": "2.0.0",
3+
"version": "2.0.1",
44
"description": "TypeScript port of TiaCodeGen C# library",
55
"type": "module",
66
"main": "dist/index.js",

TiaCodegen-ts/src/CodeGen/KopCodeHelper.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ export class KopCodeHelper {
218218
const idx = part.indexOf('[') + 1;
219219
if (idx > 0) {
220220
this._sb.appendLine(`<Component Name="${part.substring(0, idx - 1)}">`);
221-
const arrays = part.substring(idx, part.length - idx - 1);
221+
const arrays = part.substring(idx, part.length - 1);
222222

223223
if (arrays.includes('"')) {
224224
this._sb.appendLine('<Access Scope="GlobalConstant">');
@@ -312,7 +312,7 @@ export class KopCodeHelper {
312312
const idx = instanceNamePart.indexOf('[') + 1;
313313
if (idx > 0) {
314314
this._sb.appendLine(`<Component Name="${instanceNamePart.substring(0, idx - 1)}">`);
315-
const arrays = instanceNamePart.substring(idx, instanceNamePart.length - idx - 1);
315+
const arrays = instanceNamePart.substring(idx, instanceNamePart.length - 1);
316316

317317
if (arrays.includes('"')) {
318318
this._sb.appendLine('<Access Scope="GlobalConstant">');

TiaCodegen-ts/tests/SampleTests.test.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,30 @@ describe('SampleTests', () => {
168168
expect(xml).toBeTruthy();
169169
});
170170

171+
test('FunctionBlockCallWithArrayInstance', () => {
172+
const codeblock = new CodeBlock();
173+
const nw = new Network('Test', 'Test');
174+
nw.add(new FunctionBlockCall({ functionName: 'OrganiseSlot', instanceName: 'OrganiseSlot["S0001"]' }));
175+
codeblock.add(nw);
176+
177+
const xml = new Block('Test', 'Test', codeblock).getCode();
178+
179+
expect(xml).toContain('<Component Name="OrganiseSlot">');
180+
expect(xml).toContain('<Constant Name="S0001">');
181+
});
182+
183+
test('SystemFunctionBlockCallWithArrayInstance', () => {
184+
const codeblock = new CodeBlock();
185+
const nw = new Network('Test', 'Test');
186+
nw.add(new TONCall({ instanceName: 'Timer[1]' }));
187+
codeblock.add(nw);
188+
189+
const xml = new Block('Test', 'Test', codeblock).getCode();
190+
191+
expect(xml).toContain('<Component Name="Timer">');
192+
expect(xml).toContain('<ConstantValue>1</ConstantValue>');
193+
});
194+
171195
test('TestDistributor', () => {
172196
const codeblock = new CodeBlock();
173197
const nw = new Network('Test2', 'Test2en');
@@ -523,4 +547,4 @@ describe('SampleTests', () => {
523547
const expectedXml = ' <SW.Blocks.FC ID="0"> <AttributeList> <HeaderFamily>General</HeaderFamily> <HeaderVersion>1.0</HeaderVersion> <MemoryLayout>Optimized</MemoryLayout> <Name>Test</Name> <Namespace /> <ProgrammingLanguage>LAD</ProgrammingLanguage> </AttributeList> <ObjectList><SW.Blocks.CompileUnit ID="1" CompositionName="CompileUnits"> <!--Test--><AttributeList><NetworkSource><FlgNet xmlns="http://www.siemens.com/automation/Openness/SW/NetworkSource/FlgNet/v1"><Parts><Access Scope="LocalVariable" UId="21"><Symbol><Component Name="CarrierGeneral"></Component><Component Name="States"></Component><Component Name="CarriageDataPresent"><Access Scope="LiteralConstant"><Constant><ConstantType>DInt</ConstantType><ConstantValue>2</ConstantValue></Constant></Access></Component></Symbol></Access><Access Scope="LocalVariable" UId="22"><Symbol><Component Name="CarrierGeneral"></Component><Component Name="States"></Component><Component Name="CarriageOccupied"><Access Scope="LiteralConstant"><Constant><ConstantType>DInt</ConstantType><ConstantValue>2</ConstantValue></Constant></Access></Component></Symbol></Access><Access Scope="LocalVariable" UId="23"><Symbol><Component Name="Configuration"></Component><Component Name="General"></Component><Component Name="SingleDoubleCarrier"></Component></Symbol></Access><Access Scope="LocalVariable" UId="24"><Symbol><Component Name="DoubleCarrier"></Component><Component Name="Sensors"></Component><Component Name="R"><Access Scope="LocalVariable"><Symbol><Component Name="Configuration" /><Component Name="General" /><Component Name="CoordinationAxisConveyor" /></Symbol></Access><Access Scope="LiteralConstant"><Constant><ConstantType>DInt</ConstantType><ConstantValue>1</ConstantValue></Constant></Access></Component></Symbol></Access><Access Scope="LocalVariable" UId="25"><Symbol><Component Name="DoubleCarrier"></Component><Component Name="Sensors"></Component><Component Name="V"><Access Scope="LocalVariable"><Symbol><Component Name="Configuration" /><Component Name="General" /><Component Name="CoordinationAxisConveyor" /></Symbol></Access><Access Scope="LiteralConstant"><Constant><ConstantType>DInt</ConstantType><ConstantValue>1</ConstantValue></Constant></Access></Component></Symbol></Access><Access Scope="LocalVariable" UId="26"><Symbol><Component Name="DoubleCarrierData"></Component><Component Name="MOrder"></Component><Component Name="DataPresent"></Component></Symbol></Access><Access Scope="LiteralConstant" UId="27"><Constant><ConstantType>Int</ConstantType><ConstantValue>2</ConstantValue></Constant></Access><Part Name="Eq" UId="28"><TemplateValue Name="SrcType" Type="Type">Int</TemplateValue></Part><Part Name="Contact" UId="29" /><!-- #DoubleCarrier.Sensors.V[#Configuration.General.CoordinationAxisConveyor, 1] --><Part Name="Contact" UId="30" /><!-- #DoubleCarrier.Sensors.R[#Configuration.General.CoordinationAxisConveyor, 1] --><Part Name="O" UId="31"><!-- Or (Signals...) --><TemplateValue Name="Card" Type="Cardinality">2</TemplateValue></Part><Part Name="Coil" UId="32"/><!-- #CarrierGeneral.States.CarriageOccupied[2] --><Part Name="Contact" UId="33" /><!-- #DoubleCarrierData.MOrder.DataPresent --><Part Name="Coil" UId="34"/><!-- #CarrierGeneral.States.CarriageDataPresent[2] --></Parts><Wires><Wire UId="35"><Powerrail /><NameCon UId="28" Name="pre" /> <!-- Eq --></Wire><Wire UId="36"><!-- Wire CompareOperator --><IdentCon UId="23" /> <!-- Signal(#Configuration.General.SingleDoubleCarrier) --><NameCon UId="28" Name="in1" /> <!-- Eq --></Wire><Wire UId="37"><!-- Wire CompareOperator --><IdentCon UId="27" /> <!-- Signal(2) --><NameCon UId="28" Name="in2" /> <!-- Eq --></Wire><Wire UId="38"><!-- Wire Parent FunctionCall (Parent:Or (Signal(#DoubleCarrier.Sensors.V[#Configuration.General.CoordinationAxisConveyor, 1]),Signal(#DoubleCarrier.Sensors.R[#Configuration.General.CoordinationAxisConveyor, 1]))) --><IdentCon UId="25" /> <!-- #DoubleCarrier.Sensors.V[#Configuration.General.CoordinationAxisConveyor, 1] --><NameCon UId="29" Name="operand" /> <!-- #DoubleCarrier.Sensors.V[#Configuration.General.CoordinationAxisConveyor, 1] --></Wire><Wire UId="39"><!-- Wire Parent FunctionCall (Parent:Or (Signal(#DoubleCarrier.Sensors.V[#Configuration.General.CoordinationAxisConveyor, 1]),Signal(#DoubleCarrier.Sensors.R[#Configuration.General.CoordinationAxisConveyor, 1]))) --><IdentCon UId="24" /> <!-- #DoubleCarrier.Sensors.R[#Configuration.General.CoordinationAxisConveyor, 1] --><NameCon UId="30" Name="operand" /> <!-- #DoubleCarrier.Sensors.R[#Configuration.General.CoordinationAxisConveyor, 1] --></Wire><Wire UId="40"><!-- Wire 2 Or --><NameCon UId="29" Name="out" /> <!-- Signal(#DoubleCarrier.Sensors.V[#Configuration.General.CoordinationAxisConveyor, 1]) --><NameCon UId="31" Name="in1" /> <!-- Or (Signal(#DoubleCarrier.Sensors.V[#Configuration.General.CoordinationAxisConveyor, 1]),Signal(#DoubleCarrier.Sensors.R[#Configuration.General.CoordinationAxisConveyor, 1])) --></Wire><Wire UId="41"><!-- Wire 2 Or --><NameCon UId="30" Name="out" /> <!-- Signal(#DoubleCarrier.Sensors.R[#Configuration.General.CoordinationAxisConveyor, 1]) --><NameCon UId="31" Name="in2" /> <!-- Or (Signal(#DoubleCarrier.Sensors.V[#Configuration.General.CoordinationAxisConveyor, 1]),Signal(#DoubleCarrier.Sensors.R[#Configuration.General.CoordinationAxisConveyor, 1])) --></Wire><Wire UId="42"><!-- Wire Parent FunctionCall (Parent:Coil) --><IdentCon UId="22" /> <!-- #CarrierGeneral.States.CarriageOccupied[2] --><NameCon UId="32" Name="operand" /> <!-- #CarrierGeneral.States.CarriageOccupied[2] --></Wire><Wire UId="43"><!-- Wire And --><NameCon UId="31" Name="out" /> <!-- Or --><NameCon UId="32" Name="in" /> <!-- Coil --></Wire><Wire UId="44"><!-- Wire Parent FunctionCall (Parent:And (Signal(#DoubleCarrierData.MOrder.DataPresent),Coil)) --><IdentCon UId="26" /> <!-- #DoubleCarrierData.MOrder.DataPresent --><NameCon UId="33" Name="operand" /> <!-- #DoubleCarrierData.MOrder.DataPresent --></Wire><Wire UId="45"><!-- Wire Parent FunctionCall (Parent:Coil) --><IdentCon UId="21" /> <!-- #CarrierGeneral.States.CarriageDataPresent[2] --><NameCon UId="34" Name="operand" /> <!-- #CarrierGeneral.States.CarriageDataPresent[2] --></Wire><Wire UId="46"><!-- Wire And --><NameCon UId="33" Name="out" /> <!-- #DoubleCarrierData.MOrder.DataPresent --><NameCon UId="34" Name="in" /> <!-- Coil --></Wire><Wire UId="47"><!-- Wire And --><NameCon UId="28" Name="out" /> <!-- Eq --><!-- Distributor --><NameCon UId="29" Name="in" /> <!-- Signal --><NameCon UId="30" Name="in" /> <!-- Signal --><NameCon UId="33" Name="in" /> <!-- Signal --></Wire></Wires></FlgNet></NetworkSource><ProgrammingLanguage>LAD</ProgrammingLanguage></AttributeList><ObjectList><MultilingualText ID="2" CompositionName="Comment"><ObjectList><MultilingualTextItem ID="3" CompositionName="Items"><AttributeList><Culture>de-DE</Culture><Text></Text></AttributeList></MultilingualTextItem><MultilingualTextItem ID="4" CompositionName="Items"><AttributeList><Culture>en-GB</Culture><Text></Text></AttributeList></MultilingualTextItem></ObjectList></MultilingualText><MultilingualText ID="5" CompositionName="Title"><ObjectList><MultilingualTextItem ID="6" CompositionName="Items"><AttributeList><Culture>de-DE</Culture><Text>Test</Text></AttributeList></MultilingualTextItem><MultilingualTextItem ID="7" CompositionName="Items"><AttributeList><Culture>en-GB</Culture><Text>Testen</Text></AttributeList></MultilingualTextItem></ObjectList></MultilingualText></ObjectList></SW.Blocks.CompileUnit> <MultilingualText ID="8" CompositionName="Title"> <ObjectList> <MultilingualTextItem ID="9" CompositionName="Items"> <AttributeList> <Culture>de-DE</Culture> <Text>blabla</Text> </AttributeList> </MultilingualTextItem> <MultilingualTextItem ID="10" CompositionName="Items"> <AttributeList> <Culture>en-GB</Culture> <Text></Text> </AttributeList> </MultilingualTextItem> </ObjectList> </MultilingualText> <MultilingualText ID="11" CompositionName="Comment"> <ObjectList> <MultilingualTextItem ID="12" CompositionName="Items"> <AttributeList> <Culture>de-DE</Culture> <Text></Text> </AttributeList> </MultilingualTextItem> <MultilingualTextItem ID="13" CompositionName="Items"> <AttributeList> <Culture>en-GB</Culture> <Text></Text> </AttributeList> </MultilingualTextItem> </ObjectList> </MultilingualText> </ObjectList> </SW.Blocks.FC>';
524548
expect(xml.replace(/\r?\n/g, '')).toEqual(expectedXml.replace(/\r?\n/g, ''));
525549
});
526-
});
550+
});

0 commit comments

Comments
 (0)