plcopen/structures.py
author laurent
Wed, 14 Dec 2011 15:17:22 +0100
changeset 604 5b42b4401e6b
parent 586 9aa96a36cf33
child 638 2b9ed21d965c
permissions -rw-r--r--
Adding support for unifying grid table control elements
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
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
    36
_ = lambda x:x
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
    37
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    38
# Helper for emulate join on element list
305
0ed2b61de43e Fixed bug structures.py crashing with non-connected blocks.
etisserant
parents: 284
diff changeset
    39
def JoinList(separator, mylist):
0ed2b61de43e Fixed bug structures.py crashing with non-connected blocks.
etisserant
parents: 284
diff changeset
    40
    if len(mylist) > 0 :
0ed2b61de43e Fixed bug structures.py crashing with non-connected blocks.
etisserant
parents: 284
diff changeset
    41
        return reduce(lambda x, y: x + separator + y, mylist)
0ed2b61de43e Fixed bug structures.py crashing with non-connected blocks.
etisserant
parents: 284
diff changeset
    42
    else :
0ed2b61de43e Fixed bug structures.py crashing with non-connected blocks.
etisserant
parents: 284
diff changeset
    43
        return mylist
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    44
526
79900abdfa3c Bug when using arithmetic functions (ADD, SUB, MUL, DIV) for TIME datatypes fixed.
laurent
parents: 517
diff changeset
    45
def generate_block(generator, block, block_infos, body, link, order=False):
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    46
    body_type = body.getcontent()["name"]
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    47
    name = block.getinstanceName()
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    48
    type = block.gettypeName()
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    49
    executionOrderId = block.getexecutionOrderId()
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    50
    if block_infos["type"] == "function":
270
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
    51
        output_variables = block.outputVariables.getvariable()
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    52
        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
    53
            generator.ComputedBlocks[block] = True
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
    54
            vars = []
307
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    55
            one_input_connected = False
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    56
            for i, variable in enumerate(block.inputVariables.getvariable()):
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
    57
                input_info = (generator.TagName, "block", block.getlocalId(), "input", i)
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
    58
                connections = variable.connectionPointIn.getconnections()
250
e6b58eafef1a Adding support for Debugging in PLCOpenEditor
lbessard
parents: 247
diff changeset
    59
                if connections is not None:
307
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    60
                    parameter = variable.getformalParameter()
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    61
                    if parameter != "EN":
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    62
                        one_input_connected = True
250
e6b58eafef1a Adding support for Debugging in PLCOpenEditor
lbessard
parents: 247
diff changeset
    63
                    value = generator.ComputeExpression(body, connections, executionOrderId > 0)
270
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
    64
                    if len(output_variables) > 1:
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
    65
                        vars.append([(parameter, input_info),
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
    66
                                     (" := ", ())] + generator.ExtractModifier(variable, value, input_info))
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
    67
                    else:
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
    68
                        vars.append(generator.ExtractModifier(variable, value, input_info))
307
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    69
            if one_input_connected:
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    70
                for i, variable in enumerate(output_variables):
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    71
                    parameter = variable.getformalParameter()
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    72
                    if variable.getformalParameter() == "":
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    73
                        variable_name = "%s%d"%(type, block.getlocalId())
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    74
                    else:
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    75
                        variable_name = "%s%d_%s"%(type, block.getlocalId(), parameter)
483
779a519f78f2 Replace Retain and Constant column in VariablePanel by Option and add the option Non-Retain
laurent
parents: 431
diff changeset
    76
                    if generator.Interface[-1][0] != "VAR" or generator.Interface[-1][1] is not None or generator.Interface[-1][2]:
779a519f78f2 Replace Retain and Constant column in VariablePanel by Option and add the option Non-Retain
laurent
parents: 431
diff changeset
    77
                        generator.Interface.append(("VAR", None, False, []))
307
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    78
                    if variable.connectionPointOut in generator.ConnectionTypes:
483
779a519f78f2 Replace Retain and Constant column in VariablePanel by Option and add the option Non-Retain
laurent
parents: 431
diff changeset
    79
                        generator.Interface[-1][3].append((generator.ConnectionTypes[variable.connectionPointOut], variable_name, None, None))
307
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    80
                    else:
483
779a519f78f2 Replace Retain and Constant column in VariablePanel by Option and add the option Non-Retain
laurent
parents: 431
diff changeset
    81
                        generator.Interface[-1][3].append(("ANY", variable_name, None, None))
307
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    82
                    if len(output_variables) > 1 and parameter not in ["", "OUT"]:
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    83
                        vars.append([(parameter, (generator.TagName, "block", block.getlocalId(), "output", i)), 
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    84
                                     (" => %s"%variable_name, ())])
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    85
                    else:
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    86
                        output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    87
                        output_name = variable_name
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    88
                generator.Program += [(generator.CurrentIndent, ()),
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    89
                                      (output_name, output_info),
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    90
                                      (" := ", ()),
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    91
                                      (type, (generator.TagName, "block", block.getlocalId(), "type")),
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    92
                                      ("(", ())]
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    93
                generator.Program += JoinList([(", ", ())], vars)
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    94
                generator.Program += [(");\n", ())]
fd1f6ae26d4f Adding support for cancelling code generation of function with no input connected
lbessard
parents: 305
diff changeset
    95
            else:
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
    96
                generator.Warnings.append(_("\"%s\" function cancelled in \"%s\" POU: No input connected")%(type, generator.TagName.split("::")[-1]))
270
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
    97
        if link:
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
    98
            connectionPoint = link.getposition()[-1]
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
    99
        else:
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
   100
            connectionPoint = None
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
   101
        for i, variable in enumerate(output_variables):
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
   102
            blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY()
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
   103
            if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety():
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
   104
                output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
   105
                output_name = variable.getformalParameter()
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
   106
                if variable.getformalParameter() == "":
279
2ad276084038 Bug involving possible name conflict between return value and ouputs fixed
lbessard
parents: 270
diff changeset
   107
                    output_name = "%s%d"%(type, block.getlocalId())
270
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
   108
                else:
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
   109
                    output_name = "%s%d_%s"%(type, block.getlocalId(), variable.getformalParameter())
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
   110
                return generator.ExtractModifier(variable, [(output_name, output_info)], output_info)
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   111
    elif block_infos["type"] == "functionBlock":
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   112
        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
   113
            generator.ComputedBlocks[block] = True
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   114
            vars = []
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   115
            for i, variable in enumerate(block.inputVariables.getvariable()):
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   116
                input_info = (generator.TagName, "block", block.getlocalId(), "input", i)
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
   117
                connections = variable.connectionPointIn.getconnections()
250
e6b58eafef1a Adding support for Debugging in PLCOpenEditor
lbessard
parents: 247
diff changeset
   118
                if connections is not None:
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
   119
                    parameter = variable.getformalParameter()
250
e6b58eafef1a Adding support for Debugging in PLCOpenEditor
lbessard
parents: 247
diff changeset
   120
                    value = generator.ComputeExpression(body, connections, executionOrderId > 0)
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   121
                    vars.append([(parameter, input_info),
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   122
                                 (" := ", ())] + generator.ExtractModifier(variable, value, input_info))
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   123
            generator.Program += [(generator.CurrentIndent, ()), 
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   124
                                  (name, (generator.TagName, "block", block.getlocalId(), "name")),
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   125
                                  ("(", ())]
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   126
            generator.Program += JoinList([(", ", ())], vars)
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   127
            generator.Program += [(");\n", ())]
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   128
        if link:
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
   129
            connectionPoint = link.getposition()[-1]
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   130
        else:
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   131
            connectionPoint = None
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   132
        for i, variable in enumerate(block.outputVariables.getvariable()):
151
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
   133
            blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY()
aaa80b48bead Adding support for the new version of xmlclass
lbessard
parents: 125
diff changeset
   134
            if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety():
270
351d134babd7 Adding support for EN/ENO variables (temporarily disabled, waiting for matiec support)
lbessard
parents: 250
diff changeset
   135
                output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   136
                return generator.ExtractModifier(variable, [("%s.%s"%(name, variable.getformalParameter()), output_info)], output_info)
354
20ccf1e5266e Allow usage of FunctionBlock without output
greg
parents: 307
diff changeset
   137
    if link is not None:
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   138
        raise ValueError, _("No output variable found")
21
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   139
194
1b3f8b4f8e04 Adding support for Beremiz svgui plugin variable declaration
lbessard
parents: 170
diff changeset
   140
def initialise_block(type, name, block = None):
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   141
    return [(type, name, None, None)]
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   142
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   143
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   144
#                        Function Block Types definitions
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   145
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   146
21
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   147
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   148
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   149
Ordored list of common Function Blocks defined in the IEC 61131-3
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   150
Each block have this attributes:
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   151
    - "name" : The block name
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   152
    - "type" : The block type. It can be "function", "functionBlock" or "program"
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   153
    - "extensible" : Boolean that define if the block is extensible
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   154
    - "inputs" : List of the block inputs
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   155
    - "outputs" : List of the block outputs
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   156
    - "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
   157
    - "generate" : Method that generator will call for generating ST block code
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   158
Inputs and outputs are a tuple of characteristics that are in order:
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   159
    - The name
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   160
    - The data type
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   161
    - The default modifier which can be "none", "negated", "rising" or "falling"
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   162
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   163
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   164
BlockTypes = [{"name" : _("Standard function blocks"), "list":
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   165
               [{"name" : "SR", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   166
                    "inputs" : [("S1","BOOL","none"),("R","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   167
                    "outputs" : [("Q1","BOOL","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   168
                    "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
   169
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   170
                {"name" : "RS", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   171
                    "inputs" : [("S","BOOL","none"),("R1","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   172
                    "outputs" : [("Q1","BOOL","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   173
                    "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
   174
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   175
                {"name" : "SEMA", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   176
                    "inputs" : [("CLAIM","BOOL","none"),("RELEASE","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   177
                    "outputs" : [("BUSY","BOOL","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   178
                    "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
   179
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   180
                {"name" : "R_TRIG", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   181
                    "inputs" : [("CLK","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   182
                    "outputs" : [("Q","BOOL","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   183
                    "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
   184
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   185
                {"name" : "F_TRIG", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   186
                    "inputs" : [("CLK","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   187
                    "outputs" : [("Q","BOOL","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   188
                    "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
   189
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   190
                {"name" : "CTU", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   191
                    "inputs" : [("CU","BOOL","rising"),("R","BOOL","none"),("PV","INT","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   192
                    "outputs" : [("Q","BOOL","none"),("CV","INT","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   193
                    "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
   194
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   195
                {"name" : "CTD", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   196
                    "inputs" : [("CD","BOOL","rising"),("LD","BOOL","none"),("PV","INT","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   197
                    "outputs" : [("Q","BOOL","none"),("CV","INT","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   198
                    "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
   199
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   200
                {"name" : "CTUD", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   201
                    "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
   202
                    "outputs" : [("QU","BOOL","none"),("QD","BOOL","none"),("CV","INT","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   203
                    "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 and down on the other."),
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   204
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   205
                {"name" : "TP", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   206
                    "inputs" : [("IN","BOOL","none"),("PT","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   207
                    "outputs" : [("Q","BOOL","none"),("ET","TIME","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   208
                    "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
   209
                    "generate" : generate_block, "initialise" : initialise_block},
247
4a47ccafbef7 Inversion between TON and TOF comments and errors in IL keywords fixed
lbessard
parents: 242
diff changeset
   210
                {"name" : "TON", "type" : "functionBlock", "extensible" : False, 
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   211
                    "inputs" : [("IN","BOOL","none"),("PT","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   212
                    "outputs" : [("Q","BOOL","none"),("ET","TIME","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   213
                    "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
   214
                    "generate" : generate_block, "initialise" : initialise_block},
247
4a47ccafbef7 Inversion between TON and TOF comments and errors in IL keywords fixed
lbessard
parents: 242
diff changeset
   215
                {"name" : "TOF", "type" : "functionBlock", "extensible" : False, 
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   216
                    "inputs" : [("IN","BOOL","none"),("PT","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   217
                    "outputs" : [("Q","BOOL","none"),("ET","TIME","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   218
                    "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
   219
                    "generate" : generate_block, "initialise" : initialise_block},
373
db5f282946b0 Removing undefined standard function blocks
lbessard
parents: 371
diff changeset
   220
                ]},
427
22d16c457d87 improved English spelling & grammar
b.taylor@willowglen.ca
parents: 404
diff changeset
   221
              {"name" : _("Additional function blocks"), "list":
371
a69a5a72daa1 Removing undefined standard function blocks
lbessard
parents: 354
diff changeset
   222
##                {"name" : "RTC", "type" : "functionBlock", "extensible" : False, 
a69a5a72daa1 Removing undefined standard function blocks
lbessard
parents: 354
diff changeset
   223
##                    "inputs" : [("EN","BOOL","none"),("PDT","DATE_AND_TIME","none")], 
a69a5a72daa1 Removing undefined standard function blocks
lbessard
parents: 354
diff changeset
   224
##                    "outputs" : [("Q","BOOL","none"),("CDT","DATE_AND_TIME","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   225
##                    "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."),
371
a69a5a72daa1 Removing undefined standard function blocks
lbessard
parents: 354
diff changeset
   226
##                    "generate" : generate_block, "initialise" : initialise_block},
373
db5f282946b0 Removing undefined standard function blocks
lbessard
parents: 371
diff changeset
   227
               [{"name" : "INTEGRAL", "type" : "functionBlock", "extensible" : False, 
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   228
                    "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
   229
                    "outputs" : [("Q","BOOL","none"),("XOUT","REAL","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   230
                    "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
   231
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   232
                {"name" : "DERIVATIVE", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   233
                    "inputs" : [("RUN","BOOL","none"),("XIN","REAL","none"),("CYCLE","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   234
                    "outputs" : [("XOUT","REAL","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   235
                    "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
   236
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   237
                {"name" : "PID", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   238
                    "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
   239
                    "outputs" : [("XOUT","REAL","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   240
                    "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
   241
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   242
                {"name" : "RAMP", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   243
                    "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
   244
                    "outputs" : [("RAMP","BOOL","none"),("XOUT","REAL","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   245
                    "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
   246
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   247
                {"name" : "HYSTERESIS", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   248
                    "inputs" : [("XIN1","REAL","none"),("XIN2","REAL","none"),("EPS","REAL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   249
                    "outputs" : [("Q","BOOL","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   250
                    "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
   251
                    "generate" : generate_block, "initialise" : initialise_block},
371
a69a5a72daa1 Removing undefined standard function blocks
lbessard
parents: 354
diff changeset
   252
##                {"name" : "RATIO_MONITOR", "type" : "functionBlock", "extensible" : False, 
a69a5a72daa1 Removing undefined standard function blocks
lbessard
parents: 354
diff changeset
   253
##                    "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")], 
a69a5a72daa1 Removing undefined standard function blocks
lbessard
parents: 354
diff changeset
   254
##                    "outputs" : [("ALARM","BOOL","none"),("TOTAL_ERR","BOOL","none")],
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   255
##                    "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."),
371
a69a5a72daa1 Removing undefined standard function blocks
lbessard
parents: 354
diff changeset
   256
##                    "generate" : generate_block, "initialise" : initialise_block}
57
9bf197698af0 SVGUI Functions Blocks added
jon
parents: 47
diff changeset
   257
                ]},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   258
             ]
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   259
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   260
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   261
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   262
#                           Data Types definitions
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   263
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   264
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   265
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   266
Ordored list of common data types defined in the IEC 61131-3
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   267
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
   268
between type that permits to make a comparison of two types
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   269
"""
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   270
TypeHierarchy_list = [
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   271
    ("ANY", None),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   272
    ("ANY_DERIVED", "ANY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   273
    ("ANY_ELEMENTARY", "ANY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   274
    ("ANY_MAGNITUDE", "ANY_ELEMENTARY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   275
    ("ANY_BIT", "ANY_ELEMENTARY"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   276
    ("ANY_NBIT", "ANY_BIT"),
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   277
    ("ANY_STRING", "ANY_ELEMENTARY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   278
    ("ANY_DATE", "ANY_ELEMENTARY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   279
    ("ANY_NUM", "ANY_MAGNITUDE"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   280
    ("ANY_REAL", "ANY_NUM"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   281
    ("ANY_INT", "ANY_NUM"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   282
    ("ANY_SINT", "ANY_INT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   283
    ("ANY_UINT", "ANY_INT"),
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   284
    ("BOOL", "ANY_BIT"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   285
    ("SINT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   286
    ("INT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   287
    ("DINT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   288
    ("LINT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   289
    ("USINT", "ANY_UINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   290
    ("UINT", "ANY_UINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   291
    ("UDINT", "ANY_UINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   292
    ("ULINT", "ANY_UINT"),
27
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   293
    ("REAL", "ANY_REAL"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   294
    ("LREAL", "ANY_REAL"),
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   295
    ("TIME", "ANY_MAGNITUDE"),
27
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   296
    ("DATE", "ANY_DATE"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   297
    ("TOD", "ANY_DATE"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   298
    ("DT", "ANY_DATE"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   299
    ("STRING", "ANY_STRING"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   300
    ("BYTE", "ANY_NBIT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   301
    ("WORD", "ANY_NBIT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   302
    ("DWORD", "ANY_NBIT"),
27
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   303
    ("LWORD", "ANY_NBIT")
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   304
    #("WSTRING", "ANY_STRING") # TODO
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   305
]
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   306
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   307
TypeHierarchy = dict(TypeHierarchy_list)
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   308
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   309
"""
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   310
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
   311
"""
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   312
def IsOfType(type, reference):
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   313
    if reference is None:
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   314
        return True
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   315
    elif type == reference:
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   316
        return True
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   317
    else:
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   318
        parent_type = TypeHierarchy[type]
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   319
        if parent_type is not None:
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   320
            return IsOfType(parent_type, reference)
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   321
    return False
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   322
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   323
"""
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   324
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
   325
"""
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   326
def GetSubTypes(type):
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   327
    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
   328
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   329
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   330
DataTypeRange_list = [
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   331
    ("SINT", (-2**7, 2**7 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   332
    ("INT", (-2**15, 2**15 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   333
    ("DINT", (-2**31, 2**31 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   334
    ("LINT", (-2**31, 2**31 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   335
    ("USINT", (0, 2**8 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   336
    ("UINT", (0, 2**16 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   337
    ("UDINT", (0, 2**31 - 1)),
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   338
    ("ULINT", (0, 2**31 - 1))
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   339
]
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   340
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   341
DataTypeRange = dict(DataTypeRange_list)
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   342
230
45d70748e45a Moving Data types and POU types informations into project model
lbessard
parents: 210
diff changeset
   343
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   344
21
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   345
#-------------------------------------------------------------------------------
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   346
#                             Test identifier
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   347
#-------------------------------------------------------------------------------
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   348
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   349
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   350
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   351
# Test if identifier is valid
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   352
def TestIdentifier(identifier):
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   353
     if identifier[0].isdigit():
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   354
        return False
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   355
     words = identifier.split('_')
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   356
     for i, word in enumerate(words):
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   357
         if len(word) == 0 and i != 0:
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   358
             return False
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   359
         if len(word) != 0 and not word.isalnum():
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   360
             return False
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   361
     return True
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   362
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   363
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   364
#-------------------------------------------------------------------------------
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   365
#                        Standard functions list generation
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   366
#-------------------------------------------------------------------------------
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   367
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   368
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   369
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   370
take a .csv file and translate it it a "csv_table"
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   371
"""            
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   372
def csv_file_to_table(file):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   373
    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
   374
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   375
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   376
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
   377
return the matching row without first field
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   378
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   379
def find_section(section_name, table):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   380
    fields = [None]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   381
    while(fields[0] != section_name):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   382
        fields = table.pop(0)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   383
    return fields[1:]
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   384
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   385
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   386
extract the standard functions standard parameter names and types...
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   387
return a { ParameterName: Type, ...}
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   388
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   389
def get_standard_funtions_input_variables(table):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   390
    variables = find_section("Standard_functions_variables_types", table)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   391
    standard_funtions_input_variables = {}
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   392
    fields = [True,True]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   393
    while(fields[1]):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   394
        fields = table.pop(0)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   395
        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
   396
        standard_funtions_input_variables[variable_from_csv['name']] = variable_from_csv['type']
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   397
    return standard_funtions_input_variables
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   398
    
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   399
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   400
translate .csv file input declaration into PLCOpenEditor interessting values
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   401
in : "(ANY_NUM, ANY_NUM)" and { ParameterName: Type, ...}
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   402
return [("IN1","ANY_NUM","none"),("IN2","ANY_NUM","none")] 
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   403
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   404
def csv_input_translate(str_decl, variables, base):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   405
    decl = str_decl.replace('(','').replace(')','').replace(' ','').split(',')
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   406
    params = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   407
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   408
    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
   409
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   410
    for param_type in decl:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   411
        if param_type in variables.keys():
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   412
            param_name = param_type
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   413
            param_type = variables[param_type]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   414
        elif len_of_not_predifined_variable > 1:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   415
            param_name = "IN%d"%base
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   416
            base += 1
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   417
        else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   418
            param_name = "IN"
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   419
        params.append((param_name, param_type, "none"))
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   420
    return params
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   421
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   422
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   423
ANY_TO_ANY_LIST=[
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   424
        # simple type conv are let as C cast
541
24f111835805 Fixing REAL_TO_INT conversion (behaved like a trunc and not like a round)
laurent
parents: 526
diff changeset
   425
        (("ANY_INT","ANY_BIT"),("ANY_NUM","ANY_BIT"), ("return_type", "__move_", "IN_type")),
24f111835805 Fixing REAL_TO_INT conversion (behaved like a trunc and not like a round)
laurent
parents: 526
diff changeset
   426
        (("ANY_REAL",),("ANY_REAL",), ("return_type", "__move_", "IN_type")),
24f111835805 Fixing REAL_TO_INT conversion (behaved like a trunc and not like a round)
laurent
parents: 526
diff changeset
   427
        # REAL_TO_INT
24f111835805 Fixing REAL_TO_INT conversion (behaved like a trunc and not like a round)
laurent
parents: 526
diff changeset
   428
        (("ANY_REAL",),("ANY_SINT",), ("return_type", "__real_to_sint", None)),
24f111835805 Fixing REAL_TO_INT conversion (behaved like a trunc and not like a round)
laurent
parents: 526
diff changeset
   429
        (("ANY_REAL",),("ANY_UINT",), ("return_type", "__real_to_uint", None)),
24f111835805 Fixing REAL_TO_INT conversion (behaved like a trunc and not like a round)
laurent
parents: 526
diff changeset
   430
        (("ANY_REAL",),("ANY_BIT",), ("return_type", "__real_to_bit", None)),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   431
        # TO_TIME
284
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   432
        (("ANY_INT","ANY_BIT"),("ANY_DATE","TIME"), ("return_type", "__int_to_time", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   433
        (("ANY_REAL",),("ANY_DATE","TIME"), ("return_type", "__real_to_time", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   434
        (("ANY_STRING",), ("ANY_DATE","TIME"), ("return_type", "__string_to_time", None)),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   435
        # FROM_TIME
284
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   436
        (("ANY_DATE","TIME"), ("ANY_REAL",), ("return_type", "__time_to_real", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   437
        (("ANY_DATE","TIME"), ("ANY_INT","ANY_NBIT"), ("return_type", "__time_to_int", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   438
        (("TIME",), ("ANY_STRING",), ("return_type", "__time_to_string", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   439
        (("DATE",), ("ANY_STRING",), ("return_type", "__date_to_string", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   440
        (("TOD",), ("ANY_STRING",), ("return_type", "__tod_to_string", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   441
        (("DT",), ("ANY_STRING",), ("return_type", "__dt_to_string", None)),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   442
        # TO_STRING
284
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   443
        (("BOOL",), ("ANY_STRING",), ("return_type", "__bool_to_string", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   444
        (("ANY_BIT",), ("ANY_STRING",), ("return_type", "__bit_to_string", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   445
        (("ANY_REAL",), ("ANY_STRING",), ("return_type", "__real_to_string", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   446
        (("ANY_SINT",), ("ANY_STRING",), ("return_type", "__sint_to_string", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   447
        (("ANY_UINT",), ("ANY_STRING",), ("return_type", "__uint_to_string", None)),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   448
        # FROM_STRING
284
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   449
        (("ANY_STRING",), ("BOOL",), ("return_type", "__string_to_bool", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   450
        (("ANY_STRING",), ("ANY_BIT",), ("return_type", "__string_to_bit", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   451
        (("ANY_STRING",), ("ANY_SINT",), ("return_type", "__string_to_sint", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   452
        (("ANY_STRING",), ("ANY_UINT",), ("return_type", "__string_to_uint", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   453
        (("ANY_STRING",), ("ANY_REAL",), ("return_type", "__string_to_real", None))]
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   454
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   455
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   456
BCD_TO_ANY_LIST=[
284
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   457
        (("BYTE",),("USINT",), ("return_type", "__bcd_to_uint", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   458
        (("WORD",),("UINT",), ("return_type", "__bcd_to_uint", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   459
        (("DWORD",),("UDINT",), ("return_type", "__bcd_to_uint", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   460
        (("LWORD",),("ULINT",), ("return_type", "__bcd_to_uint", None))]
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   461
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   462
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   463
ANY_TO_BCD_LIST=[
284
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   464
        (("USINT",),("BYTE",), ("return_type", "__uint_to_bcd", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   465
        (("UINT",),("WORD",), ("return_type", "__uint_to_bcd", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   466
        (("UDINT",),("DWORD",), ("return_type", "__uint_to_bcd", None)),
6cf858411d3a Adding support for EN/ENO in standard functions
lbessard
parents: 279
diff changeset
   467
        (("ULINT",),("LWORD",), ("return_type", "__uint_to_bcd", None))]
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   468
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   469
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   470
def ANY_TO_ANY_FORMAT_GEN(any_to_any_list, fdecl):
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   471
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   472
    for (InTypes, OutTypes, Format) in any_to_any_list:
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   473
        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
   474
        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
   475
        if inps and outs and fdecl["outputs"][0][1] != fdecl["inputs"][0][1]:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   476
             return Format
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   477
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   478
    return None
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   479
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   480
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   481
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   482
Returns this kind of declaration for all standard functions
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   483
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   484
            [{"name" : "Numerical", 'list': [   {   
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   485
                'baseinputnumber': 1,
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   486
                'comment': 'Addition',
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   487
                'extensible': True,
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   488
                'inputs': [   ('IN1', 'ANY_NUM', 'none'),
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   489
                              ('IN2', 'ANY_NUM', 'none')],
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   490
                'name': 'ADD',
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   491
                'outputs': [('OUT', 'ANY_NUM', 'none')],
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   492
                'type': 'function'}, ...... ] },.....]
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   493
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   494
def get_standard_funtions(table):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   495
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   496
    variables = get_standard_funtions_input_variables(table)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   497
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   498
    fonctions = find_section("Standard_functions_type",table)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   499
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   500
    Standard_Functions_Decl = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   501
    Current_section = None
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   502
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   503
    translate = {
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   504
            "extensible" : lambda x: {"yes":True, "no":False}[x],
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   505
            "inputs" : lambda x:csv_input_translate(x,variables,baseinputnumber),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   506
            "outputs":lambda x:[("OUT",x,"none")]}
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   507
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   508
    for fields in table:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   509
        if fields[1]:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   510
            # If function section name given
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   511
            if fields[0]:
391
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   512
                words = fields[0].split('"')
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   513
                if len(words) > 1:
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   514
                    section_name = words[1]
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   515
                else:
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   516
                    section_name = fields[0]
07447ee3538e Adding support for internationalization
laurent
parents: 373
diff changeset
   517
                Current_section = {"name" : section_name, "list" : []}
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   518
                Standard_Functions_Decl.append(Current_section)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   519
                Function_decl_list = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   520
            if Current_section:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   521
                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
   522
                Function_decl["generate"] = generate_block
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   523
                Function_decl["initialise"] = lambda x,y:[]
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   524
                baseinputnumber = int(Function_decl.get("baseinputnumber",1))
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   525
                Function_decl["baseinputnumber"] = baseinputnumber
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   526
                for param, value in Function_decl.iteritems():
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   527
                    if param in translate:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   528
                        Function_decl[param] = translate[param](value)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   529
                Function_decl["type"] = "function"
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   530
                
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   531
                if Function_decl["name"].startswith('*') or Function_decl["name"].endswith('*') :
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   532
                    input_ovrloading_types = GetSubTypes(Function_decl["inputs"][0][1])
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   533
                    output_types = GetSubTypes(Function_decl["outputs"][0][1])
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   534
                else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   535
                    input_ovrloading_types = [None]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   536
                    output_types = [None]
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 109
diff changeset
   537
                
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   538
                funcdeclname_orig = Function_decl["name"]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   539
                funcdeclname = Function_decl["name"].strip('*_')
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   540
                fdc = Function_decl["inputs"][:]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   541
                for intype in input_ovrloading_types:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   542
                    if intype != None:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   543
                        Function_decl["inputs"] = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   544
                        for decl_tpl in fdc:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   545
                            if IsOfType(intype, decl_tpl[1]):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   546
                                Function_decl["inputs"] += [(decl_tpl[0], intype, decl_tpl[2])]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   547
                            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   548
                                Function_decl["inputs"] += [(decl_tpl)]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   549
                            
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   550
                            if funcdeclname_orig.startswith('*'):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   551
                                funcdeclin = intype + '_' + funcdeclname 
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   552
                            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   553
                                funcdeclin = funcdeclname
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   554
                    else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   555
                        funcdeclin = funcdeclname
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   556
                        
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   557
                    for outype in output_types:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   558
                        if outype != None:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   559
                            decl_tpl = Function_decl["outputs"][0]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   560
                            Function_decl["outputs"] = [ (decl_tpl[0] , outype,  decl_tpl[2])]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   561
                            if funcdeclname_orig.endswith('*'):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   562
                                funcdeclout =  funcdeclin + '_' + outype
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   563
                            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   564
                                funcdeclout =  funcdeclin
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   565
                        else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   566
                            funcdeclout =  funcdeclin
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   567
                        Function_decl["name"] = funcdeclout
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   568
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   569
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   570
                        fdecl = Function_decl
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   571
                        res = eval(Function_decl["python_eval_c_code_format"])
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   572
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   573
                        if res != None :
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   574
                            # create the copy of decl dict to be appended to section
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   575
                            Function_decl_copy = Function_decl.copy()
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   576
                            Current_section["list"].append(Function_decl_copy)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   577
            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   578
                raise "First function must be in a category"
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   579
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   580
    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
   581
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   582
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
   583
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   584
BlockTypes.extend(std_decl)
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   585
517
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   586
for section in BlockTypes: 
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   587
    for desc in section["list"]:
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   588
        words = desc["comment"].split('"')
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   589
        if len(words) > 1:
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   590
            desc["comment"] = words[1]
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   591
        desc["usage"] = (
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   592
            "\n (" +
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   593
            str([ " " + fctdecl[1]+":"+fctdecl[0] for fctdecl in desc["inputs"]]).strip("[]").replace("'",'') +
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   594
            " ) => (" +
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   595
            str([ " " + fctdecl[1]+":"+fctdecl[0] for fctdecl in desc["outputs"]]).strip("[]").replace("'",'') +
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   596
            " )")
026ef159e8a2 Added POU interface description in library help text for standard function blocks too, not only in standard functions
Edouard Tisserant
parents: 483
diff changeset
   597
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   598
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   599
#-------------------------------------------------------------------------------
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   600
#                            Languages Keywords
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   601
#-------------------------------------------------------------------------------
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   602
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   603
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   604
# Keywords for Pou Declaration
586
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   605
POU_BLOCK_START_KEYWORDS = ["FUNCTION", "FUNCTION_BLOCK", "PROGRAM"]
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   606
POU_BLOCK_END_KEYWORDS = ["END_FUNCTION", "END_FUNCTION_BLOCK", "END_PROGRAM"]
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   607
POU_KEYWORDS = ["EN", "ENO", "F_EDGE", "R_EDGE"] + POU_BLOCK_START_KEYWORDS + POU_BLOCK_END_KEYWORDS
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   608
for category in BlockTypes:
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   609
    for block in category["list"]:
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   610
        if block["name"] not in POU_KEYWORDS:
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   611
            POU_KEYWORDS.append(block["name"])
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   612
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   613
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   614
# Keywords for Type Declaration
586
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   615
TYPE_BLOCK_START_KEYWORDS = ["TYPE", "STRUCT"]
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   616
TYPE_BLOCK_END_KEYWORDS = ["END_TYPE", "END_STRUCT"]
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   617
TYPE_KEYWORDS = ["ARRAY", "OF", "T", "D", "TIME_OF_DAY", "DATE_AND_TIME"] + TYPE_BLOCK_START_KEYWORDS + TYPE_BLOCK_END_KEYWORDS
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   618
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
   619
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   620
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   621
# Keywords for Variable Declaration
586
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   622
VAR_BLOCK_START_KEYWORDS = ["VAR", "VAR_INPUT", "VAR_OUTPUT", "VAR_IN_OUT", "VAR_TEMP", "VAR_EXTERNAL"]
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   623
VAR_BLOCK_END_KEYWORDS = ["END_VAR"]
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   624
VAR_KEYWORDS = ["AT", "CONSTANT", "RETAIN", "NON_RETAIN"] + VAR_BLOCK_START_KEYWORDS + VAR_BLOCK_END_KEYWORDS
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   625
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   626
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   627
# Keywords for Configuration Declaration
586
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   628
CONFIG_BLOCK_START_KEYWORDS = ["CONFIGURATION", "RESOURCE", "VAR_ACCESS", "VAR_CONFIG", "VAR_GLOBAL"]
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   629
CONFIG_BLOCK_END_KEYWORDS = ["END_CONFIGURATION", "END_RESOURCE", "END_VAR"]
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   630
CONFIG_KEYWORDS = ["ON", "PROGRAM", "WITH", "READ_ONLY", "READ_WRITE", "TASK"] + CONFIG_BLOCK_START_KEYWORDS + CONFIG_BLOCK_END_KEYWORDS
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   631
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   632
# Keywords for Structured Function Chart
586
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   633
SFC_BLOCK_START_KEYWORDS = ["ACTION", "INITIAL_STEP", "STEP", "TRANSITION"]
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   634
SFC_BLOCK_END_KEYWORDS = ["END_ACTION", "END_STEP", "END_TRANSITION"]
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   635
SFC_KEYWORDS = ["FROM", "TO"] + SFC_BLOCK_START_KEYWORDS + SFC_BLOCK_START_KEYWORDS
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   636
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   637
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   638
# Keywords for Instruction List
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   639
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
   640
 "XOR", "XORN", "NOT", "ADD", "SUB", "MUL", "DIV", "MOD", "GT", "GE", "EQ", "NE",
247
4a47ccafbef7 Inversion between TON and TOF comments and errors in IL keywords fixed
lbessard
parents: 242
diff changeset
   641
 "LE", "LT", "JMP", "JMPC", "JMPCN", "CAL", "CALC", "CALCN", "RET", "RETC", "RETCN"]
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   642
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   643
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   644
# Keywords for Structured Text
582
aa41547baa2a Adding support for folding/unfolding and auto-indentation in ST code editor
laurent
parents: 541
diff changeset
   645
ST_BLOCK_START_KEYWORDS = ["IF", "ELSIF", "ELSE", "CASE", "FOR", "WHILE", "REPEAT"]
aa41547baa2a Adding support for folding/unfolding and auto-indentation in ST code editor
laurent
parents: 541
diff changeset
   646
ST_BLOCK_END_KEYWORDS = ["END_IF", "END_CASE", "END_FOR", "END_WHILE", "END_REPEAT"]
aa41547baa2a Adding support for folding/unfolding and auto-indentation in ST code editor
laurent
parents: 541
diff changeset
   647
ST_KEYWORDS = ["TRUE", "FALSE", "THEN", "OF", "TO", "BY", "DO", "DO", "UNTIL", "EXIT", 
aa41547baa2a Adding support for folding/unfolding and auto-indentation in ST code editor
laurent
parents: 541
diff changeset
   648
 "RETURN", "NOT", "MOD", "AND", "XOR", "OR"] + ST_BLOCK_START_KEYWORDS + ST_BLOCK_END_KEYWORDS
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   649
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   650
# All the keywords of IEC
586
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   651
IEC_BLOCK_START_KEYWORDS = []
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   652
IEC_BLOCK_END_KEYWORDS = []
109
734e02ab4018 Bug that didn't affect standard function names as keywords fixed
lbessard
parents: 108
diff changeset
   653
IEC_KEYWORDS = ["E", "TRUE", "FALSE"]
586
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   654
for all_keywords, keywords_list in [(IEC_BLOCK_START_KEYWORDS, [POU_BLOCK_START_KEYWORDS, TYPE_BLOCK_START_KEYWORDS,
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   655
                                                                VAR_BLOCK_START_KEYWORDS, CONFIG_BLOCK_START_KEYWORDS,
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   656
                                                                SFC_BLOCK_START_KEYWORDS, ST_BLOCK_START_KEYWORDS]),
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   657
                                    (IEC_BLOCK_END_KEYWORDS, [POU_BLOCK_END_KEYWORDS, TYPE_BLOCK_END_KEYWORDS,
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   658
                                                              VAR_BLOCK_END_KEYWORDS, CONFIG_BLOCK_END_KEYWORDS,
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   659
                                                              SFC_BLOCK_END_KEYWORDS, ST_BLOCK_END_KEYWORDS]),
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   660
                                    (IEC_KEYWORDS, [POU_KEYWORDS, TYPE_KEYWORDS, VAR_KEYWORDS, CONFIG_KEYWORDS,
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   661
                                                    SFC_KEYWORDS, IL_KEYWORDS, ST_KEYWORDS])]:
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   662
    for keywords in keywords_list:
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   663
        all_keywords.extend([keyword for keyword in keywords if keyword not in all_keywords])
9aa96a36cf33 Moving variable panel from bottom notebook panel to POU editor panel
laurent
parents: 582
diff changeset
   664