Adding support for generation of blocks in LD
authorlbessard
Fri, 05 Oct 2007 18:00:25 +0200
changeset 104 a9b8916d906d
parent 103 26c10e28ee3a
child 105 d8284a8f1934
Adding support for generation of blocks in LD
PLCGenerator.py
plcopen/structures.py
--- a/PLCGenerator.py	Fri Oct 05 17:59:34 2007 +0200
+++ b/PLCGenerator.py	Fri Oct 05 18:00:25 2007 +0200
@@ -245,6 +245,10 @@
             for instance in body.getContentInstances():
                 if isinstance(instance, plcopen.coil):
                     paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), body)
+                    if len(paths) > 0:
+                        paths = tuple(paths)
+                    else:
+                        paths = paths[0] 
                     variable = self.ExtractModifier(instance, instance.getVariable())
                     expression = self.ComputeLDExpression(paths, True)
                     self.Program += "  %s := %s;\n"%(variable, expression)
@@ -275,8 +279,8 @@
         if isinstance(instance, (plcopen.inVariable, plcopen.inOutVariable)):
             return instance.getExpression()
         elif isinstance(instance, plcopen.block):
-            type = instance.getTypeName()
-            block_infos = GetBlockType(type)
+            block_type = instance.getTypeName()
+            block_infos = GetBlockType(block_type)
             return block_infos["generate"](self, instance, body, link)
         elif isinstance(instance, plcopen.continuation):
             name = instance.getName()
@@ -300,6 +304,10 @@
             next = body.getContentInstance(localId)
             if isinstance(next, plcopen.leftPowerRail):
                 paths.append(None)
+            elif isinstance(next, plcopen.block):
+                block_type = next.getTypeName()
+                block_infos = GetBlockType(block_type)
+                paths.append(block_infos["generate"](self, next, body, connection))
             else:
                 variable = self.ExtractModifier(next, next.getVariable())
                 result = self.GenerateLDPaths(next.connectionPointIn.getConnections(), body)
--- a/plcopen/structures.py	Fri Oct 05 17:59:34 2007 +0200
+++ b/plcopen/structures.py	Fri Oct 05 18:00:25 2007 +0200
@@ -27,7 +27,14 @@
 
 LANGUAGES = ["IL","ST","FBD","LD","SFC"]
 
+LOCATIONDATATYPES = {"X" : ["BOOL"],
+                     "B" : ["SINT", "USINT", "BYTE", "STRING"],
+                     "W" : ["INT", "UINT", "WORD", "WSTRING"],
+                     "D" : ["DINT", "UDINT", "REAL", "DWORD"],
+                     "L" : ["LINT", "ULINT", "LREAL", "LWORD"]} 
+
 def generate_block(generator, block, body, link):
+    body_type = body.getContent()["name"]
     name = block.getInstanceName()
     type = block.getTypeName()
     block_infos = GetBlockType(type)
@@ -37,7 +44,15 @@
         for variable in block.inputVariables.getVariable():
             connections = variable.connectionPointIn.getConnections()
             if connections and len(connections) == 1:
-                value = generator.ComputeFBDExpression(body, connections[0])
+                if body_type == "FBD":
+                    value = generator.ComputeFBDExpression(body, connections[0])
+                elif body_type == "LD":
+                    paths = generator.GenerateLDPaths(variable.connectionPointIn.getConnections(), body)
+                    if len(paths) > 0:
+                        paths = tuple(paths)
+                    else:
+                        paths = paths[0] 
+                    value = generator.ComputeLDExpression(paths, True)
                 vars.append(generator.ExtractModifier(variable, value))
         variable = block.outputVariables.getVariable()[0]
         return generator.ExtractModifier(variable, "%s(%s)"%(type, ", ".join(vars)))
@@ -48,7 +63,16 @@
                 connections = variable.connectionPointIn.getConnections()
                 if connections and len(connections) == 1:
                     parameter = variable.getFormalParameter()
-                    value = generator.ComputeFBDExpression(body, connections[0])
+                    if body_type == "FBD":
+                        value = generator.ComputeFBDExpression(body, connections[0])
+                        vars.append("%s := %s"%(parameter, generator.ExtractModifier(variable, value)))
+                    elif body_type == "LD":
+                        paths = generator.GenerateLDPaths(variable.connectionPointIn.getConnections(), body)
+                        if len(paths) > 0:
+                            paths = tuple(paths)
+                        else:
+                            paths = paths[0] 
+                        value = generator.ComputeLDExpression(paths, True)
                     vars.append("%s := %s"%(parameter, generator.ExtractModifier(variable, value)))
             generator.Program += "  %s(%s);\n"%(name, ", ".join(vars))
             generator.ComputedBlocks[name] = True