plcopen/pou_variables.ysl2
author Andrey Skvortsov <andrej.skvortzov@gmail.com>
Sun, 06 Jan 2019 01:22:46 +0300
changeset 2499 68f4f2d4516b
parent 1949 c266fbaae0f6
child 3802 8616ffd7c29d
permissions -rw-r--r--
use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux

This code could be possible reused on low-end targets with limited RAM.

code to generate lookup table:
[---------------------------------------------------------------------]

/* CRC lookup table and initial state. */
uint32_t crc32_table[256];

/* Generate CRC32 lookup table. */
void GenerateCRC32Table(void)
{
unsigned int i, j;
/* Use CRC-32-IEEE 802.3 polynomial 0x04C11DB7 (bit reflected). */
uint32_t poly = 0xEDB88320;

for (i = 0; i <= 0xFF; i++)
{
uint32_t c = i;
for (j = 0 ; j < 8 ; j++)
c = (c & 1) ? (c >> 1 ) ^ poly : (c >> 1);
crc32_table[i] = c;
}
}

void main(void)
{
GenerateCRC32Table();
int j=0;
for(int i=0; i<256; i++) {
printf("0x%08X, ", crc32_table[i]);
if (++j >= 8) {
j = 0;
printf("\n");
}
}
}
[---------------------------------------------------------------------]
include yslt_noindent.yml2
istylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
            xmlns:xhtml="http://www.w3.org/1999/xhtml"
            xmlns:ns="beremiz" 
            extension-element-prefixes="ns" 
            exclude-result-prefixes="ns" {
    
    template "text()";
    template "text()", mode="var_class";
    template "text()", mode="var_type";
    template "text()", mode="var_edit";
    template "text()", mode="var_debug";
    
    variable "project", "ns:GetProject()";
    
    variable "stdlib", "ns:GetStdLibs()";

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

    variable "all_types", "($project | $stdlib | $extensions)/ppx:types";
    
    function "add_root" {
        param "class";
        param "type";
        param "edit" > true
        param "debug" > true
        value "ns:SetRoot($class, $type, $edit, $debug)";
    }
    
    template "ppx:pou" {
        call "add_root" {
            with "class" > «@pouType»
            with "type" > «@name»
        }
        apply "ppx:interface";
        apply "ppx:actions/ppx:action | ppx:transitions/ppx:transition", mode="variable_list";
    }
    
    template "ppx:action" {
        call "add_root" {
            with "class" > action
        }
        apply "ancestor::ppx:pou/child::ppx:interface";
    }
    
    template "ppx:transition" {
        call "add_root" {
            with "class" > transition
        }
        apply "ancestor::ppx:pou/child::ppx:interface";
    }
    
    template "ppx:configuration" {
        call "add_root" {
            with "class" > configuration
            with "debug" > false
        }
        apply "ppx:resource", mode="variable_list";
        apply "ppx:globalVars";
    }
    
    template "ppx:resource" {
        call "add_root" {
            with "class" > resource
            with "debug" > false
        }
        apply "ppx:pouInstance | ppx:task/ppx:pouInstance",  mode="variable_list";
        apply "ppx:globalVars";
    }
    
    function "variables_infos" {
        param "var_class";
        foreach "ppx:variable" {
            variable "class" {
                apply "ppx:type", mode="var_class" {
                    with "default_class" > «$var_class»
                }
            }
            variable "type" {
                apply"ppx:type", mode="var_type";
            }
            variable "edit" {
                apply "ppx:type", mode="var_edit";
            }
            variable "debug" {
                apply "ppx:type", mode="var_debug";
            }
            value "ns:AddVariable(@name, $class, $type, $edit, $debug)";
        }
    }
    
    template "ppx:localVars" {
        call "variables_infos" {
            with "var_class" > Local
        }
    }
    
    template "ppx:globalVars" {
        call "variables_infos" {
            with "var_class" > Global
        }
    }
    
    template "ppx:externalVars" {
        call "variables_infos" {
            with "var_class" > External
        }
    }
    
    template "ppx:tempVars" {
        call "variables_infos" {
            with "var_class" > Temp
        }
    }
    
    template "ppx:inputVars" {
        call "variables_infos" {
            with "var_class" > Input
        }
    }
    
    template "ppx:outputVars" {
        call "variables_infos" {
            with "var_class" > Output
        }
    }
    
    template "ppx:inOutVars" {
        call "variables_infos" {
            with "var_class" > InOut
        }
    }
    
    function "add_variable" {
        param "name";
        param "class";
        param "type";
        param "edit" > true
        param "debug" > true
        value "ns:AddVariable($name, $class, $type, $edit, $debug)";
    }
    
    template "ppx:action", mode="variable_list" {
        call "add_variable" {
            with "name" > «@name»
            with "class" > action
        }
    }
    
    template "ppx:transition", mode="variable_list" {
        call "add_variable" {
            with "name" > «@name»
            with "class" > transition
        }
    }
    
    template "ppx:resource", mode="variable_list" {
        call "add_variable" {
            with "name" > «@name»
            with "class" > resource
            with "debug" > false
        } 
    }
    
    template "ppx:pouInstance", mode="variable_list" {
        call "add_variable" {
            with "name" > «@name»
            with "class" > program
            with "type" > «@typeName»
        }
    }
    
    template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_class" {
        param "default_class";
        variable "type_name", "@name";
        variable "pou_infos", "$all_types/ppx:pous/ppx:pou[@name=$type_name]";
        choose {
            when "$pou_infos" {
                apply "$pou_infos", mode="var_class";
            }
            otherwise {
                value "$default_class"
            }
        }
    }
    
    template "ppx:pou", mode="var_class" {
        value "@pouType";
    }
    
    template "*[self::ppx:type or self::ppx:baseType]/*" mode="var_class" {
        param "default_class";
        value "$default_class";
    }
  
    template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_type" {
        > «@name»
    }
    
    template "*[self::ppx:type or self::ppx:baseType]/ppx:array", mode="var_type" {
        > ARRAY [
        foreach "ppx:dimension" {
            > «@lower»..«@upper»
        }
        > ] OF 
        apply "ppx:baseType", mode="var_type";
    }
    
    template "*[self::ppx:type or self::ppx:baseType]/ppx:string", mode="var_type" {
        > STRING
    }
  
    template "*[self::ppx:type or self::ppx:baseType]/ppx:wstring", mode="var_type" {
        > WSTRING
    }
  
    template "*[self::ppx:type or self::ppx:baseType]/*", mode="var_type" {
        > «local-name()»
    }
    
    template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_edit" {
        variable "type_name", "@name";
        variable "pou_infos", "$project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]";
        choose {
            when "$pou_infos" > true
            otherwise > false
        }
    }
    
    template "*[self::ppx:type or self::ppx:baseType]/ppx:array", mode="var_edit" {
        apply "ppx:baseType", mode="var_edit";
    }
    
    template "*[self::ppx:type or self::ppx:baseType]/*", mode="var_edit" {
        > false
    }
    
    template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_debug" {
        variable "type_name", "@name";
        variable "datatype_infos", """ \
            $project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] | \
            $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name] \
        """;
        choose {
            when "$datatype_infos" {
                apply "$datatype_infos", mode="var_debug";
            }
            otherwise > false
        }
    }
    
    template "ppx:pou", mode="var_debug" {
        > true
    }
    
    template "*[self::ppx:type or self::ppx:baseType]/ppx:array", mode="var_debug" {
        > false
    }
    
    template "*[self::ppx:type or self::ppx:baseType]/ppx:struct", mode="var_debug" {
        > false
    }
    
    template "*[self::ppx:type or self::ppx:baseType]/*", mode="var_debug" {
        > true
    }
    
}