plcopen/structures.py
author lbessard
Wed, 27 Aug 2008 16:55:16 +0200
changeset 242 5b3e1c4569e6
parent 230 45d70748e45a
child 247 4a47ccafbef7
permissions -rw-r--r--
Adding optimisation on LD expression generated
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
     1
#!/usr/bin/env python
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
     3
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
     4
import string, os, sys
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
     5
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
     6
#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
     7
#based on the plcopen standard. 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
     8
#
58
39cd981ff242 Changing file headers
lbessard
parents: 57
diff changeset
     9
#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    10
#
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    11
#See COPYING file for copyrights details.
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    12
#
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    13
#This library is free software; you can redistribute it and/or
5
f8652b073e84 GPL->LGPL
etisserant
parents: 0
diff changeset
    14
#modify it under the terms of the GNU General Public
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    15
#License as published by the Free Software Foundation; either
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    16
#version 2.1 of the License, or (at your option) any later version.
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    17
#
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    18
#This library is distributed in the hope that it will be useful,
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    19
#but WITHOUT ANY WARRANTY; without even the implied warranty of
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    20
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
58
39cd981ff242 Changing file headers
lbessard
parents: 57
diff changeset
    21
#General Public License for more details.
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    22
#
5
f8652b073e84 GPL->LGPL
etisserant
parents: 0
diff changeset
    23
#You should have received a copy of the GNU General Public
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    24
#License along with this library; if not, write to the Free Software
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    25
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    26
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    27
9
b29105e29081 Adding test on step names in SFC Editor
lbessard
parents: 5
diff changeset
    28
LANGUAGES = ["IL","ST","FBD","LD","SFC"]
b29105e29081 Adding test on step names in SFC Editor
lbessard
parents: 5
diff changeset
    29
104
a9b8916d906d Adding support for generation of blocks in LD
lbessard
parents: 99
diff changeset
    30
LOCATIONDATATYPES = {"X" : ["BOOL"],
a9b8916d906d Adding support for generation of blocks in LD
lbessard
parents: 99
diff changeset
    31
                     "B" : ["SINT", "USINT", "BYTE", "STRING"],
a9b8916d906d Adding support for generation of blocks in LD
lbessard
parents: 99
diff changeset
    32
                     "W" : ["INT", "UINT", "WORD", "WSTRING"],
a9b8916d906d Adding support for generation of blocks in LD
lbessard
parents: 99
diff changeset
    33
                     "D" : ["DINT", "UDINT", "REAL", "DWORD"],
a9b8916d906d Adding support for generation of blocks in LD
lbessard
parents: 99
diff changeset
    34
                     "L" : ["LINT", "ULINT", "LREAL", "LWORD"]} 
a9b8916d906d Adding support for generation of blocks in LD
lbessard
parents: 99
diff changeset
    35
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    36
# Helper for emulate join on element list
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    37
def JoinList(separator, list):
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    38
    return reduce(lambda x, y: x + separator + y, list)
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    39
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    40
def generate_block(generator, block, body, link, order=False):
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    41
    body_type = body.getcontent()["name"]
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    42
    name = block.getinstanceName()
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    43
    type = block.gettypeName()
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    44
    executionOrderId = block.getexecutionOrderId()
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    45
    block_infos = generator.GetBlockType(type)
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    46
    if block_infos["type"] == "function":
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    47
        output_variable = block.outputVariables.getvariable()[0]
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    48
        output_name = "%s%d_OUT"%(type, block.getlocalId())
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    49
        output_info = (generator.TagName, "block", block.getlocalId(), "output", 0)
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    50
        if not generator.ComputedBlocks.get(block, False) and not order:
208
c70aefcadf66 Bugs with feedback path in View, Controler and Generator fixed
lbessard
parents: 194
diff changeset
    51
            generator.ComputedBlocks[block] = True
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    52
            if generator.Interface[-1][0] != "VAR" or generator.Interface[-1][1] or generator.Interface[-1][2] or generator.Interface[-1][3]:
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    53
                generator.Interface.append(("VAR", False, False, False, []))
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    54
            if output_variable.connectionPointOut in generator.ConnectionTypes:
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    55
                generator.Interface[-1][4].append((generator.ConnectionTypes[output_variable.connectionPointOut], output_name, None, None))
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    56
            else:
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    57
                generator.Interface[-1][4].append(("ANY", output_name, None, None))
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    58
            vars = []
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    59
            for i, variable in enumerate(block.inputVariables.getvariable()):
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    60
                input_info = (generator.TagName, "block", block.getlocalId(), "input", i)
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    61
                connections = variable.connectionPointIn.getconnections()
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    62
                if connections and len(connections) == 1:
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    63
                    if body_type == "FBD" or body_type == "SFC":
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    64
                        value = generator.ComputeFBDExpression(body, connections[0], executionOrderId > 0)
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    65
                    elif body_type == "LD":
242
5b3e1c4569e6 Adding optimisation on LD expression generated
lbessard
parents: 230
diff changeset
    66
                        value = generator.ComputeLDExpression(body, variable.connectionPointIn.getConnections())
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    67
                    vars.append(generator.ExtractModifier(variable, value, input_info))
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    68
            generator.Program += [(generator.CurrentIndent, ()),
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    69
                                  (output_name, output_info),
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    70
                                  (" := ", ()),
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    71
                                  (type, (generator.TagName, "block", block.getlocalId(), "type")),
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    72
                                  ("(", ())]
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    73
            generator.Program += JoinList([(", ", ())], vars)
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    74
            generator.Program += [(");\n", ())]
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    75
        return generator.ExtractModifier(output_variable, [(output_name, output_info)], output_info)
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    76
    elif block_infos["type"] == "functionBlock":
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    77
        if not generator.ComputedBlocks.get(block, False) and not order:
208
c70aefcadf66 Bugs with feedback path in View, Controler and Generator fixed
lbessard
parents: 194
diff changeset
    78
            generator.ComputedBlocks[block] = True
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    79
            vars = []
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    80
            for i, variable in enumerate(block.inputVariables.getvariable()):
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    81
                input_info = (generator.TagName, "block", block.getlocalId(), "input", i)
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    82
                connections = variable.connectionPointIn.getconnections()
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    83
                if connections and len(connections) == 1:
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    84
                    parameter = variable.getformalParameter()
108
9aa1fdfb7cb2 A lots of bugs fixed
lbessard
parents: 104
diff changeset
    85
                    if body_type == "FBD" or body_type == "SFC":
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    86
                        value = generator.ComputeFBDExpression(body, connections[0], executionOrderId > 0)
104
a9b8916d906d Adding support for generation of blocks in LD
lbessard
parents: 99
diff changeset
    87
                    elif body_type == "LD":
242
5b3e1c4569e6 Adding optimisation on LD expression generated
lbessard
parents: 230
diff changeset
    88
                        value = generator.ComputeLDExpression(body, variable.connectionPointIn.getconnections())
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    89
                    vars.append([(parameter, input_info),
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    90
                                 (" := ", ())] + generator.ExtractModifier(variable, value, input_info))
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    91
            generator.Program += [(generator.CurrentIndent, ()), 
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    92
                                  (name, (generator.TagName, "block", block.getlocalId(), "name")),
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    93
                                  ("(", ())]
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    94
            generator.Program += JoinList([(", ", ())], vars)
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    95
            generator.Program += [(");\n", ())]
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    96
        if link:
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    97
            connectionPoint = link.getposition()[-1]
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    98
        else:
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    99
            connectionPoint = None
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   100
        for i, variable in enumerate(block.outputVariables.getvariable()):
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
   101
            blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY()
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   102
            output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
   103
            if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety():
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   104
                return generator.ExtractModifier(variable, [("%s.%s"%(name, variable.getformalParameter()), output_info)], output_info)
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   105
        raise ValueError, "No output variable found"
21
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   106
194
1b3f8b4f8e04 Adding support for Beremiz svgui plugin variable declaration
lbessard
parents: 170
diff changeset
   107
def initialise_block(type, name, block = None):
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   108
    return [(type, name, None, None)]
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   109
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   110
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   111
#                        Function Block Types definitions
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   112
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   113
21
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   114
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   115
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   116
Ordored list of common Function Blocks defined in the IEC 61131-3
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   117
Each block have this attributes:
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   118
    - "name" : The block name
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   119
    - "type" : The block type. It can be "function", "functionBlock" or "program"
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   120
    - "extensible" : Boolean that define if the block is extensible
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   121
    - "inputs" : List of the block inputs
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   122
    - "outputs" : List of the block outputs
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   123
    - "comment" : Comment that will be displayed in the block popup
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   124
    - "generate" : Method that generator will call for generating ST block code
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   125
Inputs and outputs are a tuple of characteristics that are in order:
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   126
    - The name
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   127
    - The data type
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   128
    - The default modifier which can be "none", "negated", "rising" or "falling"
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   129
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   130
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   131
BlockTypes = [{"name" : "Standard function blocks", "list":
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   132
               [{"name" : "SR", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   133
                    "inputs" : [("S1","BOOL","none"),("R","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   134
                    "outputs" : [("Q1","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   135
                    "comment" : "SR bistable\nThe SR bistable is a latch where the Set dominates.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   136
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   137
                {"name" : "RS", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   138
                    "inputs" : [("S","BOOL","none"),("R1","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   139
                    "outputs" : [("Q1","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   140
                    "comment" : "RS bistable\nThe RS bistable is a latch where the Reset dominates.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   141
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   142
                {"name" : "SEMA", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   143
                    "inputs" : [("CLAIM","BOOL","none"),("RELEASE","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   144
                    "outputs" : [("BUSY","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   145
                    "comment" : "Semaphore\nThe semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   146
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   147
                {"name" : "R_TRIG", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   148
                    "inputs" : [("CLK","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   149
                    "outputs" : [("Q","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   150
                    "comment" : "Rising edge detector\nThe output produces a single pulse when a rising edge is detected.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   151
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   152
                {"name" : "F_TRIG", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   153
                    "inputs" : [("CLK","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   154
                    "outputs" : [("Q","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   155
                    "comment" : "Falling edge detector\nThe output produces a single pulse when a falling edge is detected.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   156
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   157
                {"name" : "CTU", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   158
                    "inputs" : [("CU","BOOL","rising"),("R","BOOL","none"),("PV","INT","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   159
                    "outputs" : [("Q","BOOL","none"),("CV","INT","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   160
                    "comment" : "Up-counter\nThe up-counter can be used to signal when a count has reached a maximum value.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   161
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   162
                {"name" : "CTD", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   163
                    "inputs" : [("CD","BOOL","rising"),("LD","BOOL","none"),("PV","INT","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   164
                    "outputs" : [("Q","BOOL","none"),("CV","INT","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   165
                    "comment" : "Down-counter\nThe down-counter can be used to signal when a count has reached zero, on counting down from a preset value.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   166
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   167
                {"name" : "CTUD", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   168
                    "inputs" : [("CU","BOOL","rising"),("CD","BOOL","rising"),("R","BOOL","none"),("LD","BOOL","none"),("PV","INT","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   169
                    "outputs" : [("QU","BOOL","none"),("QD","BOOL","none"),("CV","INT","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   170
                    "comment" : "Up-down counter\nThe up-down counter has two inputs CU and CD. It can be used to both count up on one input ans down on the other.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   171
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   172
                {"name" : "TP", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   173
                    "inputs" : [("IN","BOOL","none"),("PT","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   174
                    "outputs" : [("Q","BOOL","none"),("ET","TIME","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   175
                    "comment" : "Pulse timer\nThe pulse timer can be used to generate output pulses of a given time duration.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   176
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   177
                {"name" : "TOF", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   178
                    "inputs" : [("IN","BOOL","none"),("PT","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   179
                    "outputs" : [("Q","BOOL","none"),("ET","TIME","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   180
                    "comment" : "On-delay timer\nThe on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   181
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   182
                {"name" : "TON", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   183
                    "inputs" : [("IN","BOOL","none"),("PT","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   184
                    "outputs" : [("Q","BOOL","none"),("ET","TIME","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   185
                    "comment" : "Off-delay timer\nThe off-delay timer can be used to delay setting an output false, for fixed period after input goes false.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   186
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   187
                {"name" : "RTC", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   188
                    "inputs" : [("EN","BOOL","none"),("PDT","DATE_AND_TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   189
                    "outputs" : [("Q","BOOL","none"),("CDT","DATE_AND_TIME","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   190
                    "comment" : "Real time clock\nThe real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   191
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   192
                {"name" : "INTEGRAL", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   193
                    "inputs" : [("RUN","BOOL","none"),("R1","BOOL","none"),("XIN","REAL","none"),("X0","REAL","none"),("CYCLE","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   194
                    "outputs" : [("Q","BOOL","none"),("XOUT","REAL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   195
                    "comment" : "Integral\nThe integral function block integrates the value of input XIN over time.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   196
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   197
                {"name" : "DERIVATIVE", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   198
                    "inputs" : [("RUN","BOOL","none"),("XIN","REAL","none"),("CYCLE","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   199
                    "outputs" : [("XOUT","REAL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   200
                    "comment" : "Derivative\nThe derivative function block produces an output XOUT proportional to the rate of change of the input XIN.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   201
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   202
                {"name" : "PID", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   203
                    "inputs" : [("AUTO","BOOL","none"),("PV","REAL","none"),("SP","REAL","none"),("X0","REAL","none"),("KP","REAL","none"),("TR","REAL","none"),("TD","REAL","none"),("CYCLE","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   204
                    "outputs" : [("XOUT","REAL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   205
                    "comment" : "PID\nThe PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   206
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   207
                {"name" : "RAMP", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   208
                    "inputs" : [("RUN","BOOL","none"),("X0","REAL","none"),("X1","REAL","none"),("TR","TIME","none"),("CYCLE","TIME","none"),("HOLDBACK","BOOL","none"),("ERROR","REAL","none"),("PV","REAL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   209
                    "outputs" : [("RAMP","BOOL","none"),("XOUT","REAL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   210
                    "comment" : "Ramp\nThe RAMP function block is modelled on example given in the standard but with the addition of a 'Holdback' feature.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   211
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   212
                {"name" : "HYSTERESIS", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   213
                    "inputs" : [("XIN1","REAL","none"),("XIN2","REAL","none"),("EPS","REAL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   214
                    "outputs" : [("Q","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   215
                    "comment" : "Hysteresis\nThe hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   216
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   217
                {"name" : "RATIO_MONITOR", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   218
                    "inputs" : [("PV1","REAL","none"),("PV2","REAL","none"),("RATIO","REAL","none"),("TIMON","TIME","none"),("TIMOFF","TIME","none"),("TOLERANCE","BOOL","none"),("RESET","BOOL","none"),("CYCLE","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   219
                    "outputs" : [("ALARM","BOOL","none"),("TOTAL_ERR","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   220
                    "comment" : "Ratio monitor\nThe ratio_monitor function block checks that one process value PV1 is always a given ratio (defined by input RATIO) of a second process value PV2.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   221
                    "generate" : generate_block, "initialise" : initialise_block}
57
9bf197698af0 SVGUI Functions Blocks added
jon
parents: 47
diff changeset
   222
                ]},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   223
             ]
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   224
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   225
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   226
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   227
#                           Data Types definitions
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   228
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   229
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   230
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   231
Ordored list of common data types defined in the IEC 61131-3
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   232
Each type is associated to his direct parent type. It defines then a hierarchy
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   233
between type that permits to make a comparison of two types
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   234
"""
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   235
TypeHierarchy_list = [
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   236
    ("ANY", None),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   237
    ("ANY_DERIVED", "ANY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   238
    ("ANY_ELEMENTARY", "ANY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   239
    ("ANY_MAGNITUDE", "ANY_ELEMENTARY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   240
    ("ANY_BIT", "ANY_ELEMENTARY"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   241
    ("ANY_NBIT", "ANY_BIT"),
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   242
    ("ANY_STRING", "ANY_ELEMENTARY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   243
    ("ANY_DATE", "ANY_ELEMENTARY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   244
    ("ANY_NUM", "ANY_MAGNITUDE"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   245
    ("ANY_REAL", "ANY_NUM"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   246
    ("ANY_INT", "ANY_NUM"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   247
    ("ANY_SINT", "ANY_INT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   248
    ("ANY_UINT", "ANY_INT"),
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   249
    ("BOOL", "ANY_BIT"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   250
    ("SINT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   251
    ("INT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   252
    ("DINT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   253
    ("LINT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   254
    ("USINT", "ANY_UINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   255
    ("UINT", "ANY_UINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   256
    ("UDINT", "ANY_UINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   257
    ("ULINT", "ANY_UINT"),
27
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   258
    ("REAL", "ANY_REAL"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   259
    ("LREAL", "ANY_REAL"),
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   260
    ("TIME", "ANY_MAGNITUDE"),
27
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   261
    ("DATE", "ANY_DATE"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   262
    ("TOD", "ANY_DATE"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   263
    ("DT", "ANY_DATE"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   264
    ("STRING", "ANY_STRING"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   265
    ("BYTE", "ANY_NBIT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   266
    ("WORD", "ANY_NBIT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   267
    ("DWORD", "ANY_NBIT"),
27
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   268
    ("LWORD", "ANY_NBIT")
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   269
    #("WSTRING", "ANY_STRING") # TODO
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   270
]
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   271
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   272
TypeHierarchy = dict(TypeHierarchy_list)
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   273
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   274
"""
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   275
returns true if the given data type is the same that "reference" meta-type or one of its types.
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   276
"""
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   277
def IsOfType(type, reference):
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   278
    if reference is None:
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   279
        return True
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   280
    elif type == reference:
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   281
        return True
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   282
    else:
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   283
        parent_type = TypeHierarchy[type]
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   284
        if parent_type is not None:
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   285
            return IsOfType(parent_type, reference)
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   286
    return False
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   287
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   288
"""
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   289
returns list of all types that correspont to the ANY* meta type
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   290
"""
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   291
def GetSubTypes(type):
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   292
    return [typename for typename, parenttype in TypeHierarchy.items() if not typename.startswith("ANY") and IsOfType(typename, type)]
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   293
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   294
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   295
DataTypeRange_list = [
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   296
    ("SINT", (-2**7, 2**7 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   297
    ("INT", (-2**15, 2**15 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   298
    ("DINT", (-2**31, 2**31 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   299
    ("LINT", (-2**31, 2**31 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   300
    ("USINT", (0, 2**8 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   301
    ("UINT", (0, 2**16 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   302
    ("UDINT", (0, 2**31 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   303
    ("ULINT", (0, 2**31 - 1))
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   304
]
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   305
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   306
DataTypeRange = dict(DataTypeRange_list)
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   307
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   308
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   309
21
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   310
#-------------------------------------------------------------------------------
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   311
#                             Test identifier
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   312
#-------------------------------------------------------------------------------
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   313
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   314
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   315
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   316
# Test if identifier is valid
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   317
def TestIdentifier(identifier):
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   318
     if identifier[0].isdigit():
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   319
        return False
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   320
     words = identifier.split('_')
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   321
     for i, word in enumerate(words):
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   322
         if len(word) == 0 and i != 0:
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   323
             return False
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   324
         if len(word) != 0 and not word.isalnum():
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   325
             return False
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   326
     return True
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   327
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   328
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   329
#-------------------------------------------------------------------------------
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   330
#                        Standard functions list generation
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   331
#-------------------------------------------------------------------------------
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   332
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   333
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   334
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   335
take a .csv file and translate it it a "csv_table"
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   336
"""            
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   337
def csv_file_to_table(file):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   338
    return [ map(string.strip,line.split(';')) for line in file.xreadlines()]
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   339
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   340
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   341
seek into the csv table to a section ( section_name match 1st field )
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   342
return the matching row without first field
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   343
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   344
def find_section(section_name, table):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   345
    fields = [None]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   346
    while(fields[0] != section_name):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   347
        fields = table.pop(0)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   348
    return fields[1:]
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   349
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   350
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   351
extract the standard functions standard parameter names and types...
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   352
return a { ParameterName: Type, ...}
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   353
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   354
def get_standard_funtions_input_variables(table):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   355
    variables = find_section("Standard_functions_variables_types", table)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   356
    standard_funtions_input_variables = {}
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   357
    fields = [True,True]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   358
    while(fields[1]):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   359
        fields = table.pop(0)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   360
        variable_from_csv = dict([(champ, val) for champ, val in zip(variables, fields[1:]) if champ!=''])
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   361
        standard_funtions_input_variables[variable_from_csv['name']] = variable_from_csv['type']
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   362
    return standard_funtions_input_variables
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   363
    
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   364
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   365
translate .csv file input declaration into PLCOpenEditor interessting values
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   366
in : "(ANY_NUM, ANY_NUM)" and { ParameterName: Type, ...}
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   367
return [("IN1","ANY_NUM","none"),("IN2","ANY_NUM","none")] 
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   368
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   369
def csv_input_translate(str_decl, variables, base):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   370
    decl = str_decl.replace('(','').replace(')','').replace(' ','').split(',')
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   371
    params = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   372
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   373
    len_of_not_predifined_variable = len([True for param_type in decl if param_type not in variables])
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   374
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   375
    for param_type in decl:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   376
        if param_type in variables.keys():
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   377
            param_name = param_type
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   378
            param_type = variables[param_type]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   379
        elif len_of_not_predifined_variable > 1:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   380
            param_name = "IN%d"%base
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   381
            base += 1
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   382
        else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   383
            param_name = "IN"
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   384
        params.append((param_name, param_type, "none"))
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   385
    return params
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   386
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   387
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   388
ANY_TO_ANY_LIST=[
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   389
        # simple type conv are let as C cast
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   390
        (("ANY_NUM","ANY_BIT"),("ANY_NUM","ANY_BIT"), "(%(return_type)s)%(IN_value)s"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   391
        # TO_TIME
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   392
        (("ANY_INT","ANY_BIT"),("ANY_DATE","TIME"), "(%(return_type)s)__int_to_time(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   393
        (("ANY_REAL",),("ANY_DATE","TIME"), "(%(return_type)s)__real_to_time(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   394
        (("ANY_STRING",), ("ANY_DATE","TIME"), "(%(return_type)s)__string_to_time(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   395
        # FROM_TIME
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   396
        (("ANY_DATE","TIME"), ("ANY_REAL",), "(%(return_type)s)__time_to_real(%(IN_value)s)"),
40
49c8ebc1ee25 Cleanup in generated C code for STD lib
etisserant
parents: 28
diff changeset
   397
        (("ANY_DATE","TIME"), ("ANY_INT","ANY_NBIT"), "(%(return_type)s)__time_to_int(%(IN_value)s)"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   398
        (("TIME",), ("ANY_STRING",), "(%(return_type)s)__time_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   399
        (("DATE",), ("ANY_STRING",), "(%(return_type)s)__date_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   400
        (("TOD",), ("ANY_STRING",), "(%(return_type)s)__tod_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   401
        (("DT",), ("ANY_STRING",), "(%(return_type)s)__dt_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   402
        # TO_STRING
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   403
        (("BOOL",), ("ANY_STRING",), "(%(return_type)s)__bool_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   404
        (("ANY_BIT",), ("ANY_STRING",), "(%(return_type)s)__bit_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   405
        (("ANY_REAL",), ("ANY_STRING",), "(%(return_type)s)__real_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   406
        (("ANY_SINT",), ("ANY_STRING",), "(%(return_type)s)__sint_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   407
        (("ANY_UINT",), ("ANY_STRING",), "(%(return_type)s)__uint_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   408
        # FROM_STRING
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   409
        (("ANY_STRING",), ("BOOL",), "(%(return_type)s)__string_to_bool(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   410
        (("ANY_STRING",), ("ANY_BIT",), "(%(return_type)s)__string_to_bit(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   411
        (("ANY_STRING",), ("ANY_SINT",), "(%(return_type)s)__string_to_sint(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   412
        (("ANY_STRING",), ("ANY_UINT",), "(%(return_type)s)__string_to_uint(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   413
        (("ANY_STRING",), ("ANY_REAL",), "(%(return_type)s)__string_to_real(%(IN_value)s)")]
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   414
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   415
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   416
BCD_TO_ANY_LIST=[
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   417
        (("BYTE",),("USINT",), "(%(return_type)s)__bcd_to_uint(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   418
        (("WORD",),("UINT",), "(%(return_type)s)__bcd_to_uint(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   419
        (("DWORD",),("UDINT",), "(%(return_type)s)__bcd_to_uint(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   420
        (("LWORD",),("ULINT",), "(%(return_type)s)__bcd_to_uint(%(IN_value)s)")]
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   421
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   422
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   423
ANY_TO_BCD_LIST=[
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   424
        (("USINT",),("BYTE",), "(%(return_type)s)__uint_to_bcd(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   425
        (("UINT",),("WORD",), "(%(return_type)s)__uint_to_bcd(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   426
        (("UDINT",),("DWORD",), "(%(return_type)s)__uint_to_bcd(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   427
        (("ULINT",),("LWORD",), "(%(return_type)s)__uint_to_bcd(%(IN_value)s)")]
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   428
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   429
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   430
def ANY_TO_ANY_FORMAT_GEN(any_to_any_list, fdecl):
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   431
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   432
    for (InTypes, OutTypes, Format) in any_to_any_list:
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   433
        outs = reduce(lambda a,b: a or b, map(lambda testtype : IsOfType(fdecl["outputs"][0][1],testtype), OutTypes))
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   434
        inps = reduce(lambda a,b: a or b, map(lambda testtype : IsOfType(fdecl["inputs"][0][1],testtype), InTypes))
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   435
        if inps and outs and fdecl["outputs"][0][1] != fdecl["inputs"][0][1]:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   436
             return Format
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   437
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   438
    return None
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   439
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   440
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   441
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   442
Returns this kind of declaration for all standard functions
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   443
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   444
            [{"name" : "Numerical", 'list': [   {   
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   445
                'baseinputnumber': 1,
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   446
                'comment': 'Addition',
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   447
                'extensible': True,
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   448
                'inputs': [   ('IN1', 'ANY_NUM', 'none'),
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   449
                              ('IN2', 'ANY_NUM', 'none')],
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   450
                'name': 'ADD',
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   451
                'outputs': [('OUT', 'ANY_NUM', 'none')],
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   452
                'type': 'function'}, ...... ] },.....]
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   453
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   454
def get_standard_funtions(table):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   455
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   456
    variables = get_standard_funtions_input_variables(table)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   457
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   458
    fonctions = find_section("Standard_functions_type",table)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   459
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   460
    Standard_Functions_Decl = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   461
    Current_section = None
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   462
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   463
    translate = {
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   464
            "extensible" : lambda x: {"yes":True, "no":False}[x],
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   465
            "inputs" : lambda x:csv_input_translate(x,variables,baseinputnumber),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   466
            "outputs":lambda x:[("OUT",x,"none")]}
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   467
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   468
    for fields in table:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   469
        if fields[1]:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   470
            # If function section name given
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   471
            if fields[0]:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   472
                Current_section = {"name" : fields[0], "list" : []}
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   473
                Standard_Functions_Decl.append(Current_section)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   474
                Function_decl_list = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   475
            if Current_section:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   476
                Function_decl = dict([(champ, val) for champ, val in zip(fonctions, fields[1:]) if champ])
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   477
                Function_decl["generate"] = generate_block
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   478
                Function_decl["initialise"] = lambda x,y:[]
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   479
                baseinputnumber = int(Function_decl.get("baseinputnumber",1))
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   480
                Function_decl["baseinputnumber"] = baseinputnumber
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   481
                for param, value in Function_decl.iteritems():
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   482
                    if param in translate:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   483
                        Function_decl[param] = translate[param](value)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   484
                Function_decl["type"] = "function"
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   485
                
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   486
                if Function_decl["name"].startswith('*') or Function_decl["name"].endswith('*') :
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   487
                    input_ovrloading_types = GetSubTypes(Function_decl["inputs"][0][1])
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   488
                    output_types = GetSubTypes(Function_decl["outputs"][0][1])
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   489
                else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   490
                    input_ovrloading_types = [None]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   491
                    output_types = [None]
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   492
                
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   493
                funcdeclname_orig = Function_decl["name"]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   494
                funcdeclname = Function_decl["name"].strip('*_')
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   495
                fdc = Function_decl["inputs"][:]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   496
                for intype in input_ovrloading_types:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   497
                    if intype != None:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   498
                        Function_decl["inputs"] = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   499
                        for decl_tpl in fdc:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   500
                            if IsOfType(intype, decl_tpl[1]):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   501
                                Function_decl["inputs"] += [(decl_tpl[0], intype, decl_tpl[2])]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   502
                            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   503
                                Function_decl["inputs"] += [(decl_tpl)]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   504
                            
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   505
                            if funcdeclname_orig.startswith('*'):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   506
                                funcdeclin = intype + '_' + funcdeclname 
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   507
                            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   508
                                funcdeclin = funcdeclname
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   509
                    else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   510
                        funcdeclin = funcdeclname
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   511
                        
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   512
                    for outype in output_types:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   513
                        if outype != None:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   514
                            decl_tpl = Function_decl["outputs"][0]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   515
                            Function_decl["outputs"] = [ (decl_tpl[0] , outype,  decl_tpl[2])]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   516
                            if funcdeclname_orig.endswith('*'):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   517
                                funcdeclout =  funcdeclin + '_' + outype
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   518
                            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   519
                                funcdeclout =  funcdeclin
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   520
                        else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   521
                            funcdeclout =  funcdeclin
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   522
                        Function_decl["name"] = funcdeclout
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   523
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   524
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   525
                        fdecl = Function_decl
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   526
                        res = eval(Function_decl["python_eval_c_code_format"])
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   527
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   528
                        if res != None :
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   529
                            # create the copy of decl dict to be appended to section
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   530
                            Function_decl_copy = Function_decl.copy()
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   531
                            # Have to generate type description in comment with freshly redefined types
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   532
                            Function_decl_copy["comment"] += (
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   533
                                "\n (" +
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   534
                                str([ " " + fctdecl[1]+":"+fctdecl[0] for fctdecl in Function_decl["inputs"]]).strip("[]").replace("'",'') +
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   535
                                " ) => (" +
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   536
                                str([ " " + fctdecl[1]+":"+fctdecl[0] for fctdecl in Function_decl["outputs"]]).strip("[]").replace("'",'') +
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   537
                                " )")
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   538
                            Current_section["list"].append(Function_decl_copy)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   539
                            #pp.pprint(Function_decl_copy)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   540
            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   541
                raise "First function must be in a category"
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   542
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   543
    return Standard_Functions_Decl
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   544
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   545
std_decl = get_standard_funtions(csv_file_to_table(open(os.path.join(os.path.split(__file__)[0],"iec_std.csv"))))#, True)
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   546
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   547
BlockTypes.extend(std_decl)
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   548
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   549
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   550
#-------------------------------------------------------------------------------
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   551
#                            Languages Keywords
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   552
#-------------------------------------------------------------------------------
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   553
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   554
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   555
# Keywords for Pou Declaration
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   556
POU_KEYWORDS = ["FUNCTION", "END_FUNCTION", "FUNCTION_BLOCK", "END_FUNCTION_BLOCK",
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   557
 "PROGRAM", "END_PROGRAM", "EN", "ENO", "F_EDGE", "R_EDGE"]
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   558
for category in BlockTypes:
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   559
    for block in category["list"]:
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   560
        if block["name"] not in POU_KEYWORDS:
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   561
            POU_KEYWORDS.append(block["name"])
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   562
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   563
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   564
# Keywords for Type Declaration
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   565
TYPE_KEYWORDS = ["TYPE", "END_TYPE", "STRUCT", "END_STRUCT", "ARRAY", "OF", "T",
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   566
 "D", "TIME_OF_DAY", "DATE_AND_TIME"]
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   567
TYPE_KEYWORDS.extend([keyword for keyword in TypeHierarchy.keys() if keyword not in TYPE_KEYWORDS])
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   568
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   569
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   570
# Keywords for Variable Declaration
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   571
VAR_KEYWORDS = ["VAR", "VAR_INPUT", "VAR_OUTPUT", "VAR_IN_OUT", "VAR_TEMP", 
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   572
 "VAR_EXTERNAL", "END_VAR", "AT", "CONSTANT", "RETAIN", "NON_RETAIN"]
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   573
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   574
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   575
# Keywords for Configuration Declaration
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   576
CONFIG_KEYWORDS = ["CONFIGURATION", "END_CONFIGURATION", "RESOURCE", "ON", "END_RESOURCE",
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   577
 "PROGRAM", "WITH", "READ_ONLY", "READ_WRITE", "TASK", "VAR_ACCESS", "VAR_CONFIG", 
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   578
 "VAR_GLOBAL", "END_VAR"]
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   579
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   580
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   581
# Keywords for Structured Function Chart
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   582
SFC_KEYWORDS = ["ACTION", "END_ACTION", "INITIAL_STEP", "STEP", "END_STEP", "TRANSITION",
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   583
 "FROM", "TO", "END_TRANSITION"]
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   584
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   585
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   586
# Keywords for Instruction List
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   587
IL_KEYWORDS = ["TRUE", "FALSE", "LD", "LDN", "ST", "STN", "S", "R", "AND", "ANDN", "OR", "ORN",
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   588
 "XOR", "XORN", "NOT", "ADD", "SUB", "MUL", "DIV", "MOD", "GT", "GE", "EQ", "NE",
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   589
 "LE", "LT", "JMP", "JMPC", "JMPNC", "CAL", "CALC", "CALNC", "RET", "RETC", "RETNC"]
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   590
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   591
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   592
# Keywords for Structured Text
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   593
ST_KEYWORDS = ["TRUE", "FALSE", "IF", "THEN", "ELSIF", "ELSE", "END_IF", "CASE", "OF", "END_CASE", 
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   594
 "FOR", "TO", "BY", "DO", "END_FOR", "WHILE", "DO", "END_WHILE", "REPEAT", "UNTIL", 
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   595
 "END_REPEAT", "EXIT", "RETURN", "NOT", "MOD", "AND", "XOR", "OR"]
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   596
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   597
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   598
# All the keywords of IEC
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   599
IEC_KEYWORDS = ["E", "TRUE", "FALSE"]
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   600
IEC_KEYWORDS.extend([keyword for keyword in POU_KEYWORDS if keyword not in IEC_KEYWORDS])
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   601
IEC_KEYWORDS.extend([keyword for keyword in TYPE_KEYWORDS if keyword not in IEC_KEYWORDS])
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   602
IEC_KEYWORDS.extend([keyword for keyword in VAR_KEYWORDS if keyword not in IEC_KEYWORDS])
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   603
IEC_KEYWORDS.extend([keyword for keyword in CONFIG_KEYWORDS if keyword not in IEC_KEYWORDS])
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   604
IEC_KEYWORDS.extend([keyword for keyword in SFC_KEYWORDS if keyword not in IEC_KEYWORDS])
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   605
IEC_KEYWORDS.extend([keyword for keyword in IL_KEYWORDS if keyword not in IEC_KEYWORDS])
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   606
IEC_KEYWORDS.extend([keyword for keyword in ST_KEYWORDS if keyword not in IEC_KEYWORDS])
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   607