plcopen/instance_tagname.ysl2
author Andrey Skvortsov <andrej.skvortzov@gmail.com>
Tue, 05 Mar 2019 11:19:36 +0300
changeset 2519 27955f010b23
parent 1950 752ec68da94d
permissions -rw-r--r--
Fix crash if LD input contact isn't connected

Traceback (most recent call last):
File "/home/developer/WorkData/PLC/beremiz/beremiz/BeremizIDE.py", line 339, in OnMethod
obj.CTR.CallMethod('_'+meth)
File "/home/developer/WorkData/PLC/beremiz/beremiz/ProjectController.py", line 1996, in CallMethod
getattr(self, method)()
File "/home/developer/WorkData/PLC/beremiz/beremiz/ProjectController.py", line 1134, in _Build
IECGenRes = self._Generate_SoftPLC()
File "/home/developer/WorkData/PLC/beremiz/beremiz/ProjectController.py", line 746, in _Generate_SoftPLC
if self._Generate_PLC_ST():
File "/home/developer/WorkData/PLC/beremiz/beremiz/ProjectController.py", line 763, in _Generate_PLC_ST
self._getIECgeneratedcodepath())
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCControler.py", line 456, in GenerateProgram
self.ProgramChunks = GenerateCurrentProgram(self, self.Project, errors, warnings)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1762, in GenerateCurrentProgram
generator.GenerateProgram()
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 478, in GenerateProgram
self.GeneratePouProgram(pou_name)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 260, in GeneratePouProgram
program = pou_program.GenerateProgram(pou)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1718, in GenerateProgram
self.ComputeProgram(pou)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1028, in ComputeProgram
self.GenerateBlock(instance, block_infos, body, None)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1144, in GenerateBlock
expression = self.ComputeExpression(body, connections, executionOrderId > 0)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1373, in ComputeExpression
paths = self.GeneratePaths(connections, body, order, to_inout)
File "/home/developer/WorkData/PLC/beremiz/beremiz/PLCGenerator.py", line 1344, in GeneratePaths
elif isinstance(result[0], list):
IndexError: list index out of range


Close #70
include yslt_noindent.yml2
istylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
            xmlns:xhtml="http://www.w3.org/1999/xhtml"
            xmlns:ns="beremiz" 
            extension-element-prefixes="ns" 
            exclude-result-prefixes="ns" {
    
    param "instance_path";
    
    variable "project", "ns:GetProject()";
    
    variable "stdlib", "ns:GetStdLibs()";

    variable "extensions", "ns:GetExtensions()";

    variable "all_types", "($project | $stdlib | $extensions)/ppx:types";
    
    function "element_name" {
        param "path";
        choose {
            when "contains($path,'.')" > «substring-before($path,'.')»
            otherwise > «$path»
        }
    }
    
    function "next_path" {
        param "path";
        choose {
            when "contains($path,'.')" > «substring-after($path,'.')»
        }
    }
    
    template "ppx:project" {
        variable "config_name" {
            call "element_name" {
                with "path", "$instance_path";
            }
        }
        apply "ppx:instances/ppx:configurations/ppx:configuration[@name=$config_name]" {
            with "element_path" {
                call "next_path" {
                    with "path", "$instance_path";
                }
            }
        }
    }
    
    template "ppx:configuration" {
        param "element_path";
        choose {
            when "$element_path!=''" {
                variable "child_name" {
                    call "element_name" {
                        with "path", "$element_path";
                    }
                }
                apply "ppx:resource[@name=$child_name] | ppx:globalVars/ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" {
                    with "element_path" {
                        call "next_path" {
                            with "path", "$element_path";
                        }
                    }
                }
            }
            otherwise {
                value "ns:ConfigTagName(@name)";
            }
        }
    }
    
    template "ppx:resource" {
        param "element_path";
        choose {
            when "$element_path!=''" {
                variable "child_name" {
                    call "element_name" {
                        with "path" > «$element_path»
                    }
                }
                apply "ppx:pouInstance[@name=$child_name] | ppx:task/ppx:pouInstance[@name=$child_name] | ppx:globalVars/ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" {
                    with "element_path" {
                        call "next_path" {
                            with "path", "$element_path";
                        }
                    }
                }
            }
            otherwise {
                value "ns:ResourceTagName(ancestor::ppx:configuration/@name, @name)";
            }
        }
    }
    
    template "ppx:pouInstance" {
        param "element_path";
        variable "type_name" > «@typeName»
        apply """$all_types/ppx:pous/ppx:pou[@name=$type_name] | \
                 $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" {
            with "element_path", "$element_path";
        }
    }
    
    template "ppx:pou" {
        param "element_path";
        choose {
            when "$element_path!=''" {
                variable "child_name" {
                    call "element_name" {
                        with "path", "$element_path";
                    }
                }
                apply "ppx:interface/*/ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" {
                    with "element_path" {
                        call "next_path" {
                            with "path", "$element_path";
                        }
                    }
                }
                apply "ppx:actions/ppx:action[@name=$child_name] | ppx:transitions/ppx:transition[@name=$child_name]";
            }
            otherwise {
                variable "name" > «@name»
                value "ns:PouTagName($name)";
            }
        }
    }
    
    template "ppx:action" {
        value "ns:ActionTagName(ancestor::ppx:pou/@name, @name)";
    }
    
    template "ppx:transition" {
        value "ns:TransitionTagName(ancestor::ppx:pou/@name, @name)";
    }
    
    template "ppx:dataType" {
        param "element_path";
        apply "ppx:baseType/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" {
            with "element_path", "$element_path";
        }
    }
    
    template "ppx:derived" {
        param "element_path";
        variable "type_name" > «@name»
        apply """$all_types/ppx:pous/ppx:pou[@name=$type_name] | \
                 $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" {
            with "element_path", "$element_path";
        }
    }
    
    template "ppx:array" {
        param "element_path";
        apply "ppx:baseType/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" {
            with "element_path", "$element_path";
        }
    }
    
    template "ppx:struct" {
        param "element_path";
        variable "child_name" {
            call "element_name" {
                with "path", "$element_path";
            }
        }
        apply "ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" {
            with "element_path" {
                call "next_path" {
                    with "path", "$element_path";
                }
            }
        }
    }
    
}