plcopen/structures.py
author lbessard
Mon, 17 Sep 2007 17:51:05 +0200
changeset 94 e7f5a251f251
parent 93 c3c24b979a4d
child 98 ec5d7af033d8
permissions -rw-r--r--
Bug on block modification fixed
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
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    30
def generate_block(generator, block, body, link):
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    31
    name = block.getInstanceName()
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    32
    type = block.getTypeName()
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    33
    block_infos = GetBlockType(type)
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    34
    if block_infos["type"] == "function" and link:
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    35
        generator.GeneratePouProgram(type)
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    36
        vars = []
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    37
        for variable in block.inputVariables.getVariable():
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    38
            connections = variable.connectionPointIn.getConnections()
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    39
            if connections and len(connections) == 1:
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    40
                value = generator.ComputeFBDExpression(body, connections[0])
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    41
                vars.append(generator.ExtractModifier(variable, value))
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    42
        variable = block.outputVariables.getVariable()[0]
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    43
        return generator.ExtractModifier(variable, "%s(%s)"%(type, ", ".join(vars)))
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    44
    elif block_infos["type"] == "functionBlock":
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    45
        if not generator.ComputedBlocks.get(name, False):
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    46
            vars = []
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    47
            for variable in block.inputVariables.getVariable():
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    48
                connections = variable.connectionPointIn.getConnections()
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    49
                if connections and len(connections) == 1:
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    50
                    parameter = variable.getFormalParameter()
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    51
                    value = generator.ComputeFBDExpression(body, connections[0])
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    52
                    vars.append("%s := %s"%(parameter, generator.ExtractModifier(variable, value)))
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    53
            generator.Program += "  %s(%s);\n"%(name, ", ".join(vars))
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    54
            generator.ComputedBlocks[name] = True
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    55
        if link:
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    56
            connectionPoint = link.getPosition()[-1]
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    57
        else:
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    58
            connectionPoint = None
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    59
        for variable in block.outputVariables.getVariable():
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    60
            blockPointx, blockPointy = variable.connectionPointOut.getRelPosition()
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    61
            if not connectionPoint or block.getX() + blockPointx == connectionPoint.getX() and block.getY() + blockPointy == connectionPoint.getY():
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    62
                return generator.ExtractModifier(variable, "%s.%s"%(name, variable.getFormalParameter()))
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    63
        raise ValueError, "No output variable found"
21
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
    64
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
    65
def initialise_block(type, name):
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
    66
    return [(type, name, None, None)]
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
    67
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    68
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    69
#                        Function Block Types definitions
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    70
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    71
21
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
    72
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    73
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    74
Ordored list of common Function Blocks defined in the IEC 61131-3
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    75
Each block have this attributes:
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    76
    - "name" : The block name
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    77
    - "type" : The block type. It can be "function", "functionBlock" or "program"
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    78
    - "extensible" : Boolean that define if the block is extensible
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    79
    - "inputs" : List of the block inputs
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    80
    - "outputs" : List of the block outputs
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    81
    - "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
    82
    - "generate" : Method that generator will call for generating ST block code
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    83
Inputs and outputs are a tuple of characteristics that are in order:
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    84
    - The name
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    85
    - The data type
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    86
    - The default modifier which can be "none", "negated", "rising" or "falling"
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    87
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    88
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
    89
BlockTypes = [{"name" : "Standard function blocks", "list":
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    90
               [{"name" : "SR", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    91
                    "inputs" : [("S1","BOOL","none"),("R","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    92
                    "outputs" : [("Q1","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    93
                    "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
    94
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    95
                {"name" : "RS", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    96
                    "inputs" : [("S","BOOL","none"),("R1","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
    97
                    "outputs" : [("Q1","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
    98
                    "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
    99
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   100
                {"name" : "SEMA", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   101
                    "inputs" : [("CLAIM","BOOL","none"),("RELEASE","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   102
                    "outputs" : [("BUSY","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   103
                    "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
   104
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   105
                {"name" : "R_TRIG", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   106
                    "inputs" : [("CLK","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   107
                    "outputs" : [("Q","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   108
                    "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
   109
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   110
                {"name" : "F_TRIG", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   111
                    "inputs" : [("CLK","BOOL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   112
                    "outputs" : [("Q","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   113
                    "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
   114
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   115
                {"name" : "CTU", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   116
                    "inputs" : [("CU","BOOL","rising"),("R","BOOL","none"),("PV","INT","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   117
                    "outputs" : [("Q","BOOL","none"),("CV","INT","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   118
                    "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
   119
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   120
                {"name" : "CTD", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   121
                    "inputs" : [("CD","BOOL","rising"),("LD","BOOL","none"),("PV","INT","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   122
                    "outputs" : [("Q","BOOL","none"),("CV","INT","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   123
                    "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
   124
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   125
                {"name" : "CTUD", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   126
                    "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
   127
                    "outputs" : [("QU","BOOL","none"),("QD","BOOL","none"),("CV","INT","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   128
                    "comment" : "Up-down counter\nThe up-down counter has two inputs CU and CD. It can be used to both count up on one input ans down on the other.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   129
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   130
                {"name" : "TP", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   131
                    "inputs" : [("IN","BOOL","none"),("PT","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   132
                    "outputs" : [("Q","BOOL","none"),("ET","TIME","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   133
                    "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
   134
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   135
                {"name" : "TOF", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   136
                    "inputs" : [("IN","BOOL","none"),("PT","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   137
                    "outputs" : [("Q","BOOL","none"),("ET","TIME","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   138
                    "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
   139
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   140
                {"name" : "TON", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   141
                    "inputs" : [("IN","BOOL","none"),("PT","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   142
                    "outputs" : [("Q","BOOL","none"),("ET","TIME","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   143
                    "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
   144
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   145
                {"name" : "RTC", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   146
                    "inputs" : [("EN","BOOL","none"),("PDT","DATE_AND_TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   147
                    "outputs" : [("Q","BOOL","none"),("CDT","DATE_AND_TIME","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   148
                    "comment" : "Real time clock\nThe real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   149
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   150
                {"name" : "INTEGRAL", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   151
                    "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
   152
                    "outputs" : [("Q","BOOL","none"),("XOUT","REAL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   153
                    "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
   154
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   155
                {"name" : "DERIVATIVE", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   156
                    "inputs" : [("RUN","BOOL","none"),("XIN","REAL","none"),("CYCLE","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   157
                    "outputs" : [("XOUT","REAL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   158
                    "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
   159
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   160
                {"name" : "PID", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   161
                    "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
   162
                    "outputs" : [("XOUT","REAL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   163
                    "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
   164
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   165
                {"name" : "RAMP", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   166
                    "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
   167
                    "outputs" : [("RAMP","BOOL","none"),("XOUT","REAL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   168
                    "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
   169
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   170
                {"name" : "HYSTERESIS", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   171
                    "inputs" : [("XIN1","REAL","none"),("XIN2","REAL","none"),("EPS","REAL","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   172
                    "outputs" : [("Q","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   173
                    "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
   174
                    "generate" : generate_block, "initialise" : initialise_block},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   175
                {"name" : "RATIO_MONITOR", "type" : "functionBlock", "extensible" : False, 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   176
                    "inputs" : [("PV1","REAL","none"),("PV2","REAL","none"),("RATIO","REAL","none"),("TIMON","TIME","none"),("TIMOFF","TIME","none"),("TOLERANCE","BOOL","none"),("RESET","BOOL","none"),("CYCLE","TIME","none")], 
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   177
                    "outputs" : [("ALARM","BOOL","none"),("TOTAL_ERR","BOOL","none")],
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   178
                    "comment" : "Ratio monitor\nThe ratio_monitor function block checks that one process value PV1 is always a given ratio (defined by input RATIO) of a second process value PV2.",
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   179
                    "generate" : generate_block, "initialise" : initialise_block}
57
9bf197698af0 SVGUI Functions Blocks added
jon
parents: 47
diff changeset
   180
                ]},
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   181
             ]
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   182
             
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   183
PluginTypes = []
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   184
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   185
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   186
Function that returns the block definition associated to the block type given
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   187
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   188
28
fc23e1f415d8 Adding support for concurrent overriden standard function
lbessard
parents: 27
diff changeset
   189
def GetBlockType(type, inputs = None):
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   190
    for category in BlockTypes + PluginTypes:
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   191
        for blocktype in category["list"]:
28
fc23e1f415d8 Adding support for concurrent overriden standard function
lbessard
parents: 27
diff changeset
   192
            if inputs:
fc23e1f415d8 Adding support for concurrent overriden standard function
lbessard
parents: 27
diff changeset
   193
                block_inputs = tuple([var_type for name, var_type, modifier in blocktype["inputs"]])
fc23e1f415d8 Adding support for concurrent overriden standard function
lbessard
parents: 27
diff changeset
   194
                same_inputs = inputs == block_inputs
fc23e1f415d8 Adding support for concurrent overriden standard function
lbessard
parents: 27
diff changeset
   195
            else:
fc23e1f415d8 Adding support for concurrent overriden standard function
lbessard
parents: 27
diff changeset
   196
                same_inputs = True
fc23e1f415d8 Adding support for concurrent overriden standard function
lbessard
parents: 27
diff changeset
   197
            if blocktype["name"] == type and same_inputs:
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   198
                return blocktype
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   199
    return None
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   200
78
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   201
"""
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   202
Function that add a new plugin to the plugin list
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   203
"""
049f2e7090a2 Adding support for adding block types with particular behaviour
lbessard
parents: 58
diff changeset
   204
92
76d5001393df Adding support for refreshing PLCOpenEditor block list
lbessard
parents: 78
diff changeset
   205
def AddPluginBlockList(blocklist):
76d5001393df Adding support for refreshing PLCOpenEditor block list
lbessard
parents: 78
diff changeset
   206
    PluginTypes.extend(blocklist)
76d5001393df Adding support for refreshing PLCOpenEditor block list
lbessard
parents: 78
diff changeset
   207
    
76d5001393df Adding support for refreshing PLCOpenEditor block list
lbessard
parents: 78
diff changeset
   208
def ClearPluginTypes():
76d5001393df Adding support for refreshing PLCOpenEditor block list
lbessard
parents: 78
diff changeset
   209
    for i in xrange(len(PluginTypes)):
76d5001393df Adding support for refreshing PLCOpenEditor block list
lbessard
parents: 78
diff changeset
   210
        PluginTypes.pop(0)
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   211
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   212
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   213
#                           Data Types definitions
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   214
#-------------------------------------------------------------------------------
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   215
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   216
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   217
Ordored list of common data types defined in the IEC 61131-3
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   218
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
   219
between type that permits to make a comparison of two types
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   220
"""
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   221
TypeHierarchy_list = [
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   222
    ("ANY", None),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   223
    ("ANY_DERIVED", "ANY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   224
    ("ANY_ELEMENTARY", "ANY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   225
    ("ANY_MAGNITUDE", "ANY_ELEMENTARY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   226
    ("ANY_BIT", "ANY_ELEMENTARY"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   227
    ("ANY_NBIT", "ANY_BIT"),
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   228
    ("ANY_STRING", "ANY_ELEMENTARY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   229
    ("ANY_DATE", "ANY_ELEMENTARY"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   230
    ("ANY_NUM", "ANY_MAGNITUDE"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   231
    ("ANY_REAL", "ANY_NUM"),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   232
    ("ANY_INT", "ANY_NUM"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   233
    ("ANY_SINT", "ANY_INT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   234
    ("ANY_UINT", "ANY_INT"),
27
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   235
	("BOOL", "ANY_BIT"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   236
    ("SINT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   237
    ("INT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   238
    ("DINT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   239
    ("LINT", "ANY_SINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   240
    ("USINT", "ANY_UINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   241
    ("UINT", "ANY_UINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   242
    ("UDINT", "ANY_UINT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   243
    ("ULINT", "ANY_UINT"),
27
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   244
    ("REAL", "ANY_REAL"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   245
    ("LREAL", "ANY_REAL"),
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   246
    ("TIME", "ANY_MAGNITUDE"),
27
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   247
    ("DATE", "ANY_DATE"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   248
    ("TOD", "ANY_DATE"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   249
    ("DT", "ANY_DATE"),
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   250
    ("STRING", "ANY_STRING"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   251
    ("BYTE", "ANY_NBIT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   252
    ("WORD", "ANY_NBIT"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   253
    ("DWORD", "ANY_NBIT"),
27
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   254
    ("LWORD", "ANY_NBIT")
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   255
    #("WSTRING", "ANY_STRING") # TODO
dae55dd9ee14 Current developping version
lbessard
parents: 25
diff changeset
   256
]
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   257
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   258
TypeHierarchy = dict(TypeHierarchy_list)
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   259
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   260
"""
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   261
returns true if the given data type is the same that "reference" meta-type or one of its types.
0
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   262
"""
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   263
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   264
def IsOfType(test, reference):
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   265
    while test != None:
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   266
        if test == reference:
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   267
            return True
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   268
        test = TypeHierarchy[test]
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   269
    return False
b622defdfd98 PLCOpenEditor initial commit. 31/01/07.
etisserant
parents:
diff changeset
   270
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   271
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   272
returns list of all types that correspont to the ANY* meta type
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   273
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   274
def GetSubTypes(reference):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   275
    return [ typename for typename, parenttype in TypeHierarchy_list if typename[:3] != "ANY" and IsOfType(typename, reference)]
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   276
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   277
21
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   278
#-------------------------------------------------------------------------------
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   279
#                             Test identifier
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   280
#-------------------------------------------------------------------------------
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   281
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   282
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   283
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   284
# Test if identifier is valid
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   285
def TestIdentifier(identifier):
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   286
     if identifier[0].isdigit():
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   287
        return False
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   288
     words = identifier.split('_')
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   289
     for i, word in enumerate(words):
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   290
         if len(word) == 0 and i != 0:
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   291
             return False
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   292
         if len(word) != 0 and not word.isalnum():
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   293
             return False
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   294
     return True
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   295
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   296
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   297
#-------------------------------------------------------------------------------
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   298
#                            Languages Keywords
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   299
#-------------------------------------------------------------------------------
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   300
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   301
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   302
# Keywords for Pou Declaration
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   303
POU_KEYWORDS = ["FUNCTION", "END_FUNCTION", "FUNCTION_BLOCK", "END_FUNCTION_BLOCK",
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   304
 "PROGRAM", "END_PROGRAM", "EN", "ENO", "F_EDGE", "R_EDGE"]
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   305
for category in BlockTypes:
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   306
    for block in category["list"]:
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   307
        if block["name"] not in POU_KEYWORDS:
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   308
            POU_KEYWORDS.append(block["name"])
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   309
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   310
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   311
# Keywords for Type Declaration
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   312
TYPE_KEYWORDS = ["TYPE", "END_TYPE", "STRUCT", "END_STRUCT", "ARRAY", "OF", "T",
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   313
 "D", "TIME_OF_DAY", "DATE_AND_TIME"]
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   314
TYPE_KEYWORDS.extend([keyword for keyword in TypeHierarchy.keys() if keyword not in TYPE_KEYWORDS])
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   315
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   316
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   317
# Keywords for Variable Declaration
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   318
VAR_KEYWORDS = ["VAR", "VAR_INPUT", "VAR_OUTPUT", "VAR_IN_OUT", "VAR_TEMP", 
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   319
 "VAR_EXTERNAL", "END_VAR", "AT", "CONSTANT", "RETAIN", "NON_RETAIN"]
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   320
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   321
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   322
# Keywords for Configuration Declaration
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   323
CONFIG_KEYWORDS = ["CONFIGURATION", "END_CONFIGURATION", "RESOURCE", "ON", "END_RESOURCE",
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   324
 "PROGRAM", "WITH", "READ_ONLY", "READ_WRITE", "TASK", "VAR_ACCESS", "VAR_CONFIG", 
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   325
 "VAR_GLOBAL", "END_VAR"]
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   326
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   327
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   328
# Keywords for Structured Function Chart
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   329
SFC_KEYWORDS = ["ACTION", "END_ACTION", "INITIAL_STEP", "STEP", "END_STEP", "TRANSITION",
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   330
 "FROM", "TO", "END_TRANSITION"]
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   331
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   332
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   333
# Keywords for Instruction List
47
2b2f8d88e6d3 Interface changed to show pou interface at the bottom of the window
lbessard
parents: 40
diff changeset
   334
IL_KEYWORDS = ["TRUE", "FALSE", "LD", "LDN", "ST", "STN", "S", "R", "AND", "ANDN", "OR", "ORN",
21
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   335
 "XOR", "XORN", "NOT", "ADD", "SUB", "MUL", "DIV", "MOD", "GT", "GE", "EQ", "NE",
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   336
 "LE", "LT", "JMP", "JMPC", "JMPNC", "CAL", "CALC", "CALNC", "RET", "RETC", "RETNC"]
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   337
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   338
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   339
# Keywords for Instruction List and Structured Text
47
2b2f8d88e6d3 Interface changed to show pou interface at the bottom of the window
lbessard
parents: 40
diff changeset
   340
ST_KEYWORDS = ["TRUE", "FALSE", "IF", "THEN", "ELSIF", "ELSE", "END_IF", "CASE", "OF", "END_CASE", 
21
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   341
 "FOR", "TO", "BY", "DO", "END_FOR", "WHILE", "DO", "END_WHILE", "REPEAT", "UNTIL", 
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   342
 "END_REPEAT", "EXIT", "RETURN", "NOT", "MOD", "AND", "XOR", "OR"]
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   343
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   344
 
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   345
# All the keywords of IEC
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   346
IEC_KEYWORDS = ["E", "TRUE", "FALSE"]
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   347
IEC_KEYWORDS.extend([keyword for keyword in POU_KEYWORDS if keyword not in IEC_KEYWORDS])
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   348
IEC_KEYWORDS.extend([keyword for keyword in TYPE_KEYWORDS if keyword not in IEC_KEYWORDS])
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   349
IEC_KEYWORDS.extend([keyword for keyword in VAR_KEYWORDS if keyword not in IEC_KEYWORDS])
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   350
IEC_KEYWORDS.extend([keyword for keyword in CONFIG_KEYWORDS if keyword not in IEC_KEYWORDS])
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   351
IEC_KEYWORDS.extend([keyword for keyword in SFC_KEYWORDS if keyword not in IEC_KEYWORDS])
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   352
IEC_KEYWORDS.extend([keyword for keyword in IL_KEYWORDS if keyword not in IEC_KEYWORDS])
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   353
IEC_KEYWORDS.extend([keyword for keyword in ST_KEYWORDS if keyword not in IEC_KEYWORDS])
e619d7bea692 Add support for AND, OR, XOR for booleans
lbessard
parents: 19
diff changeset
   354
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   355
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   356
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   357
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   358
take a .csv file and translate it it a "csv_table"
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   359
"""            
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   360
def csv_file_to_table(file):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   361
    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
   362
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   363
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   364
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
   365
return the matching row without first field
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   366
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   367
def find_section(section_name, table):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   368
    fields = [None]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   369
    while(fields[0] != section_name):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   370
        fields = table.pop(0)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   371
    return fields[1:]
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   372
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   373
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   374
extract the standard functions standard parameter names and types...
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   375
return a { ParameterName: Type, ...}
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   376
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   377
def get_standard_funtions_input_variables(table):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   378
    variables = find_section("Standard_functions_variables_types", table)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   379
    standard_funtions_input_variables = {}
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   380
    fields = [True,True]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   381
    while(fields[1]):
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
        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
   384
        standard_funtions_input_variables[variable_from_csv['name']] = variable_from_csv['type']
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   385
    return standard_funtions_input_variables
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   386
    
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   387
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   388
translate .csv file input declaration into PLCOpenEditor interessting values
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   389
in : "(ANY_NUM, ANY_NUM)" and { ParameterName: Type, ...}
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   390
return [("IN1","ANY_NUM","none"),("IN2","ANY_NUM","none")] 
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   391
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   392
def csv_input_translate(str_decl, variables, base):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   393
    decl = str_decl.replace('(','').replace(')','').replace(' ','').split(',')
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   394
    params = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   395
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   396
    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
   397
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   398
    for param_type in decl:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   399
        if param_type in variables.keys():
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   400
            param_name = param_type
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   401
            param_type = variables[param_type]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   402
        elif len_of_not_predifined_variable > 1:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   403
            param_name = "IN%d"%base
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   404
            base += 1
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   405
        else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   406
            param_name = "IN"
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   407
        params.append((param_name, param_type, "none"))
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   408
    return params
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   409
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   410
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   411
ANY_TO_ANY_LIST=[
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   412
        # simple type conv are let as C cast
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   413
        (("ANY_NUM","ANY_BIT"),("ANY_NUM","ANY_BIT"), "(%(return_type)s)%(IN_value)s"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   414
        # TO_TIME
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   415
        (("ANY_INT","ANY_BIT"),("ANY_DATE","TIME"), "(%(return_type)s)__int_to_time(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   416
        (("ANY_REAL",),("ANY_DATE","TIME"), "(%(return_type)s)__real_to_time(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   417
        (("ANY_STRING",), ("ANY_DATE","TIME"), "(%(return_type)s)__string_to_time(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   418
        # FROM_TIME
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   419
        (("ANY_DATE","TIME"), ("ANY_REAL",), "(%(return_type)s)__time_to_real(%(IN_value)s)"),
40
49c8ebc1ee25 Cleanup in generated C code for STD lib
etisserant
parents: 28
diff changeset
   420
        (("ANY_DATE","TIME"), ("ANY_INT","ANY_NBIT"), "(%(return_type)s)__time_to_int(%(IN_value)s)"),
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   421
        (("TIME",), ("ANY_STRING",), "(%(return_type)s)__time_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   422
        (("DATE",), ("ANY_STRING",), "(%(return_type)s)__date_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   423
        (("TOD",), ("ANY_STRING",), "(%(return_type)s)__tod_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   424
        (("DT",), ("ANY_STRING",), "(%(return_type)s)__dt_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   425
        # TO_STRING
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   426
        (("BOOL",), ("ANY_STRING",), "(%(return_type)s)__bool_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   427
        (("ANY_BIT",), ("ANY_STRING",), "(%(return_type)s)__bit_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   428
        (("ANY_REAL",), ("ANY_STRING",), "(%(return_type)s)__real_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   429
        (("ANY_SINT",), ("ANY_STRING",), "(%(return_type)s)__sint_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   430
        (("ANY_UINT",), ("ANY_STRING",), "(%(return_type)s)__uint_to_string(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   431
        # FROM_STRING
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   432
        (("ANY_STRING",), ("BOOL",), "(%(return_type)s)__string_to_bool(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   433
        (("ANY_STRING",), ("ANY_BIT",), "(%(return_type)s)__string_to_bit(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   434
        (("ANY_STRING",), ("ANY_SINT",), "(%(return_type)s)__string_to_sint(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   435
        (("ANY_STRING",), ("ANY_UINT",), "(%(return_type)s)__string_to_uint(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   436
        (("ANY_STRING",), ("ANY_REAL",), "(%(return_type)s)__string_to_real(%(IN_value)s)")]
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   437
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   438
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   439
BCD_TO_ANY_LIST=[
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   440
        (("BYTE",),("USINT",), "(%(return_type)s)__bcd_to_uint(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   441
        (("WORD",),("UINT",), "(%(return_type)s)__bcd_to_uint(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   442
        (("DWORD",),("UDINT",), "(%(return_type)s)__bcd_to_uint(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   443
        (("LWORD",),("ULINT",), "(%(return_type)s)__bcd_to_uint(%(IN_value)s)")]
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   444
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   445
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   446
ANY_TO_BCD_LIST=[
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   447
        (("USINT",),("BYTE",), "(%(return_type)s)__uint_to_bcd(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   448
        (("UINT",),("WORD",), "(%(return_type)s)__uint_to_bcd(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   449
        (("UDINT",),("DWORD",), "(%(return_type)s)__uint_to_bcd(%(IN_value)s)"),
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   450
        (("ULINT",),("LWORD",), "(%(return_type)s)__uint_to_bcd(%(IN_value)s)")]
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   451
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   452
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   453
def ANY_TO_ANY_FORMAT_GEN(any_to_any_list, fdecl):
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   454
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   455
    for (InTypes, OutTypes, Format) in any_to_any_list:
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   456
        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
   457
        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
   458
        if inps and outs and fdecl["outputs"][0][1] != fdecl["inputs"][0][1]:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   459
             return Format
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   460
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   461
    return None
18
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   462
ee18a387e80a Enhanced standard funcrtion declaration from .csv file.
etisserant
parents: 15
diff changeset
   463
15
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   464
"""
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   465
Returns this kind of declaration for all standard functions
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   466
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   467
            [{"name" : "Numerical", 'list': [   {   
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   468
                'baseinputnumber': 1,
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   469
                'comment': 'Addition',
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   470
                'extensible': True,
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   471
                'inputs': [   ('IN1', 'ANY_NUM', 'none'),
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   472
                              ('IN2', 'ANY_NUM', 'none')],
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   473
                'name': 'ADD',
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   474
                'outputs': [('OUT', 'ANY_NUM', 'none')],
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   475
                'type': 'function'}, ...... ] },.....]
fc897b7bfa7b Enhanced standard function decalration fr cvs
etisserant
parents: 14
diff changeset
   476
"""
14
cd0133ed377b Standard IEC functions declaration now made from iec_std.csv file for easier maintainance.
etisserant
parents: 9
diff changeset
   477
def get_standard_funtions(table):
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   478
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   479
    variables = get_standard_funtions_input_variables(table)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   480
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   481
    fonctions = find_section("Standard_functions_type",table)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   482
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   483
    Standard_Functions_Decl = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   484
    Current_section = None
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   485
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   486
    translate = {
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   487
            "extensible" : lambda x: {"yes":True, "no":False}[x],
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   488
            "inputs" : lambda x:csv_input_translate(x,variables,baseinputnumber),
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   489
            "outputs":lambda x:[("OUT",x,"none")]}
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   490
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   491
    for fields in table:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   492
        if fields[1]:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   493
            # If function section name given
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   494
            if fields[0]:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   495
                Current_section = {"name" : fields[0], "list" : []}
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   496
                Standard_Functions_Decl.append(Current_section)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   497
                Function_decl_list = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   498
            if Current_section:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   499
                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
   500
                Function_decl["generate"] = generate_block
93
c3c24b979a4d Add support for custom block declaration
lbessard
parents: 92
diff changeset
   501
                Function_decl["initialise"] = lambda x,y:[]
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   502
                baseinputnumber = int(Function_decl.get("baseinputnumber",1))
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   503
                Function_decl["baseinputnumber"] = baseinputnumber
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   504
                for param, value in Function_decl.iteritems():
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   505
                    if param in translate:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   506
                        Function_decl[param] = translate[param](value)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   507
                Function_decl["type"] = "function"
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   508
                
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   509
                if Function_decl["name"].startswith('*') or Function_decl["name"].endswith('*') :
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   510
                    input_ovrloading_types = GetSubTypes(Function_decl["inputs"][0][1])
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   511
                    output_types = GetSubTypes(Function_decl["outputs"][0][1])
22
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   512
                else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   513
                    input_ovrloading_types = [None]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   514
                    output_types = [None]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   515
                    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   516
                funcdeclname_orig = Function_decl["name"]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   517
                funcdeclname = Function_decl["name"].strip('*_')
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   518
                fdc = Function_decl["inputs"][:]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   519
                for intype in input_ovrloading_types:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   520
                    if intype != None:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   521
                        Function_decl["inputs"] = []
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   522
                        for decl_tpl in fdc:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   523
                            if IsOfType(intype, decl_tpl[1]):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   524
                                Function_decl["inputs"] += [(decl_tpl[0], intype, decl_tpl[2])]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   525
                            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   526
                                Function_decl["inputs"] += [(decl_tpl)]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   527
                            
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   528
                            if funcdeclname_orig.startswith('*'):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   529
                                funcdeclin = intype + '_' + funcdeclname 
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   530
                            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   531
                                funcdeclin = funcdeclname
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   532
                    else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   533
                        funcdeclin = funcdeclname
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   534
                        
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   535
                    for outype in output_types:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   536
                        if outype != None:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   537
                            decl_tpl = Function_decl["outputs"][0]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   538
                            Function_decl["outputs"] = [ (decl_tpl[0] , outype,  decl_tpl[2])]
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   539
                            if funcdeclname_orig.endswith('*'):
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   540
                                funcdeclout =  funcdeclin + '_' + outype
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   541
                            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   542
                                funcdeclout =  funcdeclin
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   543
                        else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   544
                            funcdeclout =  funcdeclin
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   545
                        Function_decl["name"] = funcdeclout
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   546
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   547
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   548
                        fdecl = Function_decl
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   549
                        res = eval(Function_decl["python_eval_c_code_format"])
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   550
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   551
                        if res != None :
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   552
                            # create the copy of decl dict to be appended to section
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   553
                            Function_decl_copy = Function_decl.copy()
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   554
                            # Have to generate type description in comment with freshly redefined types
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   555
                            Function_decl_copy["comment"] += (
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   556
                                "\n (" +
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   557
                                str([ " " + fctdecl[1]+":"+fctdecl[0] for fctdecl in Function_decl["inputs"]]).strip("[]").replace("'",'') +
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   558
                                " ) => (" +
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   559
                                str([ " " + fctdecl[1]+":"+fctdecl[0] for fctdecl in Function_decl["outputs"]]).strip("[]").replace("'",'') +
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   560
                                " )")
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   561
                            Current_section["list"].append(Function_decl_copy)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   562
                            #pp.pprint(Function_decl_copy)
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   563
            else:
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   564
                raise "First function must be in a category"
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   565
    
a765fae3b361 Modifications on structure.py
lbessard
parents: 21
diff changeset
   566
    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
   567
25
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   568
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
   569
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   570
BlockTypes.extend(std_decl)
8dc68e669d99 Early implementation of STD library.
etisserant
parents: 23
diff changeset
   571