0822 Does not work
commit
a1981564a3
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<?ccsproject version="1.0"?>
|
||||||
|
<projectOptions>
|
||||||
|
<deviceVariant value="TMS320C28XX.TMS320F28335"/>
|
||||||
|
<deviceFamily value="C2000"/>
|
||||||
|
<codegenToolVersion value="6.2.0"/>
|
||||||
|
<isElfFormat value="false"/>
|
||||||
|
<linkerCommandFile value="28335_RAM_lnk.cmd"/>
|
||||||
|
<rts value="libc.a"/>
|
||||||
|
<templateProperties value="id=com.ti.common.project.core.emptyProjectTemplate,"/>
|
||||||
|
<isTargetManual value="false"/>
|
||||||
|
<origin value="C:/CCSWorkSpaces/temp/DVRFramework"/>
|
||||||
|
<connection value="common/targetdb/connections/TIXDS100v3_Dot7_Connection.xml"/>
|
||||||
|
</projectOptions>
|
@ -0,0 +1,194 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||||
|
<storageModule configRelations="2" moduleId="org.eclipse.cdt.core.settings">
|
||||||
|
<cconfiguration id="com.ti.ccstudio.buildDefinitions.C2000.Debug.2040603795">
|
||||||
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.ti.ccstudio.buildDefinitions.C2000.Debug.2040603795" moduleId="org.eclipse.cdt.core.settings" name="Debug">
|
||||||
|
<externalSettings/>
|
||||||
|
<extensions>
|
||||||
|
<extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="com.ti.ccstudio.errorparser.CoffErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="com.ti.ccstudio.errorparser.LinkErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="com.ti.ccstudio.errorparser.AsmErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
</extensions>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
|
<configuration artifactExtension="out" artifactName="${SRC_ROOT}/sys/build/Debug/framework" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.C2000.Debug.2040603795" name="Debug" parent="com.ti.ccstudio.buildDefinitions.C2000.Debug">
|
||||||
|
<folderInfo id="com.ti.ccstudio.buildDefinitions.C2000.Debug.2040603795." name="/" resourcePath="">
|
||||||
|
<toolChain id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.DebugToolchain.830787211" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.linkerDebug.1778512584">
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1197154302" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">
|
||||||
|
<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=TMS320C28XX.TMS320F28335"/>
|
||||||
|
<listOptionValue builtIn="false" value="DEVICE_CORE_ID=C2800"/>
|
||||||
|
<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>
|
||||||
|
<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>
|
||||||
|
<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=libc.a"/>
|
||||||
|
<listOptionValue builtIn="false" value="CCS_MBS_VERSION=5.5.0"/>
|
||||||
|
<listOptionValue builtIn="false" value="LINK_ORDER=F28335.cmd;-lrts2800_fpu32.lib;"/>
|
||||||
|
<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=28335_RAM_lnk.cmd"/>
|
||||||
|
<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>
|
||||||
|
<listOptionValue builtIn="false" value="PRODUCTS="/>
|
||||||
|
<listOptionValue builtIn="false" value="PRODUCT_MACRO_IMPORTS={}"/>
|
||||||
|
</option>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.624589266" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="21.6.0.LTS" valueType="string"/>
|
||||||
|
<targetPlatform id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.targetPlatformDebug.1195867980" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.targetPlatformDebug"/>
|
||||||
|
<builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.builderDebug.1484000353" keepEnvironmentInBuildfile="false" name="GNU Make" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.builderDebug"/>
|
||||||
|
<tool id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.compilerDebug.1731246565" name="C2000 Compiler" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.compilerDebug">
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.LARGE_MEMORY_MODEL.2072485324" name="Option deprecated, set by default (--large_memory_model, -ml)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.LARGE_MEMORY_MODEL" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.UNIFIED_MEMORY.2020368090" name="Unified memory (--unified_memory, -mt)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.UNIFIED_MEMORY" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.SILICON_VERSION.200319597" name="Processor version (--silicon_version, -v)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.SILICON_VERSION.28" valueType="enumerated"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FLOAT_SUPPORT.1002982879" name="Specify floating point support (--float_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FLOAT_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FLOAT_SUPPORT.fpu32" valueType="enumerated"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_LEVEL.158333741" name="Optimization level (--opt_level, -O)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_LEVEL.4" valueType="enumerated"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_FOR_SPEED.1189713323" name="Speed vs. size trade-offs (--opt_for_speed, -mf)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_FOR_SPEED.5" valueType="enumerated"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FP_MODE.597990472" name="Floating Point mode (--fp_mode)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FP_MODE" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FP_MODE.relaxed" valueType="enumerated"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.INCLUDE_PATH.910773204" name="Add dir to #include search path (--include_path, -I)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.INCLUDE_PATH" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="${SRC_ROOT}/sys/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="${SRC_ROOT}/DSP2833x_headers/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="${SRC_ROOT}/DSP2833x_common/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="${WORKSPACE_LOC}/FLOATPOINTLIB"/>
|
||||||
|
<listOptionValue builtIn="false" value="${PROJECT_ROOT}"/>
|
||||||
|
</option>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ADVICE__PERFORMANCE.1890281965" name="Provide advice on optimization techniques (--advice:performance)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ADVICE__PERFORMANCE" value="--advice:performance=all" valueType="string"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DEFINE.1385179336" name="Pre-define NAME (--define, -D)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DEFINE" valueType="definedSymbols">
|
||||||
|
<listOptionValue builtIn="false" value="_DEBUG"/>
|
||||||
|
<listOptionValue builtIn="false" value="LARGE_MODEL"/>
|
||||||
|
</option>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DEBUGGING_MODEL.451239249" name="Debugging model" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DEBUGGING_MODEL" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DEBUGGING_MODEL.SYMDEBUG__DWARF" valueType="enumerated"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DIAG_WRAP.44979444" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DISPLAY_ERROR_NUMBER.320946418" name="Emit diagnostic identifier numbers (--display_error_number, -pden)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ISSUE_REMARKS.1678891727" name="Issue remarks (--issue_remarks, -pdr)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ISSUE_REMARKS" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.QUIET_LEVEL.1661022843" name="Quiet Level" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.QUIET_LEVEL" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.QUIET_LEVEL.QUIET" valueType="enumerated"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ABI.2128235277" name="Application binary interface [See 'General' page to edit] (--abi)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ABI" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ABI.coffabi" valueType="enumerated"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ASM_LISTING.1104407996" name="Generate listing file (--asm_listing, -al)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ASM_LISTING" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DISABLE_INLINING.31466939" name="Disable inlining (--disable_inlining)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DISABLE_INLINING" value="false" valueType="boolean"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__C_SRCS.423959130" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__C_SRCS"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__CPP_SRCS.447191296" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__CPP_SRCS"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__ASM_SRCS.1088389375" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__ASM_SRCS"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__ASM2_SRCS.274059361" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__ASM2_SRCS"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.linkerDebug.1778512584" name="C2000 Linker" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.linkerDebug">
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.STACK_SIZE.1215847210" name="Set C system stack size (--stack_size, -stack)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.STACK_SIZE" value="0x100" valueType="string"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.MAP_FILE.569103737" name="Link information (map) listed into <file> (--map_file, -m)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.MAP_FILE" value=""${SRC_ROOT}/sys/build/Debug/framework.map"" valueType="string"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.OUTPUT_FILE.167409769" name="Specify output file name (--output_file, -o)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.OUTPUT_FILE" value="${SRC_ROOT}/sys/build/Debug/framework.out" valueType="string"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.HEAP_SIZE.60955433" name="Heap size for C/C++ dynamic memory allocation (--heap_size, -heap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.HEAP_SIZE" value="0x100" valueType="string"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.LIBRARY.1339269017" name="Include library file or command file as input (--library, -l)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.LIBRARY" valueType="libs">
|
||||||
|
<listOptionValue builtIn="false" value="libc.a"/>
|
||||||
|
<listOptionValue builtIn="false" value="${UTILITIES}/flash_api/2833x/28335/v210/lib/Flash28335_API_V210.lib"/>
|
||||||
|
<listOptionValue builtIn="false" value="rts2800_fpu32.lib"/>
|
||||||
|
<listOptionValue builtIn="false" value="rts2800_fpu32_fast_supplement.lib"/>
|
||||||
|
<listOptionValue builtIn="false" value="${WORKSPACE_LOC}/FLOATPOINTLIB/Debug/FLOATPOINTLIB.lib"/>
|
||||||
|
</option>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.SEARCH_PATH.345223286" name="Add <dir> to library search path (--search_path, -i)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.SEARCH_PATH" valueType="libPaths">
|
||||||
|
<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/lib"/>
|
||||||
|
<listOptionValue builtIn="false" value="${UTILITIES}/flash_api/2833x/28335/v210/lib"/>
|
||||||
|
<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="${PROJECT_ROOT}"/>
|
||||||
|
<listOptionValue builtIn="false" value="${SRC_ROOT}/sys/build"/>
|
||||||
|
<listOptionValue builtIn="false" value="${SRC_ROOT}/DSP2833x_headers/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="${FAST_FPU32_SUPPLEMENT}/lib"/>
|
||||||
|
<listOptionValue builtIn="false" value="${WORKSPACE_LOC}/FLOATPOINTLIB/Debug"/>
|
||||||
|
</option>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.DIAG_WRAP.1827120485" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.DIAG_WRAP.off" valueType="enumerated"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.DISPLAY_ERROR_NUMBER.728966569" name="Emit diagnostic identifier numbers (--display_error_number)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.XML_LINK_INFO.689360326" name="Detailed link information data-base into <file> (--xml_link_info, -xml_link_info)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.XML_LINK_INFO" value=""${ProjName}_linkInfo.xml"" valueType="string"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__CMD_SRCS.1717731033" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__CMD_SRCS"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__CMD2_SRCS.1965417765" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__CMD2_SRCS"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__GEN_CMDS.1435745153" name="Generated Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__GEN_CMDS"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="com.ti.ccstudio.buildDefinitions.C2000_21.6.hex.1661532341" name="C2000 Hex Utility" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.hex"/>
|
||||||
|
</toolChain>
|
||||||
|
</folderInfo>
|
||||||
|
<sourceEntries>
|
||||||
|
<entry excluding="SYSCTRL/AlgorithmWorkEntry.cpp|spi_rom_interface.c|digital_io.c|analog_in.c|pwm_interface.c|hsm.c|app_main.c|cmd/F28335.cmd|modbus_slave.c|analog_out.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
|
||||||
|
</sourceEntries>
|
||||||
|
</configuration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
|
</cconfiguration>
|
||||||
|
<cconfiguration id="com.ti.ccstudio.buildDefinitions.C2000.Release.1688218530">
|
||||||
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.ti.ccstudio.buildDefinitions.C2000.Release.1688218530" moduleId="org.eclipse.cdt.core.settings" name="Release">
|
||||||
|
<externalSettings/>
|
||||||
|
<extensions>
|
||||||
|
<extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="com.ti.ccstudio.errorparser.CoffErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="com.ti.ccstudio.errorparser.LinkErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="com.ti.ccstudio.errorparser.AsmErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
</extensions>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
|
<configuration artifactExtension="out" artifactName="${ProjName}" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.C2000.Release.1688218530" name="Release" parent="com.ti.ccstudio.buildDefinitions.C2000.Release">
|
||||||
|
<folderInfo id="com.ti.ccstudio.buildDefinitions.C2000.Release.1688218530." name="/" resourcePath="">
|
||||||
|
<toolChain id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.ReleaseToolchain.1897835650" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.ReleaseToolchain" targetTool="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.linkerRelease.114937104">
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.116122469" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">
|
||||||
|
<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=TMS320C28XX.TMS320F28335"/>
|
||||||
|
<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>
|
||||||
|
<listOptionValue builtIn="false" value="CCS_MBS_VERSION=5.5.0"/>
|
||||||
|
<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=28335_RAM_lnk.cmd"/>
|
||||||
|
<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=libc.a"/>
|
||||||
|
<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>
|
||||||
|
</option>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.116123921" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="6.2.0" valueType="string"/>
|
||||||
|
<targetPlatform id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.targetPlatformRelease.1291109672" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.targetPlatformRelease"/>
|
||||||
|
<builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.builderRelease.1360820187" keepEnvironmentInBuildfile="false" name="GNU Make" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.builderRelease"/>
|
||||||
|
<tool id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.compilerRelease.486955678" name="C2000 Compiler" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.compilerRelease">
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.LARGE_MEMORY_MODEL.258118407" name="Use large memory model (--large_memory_model, -ml)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.LARGE_MEMORY_MODEL" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.UNIFIED_MEMORY.685177003" name="Unified memory (--unified_memory, -mt)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.UNIFIED_MEMORY" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.SILICON_VERSION.1089679905" name="Processor version (--silicon_version, -v)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.SILICON_VERSION.28" valueType="enumerated"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.FLOAT_SUPPORT.330649707" name="Specify floating point support (--float_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.FLOAT_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.FLOAT_SUPPORT.fpu32" valueType="enumerated"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DIAG_WARNING.202516022" name="Treat diagnostic <id> as warning (--diag_warning, -pdsw)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DIAG_WARNING" valueType="stringList">
|
||||||
|
<listOptionValue builtIn="false" value="225"/>
|
||||||
|
</option>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DISPLAY_ERROR_NUMBER.861584018" name="Emit diagnostic identifier numbers (--display_error_number, -pden)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DIAG_WRAP.4729059" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.INCLUDE_PATH.277004018" name="Add dir to #include search path (--include_path, -I)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.INCLUDE_PATH" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value=""${CG_TOOL_ROOT}/include""/>
|
||||||
|
</option>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__C_SRCS.1379003288" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__C_SRCS"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__CPP_SRCS.1178256257" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__CPP_SRCS"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__ASM_SRCS.103330727" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__ASM_SRCS"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__ASM2_SRCS.1730673654" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__ASM2_SRCS"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.linkerRelease.114937104" name="C2000 Linker" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.linkerRelease">
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.STACK_SIZE.835162724" name="Set C system stack size (--stack_size, -stack)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.STACK_SIZE" value="0x300" valueType="string"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.OUTPUT_FILE.1105468446" name="Specify output file name (--output_file, -o)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.OUTPUT_FILE" useByScannerDiscovery="false" value="${ProjName}.out" valueType="string"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.MAP_FILE.1415258391" name="Input and output sections listed into <file> (--map_file, -m)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.MAP_FILE" value=""${ProjName}.map"" valueType="string"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.XML_LINK_INFO.1998060963" name="Detailed link information data-base into <file> (--xml_link_info, -xml_link_info)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.XML_LINK_INFO" value=""${ProjName}_linkInfo.xml"" valueType="string"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.DISPLAY_ERROR_NUMBER.1519711672" name="Emit diagnostic identifier numbers (--display_error_number)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
|
||||||
|
<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.DIAG_WRAP.1448229379" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.DIAG_WRAP.off" valueType="enumerated"/>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.SEARCH_PATH.1579599178" name="Add <dir> to library search path (--search_path, -i)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.SEARCH_PATH" valueType="libPaths">
|
||||||
|
<listOptionValue builtIn="false" value=""${CG_TOOL_ROOT}/lib""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${CG_TOOL_ROOT}/include""/>
|
||||||
|
</option>
|
||||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.LIBRARY.117696091" name="Include library file or command file as input (--library, -l)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.LIBRARY" valueType="libs">
|
||||||
|
<listOptionValue builtIn="false" value=""libc.a""/>
|
||||||
|
</option>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__CMD_SRCS.1278335248" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__CMD_SRCS"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__CMD2_SRCS.81365331" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__CMD2_SRCS"/>
|
||||||
|
<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__GEN_CMDS.1350236437" name="Generated Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__GEN_CMDS"/>
|
||||||
|
</tool>
|
||||||
|
</toolChain>
|
||||||
|
</folderInfo>
|
||||||
|
</configuration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
|
</cconfiguration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||||
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
|
<project id="Framework.com.ti.ccstudio.buildDefinitions.C2000.ProjectType.1226128593" name="C2000" projectType="com.ti.ccstudio.buildDefinitions.C2000.ProjectType"/>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="scannerConfiguration"/>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.language.mapping">
|
||||||
|
<project-mappings>
|
||||||
|
<content-type-mapping configuration="" content-type="org.eclipse.cdt.core.asmSource" language="com.ti.ccstudio.core.TIASMLanguage"/>
|
||||||
|
<content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cHeader" language="com.ti.ccstudio.core.TIGCCLanguage"/>
|
||||||
|
<content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cSource" language="com.ti.ccstudio.core.TIGCCLanguage"/>
|
||||||
|
<content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cxxHeader" language="com.ti.ccstudio.core.TIGPPLanguage"/>
|
||||||
|
<content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cxxSource" language="com.ti.ccstudio.core.TIGPPLanguage"/>
|
||||||
|
</project-mappings>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
||||||
|
<storageModule moduleId="null.endianPreference"/>
|
||||||
|
<storageModule moduleId="cpuFamily"/>
|
||||||
|
</cproject>
|
@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
# Created by https://www.gitignore.io/api/codecomposerstudio
|
||||||
|
# Edit at https://www.gitignore.io/?templates=codecomposerstudio
|
||||||
|
|
||||||
|
### CodeComposerStudio ###
|
||||||
|
|
||||||
|
tmp/
|
||||||
|
*.tmp
|
||||||
|
*.bak
|
||||||
|
# Generated build artifact directories
|
||||||
|
Debug/
|
||||||
|
Release/
|
||||||
|
Flash/
|
||||||
|
RAM/
|
||||||
|
# Generated build artifacts
|
||||||
|
makefile
|
||||||
|
*.map
|
||||||
|
*.mk
|
||||||
|
*.opt
|
||||||
|
*.pp
|
||||||
|
*.xml
|
||||||
|
# Generated directories
|
||||||
|
.config/
|
||||||
|
.launches/
|
||||||
|
# Generated file used to help display error messages in the problems view
|
||||||
|
.xdchelp
|
||||||
|
# Uniflash session files
|
||||||
|
*.uniflashsession
|
||||||
|
.settings/
|
||||||
|
targetConfigs/
|
||||||
|
|
||||||
|
# End of https://www.gitignore.io/api/codecomposerstudio
|
@ -0,0 +1,152 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>DVR500Framework</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||||
|
<triggers>full,incremental,</triggers>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>com.ti.ccstudio.core.ccsNature</nature>
|
||||||
|
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||||
|
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||||
|
<nature>org.eclipse.cdt.core.ccnature</nature>
|
||||||
|
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||||
|
</natures>
|
||||||
|
<linkedResources>
|
||||||
|
<link>
|
||||||
|
<name>app_main.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-2-ORIGINAL_PROJECT_ROOT/source/app_main.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>Debug/framework.out</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>EXTERNAL_BUILD_ARTIFACT</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_ADC_cal.asm</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_ADC_cal.asm</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_CodeStartBranch.asm</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_CodeStartBranch.asm</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_CpuTimers.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_CpuTimers.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_ECan.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-2-ORIGINAL_PROJECT_ROOT/source/DSP2833x_ECan.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_ECap.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_ECap.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_EPwm.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_EPwm.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_EQep.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_EQep.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_GlobalVariableDefs.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_MemCopy.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_MemCopy.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_PieCtrl.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_PieCtrl.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_PieVect.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_PieVect.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_SWPrioritizedDefaultIsr.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_SWPrioritizedDefaultIsr.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_Sci.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_Sci.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_SysCtrl.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_SysCtrl.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_Xintf.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_Xintf.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/DSP2833x_usDelay.asm</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_usDelay.asm</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/Date_ComBoard.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-2-ORIGINAL_PROJECT_ROOT/source/Date_ComBoard.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/Ecap2.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/Ecap2.c</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>F28335/Gpio.c</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/Gpio.c</locationURI>
|
||||||
|
</link>
|
||||||
|
</linkedResources>
|
||||||
|
<variableList>
|
||||||
|
<variable>
|
||||||
|
<name>FAST_FPU32_SUPPLEMENT</name>
|
||||||
|
<value>file:/C:/ti/controlSUITE/libs/math/FPUfastRTS/V100</value>
|
||||||
|
</variable>
|
||||||
|
<variable>
|
||||||
|
<name>ORIGINAL_PROJECT_ROOT</name>
|
||||||
|
<value>file:/C:/CCSWorkSpaces/Framework_500_Hz/sys/build/framework</value>
|
||||||
|
</variable>
|
||||||
|
<variable>
|
||||||
|
<name>SRC_ROOT</name>
|
||||||
|
<value>$%7BPARENT-3-ORIGINAL_PROJECT_ROOT%7D</value>
|
||||||
|
</variable>
|
||||||
|
<variable>
|
||||||
|
<name>UTILITIES</name>
|
||||||
|
<value>file:/C:/ti/controlSUITE/libs/utilities</value>
|
||||||
|
</variable>
|
||||||
|
</variableList>
|
||||||
|
</projectDescription>
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* AlertBase.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Alert/AlertBase.h"
|
||||||
|
|
||||||
|
namespace ALERT
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
AlertBase::AlertBase():
|
||||||
|
//m_mode(ALERT::AlertBase::UNDEFINED),
|
||||||
|
m_time_sample(-1.0),
|
||||||
|
m_level(FP_ZERO),
|
||||||
|
m_period(FP_ZERO),
|
||||||
|
m_timer(FP_ZERO)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
/*
|
||||||
|
AlertBase::mode_t AlertBase::get_mode() const
|
||||||
|
{
|
||||||
|
return m_mode;
|
||||||
|
//
|
||||||
|
}//get_mode()
|
||||||
|
//
|
||||||
|
|
||||||
|
bool AlertBase::compare(mode_t mode) const
|
||||||
|
{
|
||||||
|
return m_mode == mode;
|
||||||
|
//
|
||||||
|
}//compare()
|
||||||
|
//
|
||||||
|
*/
|
||||||
|
} /* namespace ALERT */
|
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* AlertBase.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef ALERT_ALARMBASE_H_
|
||||||
|
#define ALERT_ALARMBASE_H_
|
||||||
|
|
||||||
|
namespace ALERT
|
||||||
|
{
|
||||||
|
|
||||||
|
struct AlertBaseConfiguration
|
||||||
|
{
|
||||||
|
float level;
|
||||||
|
float period;
|
||||||
|
AlertBaseConfiguration():
|
||||||
|
level(-1.0),
|
||||||
|
period(-1.0)
|
||||||
|
{}
|
||||||
|
};//AlertBaseConfiguration
|
||||||
|
|
||||||
|
|
||||||
|
class AlertBase
|
||||||
|
{
|
||||||
|
//public:
|
||||||
|
// enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL};
|
||||||
|
//protected:
|
||||||
|
// mode_t m_mode;
|
||||||
|
protected:
|
||||||
|
float m_time_sample;
|
||||||
|
protected:
|
||||||
|
float m_level;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
float m_period;
|
||||||
|
float m_timer;
|
||||||
|
//public:
|
||||||
|
// mode_t mode;
|
||||||
|
public:
|
||||||
|
AlertBase();
|
||||||
|
virtual void setup(float time_sample) = 0;
|
||||||
|
virtual void configure(const AlertBaseConfiguration& config) = 0;
|
||||||
|
//public:
|
||||||
|
//mode_t get_mode() const;
|
||||||
|
//bool compare(mode_t mode) const;
|
||||||
|
public:
|
||||||
|
virtual void reset() = 0;
|
||||||
|
virtual void execute(float reference) = 0;
|
||||||
|
protected:
|
||||||
|
virtual void _execute_undef(float reference) = 0;
|
||||||
|
virtual void _execute_operational(float reference) = 0;
|
||||||
|
//
|
||||||
|
};//AlertBase
|
||||||
|
//
|
||||||
|
} /* namespace ALERT */
|
||||||
|
//
|
||||||
|
#endif /* ALERT_ALARMBASE_H_ */
|
@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* FaultDecrease.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Alert/FaultDecrease.h"
|
||||||
|
|
||||||
|
namespace ALERT
|
||||||
|
{
|
||||||
|
|
||||||
|
//CONSTRUCTOR
|
||||||
|
FaultDecrease::FaultDecrease():
|
||||||
|
ALERT::AlertBase(),
|
||||||
|
// m_state(ALERT::FaultDecrease::UNKNOWN),
|
||||||
|
m_fault(false),
|
||||||
|
fault(false),
|
||||||
|
_execute(&ALERT::FaultDecrease::_execute_undef)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void FaultDecrease::setup(float time_sample)
|
||||||
|
{
|
||||||
|
m_time_sample = time_sample;
|
||||||
|
//
|
||||||
|
}//setup()
|
||||||
|
//
|
||||||
|
void FaultDecrease::configure(const ALERT::AlertBaseConfiguration& config)
|
||||||
|
{
|
||||||
|
m_level = config.level;
|
||||||
|
m_period = config.period;
|
||||||
|
m_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_fault = false;
|
||||||
|
fault = false;
|
||||||
|
//
|
||||||
|
if((m_time_sample > FP_ZERO) && (m_period > m_time_sample) && (m_level >= FP_ZERO))
|
||||||
|
{
|
||||||
|
_execute = &ALERT::FaultDecrease::_execute_operational;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
}//configure()
|
||||||
|
//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void FaultDecrease::reset()
|
||||||
|
{
|
||||||
|
m_fault = false;
|
||||||
|
fault = false;
|
||||||
|
m_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//reset()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void FaultDecrease::execute(float reference)
|
||||||
|
{
|
||||||
|
(this->*_execute)(reference);
|
||||||
|
//
|
||||||
|
}//execute()
|
||||||
|
//
|
||||||
|
void FaultDecrease::_execute_undef(float reference)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}//_execute_undef()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void FaultDecrease::_execute_operational(float reference)
|
||||||
|
{
|
||||||
|
if(reference <= m_level)
|
||||||
|
{
|
||||||
|
if(m_timer >= m_period)
|
||||||
|
{
|
||||||
|
m_fault = true;
|
||||||
|
fault = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_timer += m_time_sample;
|
||||||
|
m_fault = false;
|
||||||
|
fault = false;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_timer = FP_ZERO;
|
||||||
|
m_fault = false;
|
||||||
|
fault = false;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
}//_execute_operational_warning()
|
||||||
|
//
|
||||||
|
} /* namespace ALERT */
|
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* FaultDecrease.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Alert/AlertBase.h"
|
||||||
|
|
||||||
|
#ifndef ALERT_FAULTDECREASE_H_
|
||||||
|
#define ALERT_FAULTDECREASE_H_
|
||||||
|
|
||||||
|
namespace ALERT
|
||||||
|
{
|
||||||
|
|
||||||
|
class FaultDecrease: public ALERT::AlertBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// enum state_t {UNKNOWN, NORMAL, FAULT};
|
||||||
|
private:
|
||||||
|
// state_t m_state;
|
||||||
|
bool m_fault;
|
||||||
|
public:
|
||||||
|
bool fault;
|
||||||
|
public:
|
||||||
|
FaultDecrease();
|
||||||
|
void setup(float time_sample);
|
||||||
|
void configure(const ALERT::AlertBaseConfiguration& config);
|
||||||
|
public:
|
||||||
|
// state_t get_state() const;
|
||||||
|
// bool compare_state(state_t state) const;
|
||||||
|
// bool is_fault();
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute(float reference);
|
||||||
|
private:
|
||||||
|
void (FaultDecrease::*_execute)(float reference);
|
||||||
|
void _execute_undef(float reference);
|
||||||
|
void _execute_operational(float reference);
|
||||||
|
//
|
||||||
|
};//FaultDecrease()
|
||||||
|
|
||||||
|
} /* namespace ALERT */
|
||||||
|
|
||||||
|
#endif /* ALERT_FAULTDECREASE_H_ */
|
@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* FaultExceed.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Alert/FaultExceed.h"
|
||||||
|
|
||||||
|
namespace ALERT
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
FaultExceed::FaultExceed():
|
||||||
|
ALERT::AlertBase(),
|
||||||
|
m_fault(false),
|
||||||
|
fault(false),
|
||||||
|
_execute(&ALERT::FaultExceed::_execute_undef)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void FaultExceed::setup(float time_sample)
|
||||||
|
{
|
||||||
|
m_time_sample = time_sample;
|
||||||
|
//
|
||||||
|
}//setup()
|
||||||
|
//
|
||||||
|
void FaultExceed::configure(const AlertBaseConfiguration& config)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_level = config.level;
|
||||||
|
m_period = config.period;
|
||||||
|
//
|
||||||
|
m_fault = false;
|
||||||
|
fault = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
if((m_time_sample > FP_ZERO) && (m_period >= m_time_sample)&&(m_level > FP_ZERO))
|
||||||
|
{
|
||||||
|
_execute = &ALERT::FaultExceed::_execute_operational;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//configure()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void FaultExceed::reset()
|
||||||
|
{
|
||||||
|
m_fault = false;
|
||||||
|
fault = false;
|
||||||
|
m_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//reset()
|
||||||
|
//
|
||||||
|
void FaultExceed::execute(float reference)
|
||||||
|
{
|
||||||
|
(this->*_execute)(reference);
|
||||||
|
//
|
||||||
|
}//execute()
|
||||||
|
//
|
||||||
|
void FaultExceed::_execute_undef(float reference)
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void FaultExceed::_execute_operational(float reference)
|
||||||
|
{
|
||||||
|
if(reference >= m_level)
|
||||||
|
{
|
||||||
|
if(m_timer >= m_period)
|
||||||
|
{
|
||||||
|
m_fault = true;
|
||||||
|
fault = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_timer += m_time_sample;
|
||||||
|
m_fault = false;
|
||||||
|
fault = false;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_timer = FP_ZERO;
|
||||||
|
m_fault = false;
|
||||||
|
fault = false;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
} /* namespace ALERT */
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* FaultExceed.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Alert/AlertBase.h"
|
||||||
|
|
||||||
|
#ifndef ALERT_FAULTEXCEED_H_
|
||||||
|
#define ALERT_FAULTEXCEED_H_
|
||||||
|
|
||||||
|
namespace ALERT
|
||||||
|
{
|
||||||
|
|
||||||
|
class FaultExceed: public ALERT::AlertBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
bool m_fault;
|
||||||
|
public:
|
||||||
|
bool fault;
|
||||||
|
public:
|
||||||
|
FaultExceed();
|
||||||
|
void setup(float time_sample);
|
||||||
|
void configure(const AlertBaseConfiguration& config);
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute(float reference);
|
||||||
|
private:
|
||||||
|
void (FaultExceed::*_execute)(float reference);
|
||||||
|
void _execute_undef(float reference);
|
||||||
|
void _execute_operational(float reference);
|
||||||
|
//
|
||||||
|
};//FaultExceed()
|
||||||
|
|
||||||
|
} /* namespace ALERT */
|
||||||
|
|
||||||
|
#endif /* ALERT_FAULTEXCEED_H_ */
|
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* WarningDecrease.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Alert/WarningDecrease.h"
|
||||||
|
|
||||||
|
namespace ALERT
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
WarningDecrease::WarningDecrease():
|
||||||
|
ALERT::AlertBase(),
|
||||||
|
m_warning(false),
|
||||||
|
warning(false),
|
||||||
|
_execute(&ALERT::WarningDecrease::_execute_undef)
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void WarningDecrease::setup(float time_sample)
|
||||||
|
{
|
||||||
|
m_time_sample = time_sample;
|
||||||
|
//
|
||||||
|
}//setup()
|
||||||
|
//
|
||||||
|
void WarningDecrease::configure(const AlertBaseConfiguration& config)
|
||||||
|
{
|
||||||
|
m_level = config.level;
|
||||||
|
m_period = config.period;
|
||||||
|
//
|
||||||
|
m_warning = false;
|
||||||
|
//
|
||||||
|
if((m_time_sample > FP_ZERO) && (m_period >= m_time_sample) && (m_level > FP_ZERO))
|
||||||
|
{
|
||||||
|
_execute = &ALERT::WarningDecrease::_execute_operational;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//configure()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void WarningDecrease::reset()
|
||||||
|
{
|
||||||
|
m_warning = false;
|
||||||
|
warning = false;
|
||||||
|
m_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//reset()
|
||||||
|
//
|
||||||
|
void WarningDecrease::execute(float reference)
|
||||||
|
{
|
||||||
|
(this->*_execute)(reference);
|
||||||
|
//
|
||||||
|
}//execute()
|
||||||
|
//
|
||||||
|
void WarningDecrease::_execute_undef(float reference)
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void WarningDecrease::_execute_operational(float reference)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if(reference <= m_level)
|
||||||
|
{
|
||||||
|
if(m_timer >= m_period)
|
||||||
|
{
|
||||||
|
m_warning = true;
|
||||||
|
warning = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_timer += m_time_sample;
|
||||||
|
m_warning = false;
|
||||||
|
warning = false;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_warning = false;
|
||||||
|
warning = false;
|
||||||
|
m_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//else if
|
||||||
|
//
|
||||||
|
}//_execute_operational()
|
||||||
|
//
|
||||||
|
} /* namespace ALERT */
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* WarningDecrease.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Alert/AlertBase.h"
|
||||||
|
|
||||||
|
#ifndef ALERT_WARNINGDECREASE_H_
|
||||||
|
#define ALERT_WARNINGDECREASE_H_
|
||||||
|
|
||||||
|
namespace ALERT
|
||||||
|
{
|
||||||
|
|
||||||
|
class WarningDecrease: public ALERT::AlertBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
bool m_warning;
|
||||||
|
public:
|
||||||
|
bool warning;
|
||||||
|
public:
|
||||||
|
WarningDecrease();
|
||||||
|
void setup(float time_sample);
|
||||||
|
void configure(const AlertBaseConfiguration& config);
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute(float reference);
|
||||||
|
private:
|
||||||
|
void (WarningDecrease::*_execute)(float reference);
|
||||||
|
void _execute_undef(float reference);
|
||||||
|
void _execute_operational(float reference);
|
||||||
|
//
|
||||||
|
};//
|
||||||
|
|
||||||
|
} /* namespace ALERT */
|
||||||
|
|
||||||
|
#endif /* ALERT_WARNINGDECREASE_H_ */
|
@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* WarningExceed.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Alert/WarningExceed.h"
|
||||||
|
|
||||||
|
namespace ALERT
|
||||||
|
{
|
||||||
|
|
||||||
|
//CONSTRUCTOR
|
||||||
|
WarningExceed::WarningExceed():
|
||||||
|
ALERT::AlertBase(),
|
||||||
|
m_warning(false),
|
||||||
|
warning(false),
|
||||||
|
_execute(&ALERT::WarningExceed::_execute_undef)
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void WarningExceed::setup(float time_sample)
|
||||||
|
{
|
||||||
|
m_time_sample = time_sample;
|
||||||
|
//
|
||||||
|
}//setup()
|
||||||
|
//
|
||||||
|
void WarningExceed::configure(const AlertBaseConfiguration& config)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_level = config.level;
|
||||||
|
m_period = config.period;
|
||||||
|
//
|
||||||
|
m_warning = false;
|
||||||
|
//
|
||||||
|
if((m_time_sample > FP_ZERO)&&(m_period > m_time_sample)&&(m_level >= FP_ZERO))
|
||||||
|
{
|
||||||
|
_execute = &ALERT::WarningExceed::_execute_operational;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//configure()
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void WarningExceed::reset()
|
||||||
|
{
|
||||||
|
m_warning = false;
|
||||||
|
warning = false;
|
||||||
|
m_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//reset()
|
||||||
|
//
|
||||||
|
void WarningExceed::execute(float reference)
|
||||||
|
{
|
||||||
|
(this->*_execute)(reference);
|
||||||
|
//
|
||||||
|
}//execute()
|
||||||
|
//
|
||||||
|
|
||||||
|
void WarningExceed::_execute_undef(float reference)
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void WarningExceed::_execute_operational(float reference)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if(reference >= m_level)
|
||||||
|
{
|
||||||
|
if(m_timer >= m_period)
|
||||||
|
{
|
||||||
|
m_warning = true;
|
||||||
|
warning = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_timer += m_time_sample;
|
||||||
|
m_warning = false;
|
||||||
|
warning = false;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_warning = false;
|
||||||
|
warning = false;
|
||||||
|
m_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//else if
|
||||||
|
//
|
||||||
|
}//_execute_operational()
|
||||||
|
//
|
||||||
|
} /* namespace ALERT */
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* WarningExceed.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Alert/AlertBase.h"
|
||||||
|
|
||||||
|
#ifndef ALERT_WARNINGEXCEED_H_
|
||||||
|
#define ALERT_WARNINGEXCEED_H_
|
||||||
|
|
||||||
|
namespace ALERT
|
||||||
|
{
|
||||||
|
|
||||||
|
class WarningExceed: public ALERT::AlertBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
bool m_warning;
|
||||||
|
public:
|
||||||
|
bool warning;
|
||||||
|
public:
|
||||||
|
WarningExceed();
|
||||||
|
void setup(float time_sample);
|
||||||
|
void configure(const AlertBaseConfiguration& config);
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute(float reference);
|
||||||
|
private:
|
||||||
|
void (WarningExceed::*_execute)(float reference);
|
||||||
|
void _execute_undef(float reference);
|
||||||
|
void _execute_operational(float reference);
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace ALERT */
|
||||||
|
|
||||||
|
#endif /* ALERT_WARNINGEXCEED_H_ */
|
@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
//###########################################################################
|
||||||
|
//
|
||||||
|
// FILE: DSP28x_Project.h
|
||||||
|
//
|
||||||
|
// TITLE: DSP28x Project Headerfile and Examples Include File
|
||||||
|
//
|
||||||
|
//###########################################################################
|
||||||
|
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||||
|
// $Release Date: November 1, 2016 $
|
||||||
|
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||||
|
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||||
|
//###########################################################################
|
||||||
|
|
||||||
|
#ifndef DSP28x_PROJECT_H
|
||||||
|
#define DSP28x_PROJECT_H
|
||||||
|
|
||||||
|
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||||
|
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||||
|
|
||||||
|
#endif // end of DSP28x_PROJECT_H definition
|
||||||
|
|
@ -0,0 +1,80 @@
|
|||||||
|
// TI File $Revision: /main/2 $
|
||||||
|
// Checkin $Date: June 22, 2007 13:11:24 $
|
||||||
|
//###########################################################################
|
||||||
|
//
|
||||||
|
// FILE: Flash2833x_API_Config.h
|
||||||
|
//
|
||||||
|
// TITLE: F2833x Flash Algo's - User Settings
|
||||||
|
//
|
||||||
|
// NOTE: This file contains user defined settings that
|
||||||
|
// are used by the F2833x Flash APIs.
|
||||||
|
//
|
||||||
|
//###########################################################################
|
||||||
|
// $TI Release:$
|
||||||
|
// $Release Date:$
|
||||||
|
//###########################################################################
|
||||||
|
|
||||||
|
#ifndef FLASH2833X_API_CONFIG_H
|
||||||
|
#define FLASH2833X_API_CONFIG_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Variables that can be configured by the user.
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------
|
||||||
|
1. Specify the device.
|
||||||
|
Define the device to be programmed as "1" (no quotes).
|
||||||
|
Define all other devices as "0" (no quotes).
|
||||||
|
-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define FLASH_F28335 1
|
||||||
|
#define FLASH_F28334 0
|
||||||
|
#define FLASH_F28332 0
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------
|
||||||
|
2. Specify the clock rate of the CPU (SYSCLKOUT) in nS.
|
||||||
|
|
||||||
|
Take into account the input clock frequency and the PLL multiplier
|
||||||
|
that your application will use.
|
||||||
|
|
||||||
|
Use one of the values provided, or define your own.
|
||||||
|
The trailing L is required tells the compiler to treat
|
||||||
|
the number as a 64-bit value.
|
||||||
|
|
||||||
|
Only one statement should be uncommented.
|
||||||
|
|
||||||
|
Example: CLKIN is a 30MHz crystal.
|
||||||
|
|
||||||
|
If the application will set PLLCR = 0xA then the CPU clock
|
||||||
|
will be 150Mhz (SYSCLKOUT = 150MHz).
|
||||||
|
|
||||||
|
In this case, the CPU_RATE will be 6.667L
|
||||||
|
Uncomment the line: #define CPU_RATE 6.667L
|
||||||
|
-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define CPU_RATE 6.667L // for a 150MHz CPU clock speed (SYSCLKOUT)
|
||||||
|
//#define CPU_RATE 10.000L // for a 100MHz CPU clock speed (SYSCLKOUT)
|
||||||
|
//#define CPU_RATE 13.330L // for a 75MHz CPU clock speed (SYSCLKOUT)
|
||||||
|
//#define CPU_RATE 20.000L // for a 50MHz CPU clock speed (SYSCLKOUT)
|
||||||
|
//#define CPU_RATE 33.333L // for a 30MHz CPU clock speed (SYSCLKOUT)
|
||||||
|
//#define CPU_RATE 41.667L // for a 24MHz CPU clock speed (SYSCLKOUT)
|
||||||
|
//#define CPU_RATE 50.000L // for a 20MHz CPU clock speed (SYSCLKOUT)
|
||||||
|
//#define CPU_RATE 66.667L // for a 15MHz CPU clock speed (SYSCLKOUT)
|
||||||
|
//#define CPU_RATE 100.000L // for a 10MHz CPU clock speed (SYSCLKOUT)
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// **** DO NOT modify the code below this line ****
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
#define SCALE_FACTOR 1048576.0L*( (200L/CPU_RATE) ) // IQ20
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* extern "C" */
|
||||||
|
|
||||||
|
#endif // -- end FLASH2833X_API_CONFIG_H
|
@ -0,0 +1,272 @@
|
|||||||
|
// TI File $Revision: /main/3 $
|
||||||
|
// Checkin $Date: February 5, 2008 11:10:02 $
|
||||||
|
//###########################################################################
|
||||||
|
//
|
||||||
|
// FILE: Flash2833x_API_Library.h
|
||||||
|
//
|
||||||
|
// TITLE: F2833x Flash Algo's main include file
|
||||||
|
//
|
||||||
|
// DESCRIPTION:
|
||||||
|
//
|
||||||
|
// This file should be included in any project that uses any of the
|
||||||
|
// the F2833x flash APIs.
|
||||||
|
//
|
||||||
|
//###########################################################################
|
||||||
|
// $TI Release:$
|
||||||
|
// $Release Date:$
|
||||||
|
//###########################################################################
|
||||||
|
|
||||||
|
#ifndef FLASH2833X_API_LIBRARY_H
|
||||||
|
#define FLASH2833X_API_LIBRARY_H
|
||||||
|
|
||||||
|
#include <F28335/Flash2833x_API_Config.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
28x Datatypes
|
||||||
|
|
||||||
|
For Portability, User Is Recommended To Use Following Data Type Size
|
||||||
|
Definitions For 16/32/64-Bit Signed/Unsigned Integers and floating point
|
||||||
|
variables:
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef DSP28_DATA_TYPES
|
||||||
|
#define DSP28_DATA_TYPES
|
||||||
|
typedef int int16;
|
||||||
|
typedef long int32;
|
||||||
|
typedef long long int64;
|
||||||
|
typedef unsigned int Uint16;
|
||||||
|
typedef unsigned long Uint32;
|
||||||
|
typedef unsigned long long Uint64;
|
||||||
|
typedef float float32;
|
||||||
|
typedef long double float64;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
API Status Messages
|
||||||
|
|
||||||
|
The following status values are returned from the API to the calling
|
||||||
|
program. These can be used to determine if the API function passed
|
||||||
|
or failed.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
// Operation passed, no errors were flagged
|
||||||
|
#define STATUS_SUCCESS 0
|
||||||
|
|
||||||
|
// The CSM is preventing the function from performing its operation
|
||||||
|
#define STATUS_FAIL_CSM_LOCKED 10
|
||||||
|
|
||||||
|
// Device REVID does not match that required by the API
|
||||||
|
#define STATUS_FAIL_REVID_INVALID 11
|
||||||
|
|
||||||
|
// Invalid address passed to the API
|
||||||
|
#define STATUS_FAIL_ADDR_INVALID 12
|
||||||
|
|
||||||
|
// Incorrect PARTID
|
||||||
|
// For example the F2806 API was used on a F2808 device.
|
||||||
|
#define STATUS_FAIL_INCORRECT_PARTID 13
|
||||||
|
|
||||||
|
// API/Silicon missmatch. An old version of the
|
||||||
|
// API is being used on silicon it is not valid for
|
||||||
|
// Please update to the latest API.
|
||||||
|
#define STATUS_FAIL_API_SILICON_MISMATCH 14
|
||||||
|
|
||||||
|
// ---- Erase Specific errors ----
|
||||||
|
#define STATUS_FAIL_NO_SECTOR_SPECIFIED 20
|
||||||
|
#define STATUS_FAIL_PRECONDITION 21
|
||||||
|
#define STATUS_FAIL_ERASE 22
|
||||||
|
#define STATUS_FAIL_COMPACT 23
|
||||||
|
#define STATUS_FAIL_PRECOMPACT 24
|
||||||
|
|
||||||
|
// ---- Program Specific errors ----
|
||||||
|
#define STATUS_FAIL_PROGRAM 30
|
||||||
|
#define STATUS_FAIL_ZERO_BIT_ERROR 31
|
||||||
|
|
||||||
|
// ---- Verify Specific errors ----
|
||||||
|
#define STATUS_FAIL_VERIFY 40
|
||||||
|
|
||||||
|
// Busy is set by each API function before it determines
|
||||||
|
// a pass or fail condition for that operation.
|
||||||
|
// The calling function will will not receive this
|
||||||
|
// status condition back from the API
|
||||||
|
#define STATUS_BUSY 999
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Flash sector mask definitions
|
||||||
|
|
||||||
|
The following macros can be used to form a mask specifying which sectors
|
||||||
|
will be erased by the erase API function.
|
||||||
|
|
||||||
|
Bit0 = Sector A
|
||||||
|
Bit1 = Sector B
|
||||||
|
Bit2 = Sector C
|
||||||
|
Bit3 = Sector D
|
||||||
|
Bit4 = Sector E
|
||||||
|
Bit5 = Sector F
|
||||||
|
Bit6 = Sector G
|
||||||
|
Bit7 = Sector H
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define SECTORA (Uint16)0x0001
|
||||||
|
#define SECTORB (Uint16)0x0002
|
||||||
|
#define SECTORC (Uint16)0x0004
|
||||||
|
#define SECTORD (Uint16)0x0008
|
||||||
|
#define SECTORE (Uint16)0x0010
|
||||||
|
#define SECTORF (Uint16)0x0020
|
||||||
|
#define SECTORG (Uint16)0x0040
|
||||||
|
#define SECTORH (Uint16)0x0080
|
||||||
|
|
||||||
|
|
||||||
|
#if FLASH_F28335
|
||||||
|
// All sectors on an F28335 - Sectors A - H
|
||||||
|
#define SECTOR_F28335 (SECTORA|SECTORB|SECTORC|\
|
||||||
|
SECTORD|SECTORE|SECTORF|\
|
||||||
|
SECTORG|SECTORH)
|
||||||
|
#endif // -- end FLASH_F28335
|
||||||
|
|
||||||
|
#if FLASH_F28334
|
||||||
|
// All sectors on an F28334 - Sectors A - H
|
||||||
|
#define SECTOR_F28334 (SECTORA|SECTORB|SECTORC|\
|
||||||
|
SECTORD|SECTORE|SECTORF|\
|
||||||
|
SECTORG|SECTORH)
|
||||||
|
#endif // -- end FLASH_F28334
|
||||||
|
|
||||||
|
#if FLASH_F28332
|
||||||
|
// All sectors on an F28332 - Sectors A - D
|
||||||
|
#define SECTOR_F28332 (SECTORA|SECTORB|SECTORC|\
|
||||||
|
SECTORD)
|
||||||
|
#endif // -- end FLASH_F28332
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
API Status Structure
|
||||||
|
|
||||||
|
This structure is used to pass debug data back to the calling routine.
|
||||||
|
Note that the Erase API function has 3 parts: precondition, erase and
|
||||||
|
and compaction. Erase and compaction failures will not populate
|
||||||
|
the expected and actual data fields.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Uint32 FirstFailAddr;
|
||||||
|
Uint16 ExpectedData;
|
||||||
|
Uint16 ActualData;
|
||||||
|
}FLASH_ST;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Interface Function prototypes
|
||||||
|
|
||||||
|
For each 28x Flash API library, the function names are of the form:
|
||||||
|
Flash<DeviceNum>_<Operation>()
|
||||||
|
|
||||||
|
Where <DeviceNum> is the device: ie 2808, 2806, 2801
|
||||||
|
<Operation> is the operation such as Erase, Program...
|
||||||
|
|
||||||
|
For portability for users who may move between the F2808, F2806 and
|
||||||
|
F2801, the following macro definitions are supplied.
|
||||||
|
|
||||||
|
Using these macro definitions, the user can use instead make a generic
|
||||||
|
call: Flash_<Operation> and the macro will map the call to the proper
|
||||||
|
device function
|
||||||
|
|
||||||
|
Note except for the toggle test function, all of the function prototypes
|
||||||
|
are compatible with F281x devices as well.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if FLASH_F28335
|
||||||
|
#define Flash_Erase(a,b) Flash28335_Erase(a,b)
|
||||||
|
#define Flash_Program(a,b,c,d) Flash28335_Program(a,b,c,d)
|
||||||
|
#define Flash_Verify(a,b,c,d) Flash28335_Verify(a,b,c,d)
|
||||||
|
#define Flash_ToggleTest(a,b) Flash28335_ToggleTest(a,b)
|
||||||
|
#define Flash_DepRecover() Flash28335_DepRecover()
|
||||||
|
#define Flash_APIVersionHex() Flash28335_APIVersionHex()
|
||||||
|
#define Flash_APIVersion() Flash28335_APIVersion()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if FLASH_F28334
|
||||||
|
#define Flash_Erase(a,b) Flash28334_Erase(a,b)
|
||||||
|
#define Flash_Program(a,b,c,d) Flash28334_Program(a,b,c,d)
|
||||||
|
#define Flash_Verify(a,b,c,d) Flash28334_Verify(a,b,c,d)
|
||||||
|
#define Flash_ToggleTest(a,b) Flash28334_ToggleTest(a,b)
|
||||||
|
#define Flash_DepRecover() Flash28334_DepRecover()
|
||||||
|
#define Flash_APIVersionHex() Flash28334_APIVersionHex()
|
||||||
|
#define Flash_APIVersion() Flash28334_APIVersion()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if FLASH_F28332
|
||||||
|
#define Flash_Erase(a,b) Flash28332_Erase(a,b)
|
||||||
|
#define Flash_Program(a,b,c,d) Flash28332_Program(a,b,c,d)
|
||||||
|
#define Flash_Verify(a,b,c,d) Flash28332_Verify(a,b,c,d)
|
||||||
|
#define Flash_ToggleTest(a,b) Flash28332_ToggleTest(a,b)
|
||||||
|
#define Flash_DepRecover() Flash28332_DepRecover()
|
||||||
|
#define Flash_APIVersionHex() Flash28332_APIVersionHex()
|
||||||
|
#define Flash_APIVersion() Flash28332_APIVersion()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern Uint16 Flash_Erase(Uint16 SectorMask, FLASH_ST *FEraseStat);
|
||||||
|
extern Uint16 Flash_Program(Uint16 *FlashAddr, Uint16 *BufAddr, Uint32 Length, FLASH_ST *FProgStatus);
|
||||||
|
extern Uint16 Flash_Verify(Uint16 *StartAddr, Uint16 *BufAddr, Uint32 Length, FLASH_ST *FVerifyStat);
|
||||||
|
extern void Flash_ToggleTest(volatile Uint32 *ToggleReg, Uint32 Mask);
|
||||||
|
extern Uint16 Flash_DepRecover();
|
||||||
|
extern float32 Flash_APIVersion();
|
||||||
|
extern Uint16 Flash_APIVersionHex();
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Frequency Scale factor:
|
||||||
|
The calling program must provide this global parameter used
|
||||||
|
for frequency scaling the algo's.
|
||||||
|
----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
extern Uint32 Flash_CPUScaleFactor;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Callback Function Pointer:
|
||||||
|
A callback function can be specified. This function will be called
|
||||||
|
at safe times during erase, program and verify. This function can
|
||||||
|
then be used to service an external watchdog or send a communications
|
||||||
|
packet.
|
||||||
|
|
||||||
|
Note:
|
||||||
|
THE FLASH AND OTP ARE NOT AVAILABLE DURING THIS FUNCTION CALL.
|
||||||
|
THE FLASH/OTP CANNOT BE READ NOR CAN CODE EXECUTE FROM IT DURING THIS CALL
|
||||||
|
DO NOT CALL ANY OF THE THE FLASH API FUNCTIONS DURING THIS CALL
|
||||||
|
----------------------------------------------------------------------------*/
|
||||||
|
extern void (*Flash_CallbackPtr) (void);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
API load/run symbols:
|
||||||
|
These symbols are defined by the linker during the link. Refer to the
|
||||||
|
Flash28_API section in the example .cmd file:
|
||||||
|
|
||||||
|
Flash28_API:
|
||||||
|
{
|
||||||
|
Flash28335_API_Library.lib(.econst)
|
||||||
|
Flash28335_API_Library.lib(.text)
|
||||||
|
} LOAD = FLASH,
|
||||||
|
RUN = SARAM,
|
||||||
|
LOAD_START(_Flash28_API_LoadStart),
|
||||||
|
LOAD_END(_Flash28_API_LoadEnd),
|
||||||
|
RUN_START(_Flash28_API_RunStart),
|
||||||
|
PAGE = 0
|
||||||
|
|
||||||
|
These are used to copy the flash API from flash to SARAM
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
extern Uint16 Flash28_API_LoadStart;
|
||||||
|
extern Uint16 Flash28_API_LoadEnd;
|
||||||
|
extern Uint16 Flash28_API_RunStart;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* extern "C" */
|
||||||
|
|
||||||
|
|
||||||
|
#endif // -- end FLASH2833x_API_LIBRARY_H
|
||||||
|
|
||||||
|
// --------- END OF FILE ----------------------------------
|
||||||
|
|
@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* FRAMBuffer.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "FRAM/FRAMBuffer.h"
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
FRAMBuffer::FRAMBuffer():
|
||||||
|
m_header(),
|
||||||
|
m_config(),
|
||||||
|
m_footer()
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void FRAMBuffer::update(const FRAM::FRAMHeader& header, const SYSCTRL::SystemControlConfiguration& config, const FRAM::FRAMFooter& footer)
|
||||||
|
{
|
||||||
|
m_header = header;
|
||||||
|
m_config = config;
|
||||||
|
m_footer = footer;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
bool FRAMBuffer::verify_header_and_footer(const FRAM::FRAMHeader& header, const FRAM::FRAMFooter& footer)
|
||||||
|
{
|
||||||
|
if((m_header.class_id == 0xFFFF)
|
||||||
|
&& (m_header.part_id == 0xFFFF)
|
||||||
|
&& (m_header.software_version == 0xFFFF)
|
||||||
|
&& (m_header.size_of_fram_data == 0xFFFF)
|
||||||
|
&& (m_footer.foot == 0xFFFF))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
}else{
|
||||||
|
if(m_header.class_id != header.class_id)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
}else{
|
||||||
|
if(m_header.part_id != header.part_id)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
}else{
|
||||||
|
if(m_header.software_version != header.software_version)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
}else{
|
||||||
|
if(m_header.size_of_fram_data != header.size_of_fram_data)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
}else{
|
||||||
|
if(m_footer.foot != footer.foot)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
}else{
|
||||||
|
return true;
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
void FRAMBuffer::extract(FRAM::FRAMHeader& header, SYSCTRL::SystemControlConfiguration& config, FRAM::FRAMFooter& footer)
|
||||||
|
{
|
||||||
|
header = m_header;
|
||||||
|
footer = m_footer;
|
||||||
|
config = m_config;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMBuffer::extract_header(FRAMHeader& header)
|
||||||
|
{
|
||||||
|
header = m_header;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
FRAM::FRAMHeader FRAMBuffer::get_header()
|
||||||
|
{
|
||||||
|
return m_header;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMBuffer::extract_footer(FRAMFooter& footer)
|
||||||
|
{
|
||||||
|
footer = m_footer;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
FRAM::FRAMFooter FRAMBuffer::get_footer()
|
||||||
|
{
|
||||||
|
return m_footer;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMBuffer::extract_system_configuration(SYSCTRL::SystemControlConfiguration& config)
|
||||||
|
{
|
||||||
|
config = m_config;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
} /* namespace FRAM */
|
@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* FRAMBuffer.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "SYSCTRL/TypeControl.h"
|
||||||
|
#include "SYSCTRL/SystemConfigurator.h"
|
||||||
|
|
||||||
|
#ifndef FRAM_FRAMBUFFER_H_
|
||||||
|
#define FRAM_FRAMBUFFER_H_
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
struct FRAMHeader
|
||||||
|
{
|
||||||
|
int16_t class_id;
|
||||||
|
int16_t part_id;
|
||||||
|
int16_t software_version;
|
||||||
|
int16_t size_of_fram_data;
|
||||||
|
FRAMHeader():
|
||||||
|
class_id(0x0FFFF),
|
||||||
|
part_id(0x0FFFF),
|
||||||
|
software_version(0x0FFFF),
|
||||||
|
size_of_fram_data(0x0FFFF)
|
||||||
|
{}
|
||||||
|
};//FRAMHeader
|
||||||
|
|
||||||
|
struct FRAMFooter
|
||||||
|
{
|
||||||
|
int16_t foot;
|
||||||
|
FRAMFooter():
|
||||||
|
foot(0x0FFFF)
|
||||||
|
{}
|
||||||
|
};//FRAMFooter
|
||||||
|
|
||||||
|
|
||||||
|
class FRAMBuffer
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
FRAMHeader m_header;
|
||||||
|
SYSCTRL::SystemControlConfiguration m_config;
|
||||||
|
FRAMFooter m_footer;
|
||||||
|
public:
|
||||||
|
FRAMBuffer();
|
||||||
|
public:
|
||||||
|
void update(const FRAM::FRAMHeader& header, const SYSCTRL::SystemControlConfiguration& config, const FRAM::FRAMFooter& footer);
|
||||||
|
bool verify_header_and_footer(const FRAM::FRAMHeader& header, const FRAM::FRAMFooter& footer);
|
||||||
|
void extract(FRAM::FRAMHeader& header, SYSCTRL::SystemControlConfiguration& config, FRAM::FRAMFooter& footer);
|
||||||
|
void extract_header(FRAMHeader& header);
|
||||||
|
FRAM::FRAMHeader get_header();
|
||||||
|
void extract_footer(FRAMFooter& footer);
|
||||||
|
FRAM::FRAMFooter get_footer();
|
||||||
|
void extract_system_configuration(SYSCTRL::SystemControlConfiguration& config);
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace FRAM */
|
||||||
|
|
||||||
|
#endif /* FRAM_FRAMBUFFER_H_ */
|
@ -0,0 +1,446 @@
|
|||||||
|
/*
|
||||||
|
* FRAMConfigurationParameters.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "FRAM/FRAMDATABASE.h"
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
|
||||||
|
void FRAMDATABASE::register_configuration_parameters(SYSCTRL::SystemControlConfiguration *sys_config)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_fram_object_index = 0;
|
||||||
|
m_fram_object_address = 0;
|
||||||
|
m_fram_object_last_address = 0;
|
||||||
|
|
||||||
|
//add_register_float(uint8_t readonly, float* pParam, float default_value);
|
||||||
|
//add_register_int(uint8_t readonly, int16_t* pParam, int16_t default_value);
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// References
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->reference_current_limit_rms, CURRENT_LIMIT_RMS);
|
||||||
|
add_float( 0, &sys_config->reference_current_pfc_rms, CURRENT_PFC_RMS);
|
||||||
|
add_float( 0, &sys_config->reference_voltage_rms, GRID_VOLTAGE_REFERENCE);
|
||||||
|
add_float( 0, &sys_config->reference_voltage_high_limit_rms, GRID_VOLTAGE_HIGH_LIMIT);
|
||||||
|
add_float( 0, &sys_config->reference_voltage_dc, CELL_DC_VOLTAGE_REFERENCE);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
//
|
||||||
|
// Algorithm Control Register
|
||||||
|
add_uint16(0, &sys_config->algorithm_control.all, ENABLE_CONTROL_BIT);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// High Voltage Cell
|
||||||
|
//
|
||||||
|
add_uint16(0, &sys_config->hardware.cell_level, 4);
|
||||||
|
add_uint16(0, &sys_config->hardware.version.pwm, 210);
|
||||||
|
add_uint16(0, &sys_config->hardware.version.cell, 211);
|
||||||
|
add_uint32(0, &sys_config->hardware.version.cpu_cpld, 202);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
add_float( 0, &sys_config->minimal_input_voltage_level, 10.0);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
//
|
||||||
|
// Scale Analog Signals
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->scale_voltage_input_a, 0.166324854);//0.0227386411//0.0233486816;
|
||||||
|
add_float( 0, &sys_config->scale_voltage_input_b, 0.166955084);//0.0227597337//0.0234651081;
|
||||||
|
add_float( 0, &sys_config->scale_voltage_input_c, 0.170290515);//0.02278281//0.0236082859;
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->scale_current_input_a, 0.0057266783);
|
||||||
|
add_float( 0, &sys_config->scale_current_input_b, 0.00571648451);
|
||||||
|
add_float( 0, &sys_config->scale_current_input_c, 0.00571565609);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->scale_current_cell_a, 0.0095403092);//0.00665648002;
|
||||||
|
add_float( 0, &sys_config->scale_current_cell_b, 0.00967073813);//0.00667640707;
|
||||||
|
add_float( 0, &sys_config->scale_current_cell_c, 0.00962774921);//0.00666095456;
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->scale_voltage_load_a, 0.168764219);//0.0227408651//0.0232194811;
|
||||||
|
add_float( 0, &sys_config->scale_voltage_load_b, 0.167528242);//0.0227707103//0.0233941432;
|
||||||
|
add_float( 0, &sys_config->scale_voltage_load_c, 0.171417475);//0.0229060184//0.0234934501;
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->scale_current_load_a, 0.00949461199);//0.00668919506;
|
||||||
|
add_float( 0, &sys_config->scale_current_load_b, 0.00953965727);//0.00669770781;
|
||||||
|
add_float( 0, &sys_config->scale_current_load_c, 0.00959520414);//0.00670575583;
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->scale_current_bypass_a, 0.00953388773);
|
||||||
|
add_float( 0, &sys_config->scale_current_bypass_b, 0.00956917088);
|
||||||
|
add_float( 0, &sys_config->scale_current_bypass_c, 0.00956158526);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Amplitude Filter Parameters
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->ampl_filter_current.time, 20.0e-3);
|
||||||
|
add_float( 0, &sys_config->ampl_filter_current.a3, 2.61313);
|
||||||
|
add_float( 0, &sys_config->ampl_filter_current.a2, 3.41422);
|
||||||
|
add_float( 0, &sys_config->ampl_filter_current.a1, 2.61313);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
//
|
||||||
|
// RMS Filter Parameters
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->rms_filter_analog_signal.time, 10.0e-3);
|
||||||
|
add_float( 0, &sys_config->rms_filter_analog_signal.a3, 2.61313);
|
||||||
|
add_float( 0, &sys_config->rms_filter_analog_signal.a2, 3.41422);
|
||||||
|
add_float( 0, &sys_config->rms_filter_analog_signal.a1, 2.61313);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Zero Drift Current Input
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->zero_filter.time, 1.333);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cell DC Voltage Filter
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->cell_dc_voltage_filter.time, 3.0e-3);
|
||||||
|
add_float( 0, &sys_config->cell_dc_voltage_filter.a3, 2.61313);
|
||||||
|
add_float( 0, &sys_config->cell_dc_voltage_filter.a2, 3.41422);
|
||||||
|
add_float( 0, &sys_config->cell_dc_voltage_filter.a1, 2.61313);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Signal Decompose
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->signal_decompose.projection_filter.time, 10.0e-3);
|
||||||
|
add_float( 0, &sys_config->signal_decompose.projection_filter.a3, 2.61313);
|
||||||
|
add_float( 0, &sys_config->signal_decompose.projection_filter.a2, 3.41422);
|
||||||
|
add_float( 0, &sys_config->signal_decompose.projection_filter.a1, 2.61313);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Relative
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->relative_voltage_input.minimal_amplitude_level, 0.1);
|
||||||
|
add_float( 0, &sys_config->relative_voltage_input.limit_relative_high, 1.1);
|
||||||
|
add_float( 0, &sys_config->relative_voltage_input.limit_relative_low, -1.1);
|
||||||
|
add_float( 0, &sys_config->relative_voltage_input.amplitude_filter.time, (float)(1.0/2.0/FP_PI/10.0));
|
||||||
|
add_float( 0, &sys_config->relative_voltage_input.amplitude_filter.a3, 2.61313);
|
||||||
|
add_float( 0, &sys_config->relative_voltage_input.amplitude_filter.a2, 3.41422);
|
||||||
|
add_float( 0, &sys_config->relative_voltage_input.amplitude_filter.a1, 2.61313);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Voltage PLL-ABC Parameters
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->pll_abc_input_voltage.frequency_nominal, PLLABC_FREQUENCY_NOMINAL);
|
||||||
|
add_float( 0, &sys_config->pll_abc_input_voltage.filter.time, 1.0/PLLABC_FREQUENCY_CUT);
|
||||||
|
add_float( 0, &sys_config->pll_abc_input_voltage.controller.gain, PLLABC_FREQUENCY_CUT/2.0);
|
||||||
|
add_float( 0, &sys_config->pll_abc_input_voltage.controller.time, 4.0/PLLABC_FREQUENCY_CUT);
|
||||||
|
add_float( 0, &sys_config->pll_abc_input_voltage.controller.low_saturation, PLLABC_FREQUENCY_LIMIT_LOW);
|
||||||
|
add_float( 0, &sys_config->pll_abc_input_voltage.controller.high_saturation, PLLABC_FREQUENCY_LIMIT_HI);
|
||||||
|
add_float( 0, &sys_config->pll_abc_input_voltage.position.time, 1.0);
|
||||||
|
add_float( 0, &sys_config->pll_abc_input_voltage.position.low_saturation, FP_ZERO);
|
||||||
|
add_float( 0, &sys_config->pll_abc_input_voltage.position.high_saturation, 2.0 * FP_PI);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// System Alarm
|
||||||
|
//
|
||||||
|
// exceed voltage level 1
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_1.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 + (PROTECTION_EXCEED_VOLTAGE_LEVEL_1_PERCENT / (float)100.0)));//253.0;
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_1.period, 10.0);
|
||||||
|
//
|
||||||
|
// exceed voltage level 2
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_2.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 + (PROTECTION_EXCEED_VOLTAGE_LEVEL_2_PERCENT / (float)100.0)));//264.5;
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_2.period, 5.0);
|
||||||
|
//
|
||||||
|
// exceed voltage level 3
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_3.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 + (PROTECTION_EXCEED_VOLTAGE_LEVEL_3_PERCENT / (float)100.0)));//276.0;
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_3.period, 2.0);
|
||||||
|
//
|
||||||
|
// exceed voltage level 4
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_4.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 + (PROTECTION_EXCEED_VOLTAGE_LEVEL_4_PERCENT / (float)100.0)));
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_4.period, 0.004);//1.0;
|
||||||
|
//
|
||||||
|
// decrease voltage level 1
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_1.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 - (PROTECTION_DECREASE_VOLTAGE_LEVEL_1_PERCENT / (float)100.0)));//218.5;//195.5;
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_1.period, 10.0);
|
||||||
|
//
|
||||||
|
// decrease voltage level 2
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_2.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 - (PROTECTION_DECREASE_VOLTAGE_LEVEL_2_PERCENT / (float)100.0)));//207.0;//172.5;
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_2.period, 5.0);
|
||||||
|
//
|
||||||
|
// decrease voltage level 3
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_3.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 - (PROTECTION_DECREASE_VOLTAGE_LEVEL_3_PERCENT / (float)100.0)));
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_3.period, 2.0);
|
||||||
|
//
|
||||||
|
// current overload level 1 120% 60s
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_1.level, 30.0 * 14.4);
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_1.period, 60.0);
|
||||||
|
//
|
||||||
|
// current overload level 2 130% 10s
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_2.level, 30.0 * 15.6);//30.0*15.6
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_2.period, 10.0);
|
||||||
|
//
|
||||||
|
// current overload level 3 150% 1ms
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_3.level, 30.0 * 18.0);
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_3.period, 0.004);
|
||||||
|
//
|
||||||
|
// current invertor overload level 1 110% 60s
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_1.level, 13.2);
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_1.period, 60.0);
|
||||||
|
//
|
||||||
|
// current invertor overload level 2 130% 10s
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_2.level, 15.6);
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_2.period, 10.0);
|
||||||
|
//
|
||||||
|
// current invertor overload level 3 150% 1ms
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_3.level, 18.0);
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_3.period, 0.004);
|
||||||
|
//
|
||||||
|
// current input overload level 1 110% 60s
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_1.level, 99.0);
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_1.period, 60.0);
|
||||||
|
//
|
||||||
|
// current input overload level 2 130% 10s
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_2.level, 117.0);
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_2.period, 10.0);
|
||||||
|
//
|
||||||
|
// current input overload level 3 150% 1ms
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_3.level, 135.0);
|
||||||
|
add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_3.period, 0.004);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// DIGITAL INPUTS
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->digital_input_config.period, 50.0e-3); //3001 - 3020
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// FAN CONTROL
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->fan_control.timer_period, 5.0*60.0);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Generator ABC
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->generator_abc.amplitude, 1.0);
|
||||||
|
add_float( 0, &sys_config->generator_abc.frequency, 2.0*FP_PI*50.0);
|
||||||
|
add_float( 0, &sys_config->generator_abc.phase_shift, 0.0);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reference PWM-Generator
|
||||||
|
//
|
||||||
|
//add_float( 0, &sys_config->generator_pwm.frequency, 2.0*FP_PI*1.0);
|
||||||
|
//add_float( 0, &sys_config->generator_abc.phase_shift, 0.0);
|
||||||
|
|
||||||
|
//add_float( 0, &sys_config->gen_inp_volt.amplitude.direct.d, 220.0);
|
||||||
|
//
|
||||||
|
//add_float( 0, &sys_config->gen_out_volt.amplitude.direct.d, 220.0);
|
||||||
|
//add_float( 0, &sys_config->gen_out_volt.phase.direct.phase, 0.122756);//FP_PI/4.0);
|
||||||
|
//
|
||||||
|
//add_float( 0, &sys_config->gen_out_current.amplitude.direct.d, 50.0);
|
||||||
|
//add_float( 0, &sys_config->gen_out_current.phase.direct.phase, 0.122756);//FP_PI/3.0;
|
||||||
|
//<>
|
||||||
|
|
||||||
|
//
|
||||||
|
// AlgorithmGeneratorReferences
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->algorithm_source_references.voltage, 0.0);
|
||||||
|
add_float( 0, &sys_config->algorithm_source_references.phase_shift, 0.0);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Harmonica Analyzer
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->ph_harmonica_5.time, 50.0e-3);
|
||||||
|
add_float( 0, &sys_config->ph_harmonica_5.a3, 2.61313);
|
||||||
|
add_float( 0, &sys_config->ph_harmonica_5.a2, 3.41422);
|
||||||
|
add_float( 0, &sys_config->ph_harmonica_5.a1, 2.61313);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reference Intensity Idref Iqref in Start Mode
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->intensity_id_iq_references.damp_factor, 0.7071);
|
||||||
|
add_float( 0, &sys_config->intensity_id_iq_references.time, 20.0e-3);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Regulators
|
||||||
|
//
|
||||||
|
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
//
|
||||||
|
#if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_PII
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_dq.gain, 1.0);
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_dq.time, 1.6e-3);
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_dq.high_saturation, 4500.0);
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_dq.low_saturation, -4500.0);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->integrator_voltage_dq.time, 2.0e-3);
|
||||||
|
add_float( 0, &sys_config->integrator_voltage_dq.high_saturation, 4500.0);
|
||||||
|
add_float( 0, &sys_config->integrator_voltage_dq.low_saturation, -4500.0);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->reference_voltage_dq_intensity.time, 200.0e-3);
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
#if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_I
|
||||||
|
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_dq.gain, 0.4);
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_dq.time, 1600.0e-6);
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_dq.high_saturation, 4500.0);
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_dq.low_saturation, -4500.0);
|
||||||
|
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->integrator_voltage_dq.time, 4.0e-3); // 4.0e-3 for single winding; 2.0e-3 for double winding
|
||||||
|
add_float( 0, &sys_config->integrator_voltage_dq.high_saturation, 4500.0);
|
||||||
|
add_float( 0, &sys_config->integrator_voltage_dq.low_saturation, -4500.0);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->reference_voltage_dq_intensity.time, 200.0e-3);
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
//add_float( 0, &sys_config->regulator_current_limit.gain, 1.0);
|
||||||
|
add_float( 0, &sys_config->regulator_current_limit.time, 140.0e-3);
|
||||||
|
add_float( 0, &sys_config->regulator_current_limit.high_saturation, REGULATOR_CURRENT_LIMIT_HIGH_SATURATION);
|
||||||
|
add_float( 0, &sys_config->regulator_current_limit.low_saturation, REGULATOR_CURRENT_LIMIT_LOW_SATURATION);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->regulator_current_pfc.gain, 0.25);
|
||||||
|
add_float( 0, &sys_config->regulator_current_pfc.time, 800.0e-3);
|
||||||
|
add_float( 0, &sys_config->regulator_current_pfc.high_saturation, REGULATOR_CURRENT_PFC_HIGH_SATURATION);
|
||||||
|
add_float( 0, &sys_config->regulator_current_pfc.low_saturation, REGULATOR_CURRENT_PFC_LOW_SATURATION);
|
||||||
|
//
|
||||||
|
#if TYPECURRENTCONTROLLER == CURRENTCONTROLLER_PI
|
||||||
|
add_float( 0, &sys_config->regulator_current_load_dq.gain, 8.0); // 4.0 for single winding; 8.0 for double winding
|
||||||
|
add_float( 0, &sys_config->regulator_current_load_dq.time, 6.4e-3);
|
||||||
|
add_float( 0, &sys_config->regulator_current_load_dq.high_saturation, 500.0);
|
||||||
|
add_float( 0, &sys_config->regulator_current_load_dq.low_saturation, -500.0);
|
||||||
|
#endif
|
||||||
|
#if TYPECURRENTCONTROLLER == CURRENTCONTROLLER_P
|
||||||
|
add_float( 0, &sys_config->regulator_current_load_dq.gain, 8.0);
|
||||||
|
add_float( 0, &sys_config->regulator_current_load_dq.high_saturation, 500.0);
|
||||||
|
add_float( 0, &sys_config->regulator_current_load_dq.low_saturation, -500.0);
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->referencer_current_bypass_dq.time, 25.6e-3);
|
||||||
|
add_float( 0, &sys_config->referencer_current_bypass_dq.high_saturation, 240.0);
|
||||||
|
add_float( 0, &sys_config->referencer_current_bypass_dq.low_saturation, -240.0);
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_active_reactive.gain, 0.04);
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_active_reactive.time, 10.0e-3);
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_active_reactive.high_saturation, 4500.0);
|
||||||
|
add_float( 0, &sys_config->regulator_voltage_load_active_reactive.low_saturation, -4500.0);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->regulator_current_limit.gain, 1.0);
|
||||||
|
add_float( 0, &sys_config->regulator_current_limit.time, 5.0);
|
||||||
|
add_float( 0, &sys_config->regulator_current_limit.high_saturation, GRID_VOLTAGE_REFERENCE * 0.57735);
|
||||||
|
add_float( 0, &sys_config->regulator_current_limit.low_saturation, FP_ZERO);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->regulator_current_pfc.gain, 0.25);
|
||||||
|
add_float( 0, &sys_config->regulator_current_pfc.time, 800.0e-3);
|
||||||
|
add_float( 0, &sys_config->regulator_current_pfc.high_saturation, GRID_VOLTAGE_REFERENCE * 0.57735);
|
||||||
|
add_float( 0, &sys_config->regulator_current_pfc.low_saturation, -GRID_VOLTAGE_REFERENCE * 0.57735);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->current_regulator_active.gain, 0.17); // 0.34 for single winding
|
||||||
|
add_float( 0, &sys_config->current_regulator_active.time, 0.04);
|
||||||
|
add_float( 0, &sys_config->current_regulator_active.high_saturation, 500.0);
|
||||||
|
add_float( 0, &sys_config->current_regulator_active.low_saturation, -500.0);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->current_regulator_reactive.gain, 0.17); // 0.34 for single winding
|
||||||
|
add_float( 0, &sys_config->current_regulator_reactive.time, 0.04);
|
||||||
|
add_float( 0, &sys_config->current_regulator_reactive.high_saturation, 500.0);
|
||||||
|
add_float( 0, &sys_config->current_regulator_reactive.low_saturation, -500.0);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->current_referencer.gain, 1.0);
|
||||||
|
add_float( 0, &sys_config->current_referencer.time, 0.160);
|
||||||
|
add_float( 0, &sys_config->current_referencer.high_saturation, 20.0);
|
||||||
|
add_float( 0, &sys_config->current_referencer.low_saturation, -20.0);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->regulator_dc_voltage.gain, 0.05);
|
||||||
|
add_float( 0, &sys_config->regulator_dc_voltage.time, 800.0e-3);
|
||||||
|
add_float( 0, &sys_config->regulator_dc_voltage.high_saturation, FP_ZERO);
|
||||||
|
add_float( 0, &sys_config->regulator_dc_voltage.low_saturation, -GRID_VOLTAGE_REFERENCE * 0.57735);
|
||||||
|
#endif
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->drc_voltage_decomposer.filter.time, 31.83e-3); //31.83e-3//6.366e-3//3.183e-3
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->drc_voltage_controller.gain, 0.4); //0.4 - for single winding; 0.7958 - for double winding. //7.958//1.592//0.7958
|
||||||
|
add_float( 0, &sys_config->drc_voltage_controller.time, 3.2e-3); //31.83e-3//6.366e-3//3.183e-3
|
||||||
|
add_float( 0, &sys_config->drc_voltage_controller.high_saturation, 4500.0);
|
||||||
|
add_float( 0, &sys_config->drc_voltage_controller.low_saturation, -4500.0);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->drc_reference_voltage_direct_intensity.time, 333.0e-3);
|
||||||
|
add_float( 0, &sys_config->drc_reference_voltage_direct_intensity.damp_factor, 0.9);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->drc_regulator_current_load.gain, 4.0);// 4.0 - for single winding; 8.0 - for double winding
|
||||||
|
add_float( 0, &sys_config->drc_regulator_current_load.time, 6.4e-3);
|
||||||
|
add_float( 0, &sys_config->drc_regulator_current_load.high_saturation, 500.0);
|
||||||
|
add_float( 0, &sys_config->drc_regulator_current_load.low_saturation, -500.0);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->drc_referencer_current_bypass.time, 25.6e-3);
|
||||||
|
add_float( 0, &sys_config->drc_referencer_current_bypass.high_saturation, 240.0);
|
||||||
|
add_float( 0, &sys_config->drc_referencer_current_bypass.low_saturation, -240.0);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->drc_regulator_current_limit.time, 140.0e-3);
|
||||||
|
add_float( 0, &sys_config->drc_regulator_current_limit.high_saturation, REGULATOR_CURRENT_LIMIT_HIGH_SATURATION);
|
||||||
|
add_float( 0, &sys_config->drc_regulator_current_limit.low_saturation, REGULATOR_CURRENT_LIMIT_LOW_SATURATION);
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->drc_regulator_current_pfc.gain, 0.25);
|
||||||
|
add_float( 0, &sys_config->drc_regulator_current_pfc.time, 800.0e-3);
|
||||||
|
add_float( 0, &sys_config->drc_regulator_current_pfc.high_saturation, REGULATOR_CURRENT_PFC_HIGH_SATURATION);
|
||||||
|
add_float( 0, &sys_config->drc_regulator_current_pfc.low_saturation, REGULATOR_CURRENT_PFC_LOW_SATURATION);
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Timers
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->timer_start.period, 5.0);
|
||||||
|
add_float( 0, &sys_config->timer_stop.period, 5.0);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Contactor Control Fault
|
||||||
|
//
|
||||||
|
add_float( 0, &sys_config->contactor.period, 0.4);
|
||||||
|
|
||||||
|
|
||||||
|
}//
|
||||||
|
|
||||||
|
} /* namespace FRAM */
|
@ -0,0 +1,439 @@
|
|||||||
|
/*
|
||||||
|
* FRAMDATABASE.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "FRAM/FRAMDATABASE.h"
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
FRAMDATABASE::FRAMDATABASE():
|
||||||
|
m_mode(),
|
||||||
|
m_state(),
|
||||||
|
m_fram_data_buffer(),
|
||||||
|
m_buffer_pointer((uint16_t*)&m_fram_data_buffer),
|
||||||
|
m_fram_object(),
|
||||||
|
m_fram_size(FRAM_FRAM_SIZE),
|
||||||
|
m_fram_object_index(0),
|
||||||
|
m_fram_object_address(0),
|
||||||
|
m_fram_object_last_address(0),
|
||||||
|
m_fram_rw_index(0),
|
||||||
|
m_header(),
|
||||||
|
m_footer(),
|
||||||
|
m_verify(false)
|
||||||
|
{
|
||||||
|
m_header.class_id = HEADER_CLASS_ID;
|
||||||
|
m_header.part_id = HEADER_PART_ID;
|
||||||
|
m_header.software_version = HEADER_SOFTWARE_VERSION;
|
||||||
|
m_header.size_of_fram_data = sizeof(m_fram_data_buffer);
|
||||||
|
m_footer.foot = FOOTER_FOOT;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FRAM::FRAMDATABASE::mode_t FRAMDATABASE::get_mode()
|
||||||
|
{
|
||||||
|
return m_mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool FRAMDATABASE::compare_mode(FRAM::FRAMDATABASE::mode_t mode)
|
||||||
|
{
|
||||||
|
return mode == m_mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
FRAM::FRAMDATABASE::state_t FRAMDATABASE::get_state()
|
||||||
|
{
|
||||||
|
return m_state;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool FRAMDATABASE::compare_state(FRAM::FRAMDATABASE::state_t state)
|
||||||
|
{
|
||||||
|
return state == m_state;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool FRAMDATABASE::is_free()
|
||||||
|
{
|
||||||
|
return m_state == FRAM::FRAMDATABASE::FREE;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool FRAMDATABASE::is_busy()
|
||||||
|
{
|
||||||
|
return m_state == FRAM::FRAMDATABASE::BUSY;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool FRAMDATABASE::is_read()
|
||||||
|
{
|
||||||
|
return m_mode == FRAM::FRAMDATABASE::READ;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool FRAMDATABASE::is_burn()
|
||||||
|
{
|
||||||
|
return m_mode == FRAM::FRAMDATABASE::BURN;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool FRAMDATABASE::is_erase()
|
||||||
|
{
|
||||||
|
return m_mode == FRAM::FRAMDATABASE::ERASE;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool FRAMDATABASE::is_restore()
|
||||||
|
{
|
||||||
|
return m_mode == FRAM::FRAMDATABASE::RESTORE;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool FRAMDATABASE::is_verify()
|
||||||
|
{
|
||||||
|
return m_mode == FRAM::FRAMDATABASE::VERIFY;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::set_read()
|
||||||
|
{
|
||||||
|
m_state = FRAM::FRAMDATABASE::BUSY;
|
||||||
|
m_mode = FRAM::FRAMDATABASE::READ;
|
||||||
|
m_fram_rw_index = 0;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::set_burn()
|
||||||
|
{
|
||||||
|
m_state = FRAM::FRAMDATABASE::BUSY;
|
||||||
|
m_mode = FRAM::FRAMDATABASE::BURN;
|
||||||
|
m_fram_rw_index = 0;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::set_erase()
|
||||||
|
{
|
||||||
|
m_state = FRAM::FRAMDATABASE::BUSY;
|
||||||
|
m_mode = FRAM::FRAMDATABASE::ERASE;
|
||||||
|
m_fram_rw_index = 0;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::set_verify()
|
||||||
|
{
|
||||||
|
m_state = FRAM::FRAMDATABASE::BUSY;
|
||||||
|
m_mode = FRAM::FRAMDATABASE::VERIFY;
|
||||||
|
m_fram_rw_index = 0;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::set_restore()
|
||||||
|
{
|
||||||
|
m_state = FRAM::FRAMDATABASE::BUSY;
|
||||||
|
m_mode = FRAM::FRAMDATABASE::RESTORE;
|
||||||
|
m_fram_rw_index = 0;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::set_break()
|
||||||
|
{
|
||||||
|
m_state = FRAM::FRAMDATABASE::FREE;
|
||||||
|
m_mode = FRAM::FRAMDATABASE::WAIT;
|
||||||
|
m_fram_rw_index = 0;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
FRAM::FRAMHeader FRAMDATABASE::get_header()
|
||||||
|
{
|
||||||
|
return m_header;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
FRAM::FRAMFooter FRAMDATABASE::get_footer()
|
||||||
|
{
|
||||||
|
return m_footer;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::extract_system_configuration(SYSCTRL::SystemControlConfiguration *sys_config)
|
||||||
|
{
|
||||||
|
m_fram_data_buffer.extract_system_configuration(*sys_config);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::implement_dafault_configuration()
|
||||||
|
{
|
||||||
|
for(uint16_t i = 0; i < m_fram_object_index; i++)
|
||||||
|
{
|
||||||
|
FRAM::FRAMDataObjects& o = m_fram_object[i];
|
||||||
|
o.restore_default_value();
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
void FRAMDATABASE::upload_configuration(SYSCTRL::SystemControlConfiguration *sys_config)
|
||||||
|
{
|
||||||
|
register_configuration_parameters(sys_config);
|
||||||
|
|
||||||
|
//implement_dafault_configuration();
|
||||||
|
|
||||||
|
read_from_fram_to_buffer();
|
||||||
|
|
||||||
|
m_verify = m_fram_data_buffer.verify_header_and_footer(m_header, m_footer);
|
||||||
|
//m_verify = false;
|
||||||
|
if(m_verify)
|
||||||
|
{
|
||||||
|
extract_system_configuration(sys_config);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
erase_fram_buffer();
|
||||||
|
|
||||||
|
implement_dafault_configuration();
|
||||||
|
|
||||||
|
m_fram_data_buffer.update(m_header, *sys_config, m_footer);
|
||||||
|
|
||||||
|
write_to_fram_from_buffer();
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
void FRAMDATABASE::update_buffer(const SYSCTRL::SystemControlConfiguration *sys_config)
|
||||||
|
{
|
||||||
|
m_fram_data_buffer.update(m_header, *sys_config, m_footer);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::erase_fram_index()
|
||||||
|
{
|
||||||
|
if(m_mode == FRAM::FRAMDATABASE::ERASE)
|
||||||
|
{
|
||||||
|
if(m_fram_rw_index < sizeof(m_fram_data_buffer))
|
||||||
|
{
|
||||||
|
writeint(0xFFFF, m_fram_rw_index << 1);
|
||||||
|
m_fram_rw_index++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
set_break();
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::verify_fram_index()
|
||||||
|
{
|
||||||
|
if(m_mode == FRAM::FRAMDATABASE::VERIFY)
|
||||||
|
{
|
||||||
|
if(m_fram_rw_index < sizeof(m_fram_data_buffer))
|
||||||
|
{
|
||||||
|
m_fram_rw_index++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
set_break();
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::write_fram_index()
|
||||||
|
{
|
||||||
|
if(m_mode == FRAM::FRAMDATABASE::BURN)
|
||||||
|
{
|
||||||
|
if(m_fram_rw_index < sizeof(m_fram_data_buffer))
|
||||||
|
{
|
||||||
|
writeint((*(m_buffer_pointer + m_fram_rw_index)), m_fram_rw_index << 1);
|
||||||
|
m_fram_rw_index++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
set_break();
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::read_fram_index()
|
||||||
|
{
|
||||||
|
if(m_mode == FRAM::FRAMDATABASE::READ)
|
||||||
|
{
|
||||||
|
if(m_fram_rw_index < sizeof(m_fram_data_buffer))
|
||||||
|
{
|
||||||
|
*(m_buffer_pointer + m_fram_rw_index) = readint(m_fram_rw_index << 1);
|
||||||
|
m_fram_rw_index++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
set_break();
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::restore_fram_index()
|
||||||
|
{
|
||||||
|
if(m_mode == FRAM::FRAMDATABASE::RESTORE)
|
||||||
|
{
|
||||||
|
if(m_fram_rw_index < sizeof(m_fram_data_buffer))
|
||||||
|
{
|
||||||
|
writeint((*(m_buffer_pointer + m_fram_rw_index)), m_fram_rw_index << 1);
|
||||||
|
m_fram_rw_index++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
set_break();
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::read_from_fram_to_buffer()
|
||||||
|
{
|
||||||
|
set_read();
|
||||||
|
for(m_fram_rw_index = 0; m_fram_rw_index < sizeof(m_fram_data_buffer); m_fram_rw_index++)
|
||||||
|
{
|
||||||
|
*(m_buffer_pointer + m_fram_rw_index) = readint(m_fram_rw_index << 1);
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
m_mode = FRAM::FRAMDATABASE::READ;
|
||||||
|
m_state = FRAMDATABASE::BUSY;
|
||||||
|
set_break();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::write_to_fram_from_buffer()
|
||||||
|
{
|
||||||
|
set_burn();
|
||||||
|
for(m_fram_rw_index = 0; m_fram_rw_index < sizeof(m_fram_data_buffer); m_fram_rw_index++)
|
||||||
|
{
|
||||||
|
writeint((*(m_buffer_pointer + m_fram_rw_index)), m_fram_rw_index << 1);
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
set_break();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::erase_fram_buffer()
|
||||||
|
{
|
||||||
|
set_verify();
|
||||||
|
for(m_fram_rw_index = 0; m_fram_rw_index < sizeof(m_fram_data_buffer); m_fram_rw_index++)
|
||||||
|
{
|
||||||
|
writeint(0xFFFF, m_fram_rw_index << 1);
|
||||||
|
*(m_buffer_pointer + m_fram_rw_index) = readint(m_fram_rw_index << 1);
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
set_break();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
void FRAMDATABASE::add_float(uint8_t readonly, float* pParam, float default_value)
|
||||||
|
{
|
||||||
|
if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&&
|
||||||
|
(((m_fram_object_address + (sizeof(float)<<1)) < m_fram_size)))
|
||||||
|
{
|
||||||
|
FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index];
|
||||||
|
object.add_register_float(m_fram_object_address, readonly, pParam, default_value);
|
||||||
|
m_fram_object_index++;
|
||||||
|
m_fram_object_address += (sizeof(float) << 1);
|
||||||
|
m_fram_object_last_address = m_fram_object_address;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::add_int16(uint8_t readonly, int16_t* pParam, int16_t default_value)
|
||||||
|
{
|
||||||
|
if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&&
|
||||||
|
(((m_fram_object_address + (sizeof(uint16_t)<<1)) < m_fram_size)))
|
||||||
|
{
|
||||||
|
FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index];
|
||||||
|
object.add_register_int16(m_fram_object_address, readonly, pParam, default_value);
|
||||||
|
m_fram_object_index++;
|
||||||
|
m_fram_object_address += sizeof(int16_t) << 1;
|
||||||
|
m_fram_object_last_address = m_fram_object_address;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::add_int32(uint8_t readonly, int32_t* pParam, int32_t default_value)
|
||||||
|
{
|
||||||
|
if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&&
|
||||||
|
(((m_fram_object_address + (sizeof(int32_t)<<1)) < m_fram_size)))
|
||||||
|
{
|
||||||
|
FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index];
|
||||||
|
object.add_register_int32(m_fram_object_address, readonly, pParam, default_value);
|
||||||
|
m_fram_object_index++;
|
||||||
|
m_fram_object_address += (sizeof(int32_t) << 1);
|
||||||
|
m_fram_object_last_address = m_fram_object_address;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::add_uint16(uint8_t readonly, uint16_t* pParam, uint16_t default_value)
|
||||||
|
{
|
||||||
|
if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&&
|
||||||
|
(((m_fram_object_address + (sizeof(uint16_t)<<1)) < m_fram_size)))
|
||||||
|
{
|
||||||
|
FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index];
|
||||||
|
object.add_register_uint16(m_fram_object_address, readonly, pParam, default_value);
|
||||||
|
m_fram_object_index++;
|
||||||
|
m_fram_object_address += sizeof(uint16_t) << 1;
|
||||||
|
m_fram_object_last_address = m_fram_object_address;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::add_uint32(uint8_t readonly, uint32_t* pParam, uint32_t default_value)
|
||||||
|
{
|
||||||
|
if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&&
|
||||||
|
(((m_fram_object_address + (sizeof(uint32_t)<<1)) < m_fram_size)))
|
||||||
|
{
|
||||||
|
FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index];
|
||||||
|
object.add_register_uint32(m_fram_object_address, readonly, pParam, default_value);
|
||||||
|
m_fram_object_index++;
|
||||||
|
m_fram_object_address += (sizeof(uint32_t) << 1);
|
||||||
|
m_fram_object_last_address = m_fram_object_address;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDATABASE::add_bool(uint8_t readonly, bool* pParam, bool default_value)
|
||||||
|
{
|
||||||
|
if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&&
|
||||||
|
(((m_fram_object_address + (sizeof(uint16_t)<<1)) < m_fram_size)))
|
||||||
|
{
|
||||||
|
FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index];
|
||||||
|
object.add_register_bool(m_fram_object_address, readonly, pParam, default_value);
|
||||||
|
m_fram_object_index++;
|
||||||
|
m_fram_object_address += sizeof(int16_t) << 1;
|
||||||
|
m_fram_object_last_address = m_fram_object_address;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace FRAM */
|
@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* FRAMDATABASE.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "framework.h"
|
||||||
|
#include "FRAM/FRAMDefinitions.h"
|
||||||
|
#include "FRAM/FRAMBuffer.h"
|
||||||
|
#include "FRAM/FRAMDataObjects.h"
|
||||||
|
#include "FRAM/FRAMVariant.h"
|
||||||
|
#include "SYSCTRL/SystemConfigurator.h"
|
||||||
|
#include "SYSCTRL/SystemDefinitions.h"
|
||||||
|
|
||||||
|
#ifndef FRAM_FRAMDATABASE_H_
|
||||||
|
#define FRAM_FRAMDATABASE_H_
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
class FRAMDATABASE
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum mode_t {WAIT, READ, BURN, ERASE, VERIFY, RESTORE};
|
||||||
|
enum state_t {BUSY, FREE};
|
||||||
|
private:
|
||||||
|
mode_t m_mode;
|
||||||
|
state_t m_state;
|
||||||
|
private:
|
||||||
|
FRAM::FRAMBuffer m_fram_data_buffer;
|
||||||
|
uint16_t *m_buffer_pointer;
|
||||||
|
FRAM::FRAMDataObjects m_fram_object[NUMBER_FRAM_PARAMETERS];
|
||||||
|
uint16_t m_fram_size;
|
||||||
|
uint16_t m_fram_object_index;
|
||||||
|
uint16_t m_fram_object_address;
|
||||||
|
uint16_t m_fram_object_last_address;
|
||||||
|
uint16_t m_fram_rw_index;
|
||||||
|
FRAM::FRAMHeader m_header;
|
||||||
|
FRAM::FRAMFooter m_footer;
|
||||||
|
bool m_verify;
|
||||||
|
public:
|
||||||
|
FRAMDATABASE();
|
||||||
|
public:
|
||||||
|
mode_t get_mode();
|
||||||
|
bool compare_mode(mode_t mode);
|
||||||
|
state_t get_state();
|
||||||
|
bool compare_state(state_t state);
|
||||||
|
public:
|
||||||
|
bool is_free();
|
||||||
|
bool is_busy();
|
||||||
|
bool is_read();
|
||||||
|
bool is_burn();
|
||||||
|
bool is_erase();
|
||||||
|
bool is_restore();
|
||||||
|
bool is_verify();
|
||||||
|
public:
|
||||||
|
void set_read();
|
||||||
|
void set_burn();
|
||||||
|
void set_erase();
|
||||||
|
void set_verify();
|
||||||
|
void set_restore();
|
||||||
|
void set_break();
|
||||||
|
public:
|
||||||
|
void upload_configuration(SYSCTRL::SystemControlConfiguration *sys_config);
|
||||||
|
void update_buffer(const SYSCTRL::SystemControlConfiguration *sys_config);
|
||||||
|
void erase_fram_index();
|
||||||
|
void verify_fram_index();
|
||||||
|
void write_fram_index();
|
||||||
|
void read_fram_index();
|
||||||
|
void restore_fram_index();
|
||||||
|
void read_from_fram_to_buffer();
|
||||||
|
void write_to_fram_from_buffer();
|
||||||
|
void erase_fram_buffer();
|
||||||
|
public:
|
||||||
|
FRAM::FRAMHeader get_header();
|
||||||
|
FRAM::FRAMFooter get_footer();
|
||||||
|
void extract_system_configuration(SYSCTRL::SystemControlConfiguration *sys_config);
|
||||||
|
void implement_dafault_configuration();
|
||||||
|
//
|
||||||
|
//
|
||||||
|
private:
|
||||||
|
void add_float(uint8_t readonly, float* pParam, float default_value);
|
||||||
|
void add_int16(uint8_t readonly, int16_t* pParam, int16_t default_value);
|
||||||
|
void add_int32(uint8_t readonly, int32_t* pParam, int32_t default_value);
|
||||||
|
void add_uint16(uint8_t readonly, uint16_t* pParam, uint16_t default_value);
|
||||||
|
void add_uint32(uint8_t readonly, uint32_t* pParam, uint32_t default_value);
|
||||||
|
void add_bool(uint8_t readonly, bool* pParam, bool default_value);
|
||||||
|
public:
|
||||||
|
void register_configuration_parameters(SYSCTRL::SystemControlConfiguration *sys_config);
|
||||||
|
|
||||||
|
};//class FRAMDATABASE
|
||||||
|
|
||||||
|
} /* namespace FRAM */
|
||||||
|
|
||||||
|
#endif /* FRAM_FRAMDATABASE_H_ */
|
@ -0,0 +1,201 @@
|
|||||||
|
/*
|
||||||
|
* FRAMDataObjects.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "FRAM/FRAMDataObjects.h"
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
|
||||||
|
FRAMDataObjects::FRAMDataObjects():
|
||||||
|
m_address(0),
|
||||||
|
m_is_read_only(false),
|
||||||
|
m_pParam(0),
|
||||||
|
m_default_value()
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::restore_default_value()
|
||||||
|
{
|
||||||
|
if(m_pParam != 0)
|
||||||
|
{
|
||||||
|
switch(m_default_value.get_type())
|
||||||
|
{
|
||||||
|
case FRAM::FRAM_VARIANT_FLOAT: { *((float*) m_pParam) = m_default_value.get_float(); break;}
|
||||||
|
case FRAM::FRAM_VARIANT_INT16: { *((int16_t*) m_pParam) = m_default_value.get_int16(); break;}
|
||||||
|
case FRAM::FRAM_VARIANT_INT32: { *((int32_t*) m_pParam) = m_default_value.get_int32(); break;}
|
||||||
|
case FRAM::FRAM_VARIANT_UINT16: { *((uint16_t*) m_pParam) = m_default_value.get_uint16(); break;}
|
||||||
|
case FRAM::FRAM_VARIANT_UINT32: { *((uint32_t*) m_pParam) = m_default_value.get_uint32(); break;}
|
||||||
|
case FRAM::FRAM_VARIANT_BOOL: { *((bool*) m_pParam) = m_default_value.get_bool(); break;}
|
||||||
|
default: {break;}
|
||||||
|
}//switch
|
||||||
|
}//if
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::add_register_float(uint16_t address, uint8_t readonly, float* pParam, float default_value)
|
||||||
|
{
|
||||||
|
m_address = address;
|
||||||
|
m_is_read_only = 0 != readonly ? true : false;
|
||||||
|
m_pParam = pParam;
|
||||||
|
m_default_value.set_float(default_value);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::add_register_int16(uint16_t address, uint8_t readonly, int16_t* pParam, int16_t default_value)
|
||||||
|
{
|
||||||
|
m_address = address;
|
||||||
|
m_is_read_only = 0 != readonly ? true : false;
|
||||||
|
m_pParam = pParam;
|
||||||
|
m_default_value.set_int16(default_value);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::add_register_int32(uint16_t address, uint8_t readonly, int32_t* pParam, int32_t default_value)
|
||||||
|
{
|
||||||
|
m_address = address;
|
||||||
|
m_is_read_only = 0 != readonly ? true : false;
|
||||||
|
m_pParam = pParam;
|
||||||
|
m_default_value.set_int32(default_value);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::add_register_uint16(uint16_t address, uint8_t readonly, uint16_t* pParam, uint16_t default_value)
|
||||||
|
{
|
||||||
|
m_address = address;
|
||||||
|
m_is_read_only = 0 != readonly ? true : false;
|
||||||
|
m_pParam = pParam;
|
||||||
|
m_default_value.set_uint16(default_value);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::add_register_uint32(uint16_t address, uint8_t readonly, uint32_t* pParam, uint32_t default_value)
|
||||||
|
{
|
||||||
|
m_address = address;
|
||||||
|
m_is_read_only = 0 != readonly ? true : false;
|
||||||
|
m_pParam = pParam;
|
||||||
|
m_default_value.set_uint32(default_value);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::add_register_bool(uint16_t address, uint8_t readonly, bool* pParam, bool default_value)
|
||||||
|
{
|
||||||
|
m_address = address;
|
||||||
|
m_is_read_only = 0 != readonly ? true : false;
|
||||||
|
m_pParam = pParam;
|
||||||
|
m_default_value.set_bool(default_value);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
uint16_t FRAMDataObjects::get_address() const
|
||||||
|
{
|
||||||
|
return m_address;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::write_parameter(const void *pBuffer, uint8_t buffer_size)
|
||||||
|
{
|
||||||
|
if((m_pParam != 0)&&
|
||||||
|
(pBuffer != 0) &&
|
||||||
|
(buffer_size > 0) &&
|
||||||
|
(m_is_read_only != true))
|
||||||
|
{
|
||||||
|
switch(m_default_value.get_type())
|
||||||
|
{
|
||||||
|
case FRAM::FRAM_VARIANT_FLOAT: { if(4 == buffer_size) *((float*) m_pParam) = *((float*) pBuffer); break;}
|
||||||
|
case FRAM::FRAM_VARIANT_INT16: { if(2 == buffer_size) *((int16_t*) m_pParam) = *((int16_t*) pBuffer); break;}
|
||||||
|
default: {break;}
|
||||||
|
}//switch
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::read_parameter(void *pBuffer, uint8_t buffer_size) const
|
||||||
|
{
|
||||||
|
if((m_pParam != 0) &&
|
||||||
|
(pBuffer != 0) &&
|
||||||
|
(buffer_size > 0))
|
||||||
|
{
|
||||||
|
switch(m_default_value.get_type())
|
||||||
|
{
|
||||||
|
case FRAM::FRAM_VARIANT_FLOAT: {if(4 == buffer_size) *((float*) pBuffer) = *((float*) m_pParam); break;}
|
||||||
|
case FRAM::FRAM_VARIANT_INT16: {if(2 == buffer_size) *((int16_t*) pBuffer) = *((int16_t*) m_pParam); break;}
|
||||||
|
default: {break;}
|
||||||
|
}//switch
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
}//
|
||||||
|
|
||||||
|
void FRAMDataObjects::fram_write_parameter()
|
||||||
|
{
|
||||||
|
if(m_pParam != 0)
|
||||||
|
{
|
||||||
|
switch(m_default_value.get_type())
|
||||||
|
{
|
||||||
|
case FRAM::FRAM_VARIANT_FLOAT:
|
||||||
|
{
|
||||||
|
writefloat(*((float*) m_pParam), m_address);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FRAM::FRAM_VARIANT_INT16:
|
||||||
|
{
|
||||||
|
writeint(*((int16_t*) m_pParam), m_address);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {break;}
|
||||||
|
}//switch
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::fram_read_parameter()
|
||||||
|
{
|
||||||
|
if(m_pParam != 0)
|
||||||
|
{
|
||||||
|
switch(m_default_value.get_type())
|
||||||
|
{
|
||||||
|
case FRAM::FRAM_VARIANT_FLOAT:
|
||||||
|
{
|
||||||
|
*((float*) m_pParam) = readfloat(m_address);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FRAM::FRAM_VARIANT_INT16:
|
||||||
|
{
|
||||||
|
*((int16_t*) m_pParam) = readint(m_address);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {break;}
|
||||||
|
}//switch
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::write_to_fram_data(Uint16 *Dest, Uint32 Length)
|
||||||
|
{
|
||||||
|
for(Uint16 i = 0; i < Length; i++)
|
||||||
|
{
|
||||||
|
writeint((*Dest++),i);
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMDataObjects::read_from_fram_data(Uint16 *BuffAddr, Uint32 Length)
|
||||||
|
{
|
||||||
|
for(Uint16 i = 0; i < Length; i++)
|
||||||
|
{
|
||||||
|
(*BuffAddr++) = readint(i);
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
} /* namespace FRAM */
|
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* FRAMACCESS.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "framework.h"
|
||||||
|
#include "FRAM/FRAMVariant.h"
|
||||||
|
|
||||||
|
#ifndef FRAM_FRAMDATAOBJECTS_H_
|
||||||
|
#define FRAM_FRAMDATAOBJECTS_H_
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
|
||||||
|
class FRAMDataObjects
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint16_t m_address;
|
||||||
|
bool m_is_read_only;
|
||||||
|
void* m_pParam;
|
||||||
|
FRAM::FRAMVariant m_default_value;
|
||||||
|
public:
|
||||||
|
FRAMDataObjects();
|
||||||
|
void restore_default_value();
|
||||||
|
void add_register_float(uint16_t address, uint8_t readonly, float* pParam, float default_value);
|
||||||
|
void add_register_int16(uint16_t address, uint8_t readonly, int16_t* pParam, int16_t default_value);
|
||||||
|
void add_register_int32(uint16_t address, uint8_t readonly, int32_t* pParam, int32_t default_value);
|
||||||
|
void add_register_uint16(uint16_t address, uint8_t readonly, uint16_t* pParam, uint16_t default_value);
|
||||||
|
void add_register_uint32(uint16_t address, uint8_t readonly, uint32_t* pParam, uint32_t default_value);
|
||||||
|
void add_register_bool(uint16_t address, uint8_t readonly, bool* pParam, bool default_value);
|
||||||
|
public:
|
||||||
|
uint16_t get_address() const;
|
||||||
|
void write_parameter(const void *pBuffer, uint8_t buffer_size);
|
||||||
|
void read_parameter(void *pBuffer, uint8_t buffer_size) const;
|
||||||
|
public:
|
||||||
|
void fram_write_parameter();
|
||||||
|
void fram_read_parameter();
|
||||||
|
public:
|
||||||
|
void write_to_fram_data(Uint16 *Dest, Uint32 Length);
|
||||||
|
void read_from_fram_data(Uint16 *BufAddr, Uint32 Length);
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace FRAM */
|
||||||
|
|
||||||
|
#endif /* FRAM_FRAMDATAOBJECTS_H_ */
|
@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* FRAMDefinitions.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FRAM_FRAMDEFINITIONS_H_
|
||||||
|
#define FRAM_FRAMDEFINITIONS_H_
|
||||||
|
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
//
|
||||||
|
//
|
||||||
|
#define FRAM_FRAM_SIZE ((uint16_t)(8192))
|
||||||
|
//
|
||||||
|
} /* namespace FRAM */
|
||||||
|
#endif /* FRAM_FRAMDEFINITIONS_H_ */
|
@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* FRAMVariant.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "FRAM/FRAMVariant.h"
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
FRAMVariant::FRAMVariant():
|
||||||
|
t(FRAM::FRAM_VARIANT_UNDEFINED),
|
||||||
|
f(0)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
|
||||||
|
FRAM::fram_variant_type_t FRAMVariant::get_type() const
|
||||||
|
{
|
||||||
|
return t;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
void FRAMVariant::set_float(float v)
|
||||||
|
{
|
||||||
|
f = v;
|
||||||
|
t = FRAM::FRAM_VARIANT_FLOAT;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
void FRAMVariant::set_int16(int16_t v)
|
||||||
|
{
|
||||||
|
i16 = v;
|
||||||
|
t = FRAM::FRAM_VARIANT_INT16;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMVariant::set_int32(int32_t v)
|
||||||
|
{
|
||||||
|
i32 = v;
|
||||||
|
t = FRAM::FRAM_VARIANT_INT32;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMVariant::set_uint16(uint16_t v)
|
||||||
|
{
|
||||||
|
u16 = v;
|
||||||
|
t = FRAM::FRAM_VARIANT_UINT16;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FRAMVariant::set_uint32(uint32_t v)
|
||||||
|
{
|
||||||
|
u32 = v;
|
||||||
|
t = FRAM::FRAM_VARIANT_UINT32;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void FRAMVariant::set_bool(bool v)
|
||||||
|
{
|
||||||
|
b = v;
|
||||||
|
t = FRAM::FRAM_VARIANT_BOOL;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
float FRAMVariant::get_float() const
|
||||||
|
{
|
||||||
|
return f;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
int16_t FRAMVariant::get_int16() const
|
||||||
|
{
|
||||||
|
return i16;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
int32_t FRAMVariant::get_int32() const
|
||||||
|
{
|
||||||
|
return i32;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
uint16_t FRAMVariant::get_uint16() const
|
||||||
|
{
|
||||||
|
return u16;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
uint32_t FRAMVariant::get_uint32() const
|
||||||
|
{
|
||||||
|
return u32;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
bool FRAMVariant::get_bool() const
|
||||||
|
{
|
||||||
|
return b;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
}/* namespace FRAM */
|
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* FRAMVariant.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "SYSCTRL/SystemDefinitions.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef FRAM_FRAMVARIANT_H_
|
||||||
|
#define FRAM_FRAMVARIANT_H_
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
|
||||||
|
enum fram_variant_type_t {FRAM_VARIANT_UNDEFINED, FRAM_VARIANT_FLOAT, FRAM_VARIANT_INT16, FRAM_VARIANT_INT32, FRAM_VARIANT_UINT16, FRAM_VARIANT_UINT32, FRAM_VARIANT_BOOL};
|
||||||
|
|
||||||
|
class FRAMVariant
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
union
|
||||||
|
{
|
||||||
|
float f;
|
||||||
|
int16_t i16;
|
||||||
|
int32_t i32;
|
||||||
|
uint16_t u16;
|
||||||
|
uint32_t u32;
|
||||||
|
bool b;
|
||||||
|
SYSCTRL::Register16 r16;
|
||||||
|
SYSCTRL::Register32 r32;
|
||||||
|
};
|
||||||
|
private:
|
||||||
|
fram_variant_type_t t;
|
||||||
|
public:
|
||||||
|
FRAMVariant();
|
||||||
|
fram_variant_type_t get_type() const;
|
||||||
|
//setters
|
||||||
|
void set_float(float v);
|
||||||
|
void set_int16(int16_t v);
|
||||||
|
void set_int32(int32_t v);
|
||||||
|
void set_uint16(uint16_t v);
|
||||||
|
void set_uint32(uint32_t v);
|
||||||
|
void set_bool(bool v);
|
||||||
|
//getters
|
||||||
|
float get_float() const;
|
||||||
|
int16_t get_int16() const;
|
||||||
|
int32_t get_int32() const;
|
||||||
|
uint16_t get_uint16() const;
|
||||||
|
uint32_t get_uint32() const;
|
||||||
|
bool get_bool() const;
|
||||||
|
//
|
||||||
|
};//class fram_variant_t
|
||||||
|
//
|
||||||
|
}/* namespace FRAM */
|
||||||
|
|
||||||
|
#endif /* FRAM_FRAMVARIANT_H_ */
|
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* FRAMheaders.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FRAM_FRAMHEADERS_H_
|
||||||
|
#define FRAM_FRAMHEADERS_H_
|
||||||
|
|
||||||
|
#include "FRAM/FRAMBuffer.h"
|
||||||
|
#include "FRAM/FRAMDATABASE.h"
|
||||||
|
#include "FRAM/FRAMDataObjects.h"
|
||||||
|
#include "FRAM/FRAMVariant.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* FRAM_FRAMHEADERS_H_ */
|
@ -0,0 +1,132 @@
|
|||||||
|
/*
|
||||||
|
* ROM.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "FRAM/ROM.h"
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
ROM::ROM():
|
||||||
|
m_mode(FRAM::ROM::UNDEFINED),
|
||||||
|
m_header(),
|
||||||
|
m_footer(),
|
||||||
|
m_int_last_address(0),
|
||||||
|
m_flt_last_address(0),
|
||||||
|
_write_float(&FRAM::ROM::_write_float_undef),
|
||||||
|
_read_float(&FRAM::ROM::_read_float_undef),
|
||||||
|
_write_int(&FRAM::ROM::_write_int_undef),
|
||||||
|
_read_int(&FRAM::ROM::_read_int_undef)
|
||||||
|
{}
|
||||||
|
//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void ROM::setup(const ROMSetup setup)
|
||||||
|
{
|
||||||
|
static bool _status = true;
|
||||||
|
if(m_mode == FRAM::ROM::UNDEFINED)
|
||||||
|
{
|
||||||
|
m_header = setup.header;
|
||||||
|
m_footer = setup.footer;
|
||||||
|
//
|
||||||
|
_status &= m_header.class_id != 0 ? true : false;
|
||||||
|
_status &= m_header.part_id != 0 ? true : false;
|
||||||
|
_status &= m_header.rom_size != 0 ? true : false;
|
||||||
|
_status &= m_header.software_version != 0 ? true : false;
|
||||||
|
_status &= m_footer.magic != 0 ? true : false;
|
||||||
|
//
|
||||||
|
if(_status)
|
||||||
|
{
|
||||||
|
m_mode = FRAM::ROM::OPERATIONAL;
|
||||||
|
//
|
||||||
|
_write_float = &FRAM::ROM::_write_float_undef;
|
||||||
|
_read_float = &FRAM::ROM::_read_float_undef;
|
||||||
|
_write_int = &FRAM::ROM::_write_int_undef;
|
||||||
|
_read_int = &FRAM::ROM::_read_int_undef;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
FRAM::ROM::mode_t ROM::get_mode()
|
||||||
|
{
|
||||||
|
return m_mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool ROM::compare(FRAM::ROM::mode_t mode)
|
||||||
|
{
|
||||||
|
return m_mode == mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void ROM::write_float(float data, int16_t addr)
|
||||||
|
{
|
||||||
|
(this->*_write_float)(data, addr);
|
||||||
|
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
float ROM::read_float(int16_t addr)
|
||||||
|
{
|
||||||
|
return (this->*_read_float)(addr);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void ROM::write_int(int16_t data, int16_t addr)
|
||||||
|
{
|
||||||
|
(this->*_write_int)(data, addr);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
int16_t ROM::read_int(int16_t addr)
|
||||||
|
{
|
||||||
|
return (this->*_read_int)(addr);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void ROM::_write_float_undef(float data, int16_t addr)
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
void ROM::_write_float_operate(float data, int16_t addr)
|
||||||
|
{
|
||||||
|
writefloat(data, addr);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
float ROM::_read_float_undef(int16_t addr)
|
||||||
|
{
|
||||||
|
return (float)0.0;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
float ROM::_read_float_operate(int16_t addr)
|
||||||
|
{
|
||||||
|
return readfloat(addr);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void ROM::_write_int_undef(int16_t data, int16_t addr)
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
void ROM::_write_int_operate(int16_t data, int16_t addr)
|
||||||
|
{
|
||||||
|
writeint(data, addr);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
int16_t ROM::_read_int_undef(int16_t addr)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
int16_t ROM::_read_int_operate(int16_t addr)
|
||||||
|
{
|
||||||
|
return readint(addr);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
} /* namespace FRAM */
|
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* ROM.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "framework.h"
|
||||||
|
|
||||||
|
#ifndef FRAM_ROM_H_
|
||||||
|
#define FRAM_ROM_H_
|
||||||
|
|
||||||
|
namespace FRAM
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
struct ROMHeader
|
||||||
|
{
|
||||||
|
uint16_t class_id;
|
||||||
|
uint16_t part_id;
|
||||||
|
uint16_t software_version;
|
||||||
|
uint16_t rom_size;
|
||||||
|
ROMHeader():
|
||||||
|
class_id(0),
|
||||||
|
part_id(0),
|
||||||
|
software_version(0),
|
||||||
|
rom_size(0)
|
||||||
|
{}
|
||||||
|
};//ROMHeader
|
||||||
|
|
||||||
|
struct ROMFooter
|
||||||
|
{
|
||||||
|
uint16_t magic;
|
||||||
|
ROMFooter():
|
||||||
|
magic(0)
|
||||||
|
{}
|
||||||
|
};//ROMFooter
|
||||||
|
|
||||||
|
struct ROMSetup
|
||||||
|
{
|
||||||
|
ROMHeader header;
|
||||||
|
ROMFooter footer;
|
||||||
|
ROMSetup():
|
||||||
|
header(),
|
||||||
|
footer()
|
||||||
|
{}
|
||||||
|
};//ROMSetup
|
||||||
|
|
||||||
|
class ROM
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum mode_t {UNDEFINED, OPERATIONAL};
|
||||||
|
private:
|
||||||
|
mode_t m_mode;
|
||||||
|
private:
|
||||||
|
ROMHeader m_header;
|
||||||
|
ROMFooter m_footer;
|
||||||
|
uint16_t m_int_last_address;
|
||||||
|
uint16_t m_flt_last_address;
|
||||||
|
public:
|
||||||
|
ROM();
|
||||||
|
void setup(const ROMSetup setup);
|
||||||
|
public:
|
||||||
|
mode_t get_mode();
|
||||||
|
bool compare(mode_t mode);
|
||||||
|
public:
|
||||||
|
void write_float(float data, int16_t addr);
|
||||||
|
float read_float(int16_t addr);
|
||||||
|
void write_int(int16_t data, int16_t addr);
|
||||||
|
int16_t read_int(int16_t addr);
|
||||||
|
private:
|
||||||
|
void (ROM::*_write_float)(float data, int16_t addr);
|
||||||
|
void _write_float_undef(float data, int16_t addr);
|
||||||
|
void _write_float_operate(float data, int16_t addr);
|
||||||
|
private:
|
||||||
|
float (ROM::*_read_float)(int16_t addr);
|
||||||
|
float _read_float_undef(int16_t addr);
|
||||||
|
float _read_float_operate(int16_t addr);
|
||||||
|
private:
|
||||||
|
void (ROM::*_write_int)(int16_t data, int16_t addr);
|
||||||
|
void _write_int_undef(int16_t data, int16_t addr);
|
||||||
|
void _write_int_operate(int16_t data, int16_t addr);
|
||||||
|
private:
|
||||||
|
int16_t (ROM::*_read_int)(int16_t addr);
|
||||||
|
int16_t _read_int_undef(int16_t addr);
|
||||||
|
int16_t _read_int_operate(int16_t addr);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
};// class ROM
|
||||||
|
|
||||||
|
} /* namespace FRAM */
|
||||||
|
|
||||||
|
#endif /* FRAM_ROM_H_ */
|
Binary file not shown.
@ -0,0 +1,209 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* File Name:framework.c
|
||||||
|
* Author:Zhangdi
|
||||||
|
* Brief:
|
||||||
|
* Note:
|
||||||
|
* Last Updated for Version:
|
||||||
|
* Date of the Last Update:
|
||||||
|
*****************************************************************************/
|
||||||
|
#include"framework.h"
|
||||||
|
/*****************************************************************************
|
||||||
|
** Constants
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
** Maco Define
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
** Data Type Define
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
** Global Variable Declare
|
||||||
|
*****************************************************************************/
|
||||||
|
BaudRate comModbusBaudRateSet;
|
||||||
|
Uint16 comModbusADDRSet;
|
||||||
|
ParityMode comModbusParitySet;
|
||||||
|
|
||||||
|
Uint16 cpuCpldVersion;
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: Analog input
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
AnalogInput analogInput = { 0 };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: Analog output
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
Uint16 a2001_2005 = 0;
|
||||||
|
Uint16 a2002_2006 = 0;
|
||||||
|
Uint16 a2003_2007 = 0;
|
||||||
|
Uint16 a2004_2008 = 0;
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: Digital input interface
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
DigitalInput digitalInput = { 0 };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: Digital output interface
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
DigitalOuput digitalOutput = { 0xffff };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: modbus output coils buffer
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
Uint16 readCoils[300] = { 0 };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: modbus input coils buffer
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
Uint16 writeCoils[300] = { 0 };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: modbus output registers buffer
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
Uint16 readRegisters[300] = { 0 };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: modbus input registers buffer
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
Uint16 writeRegisters[300] = { 0 };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: Event for modbus state machine
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
hsmEvent etmp;
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: modbus object
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
MODBUS_RTU_SLAVE modbusHMI;
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: modbus event list
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
hsmEvent eBufferHMI[50];
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: modbus port object
|
||||||
|
* Note:
|
||||||
|
*****************************************************************************/
|
||||||
|
MODBUS_RTU_PORT_INFOR modbusHMIPort = { 5, B9600, NO_PARITY,
|
||||||
|
&(ScibRegs.SCIRXBUF.all), &(ScibRegs.SCITXBUF), 21, &(ScibRegs) };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: Ecan data buffer. These data transport from cpu to communication
|
||||||
|
* board.
|
||||||
|
* Note: These data used for communication board modbus output coils.
|
||||||
|
*****************************************************************************/
|
||||||
|
Uint16 canData_cpu2com_coils[16] = { 0 };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: Ecan data buffer. These data transport from cpu to communication
|
||||||
|
* board.
|
||||||
|
* Note: These data used for communication board modbus output registers.
|
||||||
|
*****************************************************************************/
|
||||||
|
Uint16 canData_cpu2com_registers[50] = { 0 };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: Ecan data buffer. These data transport from communication board to
|
||||||
|
* cpu board.
|
||||||
|
* Note: These data are input coils data received by communication board modbus.
|
||||||
|
*****************************************************************************/
|
||||||
|
Uint16 canData_com2cpu_coils[16] = { 0 };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Brief: Ecan data buffer. These data transport from communication board to
|
||||||
|
* cpu board.
|
||||||
|
* Note: These data are input registers data received by communication board
|
||||||
|
* modbus.
|
||||||
|
*****************************************************************************/
|
||||||
|
Uint16 canData_com2cpu_registers[50] = { 0 };
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
** Global Function Declare
|
||||||
|
*****************************************************************************/
|
||||||
|
void frameworkDataInit(void)
|
||||||
|
{
|
||||||
|
Uint32 i;
|
||||||
|
int16 *p;
|
||||||
|
|
||||||
|
p = (int16 *)&analogInput;
|
||||||
|
for(i = 0; i < sizeof(analogInput) / sizeof(int16); i++)
|
||||||
|
{
|
||||||
|
p[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a2001_2005 = 0;
|
||||||
|
a2002_2006 = 0;
|
||||||
|
a2003_2007 = 0;
|
||||||
|
a2004_2008 = 0;
|
||||||
|
|
||||||
|
digitalInput.all = 0xffffffff;
|
||||||
|
digitalOutput.all = 0xffffffff;
|
||||||
|
|
||||||
|
p = (int16 *)readCoils;
|
||||||
|
for(i = 0; i < sizeof(readCoils) / sizeof(Uint16); i++)
|
||||||
|
{
|
||||||
|
p[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = (int16 *)writeCoils;
|
||||||
|
for(i = 0; i < sizeof(writeCoils) / sizeof(Uint16); i++)
|
||||||
|
{
|
||||||
|
p[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = (int16 *)readRegisters;
|
||||||
|
for(i = 0; i < sizeof(readRegisters) / sizeof(Uint16); i++)
|
||||||
|
{
|
||||||
|
p[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = (int16 *)writeRegisters;
|
||||||
|
for(i = 0; i < sizeof(writeRegisters) / sizeof(Uint16); i++)
|
||||||
|
{
|
||||||
|
p[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
etmp.signal = 0;
|
||||||
|
|
||||||
|
p = (int16 *)canData_cpu2com_coils;
|
||||||
|
for(i = 0; i < sizeof(canData_cpu2com_coils) / sizeof(Uint16); i++)
|
||||||
|
{
|
||||||
|
p[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = (int16 *)canData_cpu2com_registers;
|
||||||
|
for(i = 0; i < sizeof(canData_cpu2com_registers) / sizeof(Uint16); i++)
|
||||||
|
{
|
||||||
|
p[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = (int16 *)canData_com2cpu_coils;
|
||||||
|
for(i = 0; i < sizeof(canData_com2cpu_coils) / sizeof(Uint16); i++)
|
||||||
|
{
|
||||||
|
p[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = (int16 *)canData_com2cpu_registers;
|
||||||
|
for(i = 0; i < sizeof(canData_com2cpu_registers) / sizeof(Uint16); i++)
|
||||||
|
{
|
||||||
|
p[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
** Local Function Declare
|
||||||
|
*****************************************************************************/
|
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* HALBase.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "HAL/HALBase.h"
|
||||||
|
|
||||||
|
namespace HAL
|
||||||
|
{
|
||||||
|
|
||||||
|
//CONSTRUCTOR
|
||||||
|
HALBase::HALBase():
|
||||||
|
m_mode(HAL::HALBase::UNDEFINED),
|
||||||
|
m_status(false)
|
||||||
|
//
|
||||||
|
{}//end CONSTRUCTOR
|
||||||
|
//
|
||||||
|
HAL::HALBase::mode_t HAL::HALBase::get_mode() const
|
||||||
|
{
|
||||||
|
|
||||||
|
return m_mode;
|
||||||
|
//
|
||||||
|
}//end
|
||||||
|
//
|
||||||
|
bool HAL::HALBase::compare(HAL::HALBase::mode_t mode) const
|
||||||
|
{
|
||||||
|
return m_mode == mode;
|
||||||
|
//
|
||||||
|
}//end
|
||||||
|
//
|
||||||
|
} /* namespace HAL */
|
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* HALBase.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
//
|
||||||
|
#include "F28335/DSP28x_Project.h"
|
||||||
|
|
||||||
|
#ifndef HAL_HALVIRTUAL_H_
|
||||||
|
#define HAL_HALVIRTUAL_H_
|
||||||
|
|
||||||
|
namespace HAL
|
||||||
|
{
|
||||||
|
|
||||||
|
typedef void (*pGPIO_FUNCTION)();
|
||||||
|
|
||||||
|
|
||||||
|
struct HALSetup
|
||||||
|
{
|
||||||
|
pGPIO_FUNCTION gpio_setup;
|
||||||
|
HALSetup():
|
||||||
|
gpio_setup(0)
|
||||||
|
{}
|
||||||
|
};//HALSetup
|
||||||
|
|
||||||
|
|
||||||
|
class HALBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum mode_t {UNDEFINED=0, OPERATIONAL=1};
|
||||||
|
protected:
|
||||||
|
mode_t m_mode;
|
||||||
|
bool m_status;
|
||||||
|
public:
|
||||||
|
HALBase();
|
||||||
|
public:
|
||||||
|
mode_t get_mode() const;
|
||||||
|
bool compare(mode_t mode) const;
|
||||||
|
//
|
||||||
|
};//end class HALVirtual
|
||||||
|
|
||||||
|
} /* namespace HAL */
|
||||||
|
|
||||||
|
#endif /* HAL_HALVIRTUAL_H_ */
|
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* RUBUS.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "MODBUSRTU/RUBUS.h"
|
||||||
|
|
||||||
|
namespace MODBUSRTU
|
||||||
|
{
|
||||||
|
|
||||||
|
//CONSTRUCTOR
|
||||||
|
RUBUS::RUBUS(uint16_t len):
|
||||||
|
mode(MODBUSRTU::RUBUS::RUBUS_RESET),
|
||||||
|
size(len),
|
||||||
|
accepted(),
|
||||||
|
response_shadow(),
|
||||||
|
response(),
|
||||||
|
mask(),
|
||||||
|
m_cell(),
|
||||||
|
cell_data(0)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
} /* namespace MODBUSRTU */
|
@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* RUBUS.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MODBUSRTU_RUBUS_H_
|
||||||
|
#define MODBUSRTU_RUBUS_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "framework.h"
|
||||||
|
#include "SYSCTRL/SystemEnvironment.h"
|
||||||
|
#include "MODBUSRTU/RUBUSRegister.h"
|
||||||
|
#include "MODBUSRTU/RUBUSTypes.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace MODBUSRTU
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct RUBUS_ACCEPTED_DATA
|
||||||
|
{
|
||||||
|
RUBUS_REGISTER_16 command_start;
|
||||||
|
RUBUS_REGISTER_16 command_end;
|
||||||
|
uint16_t index;
|
||||||
|
RUBUS_REGISTER_16 id;
|
||||||
|
RUBUS_REGISTER_16 com;
|
||||||
|
RUBUS_REGISTER_32 data;
|
||||||
|
RUBUS_ACCEPTED_DATA():
|
||||||
|
command_start(0),
|
||||||
|
command_end(0),
|
||||||
|
index(0),
|
||||||
|
id(0),
|
||||||
|
com(0),
|
||||||
|
data(0)
|
||||||
|
{}
|
||||||
|
};//RUBUS_ACCEPTED_DATA
|
||||||
|
|
||||||
|
|
||||||
|
struct RUBUS_MASK
|
||||||
|
{
|
||||||
|
RUBUS_REGISTER_16 error_response;
|
||||||
|
RUBUS_REGISTER_16 rubus_bool;
|
||||||
|
RUBUS_REGISTER_16 rubus_float;
|
||||||
|
RUBUS_REGISTER_16 rubus_uint8;
|
||||||
|
RUBUS_REGISTER_16 rubus_uint16;
|
||||||
|
RUBUS_REGISTER_16 rubus_uint32;
|
||||||
|
RUBUS_REGISTER_16 rubus_int8;
|
||||||
|
RUBUS_REGISTER_16 rubus_int16;
|
||||||
|
RUBUS_REGISTER_16 rubus_int32;
|
||||||
|
RUBUS_MASK():
|
||||||
|
error_response(0x80),
|
||||||
|
rubus_bool(0x0000),
|
||||||
|
rubus_float(0x0002),
|
||||||
|
rubus_uint8(0x0004),
|
||||||
|
rubus_uint16(0x0006),
|
||||||
|
rubus_uint32(0x0008),
|
||||||
|
rubus_int8(0x000A),
|
||||||
|
rubus_int16(0x00C),
|
||||||
|
rubus_int32(0x000E)
|
||||||
|
{}
|
||||||
|
};//RUBUS_MASK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct RUBUS_RESPONSE
|
||||||
|
{
|
||||||
|
RUBUS_REGISTER_16 command;
|
||||||
|
uint16_t index;
|
||||||
|
RUBUS_REGISTER_32 data;
|
||||||
|
RUBUS_RESPONSE():
|
||||||
|
command(0),
|
||||||
|
index(0),
|
||||||
|
data(0)
|
||||||
|
{}
|
||||||
|
};//RUBUS_RESPONSE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct RUBUS
|
||||||
|
{
|
||||||
|
enum mode_rubus_t {RUBUS_RESET, RUBUS_READ, RUBUS_WRITE, RUBUS_ERROR};
|
||||||
|
mode_rubus_t mode;
|
||||||
|
uint16_t size;
|
||||||
|
RUBUS_ACCEPTED_DATA accepted;
|
||||||
|
RUBUS_RESPONSE response_shadow;
|
||||||
|
RUBUS_RESPONSE response;
|
||||||
|
const RUBUS_MASK mask;
|
||||||
|
MODBUSRTU::RUBUSRegister m_cell;
|
||||||
|
RUBUS_REGISTER_32 cell_data;
|
||||||
|
RUBUS(uint16_t size);
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace MODBUSRTU */
|
||||||
|
|
||||||
|
#endif /* MODBUSRTU_RUBUS_H_ */
|
@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* RUBUSCOPE.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "MODBUSRTU/RUBUSCOPE.h"
|
||||||
|
|
||||||
|
namespace MODBUSRTU
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
RUBUSCOPE::RUBUSCOPE(SYSCTRL::SystemEnvironment& env):
|
||||||
|
m_env(env),
|
||||||
|
m_len(RUBUSCOPEARRAYLEN),
|
||||||
|
m_channels()
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
} /* namespace MODBUSRTU */
|
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* RUBUSCOPE.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MODBUSRTU_RUBUSCOPE_H_
|
||||||
|
#define MODBUSRTU_RUBUSCOPE_H_
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "framework.h"
|
||||||
|
#include "SYSCTRL/SystemEnvironment.h"
|
||||||
|
#include "MODBUSRTU/RUBUSRegister.h"
|
||||||
|
#include "MODBUSRTU/RUBUSTypes.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace MODBUSRTU
|
||||||
|
{
|
||||||
|
|
||||||
|
#define RUBUSCOPEARRAYLEN 100
|
||||||
|
|
||||||
|
struct RUBUSCOPEVariables
|
||||||
|
{
|
||||||
|
uint16_t command;
|
||||||
|
uint16_t response;
|
||||||
|
uint16_t channel;
|
||||||
|
uint16_t pointer;
|
||||||
|
float data;
|
||||||
|
RUBUSCOPEVariables(){}
|
||||||
|
};//RUBUSCOPEVariables
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class RUBUSCOPE
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
SYSCTRL::SystemEnvironment& m_env;
|
||||||
|
uint16_t m_len;
|
||||||
|
float m_channels[9][RUBUSCOPEARRAYLEN];
|
||||||
|
public:
|
||||||
|
RUBUSCOPE(SYSCTRL::SystemEnvironment& env);
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace MODBUSRTU */
|
||||||
|
|
||||||
|
#endif /* MODBUSRTU_RUBUSCOPE_H_ */
|
@ -0,0 +1,565 @@
|
|||||||
|
/*
|
||||||
|
* RUBUSDataBase.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "MODBUSRTU/RUBUSDataBase.h"
|
||||||
|
|
||||||
|
namespace MODBUSRTU
|
||||||
|
{
|
||||||
|
|
||||||
|
RUBUSDataBase::RUBUSDataBase():
|
||||||
|
m_cell(),
|
||||||
|
m_current_index_cell(0),
|
||||||
|
m_index_cell(0),
|
||||||
|
m_counter_cell(0),
|
||||||
|
m_size_cell(NUMBER_RUBUSCELLS)
|
||||||
|
{}//
|
||||||
|
|
||||||
|
|
||||||
|
void RUBUSDataBase::add_register_bool (uint16_t index, uint16_t readonly, bool* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bool(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_float (uint16_t index, uint16_t readonly, float* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_float(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_uint8 (uint16_t index, uint16_t readonly, uint8_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_uint8(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_uint16(uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_uint16(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_uint32(uint16_t index, uint16_t readonly, uint32_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_uint32(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_int8 (uint16_t index, uint16_t readonly, int8_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_int8(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_int16 (uint16_t index, uint16_t readonly, int16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_int16(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_int32 (uint16_t index, uint16_t readonly, int32_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_int32(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void RUBUSDataBase::add_register_bit0 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit0(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit1 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit1(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit2 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit2(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit3 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit3(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit4 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit4(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit5 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit5(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit6 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit6(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit7 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit7(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit8 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit8(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit9 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit9(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit10 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit10(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit11 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit11(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit12 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit12(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit13 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit13(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit14 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit14(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit15 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit15(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit16 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit16(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit17 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit17(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit18 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit18(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit19 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit19(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit20 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit20(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit21 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit21(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit22 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit22(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit23 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit23(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit24 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit24(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit25 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit25(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit26 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit26(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit27 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit27(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit28 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit28(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit29 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit29(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit30 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit30(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSDataBase::add_register_bit31 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
if(m_counter_cell < m_size_cell)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell];
|
||||||
|
cell.register_bit31(index, readonly, param);
|
||||||
|
m_counter_cell++;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
//#pragma CODE_SECTION("ramfuncs");
|
||||||
|
MODBUSRTU::RUBUSRegister& RUBUSDataBase::get_register(uint16_t index)
|
||||||
|
{
|
||||||
|
m_current_index_cell = 0;
|
||||||
|
for(m_index_cell = 0; m_index_cell < m_counter_cell; m_index_cell++)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_index_cell];
|
||||||
|
if(cell.get_index() == index)
|
||||||
|
{
|
||||||
|
m_current_index_cell = m_index_cell;
|
||||||
|
break;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
return m_cell[m_current_index_cell];
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
//#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void RUBUSDataBase::read_register(uint16_t index, RUBUS_REGISTER_32& data)
|
||||||
|
{
|
||||||
|
m_current_index_cell = 0;
|
||||||
|
for(m_index_cell = 0; m_index_cell < m_counter_cell; m_index_cell++)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_index_cell];
|
||||||
|
if(cell.get_index() == index)
|
||||||
|
{
|
||||||
|
m_current_index_cell = m_index_cell;
|
||||||
|
break;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
data.all = m_cell[m_current_index_cell].read_register().all;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
//#pragma CODE_SECTION("ramfuncs");
|
||||||
|
uint16_t RUBUSDataBase::write_register(uint16_t index, RUBUS_REGISTER_32 data)
|
||||||
|
{
|
||||||
|
m_current_index_cell = 0;
|
||||||
|
for(m_index_cell = 0; m_index_cell < m_counter_cell; m_index_cell++)
|
||||||
|
{
|
||||||
|
MODBUSRTU::RUBUSRegister& cell = m_cell[m_index_cell];
|
||||||
|
if(cell.get_index() == index)
|
||||||
|
{
|
||||||
|
m_current_index_cell = m_index_cell;
|
||||||
|
break;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
return m_cell[m_current_index_cell].write_register(data.all);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
} /* namespace MODBUSRTU */
|
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* RUBUSDataBase.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MODBUSRTU_RUBUSDATABASE_H_
|
||||||
|
#define MODBUSRTU_RUBUSDATABASE_H_
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "framework.h"
|
||||||
|
#include "SYSCTRL/SystemEnvironment.h"
|
||||||
|
|
||||||
|
#include "MODBUSRTU/RUBUSTypes.h"
|
||||||
|
#include "MODBUSRTU/RUBUSRegister.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace MODBUSRTU
|
||||||
|
{
|
||||||
|
|
||||||
|
#define NUMBER_RUBUSCELLS ((uint16_t)(420))
|
||||||
|
|
||||||
|
class RUBUSDataBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
MODBUSRTU::RUBUSRegister m_cell[NUMBER_RUBUSCELLS];
|
||||||
|
uint16_t m_current_index_cell;
|
||||||
|
uint16_t m_index_cell;
|
||||||
|
uint16_t m_counter_cell;
|
||||||
|
uint16_t m_size_cell;
|
||||||
|
public:
|
||||||
|
RUBUSDataBase();
|
||||||
|
public:
|
||||||
|
void configurate();
|
||||||
|
public:
|
||||||
|
void add_register_bool (uint16_t index, uint16_t readonly, bool* param);
|
||||||
|
void add_register_float (uint16_t index, uint16_t readonly, float* param);
|
||||||
|
void add_register_uint8 (uint16_t index, uint16_t readonly, uint8_t* param);
|
||||||
|
void add_register_uint16(uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_uint32(uint16_t index, uint16_t readonly, uint32_t* param);
|
||||||
|
void add_register_int8 (uint16_t index, uint16_t readonly, int8_t* param);
|
||||||
|
void add_register_int16 (uint16_t index, uint16_t readonly, int16_t* param);
|
||||||
|
void add_register_int32 (uint16_t index, uint16_t readonly, int32_t* param);
|
||||||
|
void add_register_bit0 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit1 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit2 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit3 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit4 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit5 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit6 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit7 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit8 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit9 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit10 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit11 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit12 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit13 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit14 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit15 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit16 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit17 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit18 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit19 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit20 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit21 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit22 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit23 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit24 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit25 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit26 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit27 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit28 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit29 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit30 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void add_register_bit31 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
public:
|
||||||
|
MODBUSRTU::RUBUSRegister& get_register(uint16_t index);
|
||||||
|
void read_register(uint16_t index, RUBUS_REGISTER_32& data);
|
||||||
|
uint16_t write_register(uint16_t index, RUBUS_REGISTER_32 data);
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace MODBUSRTU */
|
||||||
|
|
||||||
|
#endif /* MODBUSRTU_RUBUSDATABASE_H_ */
|
@ -0,0 +1,862 @@
|
|||||||
|
/*
|
||||||
|
* RUBUSCell.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "MODBUSRTU/RUBUSRegister.h"
|
||||||
|
|
||||||
|
namespace MODBUSRTU
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
RUBUSRegister::RUBUSRegister():
|
||||||
|
m_index(0),
|
||||||
|
m_is_read_only(true),
|
||||||
|
m_param(0),
|
||||||
|
m_type(MODBUSRTU::RUBUS_UNDEFINED)
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
RUBUSRegister::RUBUSRegister(const RUBUSRegister& copyregister):
|
||||||
|
m_index(copyregister.m_index),
|
||||||
|
m_is_read_only(copyregister.m_is_read_only),
|
||||||
|
m_param(copyregister.m_param),
|
||||||
|
m_type(copyregister.m_type)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
void RUBUSRegister::register_bool (uint16_t index, uint16_t readonly, bool* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BOOL;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_float (uint16_t index, uint16_t readonly, float* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_FLOAT;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_uint8 (uint16_t index, uint16_t readonly, uint8_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_UINT8;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_uint16(uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_UINT16;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_uint32(uint16_t index, uint16_t readonly, uint32_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_UINT32;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_int8 (uint16_t index, uint16_t readonly, int8_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_INT8;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_int16 (uint16_t index, uint16_t readonly, int16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_INT16;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_int32 (uint16_t index, uint16_t readonly, int32_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_INT32;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit0 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT0;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit1 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT1;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit2 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT2;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit3 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT3;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit4 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT4;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit5 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT5;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit6 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT6;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit7 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT7;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit8 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT8;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit9 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT9;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit10 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT10;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit11 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT11;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit12 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT12;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit13 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT13;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit14 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT14;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit15 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT15;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit16 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT16;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit17 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT17;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit18 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT18;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit19 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT19;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit20 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT20;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit21 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT21;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit22 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT22;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit23 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT23;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit24 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT24;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit25 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT25;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit26 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT26;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit27 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT27;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit28 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT28;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit29 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT29;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit30 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT30;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void RUBUSRegister::register_bit31 (uint16_t index, uint16_t readonly, uint16_t* param)
|
||||||
|
{
|
||||||
|
m_index = index;
|
||||||
|
m_param = param;
|
||||||
|
m_type = MODBUSRTU::RUBUS_BIT31;
|
||||||
|
m_is_read_only = readonly == 0 ? false : true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
uint16_t RUBUSRegister::get_index()
|
||||||
|
{
|
||||||
|
return m_index;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
bool RUBUSRegister::is_read_only()
|
||||||
|
{
|
||||||
|
return m_is_read_only;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
MODBUSRTU::rubus_variant_type_t RUBUSRegister::get_type()
|
||||||
|
{
|
||||||
|
return m_type;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
MODBUSRTU::RUBUS_REGISTER_32 RUBUSRegister::read_register()
|
||||||
|
{
|
||||||
|
|
||||||
|
MODBUSRTU::RUBUS_REGISTER_32 _temp = MODBUSRTU::RUBUS_REGISTER_32(0);
|
||||||
|
_temp.word.wL.all = 0x0000;
|
||||||
|
_temp.word.wH.all = 0x0000;
|
||||||
|
|
||||||
|
|
||||||
|
switch(m_type)
|
||||||
|
{
|
||||||
|
case MODBUSRTU::RUBUS_BOOL: { _temp.b = *((bool*) m_param); break;}
|
||||||
|
case MODBUSRTU::RUBUS_FLOAT: { _temp.f = *((float*) m_param); break;}
|
||||||
|
case MODBUSRTU::RUBUS_UINT8: { _temp.u8 = *((uint8_t*) m_param); break;}
|
||||||
|
case MODBUSRTU::RUBUS_UINT16: { _temp.u16 = *((uint16_t*) m_param); break;}
|
||||||
|
case MODBUSRTU::RUBUS_UINT32: { _temp.u32 = *((uint32_t*) m_param); break;}
|
||||||
|
case MODBUSRTU::RUBUS_INT8: { _temp.i8 = *((int8_t*) m_param); break;}
|
||||||
|
case MODBUSRTU::RUBUS_INT16: { _temp.i16 = *((int16_t*) m_param); break;}
|
||||||
|
case MODBUSRTU::RUBUS_INT32: { _temp.i32 = *((int32_t*) m_param); break;}
|
||||||
|
case MODBUSRTU::RUBUS_BIT0:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0001);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT1:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0002);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT2:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0004);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT3:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0008);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT4:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0010);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT5:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0020);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT6:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0040);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT7:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0080);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT8:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0100);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT9:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0200);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT10:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0400);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT11:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x0800);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT12:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x1000);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT13:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x2000);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT14:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x4000);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT15:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wL.all, 0x8000);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT16:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0001);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT17:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0002);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT18:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0004);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT19:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0008);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT20:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0010);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT21:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0020);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT22:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0040);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT23:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0080);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT24:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0100);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT25:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0200);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT26:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0400);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT27:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x0800);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT28:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x1000);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT29:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x2000);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT30:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x4000);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT31:
|
||||||
|
{
|
||||||
|
_read_bit(_temp.word.wH.all, 0x8000);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}//switch
|
||||||
|
//
|
||||||
|
return _temp.all;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
uint16_t RUBUSRegister::write_register(MODBUSRTU::RUBUS_REGISTER_32 data)
|
||||||
|
{
|
||||||
|
|
||||||
|
MODBUSRTU::RUBUS_REGISTER_32 _temp = MODBUSRTU::RUBUS_REGISTER_32(0);
|
||||||
|
_temp.word.wL.all = 0x0000;
|
||||||
|
_temp.word.wH.all = 0x0000;
|
||||||
|
|
||||||
|
if(m_is_read_only)
|
||||||
|
{
|
||||||
|
// register is read only
|
||||||
|
// write operation is not allowed
|
||||||
|
return 0x0040;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// writeable register
|
||||||
|
switch(m_type)
|
||||||
|
{
|
||||||
|
case MODBUSRTU::RUBUS_BOOL: { *((bool*) m_param) = data.b; break;}
|
||||||
|
case MODBUSRTU::RUBUS_FLOAT: { *((float*) m_param) = data.f; break;}
|
||||||
|
case MODBUSRTU::RUBUS_UINT8: { *((uint8_t*) m_param) = data.u8; break;}
|
||||||
|
case MODBUSRTU::RUBUS_UINT16: { *((uint16_t*) m_param) = data.u16; break;}
|
||||||
|
case MODBUSRTU::RUBUS_UINT32: { *((uint32_t*) m_param) = data.u32; break;}
|
||||||
|
case MODBUSRTU::RUBUS_INT8: { *((int8_t*) m_param) = data.i8; break;}
|
||||||
|
case MODBUSRTU::RUBUS_INT16: { *((int16_t*) m_param) = data.i16; break;}
|
||||||
|
case MODBUSRTU::RUBUS_INT32: { *((int32_t*) m_param) = data.i32; break;}
|
||||||
|
case MODBUSRTU::RUBUS_BIT0:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b00 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = data.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT1:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b01 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT2:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b02 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT3:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b03 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT4:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b04 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT5:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b05 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT6:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b06 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT7:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b07 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT8:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b08 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT9:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b09 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT10:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b10 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT11:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b11 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT12:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b12 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT13:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b13 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT14:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b14 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT15:
|
||||||
|
{
|
||||||
|
_temp.u16 = *((uint16_t*) m_param);
|
||||||
|
_temp.bit16.b15 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.u16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT16:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b16 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT17:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b17 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT18:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b18 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT19:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b19 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT20:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b20 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT21:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b21 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT22:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b22 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT23:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b23 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT24:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b24 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT25:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b25 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT26:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b26 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT27:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b27 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT28:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b28 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT29:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b29 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT30:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b30 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MODBUSRTU::RUBUS_BIT31:
|
||||||
|
{
|
||||||
|
_temp.word.wH.all = *((uint16_t*) m_param);
|
||||||
|
_temp.bit32.b31 = data.bit16.b00;
|
||||||
|
*((uint16_t*) m_param) = _temp.word.wH.all;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}//switch
|
||||||
|
//
|
||||||
|
return 0;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
inline void RUBUSRegister::_read_bit(uint16_t& auxreg, uint16_t mask)
|
||||||
|
{
|
||||||
|
auxreg = *((uint16_t*) m_param);
|
||||||
|
auxreg &= mask;
|
||||||
|
auxreg = auxreg == 0 ? 0 : 1;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
} /* namespace MODBUSRTU */
|
@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* RUBUSCell.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MODBUSRTU_RUBUSREGISTER_H_
|
||||||
|
#define MODBUSRTU_RUBUSREGISTER_H_
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "framework.h"
|
||||||
|
|
||||||
|
#include "SYSCTRL/SystemEnvironment.h"
|
||||||
|
#include "MODBUSRTU/RUBUSTypes.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace MODBUSRTU
|
||||||
|
{
|
||||||
|
|
||||||
|
class RUBUSRegister
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint16_t m_index;
|
||||||
|
bool m_is_read_only;
|
||||||
|
void* m_param;
|
||||||
|
rubus_variant_type_t m_type;
|
||||||
|
public:
|
||||||
|
RUBUSRegister();
|
||||||
|
RUBUSRegister(const RUBUSRegister& cell);
|
||||||
|
public:
|
||||||
|
void register_bool (uint16_t index, uint16_t readonly, bool* param);
|
||||||
|
void register_float (uint16_t index, uint16_t readonly, float* param);
|
||||||
|
void register_uint8 (uint16_t index, uint16_t readonly, uint8_t* param);
|
||||||
|
void register_uint16(uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_uint32(uint16_t index, uint16_t readonly, uint32_t* param);
|
||||||
|
void register_int8 (uint16_t index, uint16_t readonly, int8_t* param);
|
||||||
|
void register_int16 (uint16_t index, uint16_t readonly, int16_t* param);
|
||||||
|
void register_int32 (uint16_t index, uint16_t readonly, int32_t* param);
|
||||||
|
void register_bit0 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit1 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit2 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit3 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit4 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit5 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit6 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit7 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit8 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit9 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit10 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit11 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit12 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit13 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit14 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit15 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit16 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit17 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit18 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit19 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit20 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit21 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit22 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit23 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit24 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit25 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit26 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit27 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit28 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit29 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit30 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
void register_bit31 (uint16_t index, uint16_t readonly, uint16_t* param);
|
||||||
|
public:
|
||||||
|
uint16_t get_index();
|
||||||
|
bool is_read_only();
|
||||||
|
MODBUSRTU::rubus_variant_type_t get_type();
|
||||||
|
public:
|
||||||
|
MODBUSRTU::RUBUS_REGISTER_32 read_register();
|
||||||
|
uint16_t write_register(MODBUSRTU::RUBUS_REGISTER_32 data);
|
||||||
|
private:
|
||||||
|
inline void _read_bit(uint16_t& auxreg, uint16_t mask);
|
||||||
|
//
|
||||||
|
};//
|
||||||
|
|
||||||
|
} /* namespace MODBUSRTU */
|
||||||
|
|
||||||
|
#endif /* MODBUSRTU_RUBUSREGISTER_H_ */
|
||||||
|
|
@ -0,0 +1,197 @@
|
|||||||
|
/*
|
||||||
|
* RUBUSTypes.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MODBUSRTU_RUBUSTYPES_H_
|
||||||
|
#define MODBUSRTU_RUBUSTYPES_H_
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "framework.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace MODBUSRTU
|
||||||
|
{
|
||||||
|
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
typedef signed char int8_t;
|
||||||
|
|
||||||
|
|
||||||
|
enum rubus_variant_type_t { RUBUS_UNDEFINED,
|
||||||
|
RUBUS_BOOL,
|
||||||
|
RUBUS_FLOAT,
|
||||||
|
RUBUS_UINT8,
|
||||||
|
RUBUS_UINT16,
|
||||||
|
RUBUS_UINT32,
|
||||||
|
RUBUS_INT8,
|
||||||
|
RUBUS_INT16,
|
||||||
|
RUBUS_INT32,
|
||||||
|
RUBUS_BIT0,
|
||||||
|
RUBUS_BIT1,
|
||||||
|
RUBUS_BIT2,
|
||||||
|
RUBUS_BIT3,
|
||||||
|
RUBUS_BIT4,
|
||||||
|
RUBUS_BIT5,
|
||||||
|
RUBUS_BIT6,
|
||||||
|
RUBUS_BIT7,
|
||||||
|
RUBUS_BIT8,
|
||||||
|
RUBUS_BIT9,
|
||||||
|
RUBUS_BIT10,
|
||||||
|
RUBUS_BIT11,
|
||||||
|
RUBUS_BIT12,
|
||||||
|
RUBUS_BIT13,
|
||||||
|
RUBUS_BIT14,
|
||||||
|
RUBUS_BIT15,
|
||||||
|
RUBUS_BIT16,
|
||||||
|
RUBUS_BIT17,
|
||||||
|
RUBUS_BIT18,
|
||||||
|
RUBUS_BIT19,
|
||||||
|
RUBUS_BIT20,
|
||||||
|
RUBUS_BIT21,
|
||||||
|
RUBUS_BIT22,
|
||||||
|
RUBUS_BIT23,
|
||||||
|
RUBUS_BIT24,
|
||||||
|
RUBUS_BIT25,
|
||||||
|
RUBUS_BIT26,
|
||||||
|
RUBUS_BIT27,
|
||||||
|
RUBUS_BIT28,
|
||||||
|
RUBUS_BIT29,
|
||||||
|
RUBUS_BIT30,
|
||||||
|
RUBUS_BIT31};
|
||||||
|
|
||||||
|
|
||||||
|
struct RUBUS_REGISTER_16_BIT_FIELD
|
||||||
|
{
|
||||||
|
uint16_t b00: 1;
|
||||||
|
uint16_t b01: 1;
|
||||||
|
uint16_t b02: 1;
|
||||||
|
uint16_t b03: 1;
|
||||||
|
uint16_t b04: 1;
|
||||||
|
uint16_t b05: 1;
|
||||||
|
uint16_t b06: 1;
|
||||||
|
uint16_t b07: 1;
|
||||||
|
uint16_t b08: 1;
|
||||||
|
uint16_t b09: 1;
|
||||||
|
uint16_t b10: 1;
|
||||||
|
uint16_t b11: 1;
|
||||||
|
uint16_t b12: 1;
|
||||||
|
uint16_t b13: 1;
|
||||||
|
uint16_t b14: 1;
|
||||||
|
uint16_t b15: 1;
|
||||||
|
};//RUBUS_REGISTER_16_BIT_FIELD
|
||||||
|
|
||||||
|
struct RUBUS_REGISTER_32_BIT_FIELD
|
||||||
|
{
|
||||||
|
uint32_t b00: 1;
|
||||||
|
uint32_t b01: 1;
|
||||||
|
uint32_t b02: 1;
|
||||||
|
uint32_t b03: 1;
|
||||||
|
uint32_t b04: 1;
|
||||||
|
uint32_t b05: 1;
|
||||||
|
uint32_t b06: 1;
|
||||||
|
uint32_t b07: 1;
|
||||||
|
uint32_t b08: 1;
|
||||||
|
uint32_t b09: 1;
|
||||||
|
uint32_t b10: 1;
|
||||||
|
uint32_t b11: 1;
|
||||||
|
uint32_t b12: 1;
|
||||||
|
uint32_t b13: 1;
|
||||||
|
uint32_t b14: 1;
|
||||||
|
uint32_t b15: 1;
|
||||||
|
uint32_t b16: 1;
|
||||||
|
uint32_t b17: 1;
|
||||||
|
uint32_t b18: 1;
|
||||||
|
uint32_t b19: 1;
|
||||||
|
uint32_t b20: 1;
|
||||||
|
uint32_t b21: 1;
|
||||||
|
uint32_t b22: 1;
|
||||||
|
uint32_t b23: 1;
|
||||||
|
uint32_t b24: 1;
|
||||||
|
uint32_t b25: 1;
|
||||||
|
uint32_t b26: 1;
|
||||||
|
uint32_t b27: 1;
|
||||||
|
uint32_t b28: 1;
|
||||||
|
uint32_t b29: 1;
|
||||||
|
uint32_t b30: 1;
|
||||||
|
uint32_t b31: 1;
|
||||||
|
};//RUBUS_REGISTER_32_BIT_FIELD
|
||||||
|
|
||||||
|
|
||||||
|
struct RUBUS_REGISTER_16_BYTE_FIELD
|
||||||
|
{
|
||||||
|
uint16_t bt0 :8;
|
||||||
|
uint16_t bt1 :8;
|
||||||
|
};//RUBUS_REGISTER_16_BYTE_FIELD
|
||||||
|
|
||||||
|
union RUBUS_REGISTER_16
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
RUBUS_REGISTER_16_BIT_FIELD bit;
|
||||||
|
RUBUS_REGISTER_16_BYTE_FIELD byte;
|
||||||
|
RUBUS_REGISTER_16(uint16_t val):
|
||||||
|
all(val)
|
||||||
|
{}
|
||||||
|
};//RUBUS_REGISTER_16
|
||||||
|
|
||||||
|
|
||||||
|
struct RUBUS_REGISTER_32_BYTE_FIELD
|
||||||
|
{
|
||||||
|
uint16_t bt0 :8;
|
||||||
|
uint16_t bt1 :8;
|
||||||
|
uint16_t bt2 :8;
|
||||||
|
uint16_t bt3 :8;
|
||||||
|
};//RUBUS_REGISTER_32_BYTE_FIELD
|
||||||
|
|
||||||
|
|
||||||
|
union RUBUS_REGISTER_16_WORD
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
RUBUS_REGISTER_16_BIT_FIELD bit;
|
||||||
|
RUBUS_REGISTER_16_BYTE_FIELD byte;
|
||||||
|
};//RUBUS_REGISTER_16_WORD
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct RUBUS_REGISTER_32_WORD_FIELD
|
||||||
|
{
|
||||||
|
RUBUS_REGISTER_16_WORD wL;
|
||||||
|
RUBUS_REGISTER_16_WORD wH;
|
||||||
|
};//RUBUS_REGISTER_32_WORD_FIELD
|
||||||
|
|
||||||
|
union RUBUS_REGISTER_32
|
||||||
|
{
|
||||||
|
uint32_t all;
|
||||||
|
bool b;
|
||||||
|
float f;
|
||||||
|
uint8_t u8;
|
||||||
|
uint16_t u16;
|
||||||
|
uint32_t u32;
|
||||||
|
int8_t i8;
|
||||||
|
int16_t i16;
|
||||||
|
int32_t i32;
|
||||||
|
RUBUS_REGISTER_16_BIT_FIELD bit16;
|
||||||
|
RUBUS_REGISTER_32_BIT_FIELD bit32;
|
||||||
|
RUBUS_REGISTER_32_WORD_FIELD word;
|
||||||
|
RUBUS_REGISTER_32_BYTE_FIELD byte;
|
||||||
|
RUBUS_REGISTER_32():
|
||||||
|
all((uint32_t)0)
|
||||||
|
{};
|
||||||
|
RUBUS_REGISTER_32(uint32_t val):
|
||||||
|
all(val)
|
||||||
|
{}
|
||||||
|
};//RUBUS_REGISTER_32
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace MODBUSRTU */
|
||||||
|
|
||||||
|
#endif /* MODBUSRTU_RUBUSTYPES_H_ */
|
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* ALERTHeaders.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ALERT_ALERTHEADERS_H_
|
||||||
|
#define ALERT_ALERTHEADERS_H_
|
||||||
|
|
||||||
|
#include "Alert/AlertBase.h"
|
||||||
|
#include "Alert/FaultDecrease.h"
|
||||||
|
#include "Alert/FaultExceed.h"
|
||||||
|
#include "Alert/WarningDecrease.h"
|
||||||
|
#include "Alert/WarningExceed.h"
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* ALERT_ALERTHEADERS_H_ */
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmBase.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmBase.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
AlgorithmBase::AlgorithmBase():
|
||||||
|
m_voltage_a(FP_ZERO),
|
||||||
|
m_voltage_b(FP_ZERO),
|
||||||
|
m_voltage_c(FP_ZERO)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmBase::get_ref_invertor_voltage(float& volt_a, float& volt_b, float& volt_c)
|
||||||
|
{
|
||||||
|
volt_a = m_voltage_a;
|
||||||
|
volt_b = m_voltage_b;
|
||||||
|
volt_c = m_voltage_c;
|
||||||
|
//
|
||||||
|
}//end
|
||||||
|
//
|
||||||
|
void AlgorithmBase::_execute_undef(){}
|
||||||
|
//
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmBase.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "SYSCTRL/SystemEnvironment.h"
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_ALGORITHMBASE_H_
|
||||||
|
#define SYSCTRL_ALGORITHMBASE_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
class AlgorithmBase
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
float m_voltage_a;
|
||||||
|
float m_voltage_b;
|
||||||
|
float m_voltage_c;
|
||||||
|
public:
|
||||||
|
AlgorithmBase();
|
||||||
|
public:
|
||||||
|
virtual void setup() = 0;
|
||||||
|
public:
|
||||||
|
virtual void reset() = 0;
|
||||||
|
public:
|
||||||
|
void get_ref_invertor_voltage(float& volt_a, float& volt_b, float& volt_c);
|
||||||
|
public:
|
||||||
|
virtual void execute() = 0;
|
||||||
|
protected:
|
||||||
|
void _execute_undef();
|
||||||
|
virtual void _execute_run() = 0;
|
||||||
|
//
|
||||||
|
};//AlgorithmBase
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_ALGORITHMBASE_H_ */
|
@ -0,0 +1,701 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmContext.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmContext.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
AlgorithmContext::AlgorithmContext(SYSCTRL::SystemEnvironment& env):
|
||||||
|
m_mode(SYSCTRL::AlgorithmContext::UNDEFINED),
|
||||||
|
m_algorithm(SYSCTRL::AlgorithmContext::UNKNOWN),
|
||||||
|
m_algorithm_previous(SYSCTRL::AlgorithmContext::UNKNOWN),
|
||||||
|
m_env(env),
|
||||||
|
m_algorithm_pointer(&m_off),
|
||||||
|
m_fault(env),
|
||||||
|
m_work(env),
|
||||||
|
m_stop(env),
|
||||||
|
m_start(env),
|
||||||
|
m_off(env),
|
||||||
|
m_source(env),
|
||||||
|
_strategy(&SYSCTRL::AlgorithmContext::_strategy_undef),
|
||||||
|
_set_fault(&SYSCTRL::AlgorithmContext::_set_empty_exe),
|
||||||
|
_set_work(&SYSCTRL::AlgorithmContext::_set_empty_exe),
|
||||||
|
_set_stop(&SYSCTRL::AlgorithmContext::_set_empty_exe),
|
||||||
|
_set_start(&SYSCTRL::AlgorithmContext::_set_empty_exe),
|
||||||
|
_set_off(&SYSCTRL::AlgorithmContext::_set_empty_exe),
|
||||||
|
_set_source(&SYSCTRL::AlgorithmContext::_set_empty_exe)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
|
||||||
|
void AlgorithmContext::setup()
|
||||||
|
{
|
||||||
|
static bool status = true;
|
||||||
|
if(m_mode == SYSCTRL::AlgorithmContext::UNDEFINED)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_algorithm = SYSCTRL::AlgorithmContext::UNKNOWN;
|
||||||
|
m_algorithm_previous = SYSCTRL::AlgorithmContext::UNKNOWN;
|
||||||
|
|
||||||
|
m_fault.setup();
|
||||||
|
m_work.setup();
|
||||||
|
m_stop.setup();
|
||||||
|
m_start.setup();
|
||||||
|
m_off.setup();
|
||||||
|
m_source.setup();
|
||||||
|
|
||||||
|
_strategy = &SYSCTRL::AlgorithmContext::_strategy_undef;
|
||||||
|
_set_fault = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
_set_work = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
_set_stop = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
_set_start = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
_set_off = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
_set_source = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
|
||||||
|
if(status)
|
||||||
|
{
|
||||||
|
m_mode = SYSCTRL::AlgorithmContext::CONFIGURATE;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void AlgorithmContext::configure()
|
||||||
|
{
|
||||||
|
static bool status = true;
|
||||||
|
if(m_mode == SYSCTRL::AlgorithmContext::CONFIGURATE)
|
||||||
|
{
|
||||||
|
|
||||||
|
_strategy = &SYSCTRL::AlgorithmContext::_strategy_off;
|
||||||
|
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
|
||||||
|
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
|
||||||
|
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
|
||||||
|
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
|
||||||
|
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
|
||||||
|
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
|
||||||
|
|
||||||
|
if(status)
|
||||||
|
{
|
||||||
|
m_algorithm = SYSCTRL::AlgorithmContext::OFF;
|
||||||
|
m_algorithm_previous = SYSCTRL::AlgorithmContext::OFF;
|
||||||
|
|
||||||
|
m_mode = SYSCTRL::AlgorithmContext::OPERATIONAL;
|
||||||
|
set_strategy_off();
|
||||||
|
set_off();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
SYSCTRL::AlgorithmContext::mode_t AlgorithmContext::get_mode()
|
||||||
|
{
|
||||||
|
return m_mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
SYSCTRL::AlgorithmContext::algorithm_t AlgorithmContext::get_algorithm()
|
||||||
|
{
|
||||||
|
return m_algorithm;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool AlgorithmContext::compare(const SYSCTRL::AlgorithmContext::mode_t mode)
|
||||||
|
{
|
||||||
|
return mode == m_mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool AlgorithmContext::compare_algorithm(const SYSCTRL::AlgorithmContext::algorithm_t algorithm)
|
||||||
|
{
|
||||||
|
return algorithm == m_algorithm;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::get_ref_invertor_voltage(float& volt_a, float& volt_b, float& volt_c)
|
||||||
|
{
|
||||||
|
m_algorithm_pointer->get_ref_invertor_voltage(volt_a, volt_b, volt_c);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::strategy()
|
||||||
|
{
|
||||||
|
(this->*_strategy)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void AlgorithmContext::_strategy_undef()
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_strategy_fault()
|
||||||
|
{
|
||||||
|
if((!m_env.system_fault.boolbit.b0)&&(m_env.system_reset.boolbit.b0))
|
||||||
|
{
|
||||||
|
set_strategy_off();
|
||||||
|
set_off();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_strategy_work()
|
||||||
|
{
|
||||||
|
if(m_env.system_fault.boolbit.b0)
|
||||||
|
{
|
||||||
|
m_env.enable_work_reset.boolbit.b0 = true;
|
||||||
|
set_strategy_fault();
|
||||||
|
set_fault();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if(!m_env.enable_work.boolbit.b0)
|
||||||
|
{
|
||||||
|
m_env.enable_work_reset.boolbit.b0 = true;
|
||||||
|
set_strategy_off();
|
||||||
|
set_off();
|
||||||
|
//
|
||||||
|
}else{
|
||||||
|
|
||||||
|
if((m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) |
|
||||||
|
((m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on)))
|
||||||
|
{
|
||||||
|
//m_env.reference_intensity_voltage_load_direct.set_output(m_env.voltage_load_active);
|
||||||
|
//m_env.reference_intensity_voltage_load_quadrature.set_output(m_env.voltage_load_reactive);
|
||||||
|
|
||||||
|
set_strategy_stop();
|
||||||
|
set_stop();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
}
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_strategy_stop()
|
||||||
|
{
|
||||||
|
if(m_env.system_fault.boolbit.b0)
|
||||||
|
{
|
||||||
|
m_env.enable_work_reset.boolbit.b0 = true;
|
||||||
|
set_strategy_fault();
|
||||||
|
set_fault();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!m_env.enable_work.boolbit.b0 |
|
||||||
|
//(m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) |
|
||||||
|
//(m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on)
|
||||||
|
m_env.auxiliary_km2.state.signal.is_on
|
||||||
|
)
|
||||||
|
{
|
||||||
|
m_env.enable_work_reset.boolbit.b0 = true;
|
||||||
|
set_strategy_off();
|
||||||
|
set_off();
|
||||||
|
//
|
||||||
|
}
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_strategy_start()
|
||||||
|
{
|
||||||
|
if(m_env.system_fault.boolbit.b0)
|
||||||
|
{
|
||||||
|
m_env.enable_work_reset.boolbit.b0 = true;
|
||||||
|
set_strategy_fault();
|
||||||
|
set_fault();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!m_env.enable_work.boolbit.b0)
|
||||||
|
{
|
||||||
|
m_env.enable_work_reset.boolbit.b0 = true;
|
||||||
|
set_strategy_off();
|
||||||
|
set_off();
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
if((m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) |
|
||||||
|
((m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
m_env.enable_work_reset.boolbit.b0 = true;
|
||||||
|
set_strategy_off();
|
||||||
|
set_off();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(m_env.auxiliary_km2.state.signal.is_off)
|
||||||
|
{
|
||||||
|
//m_env.regulator_voltage_load_a.set_output(m_env.reference.start.voltage_a);
|
||||||
|
//m_env.regulator_voltage_load_b.set_output(m_env.reference.start.voltage_b);
|
||||||
|
//m_env.regulator_voltage_load_c.set_output(m_env.reference.start.voltage_c);
|
||||||
|
//
|
||||||
|
//m_env.current_regulator_active.reset();
|
||||||
|
//m_env.current_regulator_reactive.reset();
|
||||||
|
//
|
||||||
|
set_strategy_work();
|
||||||
|
set_work();
|
||||||
|
//
|
||||||
|
//set_strategy_stop();
|
||||||
|
//set_stop();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_strategy_off()
|
||||||
|
{
|
||||||
|
if(m_env.system_fault.boolbit.b0)
|
||||||
|
{
|
||||||
|
set_strategy_fault();
|
||||||
|
set_fault();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(m_env.enable_work_is_on.boolbit.b0)
|
||||||
|
{
|
||||||
|
set_strategy_start();
|
||||||
|
set_start();
|
||||||
|
//
|
||||||
|
//set_strategy_source();
|
||||||
|
//set_source();
|
||||||
|
//
|
||||||
|
//set_strategy_stop();
|
||||||
|
//set_stop();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_strategy_source()
|
||||||
|
{
|
||||||
|
if(m_env.system_fault.boolbit.b0)
|
||||||
|
{
|
||||||
|
m_env.enable_work_reset.boolbit.b0 = true;
|
||||||
|
set_strategy_fault();
|
||||||
|
set_fault();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if((!m_env.enable_work.boolbit.b0) |
|
||||||
|
(m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) |
|
||||||
|
((m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
m_env.enable_work_reset.boolbit.b0 = true;
|
||||||
|
set_strategy_off();
|
||||||
|
set_off();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_strategy_fault()
|
||||||
|
{
|
||||||
|
_strategy = &SYSCTRL::AlgorithmContext::_strategy_fault;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_strategy_work()
|
||||||
|
{
|
||||||
|
_strategy = &SYSCTRL::AlgorithmContext::_strategy_work;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_strategy_stop()
|
||||||
|
{
|
||||||
|
_strategy = &SYSCTRL::AlgorithmContext::_strategy_stop;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_strategy_start()
|
||||||
|
{
|
||||||
|
_strategy = &SYSCTRL::AlgorithmContext::_strategy_start;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_strategy_off()
|
||||||
|
{
|
||||||
|
_strategy = &SYSCTRL::AlgorithmContext::_strategy_off;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_strategy_source()
|
||||||
|
{
|
||||||
|
_strategy = &SYSCTRL::AlgorithmContext::_strategy_source;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_fault()
|
||||||
|
{
|
||||||
|
(this->*_set_fault)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_work()
|
||||||
|
{
|
||||||
|
(this->*_set_work)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_stop()
|
||||||
|
{
|
||||||
|
(this->*_set_stop)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_start()
|
||||||
|
{
|
||||||
|
(this->*_set_start)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_off()
|
||||||
|
{
|
||||||
|
(this->*_set_off)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::set_source()
|
||||||
|
{
|
||||||
|
(this->*_set_source)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::execute()
|
||||||
|
{
|
||||||
|
m_algorithm_pointer->execute();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_set_fault_exe()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_algorithm_previous = m_algorithm;
|
||||||
|
m_algorithm = SYSCTRL::AlgorithmContext::FAULT;
|
||||||
|
//
|
||||||
|
_set_fault = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
|
||||||
|
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
|
||||||
|
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
|
||||||
|
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
|
||||||
|
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
|
||||||
|
//
|
||||||
|
m_env.timer_start.reset();
|
||||||
|
m_env.timer_stop.reset();
|
||||||
|
//
|
||||||
|
m_algorithm_pointer = &m_fault;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_set_work_exe()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_algorithm_previous = m_algorithm;
|
||||||
|
m_algorithm = SYSCTRL::AlgorithmContext::WORK;
|
||||||
|
//
|
||||||
|
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
|
||||||
|
_set_work = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
|
||||||
|
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
|
||||||
|
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
|
||||||
|
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
//
|
||||||
|
m_env.regulator_voltage_load_direct.reset();
|
||||||
|
m_env.regulator_voltage_load_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.integrator_direct.reset();
|
||||||
|
m_env.integrator_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.regulator_current_limit.set_to_low_saturation();
|
||||||
|
m_env.regulator_current_pfc.reset();
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
//
|
||||||
|
m_env.regulator_dc_a.reset();
|
||||||
|
m_env.regulator_dc_b.reset();
|
||||||
|
m_env.regulator_dc_c.reset();
|
||||||
|
//
|
||||||
|
m_env.regulator_current_limit_a.set_to_high_saturation();
|
||||||
|
m_env.regulator_current_pfc_a.reset();
|
||||||
|
|
||||||
|
m_env.regulator_current_limit_b.set_to_high_saturation();
|
||||||
|
m_env.regulator_current_pfc_b.reset();
|
||||||
|
|
||||||
|
m_env.regulator_current_limit_c.set_to_high_saturation();
|
||||||
|
m_env.regulator_current_pfc_c.reset();
|
||||||
|
|
||||||
|
m_env.regulator_voltage_load_a_active.reset();
|
||||||
|
m_env.regulator_voltage_load_a_reactive.reset();
|
||||||
|
|
||||||
|
m_env.regulator_voltage_load_b_active.reset();
|
||||||
|
m_env.regulator_voltage_load_b_reactive.reset();
|
||||||
|
|
||||||
|
m_env.regulator_voltage_load_c_active.reset();
|
||||||
|
m_env.regulator_voltage_load_c_reactive.reset();
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
|
||||||
|
m_env.drc_positive_voltage_controller_direct.reset();
|
||||||
|
m_env.drc_positive_voltage_controller_quadrature.reset();
|
||||||
|
m_env.drc_negative_voltage_controller_direct.reset();
|
||||||
|
m_env.drc_negative_voltage_controller_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.drc_regulator_current_limit.set_to_low_saturation();
|
||||||
|
m_env.drc_regulator_current_pfc.reset();
|
||||||
|
|
||||||
|
m_env.drc_reference_voltage_direct_intensity.set_output(m_env.drc_voltage_grid_direct);
|
||||||
|
m_work.reset_switcher();
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
m_env.timer_start.reset();
|
||||||
|
m_env.timer_stop.reset();
|
||||||
|
//
|
||||||
|
m_algorithm_pointer = &m_work;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_set_stop_exe()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_algorithm_previous = m_algorithm;
|
||||||
|
m_algorithm = SYSCTRL::AlgorithmContext::STOP;
|
||||||
|
//
|
||||||
|
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
|
||||||
|
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
|
||||||
|
_set_stop = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
|
||||||
|
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
|
||||||
|
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
|
||||||
|
//
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
m_env.reference_voltage_direct_intensity.set_output(m_env.regulator_current_limit.get_output());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
//m_env.drc_reference_voltage_direct_intensity.set_output(m_env.drc_voltage_grid_direct);
|
||||||
|
m_env.drc_reference_voltage_direct_intensity.set_output(m_env.drc_regulator_current_limit.get_output());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
/* FOR DEBUG ONLY!!!! */
|
||||||
|
/*
|
||||||
|
m_env.regulator_voltage_load_a_active.reset();
|
||||||
|
m_env.regulator_voltage_load_a_reactive.reset();
|
||||||
|
|
||||||
|
m_env.regulator_voltage_load_b_active.reset();
|
||||||
|
m_env.regulator_voltage_load_b_reactive.reset();
|
||||||
|
|
||||||
|
m_env.regulator_voltage_load_c_active.reset();
|
||||||
|
m_env.regulator_voltage_load_c_reactive.reset();
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* FOR DEBUG ONLY!!!! */
|
||||||
|
/* VECTOR CONTROL */
|
||||||
|
/*
|
||||||
|
m_env.regulator_voltage_load_direct.reset();
|
||||||
|
m_env.regulator_voltage_load_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.integrator_direct.reset();
|
||||||
|
m_env.integrator_quadrature.reset();
|
||||||
|
*/
|
||||||
|
//
|
||||||
|
m_env.timer_start.reset();
|
||||||
|
m_env.timer_stop.start();
|
||||||
|
//
|
||||||
|
m_algorithm_pointer = &m_stop;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_set_start_exe()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_algorithm_previous = m_algorithm;
|
||||||
|
m_algorithm = SYSCTRL::AlgorithmContext::START;
|
||||||
|
//
|
||||||
|
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
|
||||||
|
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
|
||||||
|
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
|
||||||
|
_set_start = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
|
||||||
|
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
|
||||||
|
//
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
//
|
||||||
|
m_env.regulator_current_load_direct.reset();
|
||||||
|
m_env.regulator_current_load_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.referencer_current_bypass_direct.reset();
|
||||||
|
m_env.referencer_current_bypass_quadrature.reset();
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
//
|
||||||
|
m_env.current_referencer_a_active.reset();
|
||||||
|
m_env.current_referencer_a_reactive.reset();
|
||||||
|
m_env.current_referencer_b_active.reset();
|
||||||
|
m_env.current_referencer_b_reactive.reset();
|
||||||
|
m_env.current_referencer_c_active.reset();
|
||||||
|
m_env.current_referencer_c_reactive.reset();
|
||||||
|
//
|
||||||
|
m_env.current_regulator_a_active.reset();
|
||||||
|
m_env.current_regulator_a_reactive.reset();
|
||||||
|
m_env.current_regulator_b_active.reset();
|
||||||
|
m_env.current_regulator_b_reactive.reset();
|
||||||
|
m_env.current_regulator_c_active.reset();
|
||||||
|
m_env.current_regulator_c_reactive.reset();
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
//
|
||||||
|
m_env.drc_regulator_current_load_direct.reset();
|
||||||
|
m_env.drc_regulator_current_load_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.drc_referencer_current_bypass_direct.reset();
|
||||||
|
m_env.drc_referencer_current_bypass_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.drc_positive_voltage_cell_direct = FP_ZERO;
|
||||||
|
m_env.drc_positive_voltage_cell_quadrature = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_direct = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_quadrature = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_env.drc_positive_voltage_cell_alpha = FP_ZERO;
|
||||||
|
m_env.drc_positive_voltage_cell_beta = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_alpha = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_beta = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_env.drc_positive_voltage_cell_a = FP_ZERO;
|
||||||
|
m_env.drc_positive_voltage_cell_b = FP_ZERO;
|
||||||
|
m_env.drc_positive_voltage_cell_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_env.drc_negative_voltage_cell_a = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_b = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
m_env.timer_start.start();
|
||||||
|
m_env.timer_stop.reset();
|
||||||
|
//
|
||||||
|
m_algorithm_pointer = &m_start;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_set_off_exe()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_algorithm_previous = m_algorithm;
|
||||||
|
m_algorithm = SYSCTRL::AlgorithmContext::OFF;
|
||||||
|
//
|
||||||
|
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
|
||||||
|
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
|
||||||
|
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
|
||||||
|
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
|
||||||
|
_set_off = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
|
||||||
|
//
|
||||||
|
m_env.timer_start.reset();
|
||||||
|
m_env.timer_stop.reset();
|
||||||
|
//
|
||||||
|
m_algorithm_pointer = &m_off;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmContext::_set_source_exe()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_algorithm_previous = m_algorithm;
|
||||||
|
m_algorithm = SYSCTRL::AlgorithmContext::SOURCE;
|
||||||
|
//
|
||||||
|
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
|
||||||
|
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
|
||||||
|
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
|
||||||
|
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
|
||||||
|
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
|
||||||
|
_set_source = &SYSCTRL::AlgorithmContext::_set_empty_exe;
|
||||||
|
//
|
||||||
|
m_env.timer_start.reset();
|
||||||
|
m_env.timer_stop.reset();
|
||||||
|
//
|
||||||
|
m_algorithm_pointer = &m_source;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void AlgorithmContext::_set_empty_exe()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmContext.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmBase.h"
|
||||||
|
#include "SYSCTRL/AlgorithmFault.h"
|
||||||
|
#include "SYSCTRL/AlgorithmOff.h"
|
||||||
|
#include "SYSCTRL/AlgorithmSource.h"
|
||||||
|
#include "SYSCTRL/AlgorithmStart.h"
|
||||||
|
#include "SYSCTRL/AlgorithmStop.h"
|
||||||
|
#include "SYSCTRL/AlgorithmWork.h"
|
||||||
|
#include "SYSCTRL/AlgorithmZero.h"
|
||||||
|
#include "SYSCTRL/SystemEnvironment.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_ALGORITHMCONTEXT_H_
|
||||||
|
#define SYSCTRL_ALGORITHMCONTEXT_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
class AlgorithmContext
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
friend class SYSCTRL::AlgorithmBase;
|
||||||
|
friend class SYSCTRL::AlgorithmFault;
|
||||||
|
friend class SYSCTRL::AlgorithmWork;
|
||||||
|
friend class SYSCTRL::AlgorithmStop;
|
||||||
|
friend class SYSCTRL::AlgorithmStart;
|
||||||
|
friend class SYSCTRL::AlgorithmOff;
|
||||||
|
friend class SYSCTRL::AlgorithmSource;
|
||||||
|
public:
|
||||||
|
enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL};
|
||||||
|
enum algorithm_t {UNKNOWN, OFF, START, ENTRY, WORK, STOP, FAULT, SOURCE};
|
||||||
|
private:
|
||||||
|
mode_t m_mode;
|
||||||
|
algorithm_t m_algorithm;
|
||||||
|
algorithm_t m_algorithm_previous;
|
||||||
|
private:
|
||||||
|
SYSCTRL::SystemEnvironment& m_env;
|
||||||
|
private:
|
||||||
|
SYSCTRL::AlgorithmBase* m_algorithm_pointer;
|
||||||
|
SYSCTRL::AlgorithmFault m_fault;
|
||||||
|
SYSCTRL::AlgorithmWork m_work;
|
||||||
|
SYSCTRL::AlgorithmStop m_stop;
|
||||||
|
SYSCTRL::AlgorithmStart m_start;
|
||||||
|
SYSCTRL::AlgorithmOff m_off;
|
||||||
|
SYSCTRL::AlgorithmSource m_source;
|
||||||
|
public:
|
||||||
|
AlgorithmContext(SYSCTRL::SystemEnvironment& env);
|
||||||
|
void setup();
|
||||||
|
void configure();
|
||||||
|
public:
|
||||||
|
mode_t get_mode();
|
||||||
|
algorithm_t get_algorithm();
|
||||||
|
bool compare(const mode_t mode);
|
||||||
|
bool compare_algorithm(const algorithm_t algorithm);
|
||||||
|
public:
|
||||||
|
void get_ref_invertor_voltage(float& volt_a, float& volt_b, float& volt_c);
|
||||||
|
public:
|
||||||
|
void strategy();
|
||||||
|
private:
|
||||||
|
void (AlgorithmContext::*_strategy)();
|
||||||
|
void _strategy_undef();
|
||||||
|
void _strategy_fault();
|
||||||
|
void _strategy_work();
|
||||||
|
void _strategy_stop();
|
||||||
|
void _strategy_start();
|
||||||
|
void _strategy_off();
|
||||||
|
void _strategy_source();
|
||||||
|
public:
|
||||||
|
void set_strategy_fault();
|
||||||
|
void set_strategy_work();
|
||||||
|
void set_strategy_stop();
|
||||||
|
void set_strategy_start();
|
||||||
|
void set_strategy_off();
|
||||||
|
void set_strategy_source();
|
||||||
|
public:
|
||||||
|
void execute();
|
||||||
|
public:
|
||||||
|
void set_fault();
|
||||||
|
void set_work();
|
||||||
|
void set_stop();
|
||||||
|
void set_start();
|
||||||
|
void set_off();
|
||||||
|
void set_source();
|
||||||
|
private:
|
||||||
|
void (AlgorithmContext::*_set_fault)();
|
||||||
|
void (AlgorithmContext::*_set_work)();
|
||||||
|
void (AlgorithmContext::*_set_stop)();
|
||||||
|
void (AlgorithmContext::*_set_start)();
|
||||||
|
void (AlgorithmContext::*_set_off)();
|
||||||
|
void (AlgorithmContext::*_set_source)();
|
||||||
|
void _set_fault_exe();
|
||||||
|
void _set_work_exe();
|
||||||
|
void _set_stop_exe();
|
||||||
|
void _set_start_exe();
|
||||||
|
void _set_off_exe();
|
||||||
|
void _set_source_exe();
|
||||||
|
void _set_empty_exe();
|
||||||
|
//
|
||||||
|
};//class AlgorithmContext
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_ALGORITHMCONTEXT_H_ */
|
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmFault.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmFault.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
AlgorithmFault::AlgorithmFault(SYSCTRL::SystemEnvironment& env):
|
||||||
|
SYSCTRL::AlgorithmBase(),
|
||||||
|
m_env(env),
|
||||||
|
_execute(&SYSCTRL::AlgorithmFault::_execute_undef)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void AlgorithmFault::setup()
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::AlgorithmFault::_execute_run;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmFault::reset()
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmFault::execute()
|
||||||
|
{
|
||||||
|
(this->*_execute)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmFault::_execute_run()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
//
|
||||||
|
m_voltage_a = FP_ZERO;
|
||||||
|
m_voltage_b = FP_ZERO;
|
||||||
|
m_voltage_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmFault.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_ALGORITHMFAULT_H_
|
||||||
|
#define SYSCTRL_ALGORITHMFAULT_H_
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmBase.h"
|
||||||
|
#include "SYSCTRL/HeadersFLTSYSLIB.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
class AlgorithmFault: public AlgorithmBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
SYSCTRL::SystemEnvironment& m_env;
|
||||||
|
public:
|
||||||
|
AlgorithmFault(SYSCTRL::SystemEnvironment& env);
|
||||||
|
public:
|
||||||
|
void setup();
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute();
|
||||||
|
private:
|
||||||
|
void (AlgorithmFault::*_execute)();
|
||||||
|
void _execute_run();
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_ALGORITHMFAULT_H_ */
|
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* AlgoritmOff.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmOff.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
AlgorithmOff::AlgorithmOff(SYSCTRL::SystemEnvironment& env):
|
||||||
|
SYSCTRL::AlgorithmBase(),
|
||||||
|
m_env(env),
|
||||||
|
_execute(&SYSCTRL::AlgorithmOff::_execute_undef)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void AlgorithmOff::setup()
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::AlgorithmOff::_execute_run;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmOff::reset()
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmOff::execute()
|
||||||
|
{
|
||||||
|
(this->*_execute)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmOff::_execute_run()
|
||||||
|
{
|
||||||
|
static bool _high_level = true;
|
||||||
|
_high_level = true;
|
||||||
|
|
||||||
|
if(m_env.system_reset.boolbit.b0)
|
||||||
|
{
|
||||||
|
m_env.hardware.ref_control_order = ORDER_RESET;
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
for(Uint16 cellnum = 0; cellnum < m_env.hardware.level; cellnum++)
|
||||||
|
{
|
||||||
|
_high_level &= m_env.hardware.hvcell.dc_voltage[0][cellnum] > m_env.hardware.dc_voltage_low_level ? true : false;
|
||||||
|
_high_level &= m_env.hardware.hvcell.dc_voltage[1][cellnum] > m_env.hardware.dc_voltage_low_level ? true : false;
|
||||||
|
_high_level &= m_env.hardware.hvcell.dc_voltage[2][cellnum] > m_env.hardware.dc_voltage_low_level ? true : false;
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
if(!_high_level & m_env.hardware.low_level())
|
||||||
|
{
|
||||||
|
m_env.hardware.ref_control_order = ORDER_RESET;
|
||||||
|
m_env.hardware.fault_low_level = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
m_voltage_a = FP_ZERO;
|
||||||
|
m_voltage_b = FP_ZERO;
|
||||||
|
m_voltage_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* AlgoritmOff.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_ALGORITMSTOPPED_H_
|
||||||
|
#define SYSCTRL_ALGORITMSTOPPED_H_
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmBase.h"
|
||||||
|
#include "SYSCTRL/HeadersFLTSYSLIB.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
class AlgorithmOff: public AlgorithmBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
SYSCTRL::SystemEnvironment& m_env;
|
||||||
|
public:
|
||||||
|
AlgorithmOff(SYSCTRL::SystemEnvironment& env);
|
||||||
|
public:
|
||||||
|
void setup();
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute();
|
||||||
|
private:
|
||||||
|
void (AlgorithmOff::*_execute)();
|
||||||
|
void _execute_run();
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_ALGORITMSTOPPED_H_ */
|
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmSource.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmSource.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
AlgorithmSource::AlgorithmSource(SYSCTRL::SystemEnvironment& env):
|
||||||
|
AlgorithmBase(),
|
||||||
|
m_env(env),
|
||||||
|
m_voltage_direct(FP_ZERO),
|
||||||
|
m_voltage_quadrature(FP_ZERO),
|
||||||
|
m_voltage_alpha(FP_ZERO),
|
||||||
|
m_voltage_beta(FP_ZERO),
|
||||||
|
m_voltage_a_gen(FP_ZERO),
|
||||||
|
m_voltage_b_gen(FP_ZERO),
|
||||||
|
m_voltage_c_gen(FP_ZERO),
|
||||||
|
m_voltage_a_relative(FP_ZERO),
|
||||||
|
m_voltage_b_relative(FP_ZERO),
|
||||||
|
m_voltage_c_relative(FP_ZERO),
|
||||||
|
m_ort_alpha(FP_ZERO),
|
||||||
|
m_ort_beta(FP_ZERO),
|
||||||
|
_execute(&SYSCTRL::AlgorithmSource::_execute_undef)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void AlgorithmSource::setup()
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::AlgorithmSource::_execute_run;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmSource::reset()
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmSource::execute()
|
||||||
|
{
|
||||||
|
(this->*_execute)();
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmSource::_execute_run()
|
||||||
|
{
|
||||||
|
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
|
||||||
|
m_voltage_direct = m_env.algorithm_source_references.voltage * cosf(m_env.algorithm_source_references.phase_shift);
|
||||||
|
m_voltage_quadrature = m_env.algorithm_source_references.voltage * sinf(m_env.algorithm_source_references.phase_shift);
|
||||||
|
//
|
||||||
|
m_ort_alpha = m_env.main_ab_orts.active;
|
||||||
|
m_ort_beta = m_env.main_ab_orts.reactive;
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::park_inverse(m_ort_alpha, m_ort_beta, m_voltage_direct, m_voltage_quadrature, m_voltage_alpha, m_voltage_beta);
|
||||||
|
FLTSYSLIB::Transformation::clarke_inverse(m_voltage_alpha, m_voltage_beta, m_voltage_a_gen, m_voltage_b_gen, m_voltage_c_gen);
|
||||||
|
//
|
||||||
|
m_voltage_a_relative = m_voltage_a_gen * m_env.cell_dc_voltage_a_reciprocal;
|
||||||
|
m_voltage_b_relative = m_voltage_b_gen * m_env.cell_dc_voltage_b_reciprocal;
|
||||||
|
m_voltage_c_relative = m_voltage_c_gen * m_env.cell_dc_voltage_c_reciprocal;
|
||||||
|
//
|
||||||
|
m_voltage_a = m_voltage_a_relative;
|
||||||
|
m_voltage_b = m_voltage_b_relative;
|
||||||
|
m_voltage_c = m_voltage_c_relative;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmSource.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_ALGIRITHMSOURCE_H_
|
||||||
|
#define SYSCTRL_ALGIRITHMSOURCE_H_
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmBase.h"
|
||||||
|
#include "SYSCTRL/HeadersFLTSYSLIB.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
class AlgorithmSource: public AlgorithmBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
SYSCTRL::SystemEnvironment& m_env;
|
||||||
|
private:
|
||||||
|
float m_voltage_direct;
|
||||||
|
float m_voltage_quadrature;
|
||||||
|
float m_voltage_alpha;
|
||||||
|
float m_voltage_beta;
|
||||||
|
float m_voltage_a_gen;
|
||||||
|
float m_voltage_b_gen;
|
||||||
|
float m_voltage_c_gen;
|
||||||
|
float m_voltage_a_relative;
|
||||||
|
float m_voltage_b_relative;
|
||||||
|
float m_voltage_c_relative;
|
||||||
|
float m_ort_alpha;
|
||||||
|
float m_ort_beta;
|
||||||
|
public:
|
||||||
|
AlgorithmSource(SYSCTRL::SystemEnvironment& env);
|
||||||
|
public:
|
||||||
|
void setup();
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute();
|
||||||
|
private:
|
||||||
|
void (AlgorithmSource::*_execute)();
|
||||||
|
void _execute_run();
|
||||||
|
//
|
||||||
|
};//class AlgirithmSource
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_ALGIRITHMSOURCE_H_ */
|
@ -0,0 +1,291 @@
|
|||||||
|
/*
|
||||||
|
* AlgoritmStart.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmStart.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
AlgorithmStart::AlgorithmStart(SYSCTRL::SystemEnvironment& env):
|
||||||
|
SYSCTRL::AlgorithmBase(),
|
||||||
|
m_env(env),
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
m_reference_zero(FP_ZERO),
|
||||||
|
m_reference_current_cell_direct(FP_ZERO),
|
||||||
|
m_reference_current_cell_quadrature(FP_ZERO),
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
m_reference_zero(FP_ZERO),
|
||||||
|
m_reference_current_cell_direct(FP_ZERO),
|
||||||
|
m_reference_current_cell_quadrature(FP_ZERO),
|
||||||
|
#endif
|
||||||
|
_execute(&SYSCTRL::AlgorithmStart::_execute_undef)
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void AlgorithmStart::setup()
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::AlgorithmStart::_execute_run;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmStart::reset()
|
||||||
|
{
|
||||||
|
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
//
|
||||||
|
m_env.regulator_current_load_direct.reset();
|
||||||
|
m_env.regulator_current_load_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.referencer_current_bypass_direct.reset();
|
||||||
|
m_env.referencer_current_bypass_quadrature.reset();
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
m_env.current_referencer_a_active.reset();
|
||||||
|
m_env.current_referencer_a_reactive.reset();
|
||||||
|
m_env.current_referencer_b_active.reset();
|
||||||
|
m_env.current_referencer_b_reactive.reset();
|
||||||
|
m_env.current_referencer_c_active.reset();
|
||||||
|
m_env.current_referencer_c_reactive.reset();
|
||||||
|
|
||||||
|
m_env.current_regulator_a_active.reset();
|
||||||
|
m_env.current_regulator_a_reactive.reset();
|
||||||
|
m_env.current_regulator_b_active.reset();
|
||||||
|
m_env.current_regulator_b_reactive.reset();
|
||||||
|
m_env.current_regulator_c_active.reset();
|
||||||
|
m_env.current_regulator_c_reactive.reset();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
//
|
||||||
|
m_env.drc_regulator_current_load_direct.reset();
|
||||||
|
m_env.drc_regulator_current_load_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.drc_referencer_current_bypass_direct.reset();
|
||||||
|
m_env.drc_referencer_current_bypass_quadrature.reset();
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
m_voltage_a = FP_ZERO;
|
||||||
|
m_voltage_b = FP_ZERO;
|
||||||
|
m_voltage_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmStart::execute()
|
||||||
|
{
|
||||||
|
(this->*_execute)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmStart::_execute_run()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
//
|
||||||
|
m_env.timer_start.execute();
|
||||||
|
//
|
||||||
|
m_reference_current_cell_direct = m_env.referencer_current_bypass_direct.execute(m_reference_zero, m_env.current_bypass_direct);
|
||||||
|
m_reference_current_cell_quadrature = m_env.referencer_current_bypass_quadrature.execute(m_reference_zero, m_env.current_bypass_quadrature);
|
||||||
|
//
|
||||||
|
m_env.voltage_cell_direct = m_env.regulator_current_load_direct.execute(m_env.current_cell_direct, m_reference_current_cell_direct);
|
||||||
|
m_env.voltage_cell_quadrature = m_env.regulator_current_load_quadrature.execute(m_env.current_cell_quadrature, m_reference_current_cell_quadrature);
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active,
|
||||||
|
m_env.main_ab_orts.reactive,
|
||||||
|
m_env.voltage_cell_direct,
|
||||||
|
m_env.voltage_cell_quadrature,
|
||||||
|
m_env.voltage_cell_alpha,
|
||||||
|
m_env.voltage_cell_beta);
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::clarke_inverse(m_env.voltage_cell_alpha,
|
||||||
|
m_env.voltage_cell_beta,
|
||||||
|
m_env.voltage_cell_a,
|
||||||
|
m_env.voltage_cell_b,
|
||||||
|
m_env.voltage_cell_c);
|
||||||
|
//
|
||||||
|
m_voltage_a = m_env.voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal;
|
||||||
|
m_voltage_b = m_env.voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal;
|
||||||
|
m_voltage_c = m_env.voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmStart::_execute_run()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
//
|
||||||
|
m_env.timer_start.execute();
|
||||||
|
|
||||||
|
//**** Phase A ***
|
||||||
|
//-reference constructor
|
||||||
|
//m_env.start_control.phase_a.reference.current_bypass_active = FP_ZERO;
|
||||||
|
//m_env.start_control.phase_a.reference.current_bypass_reactive = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_env.start_control.phase_a.reference.current_bypass_active = m_env.start_control.common_ref.active;
|
||||||
|
m_env.start_control.phase_a.reference.current_bypass_reactive = m_env.start_control.common_ref.reactive;
|
||||||
|
//
|
||||||
|
//m_env.start_control.phase_a.test_ref = m_env.start_control.common_ref;
|
||||||
|
|
||||||
|
//-feedback constructor
|
||||||
|
m_env.start_control.phase_a.feedback.current_bypass_active = m_env.projection_current_bypass_a.active;
|
||||||
|
m_env.start_control.phase_a.feedback.current_bypass_reactive = m_env.projection_current_bypass_a.reactive;
|
||||||
|
//
|
||||||
|
m_env.start_control.phase_a.feedback.current_cell_active = m_env.projection_current_cell_a.active;
|
||||||
|
m_env.start_control.phase_a.feedback.current_cell_reactive = m_env.projection_current_cell_a.reactive;
|
||||||
|
//
|
||||||
|
//-control
|
||||||
|
_execute_single_phase(m_env.start_control.phase_a,
|
||||||
|
m_env.main_abc_orts.phase_a,
|
||||||
|
m_env.cell_dc_voltage_a_reciprocal,
|
||||||
|
m_env.current_referencer_a_active,
|
||||||
|
m_env.current_referencer_a_reactive,
|
||||||
|
m_env.current_regulator_a_active,
|
||||||
|
m_env.current_regulator_a_reactive);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
//**** Phase B ***
|
||||||
|
//-reference constructor
|
||||||
|
//m_env.start_control.phase_b.reference.current_bypass_active = FP_ZERO;
|
||||||
|
//m_env.start_control.phase_b.reference.current_bypass_reactive = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_env.start_control.phase_b.reference.current_bypass_active = m_env.start_control.common_ref.active;
|
||||||
|
m_env.start_control.phase_b.reference.current_bypass_reactive = m_env.start_control.common_ref.reactive;
|
||||||
|
//
|
||||||
|
//m_env.start_control.phase_b.test_ref = m_env.start_control.common_ref;
|
||||||
|
|
||||||
|
//-feedback constructor
|
||||||
|
m_env.start_control.phase_b.feedback.current_bypass_active = m_env.projection_current_bypass_b.active;
|
||||||
|
m_env.start_control.phase_b.feedback.current_bypass_reactive = m_env.projection_current_bypass_b.reactive;
|
||||||
|
//
|
||||||
|
m_env.start_control.phase_b.feedback.current_cell_active = m_env.projection_current_cell_b.active;
|
||||||
|
m_env.start_control.phase_b.feedback.current_cell_reactive = m_env.projection_current_cell_b.reactive;
|
||||||
|
//
|
||||||
|
//-control
|
||||||
|
_execute_single_phase(m_env.start_control.phase_b,
|
||||||
|
m_env.main_abc_orts.phase_b,
|
||||||
|
m_env.cell_dc_voltage_b_reciprocal,
|
||||||
|
m_env.current_referencer_b_active,
|
||||||
|
m_env.current_referencer_b_reactive,
|
||||||
|
m_env.current_regulator_b_active,
|
||||||
|
m_env.current_regulator_b_reactive);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//**** Phase C ***
|
||||||
|
//-reference constructor
|
||||||
|
//m_env.start_control.phase_c.reference.current_bypass_active = FP_ZERO;
|
||||||
|
//m_env.start_control.phase_c.reference.current_bypass_reactive = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_env.start_control.phase_c.reference.current_bypass_active = m_env.start_control.common_ref.active;
|
||||||
|
m_env.start_control.phase_c.reference.current_bypass_reactive = m_env.start_control.common_ref.reactive;
|
||||||
|
//
|
||||||
|
//m_env.start_control.phase_c.test_ref = m_env.start_control.common_ref;
|
||||||
|
|
||||||
|
//-feedback constructor
|
||||||
|
m_env.start_control.phase_c.feedback.current_bypass_active = m_env.projection_current_bypass_c.active;
|
||||||
|
m_env.start_control.phase_c.feedback.current_bypass_reactive = m_env.projection_current_bypass_c.reactive;
|
||||||
|
//
|
||||||
|
m_env.start_control.phase_c.feedback.current_cell_active = m_env.projection_current_cell_c.active;
|
||||||
|
m_env.start_control.phase_c.feedback.current_cell_reactive = m_env.projection_current_cell_c.reactive;
|
||||||
|
//
|
||||||
|
//-control
|
||||||
|
_execute_single_phase(m_env.start_control.phase_c,
|
||||||
|
m_env.main_abc_orts.phase_c,
|
||||||
|
m_env.cell_dc_voltage_c_reciprocal,
|
||||||
|
m_env.current_referencer_c_active,
|
||||||
|
m_env.current_referencer_c_reactive,
|
||||||
|
m_env.current_regulator_c_active,
|
||||||
|
m_env.current_regulator_c_reactive);
|
||||||
|
//<>
|
||||||
|
|
||||||
|
m_voltage_a = m_env.start_control.phase_a.reference.voltage_cell_relative;
|
||||||
|
m_voltage_b = m_env.start_control.phase_b.reference.voltage_cell_relative;
|
||||||
|
m_voltage_c = m_env.start_control.phase_c.reference.voltage_cell_relative;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void AlgorithmStart::_execute_single_phase(SYSCTRL::AlgorithmStartSinglePhaseControl& phase,
|
||||||
|
SYSCTRL::VectorOrthogonalProjection& orts,
|
||||||
|
float dc_voltage_reciprocal,
|
||||||
|
FLTSYSLIB::PIController& referencer_active,
|
||||||
|
FLTSYSLIB::PIController& referencer_reactive,
|
||||||
|
FLTSYSLIB::PIController& regulator_active,
|
||||||
|
FLTSYSLIB::PIController& regulator_reactive)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
phase.reference.current_cell_active = referencer_active.execute(phase.reference.current_bypass_active, phase.feedback.current_bypass_active);
|
||||||
|
phase.reference.current_cell_reactive = referencer_reactive.execute(phase.reference.current_bypass_reactive, phase.feedback.current_bypass_reactive);
|
||||||
|
//
|
||||||
|
phase.reference.voltage_cell_ampl_active = regulator_active.execute(phase.feedback.current_cell_active, phase.reference.current_cell_active);
|
||||||
|
phase.reference.voltage_cell_ampl_reactive = regulator_reactive.execute(phase.feedback.current_cell_reactive, phase.reference.current_cell_reactive);
|
||||||
|
//
|
||||||
|
//phase.reference.voltage_cell_ampl_active = regulator_active.execute(phase.feedback.current_cell_active, phase.test_ref.active);
|
||||||
|
//phase.reference.voltage_cell_ampl_reactive = regulator_reactive.execute(phase.feedback.current_cell_reactive, phase.test_ref.reactive);
|
||||||
|
//
|
||||||
|
phase.reference.voltage_cell_active = phase.reference.voltage_cell_ampl_active * orts.active;
|
||||||
|
phase.reference.voltage_cell_reactive = phase.reference.voltage_cell_ampl_reactive * orts.reactive;
|
||||||
|
//
|
||||||
|
phase.reference.voltage_cell = phase.reference.voltage_cell_active - phase.reference.voltage_cell_reactive;
|
||||||
|
phase.reference.voltage_cell_relative = phase.reference.voltage_cell * dc_voltage_reciprocal;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmStart::_execute_run()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
//
|
||||||
|
m_env.timer_start.execute();
|
||||||
|
//
|
||||||
|
m_reference_current_cell_direct = m_env.drc_referencer_current_bypass_direct.execute(m_reference_zero, m_env.drc_current_bypass_direct);
|
||||||
|
m_reference_current_cell_quadrature = m_env.drc_referencer_current_bypass_quadrature.execute(m_reference_zero, m_env.drc_current_bypass_quadrature);
|
||||||
|
//
|
||||||
|
m_env.drc_positive_voltage_cell_direct = m_env.drc_regulator_current_load_direct.execute(m_env.drc_current_cell_direct, m_reference_current_cell_direct);
|
||||||
|
m_env.drc_positive_voltage_cell_quadrature = m_env.drc_regulator_current_load_quadrature.execute(m_env.drc_current_cell_quadrature, m_reference_current_cell_quadrature);
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active,
|
||||||
|
m_env.main_ab_orts.reactive,
|
||||||
|
m_env.drc_positive_voltage_cell_direct,
|
||||||
|
m_env.drc_positive_voltage_cell_quadrature,
|
||||||
|
m_env.drc_positive_voltage_cell_alpha,
|
||||||
|
m_env.drc_positive_voltage_cell_beta);
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::clarke_inverse(m_env.drc_positive_voltage_cell_alpha,
|
||||||
|
m_env.drc_positive_voltage_cell_beta,
|
||||||
|
m_env.drc_positive_voltage_cell_a,
|
||||||
|
m_env.drc_positive_voltage_cell_b,
|
||||||
|
m_env.drc_positive_voltage_cell_c);
|
||||||
|
//
|
||||||
|
m_env.drc_voltage_cell_a = m_env.drc_positive_voltage_cell_a;
|
||||||
|
m_env.drc_voltage_cell_b = m_env.drc_positive_voltage_cell_b;
|
||||||
|
m_env.drc_voltage_cell_c = m_env.drc_positive_voltage_cell_c;
|
||||||
|
//
|
||||||
|
m_voltage_a = m_env.drc_voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal;
|
||||||
|
m_voltage_b = m_env.drc_voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal;
|
||||||
|
m_voltage_c = m_env.drc_voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* AlgoritmStart.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_ALGORITMPRESTART_H_
|
||||||
|
#define SYSCTRL_ALGORITMPRESTART_H_
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmBase.h"
|
||||||
|
#include "SYSCTRL/HeadersFLTSYSLIB.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
class AlgorithmStart: public SYSCTRL::AlgorithmBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
SYSCTRL::SystemEnvironment& m_env;
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
private:
|
||||||
|
float m_reference_zero;
|
||||||
|
float m_reference_current_cell_direct;
|
||||||
|
float m_reference_current_cell_quadrature;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
float m_reference_zero;
|
||||||
|
float m_reference_current_cell_direct;
|
||||||
|
float m_reference_current_cell_quadrature;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
public:
|
||||||
|
AlgorithmStart(SYSCTRL::SystemEnvironment& env);
|
||||||
|
public:
|
||||||
|
void setup();
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute();
|
||||||
|
private:
|
||||||
|
void (AlgorithmStart::*_execute)();
|
||||||
|
void _execute_run();
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
private:
|
||||||
|
|
||||||
|
inline void _execute_single_phase(SYSCTRL::AlgorithmStartSinglePhaseControl& phase,
|
||||||
|
SYSCTRL::VectorOrthogonalProjection& orts,
|
||||||
|
float dc_voltage_reciprocal,
|
||||||
|
FLTSYSLIB::PIController& referencer_active,
|
||||||
|
FLTSYSLIB::PIController& referencer_reactive,
|
||||||
|
FLTSYSLIB::PIController& regulator_active,
|
||||||
|
FLTSYSLIB::PIController& regulator_reactive);
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
};//AlgoritmPrestart
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_ALGORITMPRESTART_H_ */
|
@ -0,0 +1,247 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmStop.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmStop.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
AlgorithmStop::AlgorithmStop(SYSCTRL::SystemEnvironment& env):
|
||||||
|
SYSCTRL::AlgorithmBase(),
|
||||||
|
m_env(env),
|
||||||
|
_execute(&SYSCTRL::AlgorithmStop::_execute_undef)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void AlgorithmStop::setup()
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::AlgorithmStop::_execute_run;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmStop::reset()
|
||||||
|
{
|
||||||
|
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmStop::execute()
|
||||||
|
{
|
||||||
|
(this->*_execute)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmStop::_execute_run()
|
||||||
|
{
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
//
|
||||||
|
m_env.timer_stop.execute();
|
||||||
|
//
|
||||||
|
if(m_env.timer_stop.is_finished()){
|
||||||
|
//
|
||||||
|
m_voltage_a = FP_ZERO;
|
||||||
|
m_voltage_b = FP_ZERO;
|
||||||
|
m_voltage_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
}else{
|
||||||
|
//
|
||||||
|
#if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_PII
|
||||||
|
|
||||||
|
m_env.voltage_reference_load_direct = m_env.reference_voltage_direct_intensity.execute(m_env.voltage_grid_direct);
|
||||||
|
//m_env.voltage_reference_load_direct = 0.33333*(m_env.rms_voltage_input_a + m_env.rms_voltage_input_b + m_env.rms_voltage_input_c);
|
||||||
|
//m_env.voltage_reference_load_quadrature = m_env.voltage_grid_quadrature;
|
||||||
|
m_env.voltage_reference_load_quadrature = FP_ZERO;
|
||||||
|
m_env.voltage_pi_reg_out_direct = m_env.regulator_voltage_load_direct.execute(m_env.voltage_reference_load_direct, m_env.voltage_load_direct);
|
||||||
|
//m_env.voltage_pi_reg_out_quadrature = m_env.regulator_voltage_load_quadrature.execute(m_env.voltage_reference_load_quadrature, m_env.voltage_load_quadrature);
|
||||||
|
m_env.voltage_pi_reg_out_quadrature = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_env.voltage_cell_direct = m_env.integrator_direct.execute(m_env.voltage_pi_reg_out_direct);
|
||||||
|
//m_env.voltage_cell_quadrature = m_env.integrator_quadrature.execute(m_env.voltage_pi_reg_out_quadrature);
|
||||||
|
m_env.voltage_cell_quadrature = FP_ZERO;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_I
|
||||||
|
m_env.voltage_reference_load_direct = m_env.reference_voltage_direct_intensity.execute(m_env.voltage_grid_direct);
|
||||||
|
m_env.voltage_reference_load_quadrature = FP_ZERO;
|
||||||
|
m_env.voltage_cell_direct = m_env.integrator_direct.execute(m_env.voltage_reference_load_direct - m_env.voltage_load_direct);
|
||||||
|
m_env.voltage_cell_quadrature = FP_ZERO;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active,
|
||||||
|
m_env.main_ab_orts.reactive,
|
||||||
|
m_env.voltage_cell_direct,
|
||||||
|
m_env.voltage_cell_quadrature,
|
||||||
|
m_env.voltage_cell_alpha,
|
||||||
|
m_env.voltage_cell_beta);
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::clarke_inverse(m_env.voltage_cell_alpha,
|
||||||
|
m_env.voltage_cell_beta,
|
||||||
|
m_env.voltage_cell_a,
|
||||||
|
m_env.voltage_cell_b,
|
||||||
|
m_env.voltage_cell_c);
|
||||||
|
//
|
||||||
|
m_voltage_a = m_env.voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal;
|
||||||
|
m_voltage_b = m_env.voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal;
|
||||||
|
m_voltage_c = m_env.voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmStop::_execute_run()
|
||||||
|
{
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
//
|
||||||
|
m_env.timer_stop.execute();
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//reference constructor
|
||||||
|
// m_env.phase_control.common_ref.voltage_rms_real = m_env.phase_control.common_ref.voltage_module_rms;
|
||||||
|
//m_env.phase_control.common_ref.voltage_rms_jm = FP_ZERO;
|
||||||
|
// m_env.phase_control.phase_a.reference.voltage_ampl_real_const = m_env.phase_control.common_ref.voltage_rms_real;
|
||||||
|
//m_env.phase_control.phase_a.reference.voltage_ampl_jm_const = m_env.phase_control.common_ref.voltage_rms_jm;
|
||||||
|
// m_env.phase_control.phase_a.reference.voltage_ampl_jm_const = m_env.projection_voltage_input_a.reactive;
|
||||||
|
// m_env.phase_control.phase_b.reference.voltage_ampl_real_const = m_env.phase_control.common_ref.voltage_rms_real;
|
||||||
|
//m_env.phase_control.phase_b.reference.voltage_ampl_jm_const = m_env.phase_control.common_ref.voltage_rms_jm;
|
||||||
|
// m_env.phase_control.phase_b.reference.voltage_ampl_jm_const = m_env.projection_voltage_input_b.reactive;
|
||||||
|
// m_env.phase_control.phase_c.reference.voltage_ampl_real_const = m_env.phase_control.common_ref.voltage_rms_real;
|
||||||
|
//m_env.phase_control.phase_c.reference.voltage_ampl_jm_const = m_env.phase_control.common_ref.voltage_rms_jm;
|
||||||
|
// m_env.phase_control.phase_c.reference.voltage_ampl_jm_const = m_env.projection_voltage_input_c.reactive;
|
||||||
|
//
|
||||||
|
//m_env.phase_control.phase_a.reference.voltage_ampl_real = m_env.phase_control.phase_a.reference.voltage_ampl_real_const;
|
||||||
|
//m_env.phase_control.phase_a.reference.voltage_ampl_jm = m_env.phase_control.phase_a.reference.voltage_ampl_jm_const;
|
||||||
|
//m_env.phase_control.phase_b.reference.voltage_ampl_real = m_env.phase_control.phase_b.reference.voltage_ampl_real_const;
|
||||||
|
//m_env.phase_control.phase_b.reference.voltage_ampl_jm = m_env.phase_control.phase_b.reference.voltage_ampl_jm_const;
|
||||||
|
//m_env.phase_control.phase_c.reference.voltage_ampl_real = m_env.phase_control.phase_c.reference.voltage_ampl_real_const;
|
||||||
|
//m_env.phase_control.phase_c.reference.voltage_ampl_jm = m_env.phase_control.phase_c.reference.voltage_ampl_jm_const;
|
||||||
|
|
||||||
|
m_env.phase_control.phase_a.reference.voltage_ampl_real = m_env.projection_voltage_input_a.active;
|
||||||
|
m_env.phase_control.phase_a.reference.voltage_ampl_jm = m_env.projection_voltage_input_a.reactive;
|
||||||
|
m_env.phase_control.phase_b.reference.voltage_ampl_real = m_env.projection_voltage_input_b.active;
|
||||||
|
m_env.phase_control.phase_b.reference.voltage_ampl_jm = m_env.projection_voltage_input_b.reactive;
|
||||||
|
m_env.phase_control.phase_c.reference.voltage_ampl_real = m_env.projection_voltage_input_c.active;
|
||||||
|
m_env.phase_control.phase_c.reference.voltage_ampl_jm = m_env.projection_voltage_input_c.reactive;
|
||||||
|
|
||||||
|
//
|
||||||
|
//control execute
|
||||||
|
_execute_single_phase(m_env.phase_control.phase_a,
|
||||||
|
m_env.main_abc_orts.phase_a,
|
||||||
|
m_env.regulator_voltage_load_a_active,
|
||||||
|
m_env.regulator_voltage_load_a_reactive);
|
||||||
|
//
|
||||||
|
_execute_single_phase(m_env.phase_control.phase_b,
|
||||||
|
m_env.main_abc_orts.phase_b,
|
||||||
|
m_env.regulator_voltage_load_b_active,
|
||||||
|
m_env.regulator_voltage_load_b_reactive);
|
||||||
|
//
|
||||||
|
_execute_single_phase(m_env.phase_control.phase_c,
|
||||||
|
m_env.main_abc_orts.phase_c,
|
||||||
|
m_env.regulator_voltage_load_c_active,
|
||||||
|
m_env.regulator_voltage_load_c_reactive);
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
if(m_env.timer_stop.is_finished()){
|
||||||
|
m_voltage_a = FP_ZERO;
|
||||||
|
m_voltage_b = FP_ZERO;
|
||||||
|
m_voltage_c = FP_ZERO;
|
||||||
|
}else{
|
||||||
|
m_voltage_a = m_env.phase_control.phase_a.reference.voltage_cell_relative;
|
||||||
|
m_voltage_b = m_env.phase_control.phase_b.reference.voltage_cell_relative;
|
||||||
|
m_voltage_c = m_env.phase_control.phase_c.reference.voltage_cell_relative;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
//
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void AlgorithmStop::_execute_single_phase(SYSCTRL::AlgorithmSinglePhaseControl& phase,
|
||||||
|
SYSCTRL::VectorOrthogonalProjection& orts,
|
||||||
|
FLTSYSLIB::PIController& regulator_active,
|
||||||
|
FLTSYSLIB::PIController& regulator_reactive)
|
||||||
|
{
|
||||||
|
phase.reference.voltage_cell_ampl_real = regulator_active.execute(phase.reference.voltage_ampl_real, phase.feedback.voltage_ampl_real);
|
||||||
|
phase.reference.voltage_cell_ampl_jm = regulator_reactive.execute(phase.reference.voltage_ampl_jm, phase.feedback.voltage_ampl_jm);
|
||||||
|
//
|
||||||
|
phase.reference.voltage_cell_real = phase.reference.voltage_cell_ampl_real * orts.active;
|
||||||
|
phase.reference.voltage_cell_jm = phase.reference.voltage_cell_ampl_jm * orts.reactive;
|
||||||
|
phase.reference.voltage_cell = phase.reference.voltage_cell_real - phase.reference.voltage_cell_jm;
|
||||||
|
//
|
||||||
|
phase.reference.voltage_cell_relative = phase.reference.voltage_cell * phase.feedback.voltage_cell_dc_reciprocal;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmStop::_execute_run()
|
||||||
|
{
|
||||||
|
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
//
|
||||||
|
m_env.timer_stop.execute();
|
||||||
|
//
|
||||||
|
if(m_env.timer_stop.is_finished()){
|
||||||
|
//
|
||||||
|
m_voltage_a = FP_ZERO;
|
||||||
|
m_voltage_b = FP_ZERO;
|
||||||
|
m_voltage_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
}else{
|
||||||
|
//
|
||||||
|
|
||||||
|
m_env.drc_voltage_reference_load_direct = m_env.drc_reference_voltage_direct_intensity.execute(m_env.drc_voltage_grid_direct);
|
||||||
|
m_env.drc_voltage_reference_load_quadrature = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_env.drc_positive_voltage_cell_direct = m_env.drc_positive_voltage_controller_direct.execute(m_env.drc_voltage_reference_load_direct, m_env.drc_positive_voltage_load_direct);
|
||||||
|
m_env.drc_positive_voltage_cell_quadrature = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_direct = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_quadrature = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_alpha = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_beta = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_a = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_b = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active,
|
||||||
|
m_env.main_ab_orts.reactive,
|
||||||
|
m_env.drc_positive_voltage_cell_direct,
|
||||||
|
m_env.drc_positive_voltage_cell_quadrature,
|
||||||
|
m_env.drc_positive_voltage_cell_alpha,
|
||||||
|
m_env.drc_positive_voltage_cell_beta);
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::clarke_inverse(m_env.drc_positive_voltage_cell_alpha,
|
||||||
|
m_env.drc_positive_voltage_cell_beta,
|
||||||
|
m_env.drc_positive_voltage_cell_a,
|
||||||
|
m_env.drc_positive_voltage_cell_b,
|
||||||
|
m_env.drc_positive_voltage_cell_c);
|
||||||
|
//
|
||||||
|
m_env.drc_voltage_cell_a = m_env.drc_positive_voltage_cell_a;
|
||||||
|
m_env.drc_voltage_cell_b = m_env.drc_positive_voltage_cell_b;
|
||||||
|
m_env.drc_voltage_cell_c = m_env.drc_positive_voltage_cell_c;
|
||||||
|
//
|
||||||
|
m_voltage_a = m_env.drc_voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal;
|
||||||
|
m_voltage_b = m_env.drc_voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal;
|
||||||
|
m_voltage_c = m_env.drc_voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#endif
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmStop.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_ALGORITHMSTOP_H_
|
||||||
|
#define SYSCTRL_ALGORITHMSTOP_H_
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmBase.h"
|
||||||
|
#include "SYSCTRL/HeadersFLTSYSLIB.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
class AlgorithmStop: public SYSCTRL::AlgorithmBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
SYSCTRL::SystemEnvironment& m_env;
|
||||||
|
public:
|
||||||
|
AlgorithmStop(SYSCTRL::SystemEnvironment& env);
|
||||||
|
public:
|
||||||
|
void setup();
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute();
|
||||||
|
private:
|
||||||
|
void (AlgorithmStop::*_execute)();
|
||||||
|
void _execute_run();
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
private:
|
||||||
|
inline void _execute_single_phase(SYSCTRL::AlgorithmSinglePhaseControl& phase,
|
||||||
|
SYSCTRL::VectorOrthogonalProjection& orts,
|
||||||
|
FLTSYSLIB::PIController& regulator_active,
|
||||||
|
FLTSYSLIB::PIController& regulator_reactive);
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
};//AlgorithmPrestop
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_ALGORITHMSTOP_H_ */
|
@ -0,0 +1,407 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmWork.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmWork.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
AlgorithmWork::AlgorithmWork(SYSCTRL::SystemEnvironment& env):
|
||||||
|
AlgorithmBase(),
|
||||||
|
m_env(env),
|
||||||
|
m_reference_switcher(false),
|
||||||
|
_execute(&SYSCTRL::AlgorithmWork::_execute_undef)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
|
||||||
|
void AlgorithmWork::setup()
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::AlgorithmWork::_execute_run;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmWork::reset()
|
||||||
|
{
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
//
|
||||||
|
m_env.regulator_voltage_load_direct.reset();
|
||||||
|
m_env.regulator_voltage_load_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.integrator_direct.reset();
|
||||||
|
m_env.integrator_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.regulator_current_limit.set_to_high_saturation();
|
||||||
|
m_env.regulator_current_pfc.reset();
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
//
|
||||||
|
m_env.regulator_current_limit_a.set_to_high_saturation();
|
||||||
|
m_env.regulator_current_pfc_a.reset();
|
||||||
|
|
||||||
|
m_env.regulator_current_limit_b.set_to_high_saturation();
|
||||||
|
m_env.regulator_current_pfc_b.reset();
|
||||||
|
|
||||||
|
m_env.regulator_current_limit_c.set_to_high_saturation();
|
||||||
|
m_env.regulator_current_pfc_c.reset();
|
||||||
|
|
||||||
|
m_env.regulator_voltage_load_a_active.reset();
|
||||||
|
m_env.regulator_voltage_load_a_reactive.reset();
|
||||||
|
|
||||||
|
m_env.regulator_voltage_load_b_active.reset();
|
||||||
|
m_env.regulator_voltage_load_b_reactive.reset();
|
||||||
|
|
||||||
|
m_env.regulator_voltage_load_c_active.reset();
|
||||||
|
m_env.regulator_voltage_load_c_reactive.reset();
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
|
||||||
|
m_env.drc_positive_voltage_controller_direct.reset();
|
||||||
|
m_env.drc_positive_voltage_controller_quadrature.reset();
|
||||||
|
m_env.drc_negative_voltage_controller_direct.reset();
|
||||||
|
m_env.drc_negative_voltage_controller_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.drc_reference_voltage_direct_intensity.reset();
|
||||||
|
//
|
||||||
|
m_env.drc_regulator_current_load_direct.reset();
|
||||||
|
m_env.drc_regulator_current_load_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.drc_referencer_current_bypass_direct.reset();
|
||||||
|
m_env.drc_referencer_current_bypass_quadrature.reset();
|
||||||
|
//
|
||||||
|
m_env.drc_regulator_current_limit.set_to_low_saturation();
|
||||||
|
m_env.drc_regulator_current_pfc.reset();
|
||||||
|
//
|
||||||
|
m_reference_switcher = false;
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmWork::reset_switcher()
|
||||||
|
{
|
||||||
|
m_reference_switcher = false;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmWork::execute()
|
||||||
|
{
|
||||||
|
(this->*_execute)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmWork::_execute_run()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
//
|
||||||
|
//if(m_env.algorithm_control.signal.enable_current_limit)
|
||||||
|
if(false)
|
||||||
|
{
|
||||||
|
m_env.voltage_reference_load_direct = m_env.regulator_current_limit.execute(m_env.rms_current_load_module, m_env.current_reference_limit);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_env.regulator_current_limit.set_to_low_saturation();
|
||||||
|
m_env.voltage_reference_load_direct = m_env.regulator_current_limit.get_output();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
//if(m_env.algorithm_control.signal.enable_pfc)
|
||||||
|
if(false)
|
||||||
|
{
|
||||||
|
m_env.regulator_current_pfc.reset();
|
||||||
|
m_env.voltage_reference_load_quadrature = m_env.regulator_current_pfc.get_output();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_env.regulator_current_pfc.reset();
|
||||||
|
m_env.voltage_reference_load_quadrature = m_env.regulator_current_pfc.get_output();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
|
||||||
|
// for PII-Controller
|
||||||
|
#if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_PII
|
||||||
|
m_env.voltage_pi_reg_out_direct = m_env.regulator_voltage_load_direct.execute(m_env.voltage_reference_load_direct, m_env.voltage_load_direct);
|
||||||
|
//m_env.voltage_pi_reg_out_quadrature = m_env.regulator_voltage_load_quadrature.execute(m_env.voltage_reference_load_quadrature, m_env.voltage_load_quadrature);
|
||||||
|
m_env.voltage_pi_reg_out_quadrature = FP_ZERO;
|
||||||
|
m_env.voltage_cell_direct = m_env.integrator_direct.execute(m_env.voltage_pi_reg_out_direct);
|
||||||
|
//m_env.voltage_cell_quadrature = m_env.integrator_quadrature.execute(m_env.voltage_pi_reg_out_quadrature);
|
||||||
|
m_env.voltage_cell_quadrature = FP_ZERO;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// for I-Controller
|
||||||
|
#if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_I
|
||||||
|
m_env.voltage_cell_direct = m_env.integrator_direct.execute(m_env.voltage_reference_load_direct - m_env.voltage_load_direct);
|
||||||
|
m_env.voltage_cell_quadrature = FP_ZERO;
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active,
|
||||||
|
m_env.main_ab_orts.reactive,
|
||||||
|
m_env.voltage_cell_direct,
|
||||||
|
m_env.voltage_cell_quadrature,
|
||||||
|
m_env.voltage_cell_alpha,
|
||||||
|
m_env.voltage_cell_beta);
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::clarke_inverse(m_env.voltage_cell_alpha,
|
||||||
|
m_env.voltage_cell_beta,
|
||||||
|
m_env.voltage_cell_a,
|
||||||
|
m_env.voltage_cell_b,
|
||||||
|
m_env.voltage_cell_c);
|
||||||
|
//
|
||||||
|
m_voltage_a = m_env.voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal;
|
||||||
|
m_voltage_b = m_env.voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal;
|
||||||
|
m_voltage_c = m_env.voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmWork::_execute_run()
|
||||||
|
{
|
||||||
|
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
|
||||||
|
m_env.phase_control.phase_a.reference.voltage_dc = m_env.phase_control.common_ref.voltage_dc;
|
||||||
|
m_env.phase_control.phase_b.reference.voltage_dc = m_env.phase_control.common_ref.voltage_dc;
|
||||||
|
m_env.phase_control.phase_c.reference.voltage_dc = m_env.phase_control.common_ref.voltage_dc;
|
||||||
|
|
||||||
|
m_env.phase_control.phase_a.reference.current_ampl_limit_const = m_env.phase_control.common_ref.current_limit_rms;
|
||||||
|
m_env.phase_control.phase_b.reference.current_ampl_limit_const = m_env.phase_control.common_ref.current_limit_rms;
|
||||||
|
m_env.phase_control.phase_c.reference.current_ampl_limit_const = m_env.phase_control.common_ref.current_limit_rms;
|
||||||
|
|
||||||
|
m_env.phase_control.phase_a.reference.current_ampl_pfc_const = m_env.phase_control.common_ref.current_pfc_rms;
|
||||||
|
m_env.phase_control.phase_b.reference.current_ampl_pfc_const = m_env.phase_control.common_ref.current_pfc_rms;
|
||||||
|
m_env.phase_control.phase_c.reference.current_ampl_pfc_const = m_env.phase_control.common_ref.current_pfc_rms;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_execute_single_phase(m_env.phase_control.phase_a,
|
||||||
|
m_env.projection_voltage_input_a,
|
||||||
|
m_env.main_abc_orts.phase_a,
|
||||||
|
m_env.regulator_current_limit_a,
|
||||||
|
m_env.regulator_current_pfc_a,
|
||||||
|
m_env.regulator_dc_a,
|
||||||
|
m_env.cell_dc_voltage_a,
|
||||||
|
m_env.regulator_voltage_load_a_active,
|
||||||
|
m_env.regulator_voltage_load_a_reactive);
|
||||||
|
|
||||||
|
_execute_single_phase(m_env.phase_control.phase_b,
|
||||||
|
m_env.projection_voltage_input_b,
|
||||||
|
m_env.main_abc_orts.phase_b,
|
||||||
|
m_env.regulator_current_limit_b,
|
||||||
|
m_env.regulator_current_pfc_b,
|
||||||
|
m_env.regulator_dc_b,
|
||||||
|
m_env.cell_dc_voltage_b,
|
||||||
|
m_env.regulator_voltage_load_b_active,
|
||||||
|
m_env.regulator_voltage_load_b_reactive);
|
||||||
|
|
||||||
|
_execute_single_phase(m_env.phase_control.phase_c,
|
||||||
|
m_env.projection_voltage_input_c,
|
||||||
|
m_env.main_abc_orts.phase_c,
|
||||||
|
m_env.regulator_current_limit_c,
|
||||||
|
m_env.regulator_current_pfc_c,
|
||||||
|
m_env.regulator_dc_c,
|
||||||
|
m_env.cell_dc_voltage_c,
|
||||||
|
m_env.regulator_voltage_load_c_active,
|
||||||
|
m_env.regulator_voltage_load_c_reactive);
|
||||||
|
|
||||||
|
m_voltage_a = m_env.phase_control.phase_a.reference.voltage_cell_relative;
|
||||||
|
m_voltage_b = m_env.phase_control.phase_b.reference.voltage_cell_relative;
|
||||||
|
m_voltage_c = m_env.phase_control.phase_c.reference.voltage_cell_relative;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmWork::_execute_single_phase(SYSCTRL::AlgorithmSinglePhaseControl& phase,
|
||||||
|
SYSCTRL::ProjectionAnalogSignalStructure& projection,
|
||||||
|
SYSCTRL::VectorOrthogonalProjection& orts,
|
||||||
|
FLTSYSLIB::PIController& regulator_limit,
|
||||||
|
FLTSYSLIB::PIController& regulator_pfc,
|
||||||
|
FLTSYSLIB::PIController& regulator_dc,
|
||||||
|
float& dc_volatage,
|
||||||
|
FLTSYSLIB::PIController& regulator_active,
|
||||||
|
FLTSYSLIB::PIController& regulator_reactive)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
if(phase.control_bit.signal.enable_current_limit)
|
||||||
|
{
|
||||||
|
|
||||||
|
phase.reference.voltage_limit = regulator_limit.execute(phase.reference.current_ampl_limit_const, phase.feedback.current_ampl_real);
|
||||||
|
|
||||||
|
if(phase.control_bit.signal.enable_pfc)
|
||||||
|
{
|
||||||
|
phase.reference.voltage_pfc = regulator_pfc.execute(phase.reference.current_ampl_pfc_const, phase.feedback.current_ampl_jm) +
|
||||||
|
regulator_dc.execute(phase.reference.voltage_dc, dc_volatage);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
regulator_pfc.reset();
|
||||||
|
phase.reference.voltage_pfc = projection.reactive;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
regulator_limit.set_to_high_saturation();
|
||||||
|
phase.reference.voltage_limit = regulator_limit.get_output();
|
||||||
|
//
|
||||||
|
regulator_pfc.reset();
|
||||||
|
phase.reference.voltage_pfc = projection.reactive;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
|
||||||
|
|
||||||
|
if(phase.control_bit.signal.enable_pfc)
|
||||||
|
{
|
||||||
|
phase.reference.voltage_ampl_real = sqrtf(phase.reference.voltage_limit * phase.reference.voltage_limit - phase.reference.voltage_pfc * phase.reference.voltage_pfc);
|
||||||
|
phase.reference.voltage_ampl_jm = phase.reference.voltage_pfc;
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
phase.reference.voltage_ampl_real = phase.reference.voltage_limit;
|
||||||
|
phase.reference.voltage_ampl_jm = phase.reference.voltage_pfc;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
phase.reference.voltage_cell_ampl_real = regulator_active.execute(phase.reference.voltage_ampl_real, phase.feedback.voltage_ampl_real);
|
||||||
|
//
|
||||||
|
if(phase.control_bit.signal.enable_pfc)
|
||||||
|
{
|
||||||
|
phase.reference.voltage_cell_ampl_jm = regulator_reactive.execute(phase.reference.voltage_ampl_jm, phase.feedback.voltage_ampl_jm);
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
phase.reference.voltage_cell_ampl_jm = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
phase.reference.voltage_cell_real = phase.reference.voltage_cell_ampl_real * orts.active;
|
||||||
|
phase.reference.voltage_cell_jm = phase.reference.voltage_cell_ampl_jm * orts.reactive;
|
||||||
|
phase.reference.voltage_cell = phase.reference.voltage_cell_real - phase.reference.voltage_cell_jm;
|
||||||
|
//
|
||||||
|
phase.reference.voltage_cell_relative = phase.reference.voltage_cell * phase.feedback.voltage_cell_dc_reciprocal;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmWork::_execute_run()
|
||||||
|
{
|
||||||
|
|
||||||
|
//
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
//
|
||||||
|
|
||||||
|
if(m_reference_switcher)
|
||||||
|
{
|
||||||
|
//if(m_env.algorithm_control.signal.enable_current_limit)
|
||||||
|
if(false)
|
||||||
|
{
|
||||||
|
m_env.drc_voltage_reference_load_direct = m_env.drc_regulator_current_limit.execute(m_env.rms_current_load_module, m_env.drc_current_reference_limit);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_env.drc_regulator_current_limit.set_to_low_saturation();
|
||||||
|
m_env.drc_voltage_reference_load_direct = m_env.drc_regulator_current_limit.get_output();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_env.drc_voltage_reference_load_direct = m_env.drc_reference_voltage_direct_intensity.execute(m_env.drc_regulator_current_limit.get_output());
|
||||||
|
//
|
||||||
|
if(m_env.drc_voltage_reference_load_direct >= m_env.drc_regulator_current_limit.get_output())
|
||||||
|
{
|
||||||
|
m_reference_switcher = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//if(m_env.algorithm_control.signal.enable_pfc)
|
||||||
|
if(false)
|
||||||
|
{
|
||||||
|
m_env.drc_regulator_current_pfc.reset();
|
||||||
|
m_env.drc_voltage_reference_load_quadrature = m_env.drc_regulator_current_pfc.get_output();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_env.drc_regulator_current_pfc.reset();
|
||||||
|
m_env.drc_voltage_reference_load_quadrature = m_env.drc_regulator_current_pfc.get_output();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
m_env.drc_positive_voltage_cell_direct = m_env.drc_positive_voltage_controller_direct.execute(m_env.drc_voltage_reference_load_direct, m_env.drc_positive_voltage_load_direct);
|
||||||
|
//m_env.drc_positive_voltage_cell_quadrature = m_env.drc_positive_voltage_controller_quadrature.execute(m_env.drc_voltage_reference_load_quadrature, m_env.drc_positive_voltage_load_quadrature);
|
||||||
|
m_env.drc_positive_voltage_cell_quadrature = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_direct = m_env.drc_negative_voltage_controller_direct.execute(m_env.drc_voltage_reference_zero, m_env.drc_negaative_voltage_load_direct);
|
||||||
|
m_env.drc_negative_voltage_cell_quadrature = m_env.drc_negative_voltage_controller_quadrature.execute(m_env.drc_voltage_reference_zero, m_env.drc_negative_voltage_load_quadrature);
|
||||||
|
//m_env.drc_negative_voltage_cell_direct = FP_ZERO;
|
||||||
|
//m_env.drc_negative_voltage_cell_quadrature = FP_ZERO;
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active,
|
||||||
|
m_env.main_ab_orts.reactive,
|
||||||
|
m_env.drc_positive_voltage_cell_direct,
|
||||||
|
m_env.drc_positive_voltage_cell_quadrature,
|
||||||
|
m_env.drc_positive_voltage_cell_alpha,
|
||||||
|
m_env.drc_positive_voltage_cell_beta);
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active,
|
||||||
|
m_env.main_ab_orts.reactive,
|
||||||
|
m_env.drc_negative_voltage_cell_direct,
|
||||||
|
m_env.drc_negative_voltage_cell_quadrature,
|
||||||
|
m_env.drc_negative_voltage_cell_alpha,
|
||||||
|
m_env.drc_negative_voltage_cell_beta);
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::clarke_inverse(m_env.drc_positive_voltage_cell_alpha,
|
||||||
|
m_env.drc_positive_voltage_cell_beta,
|
||||||
|
m_env.drc_positive_voltage_cell_a,
|
||||||
|
m_env.drc_positive_voltage_cell_b,
|
||||||
|
m_env.drc_positive_voltage_cell_c);
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::clarke_inverse_back_order(m_env.drc_negative_voltage_cell_alpha,
|
||||||
|
m_env.drc_negative_voltage_cell_beta,
|
||||||
|
m_env.drc_negative_voltage_cell_a,
|
||||||
|
m_env.drc_negative_voltage_cell_b,
|
||||||
|
m_env.drc_negative_voltage_cell_c);
|
||||||
|
//
|
||||||
|
m_env.drc_voltage_cell_a = m_env.drc_positive_voltage_cell_a + m_env.drc_negative_voltage_cell_a;
|
||||||
|
m_env.drc_voltage_cell_b = m_env.drc_positive_voltage_cell_b + m_env.drc_negative_voltage_cell_b;
|
||||||
|
m_env.drc_voltage_cell_c = m_env.drc_positive_voltage_cell_c + m_env.drc_negative_voltage_cell_c;
|
||||||
|
//
|
||||||
|
m_voltage_a = m_env.drc_voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal;
|
||||||
|
m_voltage_b = m_env.drc_voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal;
|
||||||
|
m_voltage_c = m_env.drc_voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmWork.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_ALGORITHMNORMAL_H_
|
||||||
|
#define SYSCTRL_ALGORITHMNORMAL_H_
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmBase.h"
|
||||||
|
#include "SYSCTRL/HeadersFLTSYSLIB.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
class AlgorithmWork: public SYSCTRL::AlgorithmBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
bool m_reference_switcher;
|
||||||
|
|
||||||
|
private:
|
||||||
|
SYSCTRL::SystemEnvironment& m_env;
|
||||||
|
public:
|
||||||
|
AlgorithmWork(SYSCTRL::SystemEnvironment& env);
|
||||||
|
public:
|
||||||
|
void setup();
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
void reset_switcher();
|
||||||
|
public:
|
||||||
|
void execute();
|
||||||
|
private:
|
||||||
|
void (AlgorithmWork::*_execute)();
|
||||||
|
void _execute_run();
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
private:
|
||||||
|
void _execute_single_phase(SYSCTRL::AlgorithmSinglePhaseControl& phase,
|
||||||
|
SYSCTRL::ProjectionAnalogSignalStructure& projection,
|
||||||
|
SYSCTRL::VectorOrthogonalProjection& orts,
|
||||||
|
FLTSYSLIB::PIController& regulator_limit,
|
||||||
|
FLTSYSLIB::PIController& regulator_pfc,
|
||||||
|
FLTSYSLIB::PIController& regulator_dc,
|
||||||
|
float& dc_volatage,
|
||||||
|
FLTSYSLIB::PIController& regulator_active,
|
||||||
|
FLTSYSLIB::PIController& regulator_reactive);
|
||||||
|
#endif
|
||||||
|
};//AlgorithmNormal
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_ALGORITHMNORMAL_H_ */
|
@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmWorkEntry.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmWorkEntry.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
AlgorithmWorkEntry::AlgorithmWorkEntry(SYSCTRL::SystemEnvironment& env):
|
||||||
|
SYSCTRL::AlgorithmBase(),
|
||||||
|
m_env(env),
|
||||||
|
_execute(&SYSCTRL::AlgorithmWorkEntry::_execute_undef)
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
|
||||||
|
void AlgorithmWorkEntry::setup()
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::AlgorithmWorkEntry::_execute_run;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmWorkEntry::reset()
|
||||||
|
{
|
||||||
|
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmWorkEntry::execute()
|
||||||
|
{
|
||||||
|
(this->*_execute)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool AlgorithmWorkEntry::compare_mode(mode_t mode)
|
||||||
|
{
|
||||||
|
return m_mode == mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmWorkEntry::set_mode(mode_t mode)
|
||||||
|
{
|
||||||
|
m_mode = mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmWorkEntry::_execute_run()
|
||||||
|
{
|
||||||
|
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
//
|
||||||
|
m_env.timer_stop.execute();
|
||||||
|
//
|
||||||
|
if(m_env.timer_stop.is_finished()){
|
||||||
|
//
|
||||||
|
m_voltage_a = FP_ZERO;
|
||||||
|
m_voltage_b = FP_ZERO;
|
||||||
|
m_voltage_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
}else{
|
||||||
|
//
|
||||||
|
|
||||||
|
m_env.drc_voltage_reference_load_direct = m_env.drc_reference_voltage_direct_intensity.execute(m_env.drc_voltage_grid_direct);
|
||||||
|
m_env.drc_voltage_reference_load_quadrature = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_env.drc_positive_voltage_cell_direct = m_env.drc_positive_voltage_controller_direct.execute(m_env.drc_voltage_reference_load_direct, m_env.drc_positive_voltage_load_direct);
|
||||||
|
m_env.drc_positive_voltage_cell_quadrature = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_direct = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_quadrature = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_alpha = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_beta = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_a = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_b = FP_ZERO;
|
||||||
|
m_env.drc_negative_voltage_cell_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active,
|
||||||
|
m_env.main_ab_orts.reactive,
|
||||||
|
m_env.drc_positive_voltage_cell_direct,
|
||||||
|
m_env.drc_positive_voltage_cell_quadrature,
|
||||||
|
m_env.drc_positive_voltage_cell_alpha,
|
||||||
|
m_env.drc_positive_voltage_cell_beta);
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::clarke_inverse(m_env.drc_positive_voltage_cell_alpha,
|
||||||
|
m_env.drc_positive_voltage_cell_beta,
|
||||||
|
m_env.drc_positive_voltage_cell_a,
|
||||||
|
m_env.drc_positive_voltage_cell_b,
|
||||||
|
m_env.drc_positive_voltage_cell_c);
|
||||||
|
//
|
||||||
|
m_env.drc_voltage_cell_a = m_env.drc_positive_voltage_cell_a;
|
||||||
|
m_env.drc_voltage_cell_b = m_env.drc_positive_voltage_cell_b;
|
||||||
|
m_env.drc_voltage_cell_c = m_env.drc_positive_voltage_cell_c;
|
||||||
|
//
|
||||||
|
m_voltage_a = m_env.drc_voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal;
|
||||||
|
m_voltage_b = m_env.drc_voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal;
|
||||||
|
m_voltage_c = m_env.drc_voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmWorkEntry.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_ALGORITHMWORKENTRY_H_
|
||||||
|
#define SYSCTRL_ALGORITHMWORKENTRY_H_
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmBase.h"
|
||||||
|
#include "SYSCTRL/HeadersFLTSYSLIB.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
class AlgorithmWorkEntry: public AlgorithmBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
SYSCTRL::SystemEnvironment& m_env;
|
||||||
|
public:
|
||||||
|
AlgorithmWorkEntry(SYSCTRL::SystemEnvironment& env);
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setup();
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute();
|
||||||
|
private:
|
||||||
|
void (AlgorithmWorkEntry::*_execute)();
|
||||||
|
void _execute_run();
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_ALGORITHMWORKENTRY_H_ */
|
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmZero.cpp
|
||||||
|
*
|
||||||
|
* Created on: 20 ìàÿ 2022 ã.
|
||||||
|
* Author: geras
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmZero.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
//CONSTRUCTOR
|
||||||
|
AlgorithmZero::AlgorithmZero(SYSCTRL::SystemEnvironment& env):
|
||||||
|
SYSCTRL::AlgorithmBase(),
|
||||||
|
m_env(env),
|
||||||
|
_execute(&SYSCTRL::AlgorithmZero::_execute_undef)
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
void AlgorithmZero::setup()
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::AlgorithmZero::_execute_run;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmZero::reset()
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmZero::execute()
|
||||||
|
{
|
||||||
|
(this->*_execute)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void AlgorithmZero::_execute_run()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_env.hardware.ref_control_order = ORDER_START;
|
||||||
|
//
|
||||||
|
m_voltage_a = FP_ZERO;
|
||||||
|
m_voltage_b = FP_ZERO;
|
||||||
|
m_voltage_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* AlgorithmZero.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_ALGORITHMZERO_H_
|
||||||
|
#define SYSCTRL_ALGORITHMZERO_H_
|
||||||
|
|
||||||
|
#include "SYSCTRL/AlgorithmBase.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
class AlgorithmZero: public AlgorithmBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
SYSCTRL::SystemEnvironment& m_env;
|
||||||
|
public:
|
||||||
|
AlgorithmZero(SYSCTRL::SystemEnvironment& env);
|
||||||
|
public:
|
||||||
|
void setup();
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute();
|
||||||
|
private:
|
||||||
|
void (AlgorithmZero::*_execute)();
|
||||||
|
void _execute_run();
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_ALGORITHMZERO_H_ */
|
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* BaseComponent.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/BaseComponent.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
BaseComponent::BaseComponent():
|
||||||
|
m_mode(SYSCTRL::BaseComponent::UNDEFINED),
|
||||||
|
m_time_sample(-1.0)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
SYSCTRL::BaseComponent::mode_t BaseComponent::get_mode()
|
||||||
|
{
|
||||||
|
return m_mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool BaseComponent::compare(SYSCTRL::BaseComponent::mode_t mode)
|
||||||
|
{
|
||||||
|
return m_mode == mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* BaseComponent.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_BASECOMPONENT_H_
|
||||||
|
#define SYSCTRL_BASECOMPONENT_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
class BaseComponent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL};
|
||||||
|
protected:
|
||||||
|
mode_t m_mode;
|
||||||
|
protected:
|
||||||
|
float m_time_sample;
|
||||||
|
public:
|
||||||
|
BaseComponent();
|
||||||
|
public:
|
||||||
|
mode_t get_mode();
|
||||||
|
bool compare(mode_t mode);
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_BASECOMPONENT_H_ */
|
@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* ContactorFault.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
#include "SYSCTRL/ContactorFault.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
ContactorFault::ContactorFault():
|
||||||
|
m_time_sample(-1.0),
|
||||||
|
m_period(-1.0),
|
||||||
|
m_counter(FP_ZERO),
|
||||||
|
m_status(),
|
||||||
|
status(),
|
||||||
|
_execute(&SYSCTRL::ContactorFault::_execute_undef)
|
||||||
|
{}
|
||||||
|
//end CONSTRUCTOR
|
||||||
|
|
||||||
|
void ContactorFault::setup(float time_sample)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_time_sample = time_sample;
|
||||||
|
_execute = &SYSCTRL::ContactorFault::_execute_undef;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void ContactorFault::configure(ContactorFaultConfiguration& config)
|
||||||
|
{
|
||||||
|
m_period = config.period;
|
||||||
|
|
||||||
|
if((m_time_sample > FP_ZERO) && (m_period > m_time_sample))
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::ContactorFault::_execute_operational;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
//#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void ContactorFault::reset(bool ref)
|
||||||
|
{
|
||||||
|
m_status.signal.fault &= !ref;
|
||||||
|
status.all = m_status.all;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void ContactorFault::execute(bool ref, bool current)
|
||||||
|
{
|
||||||
|
(this->*_execute)(ref, current);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
void ContactorFault::_execute_undef(bool ref, bool current)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void ContactorFault::_execute_operational(bool ref, bool current)
|
||||||
|
{
|
||||||
|
if(!m_status.signal.fault)
|
||||||
|
{
|
||||||
|
if(ref == current)
|
||||||
|
{
|
||||||
|
m_counter = FP_ZERO;
|
||||||
|
|
||||||
|
}else{
|
||||||
|
|
||||||
|
if(m_counter >= m_period)
|
||||||
|
{
|
||||||
|
m_status.signal.fault = 1;
|
||||||
|
m_counter = FP_ZERO;
|
||||||
|
|
||||||
|
}else{
|
||||||
|
|
||||||
|
m_counter += m_time_sample;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
status.all = m_status.all;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* ContactorFault.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "SYSCTRL/BaseComponent.h"
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_CONTACTORFAULT_H_
|
||||||
|
#define SYSCTRL_CONTACTORFAULT_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
struct ContactorFaultConfiguration
|
||||||
|
{
|
||||||
|
float period;
|
||||||
|
ContactorFaultConfiguration():
|
||||||
|
period(-1.0)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct ContactorFaultBitField
|
||||||
|
{
|
||||||
|
uint16_t fault: 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
union ContactorFaultRegister
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
ContactorFaultBitField signal;
|
||||||
|
ContactorFaultRegister():
|
||||||
|
all((uint16_t)0)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ContactorFault
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
float m_time_sample;
|
||||||
|
float m_period;
|
||||||
|
float m_counter;
|
||||||
|
ContactorFaultRegister m_status;
|
||||||
|
public:
|
||||||
|
ContactorFaultRegister status;
|
||||||
|
public:
|
||||||
|
ContactorFault();
|
||||||
|
void setup(float time_sample);
|
||||||
|
void configure(ContactorFaultConfiguration& config);
|
||||||
|
public:
|
||||||
|
void reset(bool ref);
|
||||||
|
public:
|
||||||
|
void execute(bool ref, bool current);
|
||||||
|
private:
|
||||||
|
void (ContactorFault::*_execute)(bool ref, bool current);
|
||||||
|
void _execute_undef(bool ref, bool current);
|
||||||
|
void _execute_operational(bool ref, bool current);
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_CONTACTORFAULT_H_ */
|
@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* DRCDecomposer.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/DRCDecomposer.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
DRCDecomposer::DRCDecomposer():
|
||||||
|
m_time_sample(-1.0),
|
||||||
|
m_filter_direct(),
|
||||||
|
m_filter_quadrature(),
|
||||||
|
_aux_reg(FP_ZERO),
|
||||||
|
direct(FP_ZERO),
|
||||||
|
quadrature(FP_ZERO),
|
||||||
|
_execute(&SYSCTRL::DRCDecomposer::_execute_undef)
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
void DRCDecomposer::setup(float time_sample)
|
||||||
|
{
|
||||||
|
if(time_sample > FP_ZERO)
|
||||||
|
{
|
||||||
|
m_time_sample = time_sample;
|
||||||
|
m_filter_direct.setup(m_time_sample);
|
||||||
|
m_filter_quadrature.setup(m_time_sample);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void DRCDecomposer::configure(const DRCDecomposerConfiguration& config)
|
||||||
|
{
|
||||||
|
if(m_time_sample > FP_ZERO)
|
||||||
|
{
|
||||||
|
m_filter_direct.configure(config.filter);
|
||||||
|
m_filter_quadrature.configure(config.filter);
|
||||||
|
|
||||||
|
if(m_filter_direct.compare(FLTSYSLIB::Filter::OPERATIONAL) && m_filter_quadrature.compare(FLTSYSLIB::Filter::OPERATIONAL))
|
||||||
|
//if(m_filter_direct.compare(FLTSYSLIB::FilterSecond::OPERATIONAL) && m_filter_quadrature.compare(FLTSYSLIB::FilterSecond::OPERATIONAL))
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::DRCDecomposer::_execute_operational;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void DRCDecomposer::reset()
|
||||||
|
{
|
||||||
|
m_filter_direct.reset();
|
||||||
|
m_filter_quadrature.reset();
|
||||||
|
this->direct = FP_ZERO;
|
||||||
|
this->quadrature = FP_ZERO;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void DRCDecomposer::get_outputs(float& outd, float& outq)
|
||||||
|
{
|
||||||
|
this->direct = m_filter_direct.get_output();
|
||||||
|
this->quadrature = m_filter_quadrature.get_output();
|
||||||
|
outd = this->direct;
|
||||||
|
outq = this->quadrature;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void DRCDecomposer::execute(float in_a, float in_b, float in_c,
|
||||||
|
float ort_direct_a, float ort_direct_b, float ort_direct_c,
|
||||||
|
float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c)
|
||||||
|
{
|
||||||
|
(this->*_execute)(in_a, in_b, in_c,
|
||||||
|
ort_direct_a, ort_direct_b, ort_direct_c,
|
||||||
|
ort_orthogonal_a, ort_orthogonal_b, ort_orthogonal_c);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void DRCDecomposer::_execute_undef(float in_a, float in_b, float in_c,
|
||||||
|
float ort_direct_a, float ort_direct_b, float ort_direct_c,
|
||||||
|
float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void DRCDecomposer::_execute_operational(float in_a, float in_b, float in_c,
|
||||||
|
float ort_direct_a, float ort_direct_b, float ort_direct_c,
|
||||||
|
float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c)
|
||||||
|
{
|
||||||
|
_aux_reg = (0.4714045)*(in_a * ort_direct_a + in_b * ort_direct_b + in_c * ort_direct_c);
|
||||||
|
direct = m_filter_direct.execute(_aux_reg);
|
||||||
|
_aux_reg = (-0.4714045)*(in_a * ort_orthogonal_a + in_b * ort_orthogonal_b + in_c * ort_orthogonal_c);
|
||||||
|
quadrature = m_filter_quadrature.execute(_aux_reg);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* DRCDecomposer.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "SYSCTRL/BaseComponent.h"
|
||||||
|
#include "SYSCTRL/HeadersFLTSYSLIB.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_DRCDECOMPOSER_H_
|
||||||
|
#define SYSCTRL_DRCDECOMPOSER_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
struct DRCDecomposerStructure
|
||||||
|
{
|
||||||
|
float direct;
|
||||||
|
float quadrature;
|
||||||
|
void reset()
|
||||||
|
{
|
||||||
|
direct = FP_ZERO;
|
||||||
|
quadrature = FP_ZERO;
|
||||||
|
}
|
||||||
|
DRCDecomposerStructure():
|
||||||
|
direct(FP_ZERO),
|
||||||
|
quadrature(FP_ZERO)
|
||||||
|
{}
|
||||||
|
};//DRCDecomposerStructure
|
||||||
|
|
||||||
|
struct DRCDecomposerConfiguration
|
||||||
|
{
|
||||||
|
FLTSYSLIB::FilterConfiguration filter;
|
||||||
|
//FLTSYSLIB::FilterSecondConfiguration filter;
|
||||||
|
DRCDecomposerConfiguration():
|
||||||
|
filter()
|
||||||
|
{}
|
||||||
|
};//DRCDecomposerConfiguration
|
||||||
|
|
||||||
|
class DRCDecomposer
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
float m_time_sample;
|
||||||
|
private:
|
||||||
|
FLTSYSLIB::Filter m_filter_direct;
|
||||||
|
FLTSYSLIB::Filter m_filter_quadrature;
|
||||||
|
//FLTSYSLIB::FilterSecond m_filter_direct;
|
||||||
|
//FLTSYSLIB::FilterSecond m_filter_quadrature;
|
||||||
|
private:
|
||||||
|
float _aux_reg;
|
||||||
|
public:
|
||||||
|
float direct;
|
||||||
|
float quadrature;
|
||||||
|
public:
|
||||||
|
DRCDecomposer();
|
||||||
|
void setup(float time_sample);
|
||||||
|
void configure(const DRCDecomposerConfiguration& config);
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
void get_outputs(float& d, float& q);
|
||||||
|
public:
|
||||||
|
void execute(float in_a, float in_b, float in_c,
|
||||||
|
float ort_direct_a, float ort_direct_b, float ort_direct_c,
|
||||||
|
float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c);
|
||||||
|
private:
|
||||||
|
void (DRCDecomposer::*_execute)(float in_a, float in_b, float in_c,
|
||||||
|
float ort_direct_a, float ort_direct_b, float ort_direct_c,
|
||||||
|
float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c);
|
||||||
|
void _execute_undef(float in_a, float in_b, float in_c,
|
||||||
|
float ort_direct_a, float ort_direct_b, float ort_direct_c,
|
||||||
|
float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c);
|
||||||
|
void _execute_operational(float in_a, float in_b, float in_c,
|
||||||
|
float ort_direct_a, float ort_direct_b, float ort_direct_c,
|
||||||
|
float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c);
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_DRCDECOMPOSER_H_ */
|
@ -0,0 +1,199 @@
|
|||||||
|
/*
|
||||||
|
* FanControl.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/FanControl.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define KM11_TURN_OFF (Uint16)0
|
||||||
|
#define KM11_TURN_ON (Uint16)1
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
FanControl::FanControl():
|
||||||
|
m_mode(SYSCTRL::FanControl::UNDEFINED),
|
||||||
|
m_time_sample(-1.0),
|
||||||
|
m_contact_bounce_period(FP_ZERO),
|
||||||
|
m_voltage_level_on(FP_ZERO),
|
||||||
|
m_voltage_level_off(FP_ZERO),
|
||||||
|
m_km11_control(0),
|
||||||
|
m_km11t_control(0),
|
||||||
|
m_fan_state(false),
|
||||||
|
m_fault(false),
|
||||||
|
m_voltage_relay(),
|
||||||
|
m_delay_off_timer(),
|
||||||
|
m_control_state_timer(),
|
||||||
|
_execute(&SYSCTRL::FanControl::_execute_undef)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void FanControl::setup(float time_sample)
|
||||||
|
{
|
||||||
|
static bool status = true;
|
||||||
|
if(m_mode == SYSCTRL::FanControl::UNDEFINED)
|
||||||
|
{
|
||||||
|
m_time_sample = time_sample;
|
||||||
|
|
||||||
|
m_delay_off_timer.setup(m_time_sample);
|
||||||
|
m_control_state_timer.setup(m_time_sample);
|
||||||
|
|
||||||
|
status &= m_time_sample > FP_ZERO ? true : false;
|
||||||
|
status &= m_delay_off_timer.compare(FLTSYSLIB::FTimer::CONFIGURATE);
|
||||||
|
status &= m_control_state_timer.compare(FLTSYSLIB::FTimer::CONFIGURATE);
|
||||||
|
|
||||||
|
if(status)
|
||||||
|
{
|
||||||
|
m_mode = SYSCTRL::FanControl::CONFIGURATE;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//setup()
|
||||||
|
//
|
||||||
|
void FanControl::configure(const FanControlConfiguration& config)
|
||||||
|
{
|
||||||
|
static bool status = true;
|
||||||
|
if(m_mode == SYSCTRL::FanControl::CONFIGURATE)
|
||||||
|
{
|
||||||
|
m_voltage_level_on = config.voltage_level_on;
|
||||||
|
m_voltage_level_off = config.voltage_level_off;
|
||||||
|
|
||||||
|
FLTSYSLIB::HysteresisConfiguration hyst_config;
|
||||||
|
hyst_config.level_high = 1.0;
|
||||||
|
hyst_config.level_low = FP_ZERO;
|
||||||
|
hyst_config.off = m_voltage_level_off;
|
||||||
|
hyst_config.on = m_voltage_level_on;
|
||||||
|
m_voltage_relay.configure(hyst_config);
|
||||||
|
|
||||||
|
FLTSYSLIB::FTimerConfiguration tm_config;
|
||||||
|
tm_config.period = config.delay_off_timer;
|
||||||
|
m_delay_off_timer.configure(tm_config);
|
||||||
|
tm_config.period = config.control_state_timer;
|
||||||
|
m_control_state_timer.configure(tm_config);
|
||||||
|
|
||||||
|
status &= m_voltage_relay.compare(FLTSYSLIB::Hysteresis::OPERATIONAL);
|
||||||
|
status &= m_delay_off_timer.compare(FLTSYSLIB::FTimer::OPERATIONAL);
|
||||||
|
status &= m_control_state_timer.compare(FLTSYSLIB::FTimer::OPERATIONAL);
|
||||||
|
|
||||||
|
if(status)
|
||||||
|
{
|
||||||
|
m_mode = SYSCTRL::FanControl::OPERATIONAL;
|
||||||
|
_execute = &SYSCTRL::FanControl::_execute_undef;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//configure()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
SYSCTRL::FanControl::mode_t FanControl::get_mode()
|
||||||
|
{
|
||||||
|
return m_mode;
|
||||||
|
//
|
||||||
|
}//get_mode()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool FanControl::compare(SYSCTRL::FanControl::mode_t mode)
|
||||||
|
{
|
||||||
|
return m_mode == mode;
|
||||||
|
//
|
||||||
|
}//compare()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
Uint16 FanControl::get_km11_control()
|
||||||
|
{
|
||||||
|
return m_km11_control;
|
||||||
|
//
|
||||||
|
}//get_km11_control()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
Uint16 FanControl::get_km11t_control()
|
||||||
|
{
|
||||||
|
return m_km11t_control;
|
||||||
|
//
|
||||||
|
}//get_km11t_control()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool FanControl::is_on()
|
||||||
|
{
|
||||||
|
return m_fan_state;
|
||||||
|
//
|
||||||
|
}//is_on()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool FanControl::is_off()
|
||||||
|
{
|
||||||
|
return !m_fan_state;
|
||||||
|
//
|
||||||
|
}//is_off()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool FanControl::is_fault()
|
||||||
|
{
|
||||||
|
return m_fault;
|
||||||
|
//
|
||||||
|
}//get_fault()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void FanControl::execute(float voltage, FLTSYSLIB::DigitalInput& aux_km)
|
||||||
|
{
|
||||||
|
(this->*_execute)(voltage, aux_km);
|
||||||
|
//
|
||||||
|
}//execute()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void FanControl::_execute_undef(float voltage, FLTSYSLIB::DigitalInput& aux_km)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}//_execute_undef()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void FanControl::_execute_operational(float voltage, FLTSYSLIB::DigitalInput& aux_km)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_fan_state = aux_km.is_on();
|
||||||
|
m_voltage_relay.execute(voltage);
|
||||||
|
m_delay_off_timer.execute();
|
||||||
|
m_control_state_timer.execute();
|
||||||
|
|
||||||
|
|
||||||
|
if(m_voltage_relay.is_on())
|
||||||
|
{
|
||||||
|
m_km11_control = KM11_TURN_ON;
|
||||||
|
m_km11t_control = KM11_TURN_OFF;
|
||||||
|
m_delay_off_timer.reset();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if((m_delay_off_timer.is_running()) || (m_voltage_relay.is_switched_to_off()))
|
||||||
|
{
|
||||||
|
m_km11_control = KM11_TURN_OFF;
|
||||||
|
m_km11t_control = KM11_TURN_ON;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
if(m_voltage_relay.is_switched_to_off())
|
||||||
|
{
|
||||||
|
m_delay_off_timer.start();
|
||||||
|
}//if
|
||||||
|
|
||||||
|
if(m_delay_off_timer.is_finished())
|
||||||
|
{
|
||||||
|
m_km11_control = KM11_TURN_OFF;
|
||||||
|
m_km11t_control = KM11_TURN_OFF;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//_execute_operational()
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* FanControl.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "DSP2833x_Device.h"
|
||||||
|
|
||||||
|
#include "FLTSYSLIB/Hysteresis.h"
|
||||||
|
#include "FLTSYSLIB/DigitalInput.h"
|
||||||
|
#include "FLTSYSLIB/FTimer.h"
|
||||||
|
#include "FLTSYSLIB/Relay.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_FANCONTROL_H_
|
||||||
|
#define SYSCTRL_FANCONTROL_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
struct FanControlConfiguration
|
||||||
|
{
|
||||||
|
float delay_off_timer;
|
||||||
|
float control_state_timer;
|
||||||
|
float voltage_level_on;
|
||||||
|
float voltage_level_off;
|
||||||
|
FanControlConfiguration():
|
||||||
|
delay_off_timer(FP_ZERO),
|
||||||
|
control_state_timer(FP_ZERO),
|
||||||
|
voltage_level_on(FP_ZERO),
|
||||||
|
voltage_level_off(FP_ZERO)
|
||||||
|
{}
|
||||||
|
//
|
||||||
|
};//FanControlConfiguration
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class FanControl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL};
|
||||||
|
private:
|
||||||
|
mode_t m_mode;
|
||||||
|
private:
|
||||||
|
float m_time_sample;
|
||||||
|
float m_contact_bounce_period;
|
||||||
|
float m_voltage_level_on;
|
||||||
|
float m_voltage_level_off;
|
||||||
|
private:
|
||||||
|
Uint16 m_km11_control;
|
||||||
|
Uint16 m_km11t_control;
|
||||||
|
bool m_fan_state;// false - is off, true - is on
|
||||||
|
bool m_fault;
|
||||||
|
FLTSYSLIB::Hysteresis m_voltage_relay;
|
||||||
|
FLTSYSLIB::FTimer m_delay_off_timer;
|
||||||
|
FLTSYSLIB::FTimer m_control_state_timer;
|
||||||
|
public:
|
||||||
|
FanControl();
|
||||||
|
void setup(float time_sample);
|
||||||
|
void configure(const FanControlConfiguration& config);
|
||||||
|
public:
|
||||||
|
mode_t get_mode();
|
||||||
|
bool compare(mode_t mode);
|
||||||
|
public:
|
||||||
|
Uint16 get_km11_control();
|
||||||
|
Uint16 get_km11t_control();
|
||||||
|
bool is_on();
|
||||||
|
bool is_off();
|
||||||
|
bool is_fault();
|
||||||
|
public:
|
||||||
|
void execute(float voltage, FLTSYSLIB::DigitalInput& aux_km);
|
||||||
|
private:
|
||||||
|
void (FanControl::*_execute)(float voltage, FLTSYSLIB::DigitalInput& aux_km);
|
||||||
|
void _execute_undef(float voltage, FLTSYSLIB::DigitalInput& aux_km);
|
||||||
|
void _execute_operational(float voltage, FLTSYSLIB::DigitalInput& aux_km);
|
||||||
|
//
|
||||||
|
};//FanControl
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_FANCONTROL_H_ */
|
@ -0,0 +1,135 @@
|
|||||||
|
/*
|
||||||
|
* FanTimerControl.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/FanTimerControl.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
FanTimerControl::FanTimerControl():
|
||||||
|
m_mode(SYSCTRL::FanTimerControl::UNDEFINED),
|
||||||
|
m_time_sample(-1.0),
|
||||||
|
m_timer_counter(FP_ZERO),
|
||||||
|
m_timer_period(FP_ZERO),
|
||||||
|
m_state(false),
|
||||||
|
_execute(&SYSCTRL::FanTimerControl::_execute_undef)
|
||||||
|
{}//
|
||||||
|
|
||||||
|
|
||||||
|
void FanTimerControl::setup(float time_sample)
|
||||||
|
{
|
||||||
|
if(m_mode == SYSCTRL::FanTimerControl::UNDEFINED)
|
||||||
|
{
|
||||||
|
if(time_sample >= FP_ZERO)
|
||||||
|
{
|
||||||
|
m_time_sample = time_sample;
|
||||||
|
m_mode = SYSCTRL::FanTimerControl::CONFIGURATE;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void FanTimerControl::configure(const FanTimerControlConfiguration& config)
|
||||||
|
{
|
||||||
|
if(compare(SYSCTRL::FanTimerControl::CONFIGURATE))
|
||||||
|
{
|
||||||
|
if(config.timer_period > m_time_sample)
|
||||||
|
{
|
||||||
|
m_timer_period = config.timer_period;
|
||||||
|
m_timer_counter = config.timer_period;
|
||||||
|
m_mode = SYSCTRL::FanTimerControl::OPERATIONAL;
|
||||||
|
_execute = &SYSCTRL::FanTimerControl::_execute_operational;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
FanTimerControl::mode_t FanTimerControl::get_mode()
|
||||||
|
{
|
||||||
|
return m_mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool FanTimerControl::compare(mode_t mode)
|
||||||
|
{
|
||||||
|
return m_mode == mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool FanTimerControl::is_on()
|
||||||
|
{
|
||||||
|
return m_state;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool FanTimerControl::is_off()
|
||||||
|
{
|
||||||
|
return !m_state;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void FanTimerControl::execute(bool is_switched_on, bool is_switched_off)
|
||||||
|
{
|
||||||
|
(this->*_execute)(is_switched_on, is_switched_off);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void FanTimerControl::_execute_undef(bool is_switched_on, bool is_switched_off)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void FanTimerControl::_execute_operational(bool is_switched_on, bool is_switched_off)
|
||||||
|
{
|
||||||
|
if(m_state)
|
||||||
|
{
|
||||||
|
// is on
|
||||||
|
if(m_timer_counter >= FP_ZERO)
|
||||||
|
{
|
||||||
|
m_timer_counter -= m_time_sample;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_state = false;
|
||||||
|
m_timer_counter = m_timer_period;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// is off
|
||||||
|
if(is_switched_off)
|
||||||
|
{
|
||||||
|
m_state = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_timer_counter = m_timer_period;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//
|
||||||
|
if(is_switched_on)
|
||||||
|
{
|
||||||
|
m_state = false;
|
||||||
|
m_timer_counter = m_timer_period;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* FanTimerControl.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_FANTIMERCONTROL_H_
|
||||||
|
#define SYSCTRL_FANTIMERCONTROL_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
struct FanTimerControlConfiguration
|
||||||
|
{
|
||||||
|
float timer_period;
|
||||||
|
FanTimerControlConfiguration():
|
||||||
|
timer_period(-1.0)
|
||||||
|
{}
|
||||||
|
//
|
||||||
|
};//FanTimerControlConfiguration
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class FanTimerControl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL};
|
||||||
|
private:
|
||||||
|
mode_t m_mode;
|
||||||
|
private:
|
||||||
|
float m_time_sample;
|
||||||
|
private:
|
||||||
|
float m_timer_counter;
|
||||||
|
float m_timer_period;
|
||||||
|
bool m_state;
|
||||||
|
public:
|
||||||
|
FanTimerControl();
|
||||||
|
void setup(float time_sample);
|
||||||
|
void configure(const FanTimerControlConfiguration& config);
|
||||||
|
public:
|
||||||
|
mode_t get_mode();
|
||||||
|
bool compare(mode_t mode);
|
||||||
|
public:
|
||||||
|
bool is_on();
|
||||||
|
bool is_off();
|
||||||
|
public:
|
||||||
|
void execute(bool is_switched_on, bool is_switched_off);
|
||||||
|
private:
|
||||||
|
void (FanTimerControl::*_execute)(bool is_switched_on, bool is_switched_off);
|
||||||
|
void _execute_undef(bool is_switched_on, bool is_switched_off);
|
||||||
|
void _execute_operational(bool is_switched_on, bool is_switched_off);
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_FANTIMERCONTROL_H_ */
|
@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* GeneratorSymmetricalComponents.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/GeneratorSymmetricalComponents.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
GeneratorSymmetricalComponents::GeneratorSymmetricalComponents():
|
||||||
|
m_amplitude(),
|
||||||
|
m_phase(),
|
||||||
|
m_ort_direct_alpha(FP_ZERO),
|
||||||
|
m_ort_direct_beta(FP_ZERO),
|
||||||
|
m_ort_inverse_alpha(FP_ZERO),
|
||||||
|
m_ort_inverse_beta(FP_ZERO),
|
||||||
|
m_direct_alpha(FP_ZERO),
|
||||||
|
m_direct_beta(FP_ZERO),
|
||||||
|
m_inverse_alpha(FP_ZERO),
|
||||||
|
m_inverse_beta(FP_ZERO),
|
||||||
|
m_direct_a(FP_ZERO),
|
||||||
|
m_direct_b(FP_ZERO),
|
||||||
|
m_direct_c(FP_ZERO),
|
||||||
|
m_inverse_a(FP_ZERO),
|
||||||
|
m_inverse_b(FP_ZERO),
|
||||||
|
m_inverse_c(FP_ZERO),
|
||||||
|
m_out_a(FP_ZERO),
|
||||||
|
m_out_b(FP_ZERO),
|
||||||
|
m_out_c(FP_ZERO)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void GeneratorSymmetricalComponents::configure(GeneratorSymmetricalComponentsConfiguration& config)
|
||||||
|
{
|
||||||
|
m_amplitude = config.amplitude;
|
||||||
|
m_phase = config.phase;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void GeneratorSymmetricalComponents::execute(float ort_alpha, float ort_beta)
|
||||||
|
{
|
||||||
|
m_phase.direct.cos_phase = cosf(m_phase.direct.phase);
|
||||||
|
m_phase.direct.sin_phase = sinf(m_phase.direct.phase);
|
||||||
|
m_phase.inverse.cos_phase = cosf(m_phase.inverse.phase);
|
||||||
|
m_phase.inverse.sin_phase = sinf(m_phase.inverse.phase);
|
||||||
|
//
|
||||||
|
m_ort_direct_alpha = ort_alpha * m_phase.direct.cos_phase - ort_beta * m_phase.direct.sin_phase;
|
||||||
|
m_ort_direct_beta = ort_alpha * m_phase.direct.sin_phase + ort_beta * m_phase.direct.cos_phase;
|
||||||
|
//
|
||||||
|
m_ort_inverse_alpha = ort_alpha * m_phase.inverse.cos_phase + ort_beta * m_phase.inverse.sin_phase;
|
||||||
|
m_ort_inverse_beta = ort_alpha * m_phase.inverse.sin_phase - ort_beta * m_phase.inverse.cos_phase;
|
||||||
|
//
|
||||||
|
FLTSYSLIB::Transformation::park_inverse(m_ort_direct_alpha, m_ort_direct_beta, m_amplitude.direct.d, m_amplitude.direct.q, m_direct_alpha, m_direct_beta);
|
||||||
|
FLTSYSLIB::Transformation::park_inverse(m_ort_inverse_alpha, m_ort_inverse_beta, m_amplitude.inverse.d, m_amplitude.inverse.q, m_inverse_alpha, m_inverse_beta);
|
||||||
|
FLTSYSLIB::Transformation::clarke_inverse(m_direct_alpha, m_direct_beta, m_direct_a, m_direct_b, m_direct_c);
|
||||||
|
FLTSYSLIB::Transformation::clarke_inverse(m_inverse_alpha, m_inverse_beta, m_inverse_a, m_inverse_b, m_inverse_c);
|
||||||
|
//
|
||||||
|
m_out_a = m_direct_a + m_inverse_a + m_amplitude.zero_a;
|
||||||
|
m_out_b = m_direct_b + m_inverse_b + m_amplitude.zero_b;
|
||||||
|
m_out_c = m_direct_c + m_inverse_c + m_amplitude.zero_c;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void GeneratorSymmetricalComponents::get_output(float& out_a, float& out_b, float& out_c)
|
||||||
|
{
|
||||||
|
out_a = m_out_a;
|
||||||
|
out_b = m_out_b;
|
||||||
|
out_c = m_out_c;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* GeneratorSymmetricalComponents.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_GENERATORSYMMETRICALCOMPONENTS_H_
|
||||||
|
#define SYSCTRL_GENERATORSYMMETRICALCOMPONENTS_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
//#include "SYSCTRL/HeadersFLTSYSLIB.h"
|
||||||
|
#include "FLTSYSLIB/Transformation.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct GeneratorPhase
|
||||||
|
{
|
||||||
|
float phase;
|
||||||
|
float cos_phase;
|
||||||
|
float sin_phase;
|
||||||
|
GeneratorPhase():
|
||||||
|
phase(FP_ZERO),
|
||||||
|
cos_phase(FP_ZERO),
|
||||||
|
sin_phase(FP_ZERO)
|
||||||
|
{}
|
||||||
|
};//GeneratorPhase
|
||||||
|
|
||||||
|
struct GeneratorSymmetricalComponentsPhase
|
||||||
|
{
|
||||||
|
GeneratorPhase direct;
|
||||||
|
GeneratorPhase inverse;
|
||||||
|
GeneratorSymmetricalComponentsPhase():
|
||||||
|
direct(),
|
||||||
|
inverse()
|
||||||
|
{}
|
||||||
|
};//GeneratorSymmetricalComponentsPhase
|
||||||
|
|
||||||
|
|
||||||
|
struct GeneratorAmplitude
|
||||||
|
{
|
||||||
|
float d;
|
||||||
|
float q;
|
||||||
|
GeneratorAmplitude():
|
||||||
|
d(FP_ZERO),
|
||||||
|
q(FP_ZERO)
|
||||||
|
{}
|
||||||
|
};//GeneratorAmplitude
|
||||||
|
|
||||||
|
|
||||||
|
struct GeneratorSymmetricalComponentsAmplitude
|
||||||
|
{
|
||||||
|
GeneratorAmplitude direct;
|
||||||
|
GeneratorAmplitude inverse;
|
||||||
|
float zero_a;
|
||||||
|
float zero_b;
|
||||||
|
float zero_c;
|
||||||
|
GeneratorSymmetricalComponentsAmplitude():
|
||||||
|
direct(),
|
||||||
|
inverse(),
|
||||||
|
zero_a(FP_ZERO),
|
||||||
|
zero_b(FP_ZERO),
|
||||||
|
zero_c(FP_ZERO)
|
||||||
|
{}
|
||||||
|
};//GeneratorSymmetricalComponentsAmplitude
|
||||||
|
|
||||||
|
|
||||||
|
struct GeneratorSymmetricalComponentsConfiguration
|
||||||
|
{
|
||||||
|
GeneratorSymmetricalComponentsAmplitude amplitude;
|
||||||
|
GeneratorSymmetricalComponentsPhase phase;
|
||||||
|
GeneratorSymmetricalComponentsConfiguration():
|
||||||
|
amplitude(),
|
||||||
|
phase()
|
||||||
|
{}
|
||||||
|
};//GeneratorSymmetricalComponentsConfiguration
|
||||||
|
|
||||||
|
|
||||||
|
class GeneratorSymmetricalComponents
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
GeneratorSymmetricalComponentsAmplitude m_amplitude;
|
||||||
|
GeneratorSymmetricalComponentsPhase m_phase;
|
||||||
|
private:
|
||||||
|
float m_ort_direct_alpha;
|
||||||
|
float m_ort_direct_beta;
|
||||||
|
float m_ort_inverse_alpha;
|
||||||
|
float m_ort_inverse_beta;
|
||||||
|
private:
|
||||||
|
float m_direct_alpha;
|
||||||
|
float m_direct_beta;
|
||||||
|
float m_inverse_alpha;
|
||||||
|
float m_inverse_beta;
|
||||||
|
private:
|
||||||
|
float m_direct_a;
|
||||||
|
float m_direct_b;
|
||||||
|
float m_direct_c;
|
||||||
|
float m_inverse_a;
|
||||||
|
float m_inverse_b;
|
||||||
|
float m_inverse_c;
|
||||||
|
private:
|
||||||
|
float m_out_a;
|
||||||
|
float m_out_b;
|
||||||
|
float m_out_c;
|
||||||
|
public:
|
||||||
|
GeneratorSymmetricalComponents();
|
||||||
|
public:
|
||||||
|
void configure(GeneratorSymmetricalComponentsConfiguration& config);
|
||||||
|
public:
|
||||||
|
void execute(float ort_alpha, float ort_beta);
|
||||||
|
void get_output(float& out_a, float& out_b, float& out_c);
|
||||||
|
};//GeneratorSymmetricalComponents
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_GENERATORSYMMETRICALCOMPONENTS_H_ */
|
@ -0,0 +1,243 @@
|
|||||||
|
/*
|
||||||
|
* CELL.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/HVCELL.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
HVCELL::HVCELL():
|
||||||
|
m_mode(SYSCTRL::HVCELL::UNDEFINED),
|
||||||
|
m_control_order(ORDER_STOP),
|
||||||
|
//m_switching_freq(SWITCHING_FREQ_2500),
|
||||||
|
m_cell_level(0),
|
||||||
|
m_cell_error(0),
|
||||||
|
m_pwm_version(),
|
||||||
|
m_cell_state(),
|
||||||
|
m_cell_dc_voltage(),
|
||||||
|
m_cell_version(),
|
||||||
|
m_cpu_cpld_version(0),
|
||||||
|
m_data_u(FP_ZERO),
|
||||||
|
m_data_v(FP_ZERO),
|
||||||
|
m_data_w(FP_ZERO),
|
||||||
|
//
|
||||||
|
m_dc_voltage_a(FP_ZERO),
|
||||||
|
m_dc_voltage_b(FP_ZERO),
|
||||||
|
m_dc_voltage_c(FP_ZERO),
|
||||||
|
//
|
||||||
|
m_fault_cell(false),
|
||||||
|
m_cell_error_fault(0),
|
||||||
|
m_cell_state_fault(),
|
||||||
|
//
|
||||||
|
p_send_syn_signal(&SYSCTRL::HVCELL::_empty),
|
||||||
|
p_send_control_order(&SYSCTRL::HVCELL::_empty),
|
||||||
|
p_set_cell_level(&SYSCTRL::HVCELL::_empty),
|
||||||
|
p_get_pwm_version(&SYSCTRL::HVCELL::_empty),
|
||||||
|
p_get_cell_state(&SYSCTRL::HVCELL::_empty),
|
||||||
|
p_get_cell_dc_voltage(&SYSCTRL::HVCELL::_empty),
|
||||||
|
p_get_cell_version(&SYSCTRL::HVCELL::_empty),
|
||||||
|
p_send_modulate_data(&SYSCTRL::HVCELL::_empty),
|
||||||
|
p_get_cpu_cpld_version(&SYSCTRL::HVCELL::_empty)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::configure(HVCELLConfiguration& config)
|
||||||
|
{
|
||||||
|
static bool status = true;
|
||||||
|
if(m_mode == SYSCTRL::HVCELL::UNDEFINED)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_cell_level = config.cell_level;
|
||||||
|
//m_switching_freq = config.switching_freq;
|
||||||
|
|
||||||
|
status &= (m_cell_level >= 1)&&(m_cell_level <= 8) ? true : false;
|
||||||
|
|
||||||
|
if(status)
|
||||||
|
{
|
||||||
|
m_mode = SYSCTRL::HVCELL::OPERATIONAL;
|
||||||
|
//
|
||||||
|
p_send_syn_signal = &SYSCTRL::HVCELL::_send_syn_signal;
|
||||||
|
p_send_control_order = &SYSCTRL::HVCELL::_send_control_order;
|
||||||
|
p_set_cell_level = &SYSCTRL::HVCELL::_set_cell_level;
|
||||||
|
p_get_pwm_version = &SYSCTRL::HVCELL::_get_pwm_version;
|
||||||
|
p_get_cell_state = &SYSCTRL::HVCELL::_get_cell_state;
|
||||||
|
p_get_cell_dc_voltage = &SYSCTRL::HVCELL::_get_cell_dc_voltage;
|
||||||
|
p_get_cell_version = &SYSCTRL::HVCELL::_get_cell_version;
|
||||||
|
p_send_modulate_data = &SYSCTRL::HVCELL::_send_modulate_data;
|
||||||
|
p_get_cpu_cpld_version = &SYSCTRL::HVCELL::_get_cpu_cpld_version;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//configure()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
SYSCTRL::HVCELL::mode_t HVCELL::get_mode()
|
||||||
|
{
|
||||||
|
return m_mode;
|
||||||
|
//
|
||||||
|
}//get_mode()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool HVCELL::compare(SYSCTRL::HVCELL::mode_t mode)
|
||||||
|
{
|
||||||
|
return m_mode == mode;
|
||||||
|
//
|
||||||
|
}//compare()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::send_syn_signal()
|
||||||
|
{
|
||||||
|
(this->*p_send_syn_signal)();
|
||||||
|
//
|
||||||
|
}//send_syn_signal()
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::_send_syn_signal()
|
||||||
|
{
|
||||||
|
sendSynSignal();
|
||||||
|
//
|
||||||
|
}//_send_syn_signal()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::send_control_order()
|
||||||
|
{
|
||||||
|
(this->*p_send_control_order)();
|
||||||
|
//
|
||||||
|
}//send_control_order_start()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::_send_control_order()
|
||||||
|
{
|
||||||
|
sendControlOrder(m_control_order);
|
||||||
|
//
|
||||||
|
}//_send_control_order()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::set_cell_level()
|
||||||
|
{
|
||||||
|
(this->*p_set_cell_level)();
|
||||||
|
//
|
||||||
|
}//set_cell_level()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::_set_cell_level()
|
||||||
|
{
|
||||||
|
//m_cell_error = setCellLevel(m_cell_level, m_switching_freq);
|
||||||
|
m_cell_error = setCellLevel(m_cell_level);
|
||||||
|
//
|
||||||
|
}//_set_cell_level()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::get_pwm_version()
|
||||||
|
{
|
||||||
|
(this->*p_get_pwm_version)();
|
||||||
|
//
|
||||||
|
}//get_pwm_version()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::_get_pwm_version()
|
||||||
|
{
|
||||||
|
getPwmVersion(m_pwm_version);
|
||||||
|
//
|
||||||
|
}//_get_pwm_version()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::get_cell_state()
|
||||||
|
{
|
||||||
|
(this->*p_get_cell_state)();
|
||||||
|
//
|
||||||
|
}//get_cell_state()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::_get_cell_state()
|
||||||
|
{
|
||||||
|
getCellState(m_cell_level, m_cell_state);
|
||||||
|
//
|
||||||
|
}//_get_cell_state()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::get_cell_dc_voltage()
|
||||||
|
{
|
||||||
|
(this->*p_get_cell_dc_voltage)();
|
||||||
|
//
|
||||||
|
}//get_cell_dc_voltage()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::_get_cell_dc_voltage()
|
||||||
|
{
|
||||||
|
static float aux_a, aux_b, aux_c;
|
||||||
|
|
||||||
|
getCellDCVoltage(m_cell_level, m_cell_dc_voltage);
|
||||||
|
|
||||||
|
aux_a = FP_ZERO;
|
||||||
|
aux_b = FP_ZERO;
|
||||||
|
aux_c = FP_ZERO;
|
||||||
|
//
|
||||||
|
for(Uint16 cellnum = 0; cellnum < m_cell_level; cellnum++)
|
||||||
|
{
|
||||||
|
aux_a += m_cell_dc_voltage[0][cellnum];
|
||||||
|
aux_b += m_cell_dc_voltage[1][cellnum];
|
||||||
|
aux_c += m_cell_dc_voltage[2][cellnum];
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
m_dc_voltage_a = aux_a;
|
||||||
|
m_dc_voltage_b = aux_b;
|
||||||
|
m_dc_voltage_c = aux_c;
|
||||||
|
//
|
||||||
|
}//_get_cell_dc_voltage()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::get_cell_version()
|
||||||
|
{
|
||||||
|
(this->*p_get_cell_version)();
|
||||||
|
//
|
||||||
|
}//get_cell_version()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::_get_cell_version()
|
||||||
|
{
|
||||||
|
getCellVersion(m_cell_level, m_cell_version);
|
||||||
|
//
|
||||||
|
}//get_cell_version()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::send_modulate_data()
|
||||||
|
{
|
||||||
|
(this->*p_send_modulate_data)();
|
||||||
|
//
|
||||||
|
}//send_modulate_data()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::_send_modulate_data()
|
||||||
|
{
|
||||||
|
//sendModulateData(m_data_u, m_data_v, m_data_w, m_switching_freq);
|
||||||
|
sendModulateData(m_data_u, m_data_v, m_data_w);
|
||||||
|
//
|
||||||
|
}//_send_modulate_data()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::get_cpu_cpld_version()
|
||||||
|
{
|
||||||
|
(this->*p_get_cpu_cpld_version)();
|
||||||
|
//
|
||||||
|
}//get_cpu_cpld_version()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::_get_cpu_cpld_version()
|
||||||
|
{
|
||||||
|
m_cpu_cpld_version = getCpuCpldVersion();
|
||||||
|
//
|
||||||
|
}//_get_cpu_cpld_version()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HVCELL::_empty()
|
||||||
|
{}//_empty()
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* HVCELL.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "framework.h"
|
||||||
|
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||||
|
#include "DSP2833x_Examples.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_HVCELL_H_
|
||||||
|
#define SYSCTRL_HVCELL_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
struct HVCELLConfiguration
|
||||||
|
{
|
||||||
|
Uint16 cell_level;
|
||||||
|
//UnitSwitchingFreq switching_freq;
|
||||||
|
HVCELLConfiguration():
|
||||||
|
cell_level(0)
|
||||||
|
//switching_freq(SWITCHING_FREQ_2500)
|
||||||
|
{}
|
||||||
|
};//HVCELLConfiguration
|
||||||
|
|
||||||
|
|
||||||
|
class HVCELL
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL};
|
||||||
|
private:
|
||||||
|
mode_t m_mode;
|
||||||
|
private:
|
||||||
|
ControlOrder m_control_order;
|
||||||
|
//UnitSwitchingFreq m_switching_freq;
|
||||||
|
Uint16 m_cell_level;
|
||||||
|
Uint16 m_cell_error;
|
||||||
|
Uint16 m_pwm_version[3];
|
||||||
|
CellState m_cell_state[3][13];
|
||||||
|
float m_cell_dc_voltage[3][13];
|
||||||
|
Uint16 m_cell_version[3][13];
|
||||||
|
Uint32 m_cpu_cpld_version;
|
||||||
|
float m_data_u;
|
||||||
|
float m_data_v;
|
||||||
|
float m_data_w;
|
||||||
|
private:
|
||||||
|
float m_dc_voltage_a;
|
||||||
|
float m_dc_voltage_b;
|
||||||
|
float m_dc_voltage_c;
|
||||||
|
bool m_fault_cell;
|
||||||
|
Uint16 m_cell_error_fault;
|
||||||
|
CellState m_cell_state_fault[3][13];
|
||||||
|
|
||||||
|
public:
|
||||||
|
HVCELL();
|
||||||
|
void configure(HVCELLConfiguration& config);
|
||||||
|
mode_t get_mode();
|
||||||
|
bool compare(mode_t mode);
|
||||||
|
public:
|
||||||
|
void send_syn_signal();
|
||||||
|
void send_control_order();
|
||||||
|
void set_cell_level();
|
||||||
|
void get_pwm_version();
|
||||||
|
void get_cell_state();
|
||||||
|
void get_cell_dc_voltage();
|
||||||
|
void get_cell_version();
|
||||||
|
void send_modulate_data();
|
||||||
|
void get_cpu_cpld_version();
|
||||||
|
private:
|
||||||
|
void (HVCELL::*p_send_syn_signal)();
|
||||||
|
void _send_syn_signal();
|
||||||
|
void (HVCELL::*p_send_control_order)();
|
||||||
|
void _send_control_order();
|
||||||
|
void (HVCELL::*p_set_cell_level)();
|
||||||
|
void _set_cell_level();
|
||||||
|
void (HVCELL::*p_get_pwm_version)();
|
||||||
|
void _get_pwm_version();
|
||||||
|
void (HVCELL::*p_get_cell_state)();
|
||||||
|
void _get_cell_state();
|
||||||
|
void (HVCELL::*p_get_cell_dc_voltage)();
|
||||||
|
void _get_cell_dc_voltage();
|
||||||
|
void (HVCELL::*p_get_cell_version)();
|
||||||
|
void _get_cell_version();
|
||||||
|
void (HVCELL::*p_send_modulate_data)();
|
||||||
|
void _send_modulate_data();
|
||||||
|
void (HVCELL::*p_get_cpu_cpld_version)();
|
||||||
|
void _get_cpu_cpld_version();
|
||||||
|
void _empty();
|
||||||
|
//
|
||||||
|
};//class HVCELL
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_HVCELL_H_ */
|
@ -0,0 +1,238 @@
|
|||||||
|
/*
|
||||||
|
* HardWare.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/HardWare.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
HardWare::HardWare():
|
||||||
|
enable(true),
|
||||||
|
fault(false),
|
||||||
|
fault_low_level(false),
|
||||||
|
level((Uint16)0),
|
||||||
|
error((Uint16)0),
|
||||||
|
//switching_freq(SWITCHING_FREQ_2500),
|
||||||
|
dc_voltage_low_level(500.0),
|
||||||
|
control_order_cell(ORDER_STOP),
|
||||||
|
ref_control_order(ORDER_STOP),
|
||||||
|
pwm_version(),
|
||||||
|
cpu_cpld_version((Uint32)0),
|
||||||
|
hvcell(),
|
||||||
|
disable_hw(),
|
||||||
|
disable_a_cells(),
|
||||||
|
disable_b_cells(),
|
||||||
|
disable_c_cells(),
|
||||||
|
version_default()
|
||||||
|
{
|
||||||
|
|
||||||
|
for(Uint16 phase = 0; phase < 3; phase++)
|
||||||
|
{
|
||||||
|
for(Uint16 cellnum = 0; cellnum < 13; cellnum++)
|
||||||
|
{
|
||||||
|
hvcell.dc_voltage[phase][cellnum] = FP_ZERO;
|
||||||
|
hvcell.state[phase][cellnum].all = 0;
|
||||||
|
hvcell.version[phase][cellnum] = 0;
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
}//CONSTRUCTOR
|
||||||
|
|
||||||
|
|
||||||
|
void HardWare::configure(const HardWareConfiguration config)
|
||||||
|
{
|
||||||
|
//switching_freq = config.switching_freq;
|
||||||
|
level = config.cell_level;
|
||||||
|
version_default = config.version;
|
||||||
|
disable_hw.all = (uint16_t)0;
|
||||||
|
disable_a_cells.all = (uint32_t)0;
|
||||||
|
disable_b_cells.all = (uint32_t)0;
|
||||||
|
disable_c_cells.all = (uint32_t)0;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HardWare::check_status()
|
||||||
|
{
|
||||||
|
if(cpu_cpld_version != version_default.cpu_cpld)
|
||||||
|
{
|
||||||
|
disable_hw.bits.cpu_cpld = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
disable_hw.bits.cpu_cpld = 0;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
if(pwm_version[0] != version_default.pwm)
|
||||||
|
{
|
||||||
|
disable_hw.bits.pwm_a = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
disable_hw.bits.pwm_a = 0;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
if(pwm_version[1] != version_default.pwm)
|
||||||
|
{
|
||||||
|
disable_hw.bits.pwm_b = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
disable_hw.bits.pwm_b = 0;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
if(pwm_version[2] != version_default.pwm)
|
||||||
|
{
|
||||||
|
disable_hw.bits.pwm_c = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
disable_hw.bits.pwm_c = 0;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
|
||||||
|
static uint32_t mask = (uint32_t)0;
|
||||||
|
static uint32_t auxreg_0 = (uint32_t)0;
|
||||||
|
static uint32_t auxreg_1 = (uint32_t)0;
|
||||||
|
static uint32_t auxreg_2 = (uint32_t)0;
|
||||||
|
auxreg_0 = (uint32_t)0;
|
||||||
|
auxreg_1 = (uint32_t)0;
|
||||||
|
auxreg_2 = (uint32_t)0;
|
||||||
|
for(Uint16 cellnum = 0; cellnum < level; cellnum++)
|
||||||
|
{
|
||||||
|
mask = (uint32_t)0;
|
||||||
|
if(hvcell.version[0][cellnum] != version_default.cell)
|
||||||
|
{
|
||||||
|
mask = (uint32_t)0;
|
||||||
|
mask = 1 << (cellnum);
|
||||||
|
auxreg_0 |= mask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mask = (uint32_t)0;
|
||||||
|
mask = 1 << (cellnum);
|
||||||
|
mask = (uint32_t)((uint32_t)0xFFFFFFFF ^ (uint32_t)mask);
|
||||||
|
auxreg_0 &= mask;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
mask = (uint32_t)0;
|
||||||
|
if(hvcell.version[1][cellnum] != version_default.cell)
|
||||||
|
{
|
||||||
|
mask = 1 << (cellnum);
|
||||||
|
auxreg_1 |= mask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mask = 1 << (cellnum);
|
||||||
|
mask = (uint32_t)((uint32_t)0xFFFFFFFF ^ (uint32_t)mask);
|
||||||
|
auxreg_1 &= mask;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
mask = (uint32_t)0;
|
||||||
|
if(hvcell.version[2][cellnum] != version_default.cell)
|
||||||
|
{
|
||||||
|
mask = 1 << (cellnum);
|
||||||
|
auxreg_2 |= mask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mask = 1 << (cellnum);
|
||||||
|
mask = (uint32_t)((uint32_t)0xFFFFFFFF ^ (uint32_t)mask);
|
||||||
|
auxreg_2 &= mask;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
disable_a_cells.all = (uint32_t)auxreg_0;
|
||||||
|
disable_c_cells.all = (uint32_t)auxreg_1;
|
||||||
|
disable_b_cells.all = (uint32_t)auxreg_2;
|
||||||
|
//
|
||||||
|
static bool tmp_enable = true;
|
||||||
|
tmp_enable = true;
|
||||||
|
// tmp_enable &= disable_hw.all == 0 ? true : false;
|
||||||
|
// tmp_enable &= disable_a_cells.all == 0 ? true : false;
|
||||||
|
// tmp_enable &= disable_b_cells.all == 0 ? true : false;
|
||||||
|
// tmp_enable &= disable_c_cells.all == 0 ? true : false;
|
||||||
|
enable = tmp_enable;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool HardWare::is_enable()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
return enable;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HardWare::check_faults(mode_fault_t fmode)
|
||||||
|
{
|
||||||
|
|
||||||
|
for(Uint16 cellnum = 0; cellnum < level; cellnum++)
|
||||||
|
{
|
||||||
|
for(Uint16 phasenum = 0; phasenum < 3; phasenum++)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(SYSCTRL::HardWare::COMPLETE == fmode)
|
||||||
|
{
|
||||||
|
if(((Uint16)(MASK_CELL_STATE_FAULTS & hvcell.state[phasenum][cellnum].all)) != (Uint16)0)
|
||||||
|
{
|
||||||
|
fault = true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(((Uint16)(MASK_CELL_STATE_FAULTS_SHORT & hvcell.state[phasenum][cellnum].all)) != (Uint16)0)
|
||||||
|
{
|
||||||
|
fault = true;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
}
|
||||||
|
|
||||||
|
if(((Uint16)(MASK_CELL_LOW_LEVEL & hvcell.state[phasenum][cellnum].all)) != (Uint16)0)
|
||||||
|
{
|
||||||
|
fault_low_level = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
};//for
|
||||||
|
//
|
||||||
|
}//for
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool HardWare::is_fault()
|
||||||
|
{
|
||||||
|
return fault;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
bool HardWare::low_level()
|
||||||
|
{
|
||||||
|
return fault_low_level;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void HardWare::reset()
|
||||||
|
{
|
||||||
|
fault = false;
|
||||||
|
fault_low_level = false;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,194 @@
|
|||||||
|
/*
|
||||||
|
* HardWare.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "framework.h"
|
||||||
|
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||||
|
#include "DSP2833x_Examples.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_HARDWARE_H_
|
||||||
|
#define SYSCTRL_HARDWARE_H_
|
||||||
|
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
#define MASK_CELL_STATE_DOWN_COMM (Uint16)0x0001
|
||||||
|
#define MASK_CELL_STATE_UP_COMM (Uint16)0x0002
|
||||||
|
#define MASK_CELL_STATE_RESERVED_1 (Uint16)0x0004
|
||||||
|
#define MASK_CELL_STATE_RUNNING (Uint16)0x0008
|
||||||
|
//
|
||||||
|
#define MASK_CELL_STATE_IGBT4_FAULT (Uint16)0x0010
|
||||||
|
#define MASK_CELL_STATE_IGBT3_FAULT (Uint16)0x0020
|
||||||
|
#define MASK_CELL_STATE_IGBT2_FAULT (Uint16)0x0040
|
||||||
|
#define MASK_CELL_STATE_IGBT1_FAULT (Uint16)0x0080
|
||||||
|
//
|
||||||
|
#define MASK_CELL_STATE_RESERVED_2 (Uint16)0x0100
|
||||||
|
#define MASK_CELL_STATE_TEMP_OVER (Uint16)0x0200
|
||||||
|
#define MASK_CELL_STATE_UNDER_VOLTAGE (Uint16)0x0400
|
||||||
|
#define MASK_CELL_STATE_OVER_VOLTAGE (Uint16)0x0800
|
||||||
|
//
|
||||||
|
#define MASK_CELL_STATE_RESERVED_3 (Uint16)0x0F800
|
||||||
|
|
||||||
|
#define MASK_CELL_STATE_FAULTS (Uint16)(MASK_CELL_STATE_DOWN_COMM |\
|
||||||
|
MASK_CELL_STATE_UP_COMM |\
|
||||||
|
MASK_CELL_STATE_IGBT4_FAULT |\
|
||||||
|
MASK_CELL_STATE_IGBT3_FAULT |\
|
||||||
|
MASK_CELL_STATE_IGBT2_FAULT |\
|
||||||
|
MASK_CELL_STATE_IGBT1_FAULT |\
|
||||||
|
MASK_CELL_STATE_TEMP_OVER |\
|
||||||
|
MASK_CELL_STATE_UNDER_VOLTAGE |\
|
||||||
|
MASK_CELL_STATE_OVER_VOLTAGE)
|
||||||
|
|
||||||
|
#define MASK_CELL_STATE_FAULTS_SHORT (Uint16)(MASK_CELL_STATE_IGBT4_FAULT |\
|
||||||
|
MASK_CELL_STATE_IGBT3_FAULT |\
|
||||||
|
MASK_CELL_STATE_IGBT2_FAULT |\
|
||||||
|
MASK_CELL_STATE_IGBT1_FAULT |\
|
||||||
|
MASK_CELL_STATE_TEMP_OVER |\
|
||||||
|
MASK_CELL_STATE_OVER_VOLTAGE)
|
||||||
|
|
||||||
|
#define MASK_CELL_LOW_LEVEL (Uint16)(MASK_CELL_STATE_DOWN_COMM |\
|
||||||
|
MASK_CELL_STATE_UP_COMM |\
|
||||||
|
MASK_CELL_STATE_UNDER_VOLTAGE)
|
||||||
|
|
||||||
|
|
||||||
|
struct HardWareVersion
|
||||||
|
{
|
||||||
|
uint16_t pwm;
|
||||||
|
uint16_t cell;
|
||||||
|
uint32_t cpu_cpld;
|
||||||
|
HardWareVersion():
|
||||||
|
pwm(uint16_t(0)),
|
||||||
|
cell(uint16_t(0)),
|
||||||
|
cpu_cpld(uint32_t(0))
|
||||||
|
{}
|
||||||
|
};//HardWareVersion
|
||||||
|
|
||||||
|
|
||||||
|
struct HardWareConfiguration
|
||||||
|
{
|
||||||
|
uint16_t cell_level;
|
||||||
|
//UnitSwitchingFreq switching_freq;
|
||||||
|
SYSCTRL::HardWareVersion version;
|
||||||
|
HardWareConfiguration():
|
||||||
|
cell_level(0),
|
||||||
|
//switching_freq(SWITCHING_FREQ_2500),
|
||||||
|
version()
|
||||||
|
{}
|
||||||
|
};//HardWareConfiguration
|
||||||
|
|
||||||
|
|
||||||
|
struct Cell
|
||||||
|
{
|
||||||
|
CellState state[3][13];
|
||||||
|
float dc_voltage[3][13];
|
||||||
|
uint16_t version[3][13];
|
||||||
|
float data_u;
|
||||||
|
float data_v;
|
||||||
|
float data_w;
|
||||||
|
Cell():
|
||||||
|
state(),
|
||||||
|
dc_voltage(),
|
||||||
|
version(),
|
||||||
|
data_u(FP_ZERO),
|
||||||
|
data_v(FP_ZERO),
|
||||||
|
data_w(FP_ZERO)
|
||||||
|
{}
|
||||||
|
};//Cell
|
||||||
|
|
||||||
|
|
||||||
|
struct HVCellDisableBit
|
||||||
|
{
|
||||||
|
uint32_t cell_1: 1;
|
||||||
|
uint32_t cell_2: 1;
|
||||||
|
uint32_t cell_3: 1;
|
||||||
|
uint32_t cell_4: 1;
|
||||||
|
uint32_t cell_5: 1;
|
||||||
|
uint32_t cell_6: 1;
|
||||||
|
uint32_t cell_7: 1;
|
||||||
|
uint32_t cell_8: 1;
|
||||||
|
uint32_t cell_9: 1;
|
||||||
|
uint32_t cell_10: 1;
|
||||||
|
uint32_t cell_11: 1;
|
||||||
|
uint32_t cell_12: 1;
|
||||||
|
uint32_t cell_13: 1;
|
||||||
|
uint32_t cell_14: 1;
|
||||||
|
uint32_t cell_15: 1;
|
||||||
|
uint32_t cell_16: 1;
|
||||||
|
uint32_t cell_17: 1;
|
||||||
|
uint32_t cell_18: 1;
|
||||||
|
};//HVCellDisableBit
|
||||||
|
|
||||||
|
union HVCellDisableRegister
|
||||||
|
{
|
||||||
|
uint32_t all;
|
||||||
|
HVCellDisableBit bits;
|
||||||
|
HVCellDisableRegister():
|
||||||
|
all((uint32_t)0)
|
||||||
|
{}
|
||||||
|
};//HVCellDisableRegister
|
||||||
|
|
||||||
|
struct HardWareDisableBit
|
||||||
|
{
|
||||||
|
uint16_t cpu_cpld: 1;
|
||||||
|
uint16_t pwm_a: 1;
|
||||||
|
uint16_t pwm_b: 1;
|
||||||
|
uint16_t pwm_c: 1;
|
||||||
|
};//HardWareDisableBit
|
||||||
|
|
||||||
|
union HardWareDisableRegister
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
HardWareDisableBit bits;
|
||||||
|
HardWareDisableRegister():
|
||||||
|
all((uint16_t)0)
|
||||||
|
{}
|
||||||
|
};//HardWareDisable
|
||||||
|
|
||||||
|
|
||||||
|
class HardWare
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum mode_fault_t {SHORT, COMPLETE};
|
||||||
|
public:
|
||||||
|
bool enable;
|
||||||
|
bool fault;
|
||||||
|
bool fault_low_level;
|
||||||
|
//UnitSwitchingFreq switching_freq;
|
||||||
|
float dc_voltage_low_level;
|
||||||
|
uint16_t level;
|
||||||
|
uint16_t error;
|
||||||
|
ControlOrder control_order_cell;
|
||||||
|
ControlOrder ref_control_order;
|
||||||
|
uint16_t pwm_version[3];
|
||||||
|
uint32_t cpu_cpld_version;
|
||||||
|
Cell hvcell;
|
||||||
|
HardWareDisableRegister disable_hw;
|
||||||
|
HVCellDisableRegister disable_a_cells;
|
||||||
|
HVCellDisableRegister disable_b_cells;
|
||||||
|
HVCellDisableRegister disable_c_cells;
|
||||||
|
HardWareVersion version_default;
|
||||||
|
public:
|
||||||
|
HardWare();
|
||||||
|
void configure(const HardWareConfiguration config);
|
||||||
|
void check_status();
|
||||||
|
void check_faults(mode_fault_t fmode);
|
||||||
|
bool is_enable();
|
||||||
|
bool is_fault();
|
||||||
|
bool low_level();
|
||||||
|
void reset();
|
||||||
|
//
|
||||||
|
};//class HardWare
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_HARDWARE_H_ */
|
@ -0,0 +1,358 @@
|
|||||||
|
/*
|
||||||
|
* Hardcode.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/SystemControl.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
void SystemControl::get_hard_code_setup()
|
||||||
|
{
|
||||||
|
m_system_setup.time_sample_control = 400.0e-6;
|
||||||
|
m_system_setup.time_prescale_slow = 5;
|
||||||
|
m_system_setup.time_prescale_additional = 1;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Relative
|
||||||
|
//
|
||||||
|
m_system_setup.relative_voltage_input.time_sample = m_system_setup.time_sample_control;
|
||||||
|
|
||||||
|
//
|
||||||
|
}//hard_code_setup()
|
||||||
|
//
|
||||||
|
void SystemControl::upload_configuration()
|
||||||
|
{
|
||||||
|
m_fram_db.upload_configuration(&m_system_configuration);
|
||||||
|
//m_system_configuration.selfupdata();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void SystemControl::get_hard_code_configuration()
|
||||||
|
{
|
||||||
|
|
||||||
|
//
|
||||||
|
// References
|
||||||
|
//
|
||||||
|
m_system_configuration.reference_current_limit_rms = 100.0;
|
||||||
|
m_system_configuration.reference_current_pfc_rms = 0.0;
|
||||||
|
m_system_configuration.reference_voltage_rms = 240.0;
|
||||||
|
m_system_configuration.reference_voltage_dc = 900.0;
|
||||||
|
|
||||||
|
m_system_configuration.algorithm_control.signal.enable_current_limit = true;
|
||||||
|
m_system_configuration.algorithm_control.signal.enable_pfc = false;
|
||||||
|
m_system_configuration.algorithm_control.signal.enable_harmonica = false;
|
||||||
|
m_system_configuration.algorithm_control.signal.enable_auto_offset = true;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// High Voltage Cell
|
||||||
|
//
|
||||||
|
//m_system_configuration.hardware.switching_freq = SWITCHING_FREQ_2500;
|
||||||
|
m_system_configuration.hardware.cell_level = 1;
|
||||||
|
m_system_configuration.hardware.version.pwm = 210;
|
||||||
|
m_system_configuration.hardware.version.cell = 211;
|
||||||
|
m_system_configuration.hardware.version.cpu_cpld = 202;
|
||||||
|
//
|
||||||
|
|
||||||
|
m_system_configuration.minimal_input_voltage_level = 10.0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Scale Analog Signals
|
||||||
|
//
|
||||||
|
m_system_configuration.scale_voltage_input_a = 0.0227386411;//0.0233486816;
|
||||||
|
m_system_configuration.scale_voltage_input_b = 0.0227597337;//0.0234651081;
|
||||||
|
m_system_configuration.scale_voltage_input_c = 0.02278281;//0.0236082859;
|
||||||
|
//
|
||||||
|
m_system_configuration.scale_current_input_a = 0.00666328007;
|
||||||
|
m_system_configuration.scale_current_input_b = 0.00667025521;
|
||||||
|
m_system_configuration.scale_current_input_c = 0.00665952405;
|
||||||
|
//
|
||||||
|
m_system_configuration.scale_current_cell_a = 0.0123311505;//0.00665648002;
|
||||||
|
m_system_configuration.scale_current_cell_b = 0.0123670474;//0.00667640707;
|
||||||
|
m_system_configuration.scale_current_cell_c = 0.0124070868;//0.00666095456;
|
||||||
|
//
|
||||||
|
m_system_configuration.scale_voltage_load_a = 0.0227408651;//0.0232194811;
|
||||||
|
m_system_configuration.scale_voltage_load_b = 0.0227707103;//0.0233941432;
|
||||||
|
m_system_configuration.scale_voltage_load_c = 0.0229060184;//0.0234934501;
|
||||||
|
//
|
||||||
|
m_system_configuration.scale_current_load_a = 0.00622544903;//0.00668919506;
|
||||||
|
m_system_configuration.scale_current_load_b = 0.00623486936;//0.00669770781;
|
||||||
|
m_system_configuration.scale_current_load_c = 0.00624710508;//0.00670575583;
|
||||||
|
//
|
||||||
|
m_system_configuration.scale_current_bypass_a = 0.0063;
|
||||||
|
m_system_configuration.scale_current_bypass_b = 0.0063;
|
||||||
|
m_system_configuration.scale_current_bypass_c = 0.0063;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Amplitude Filter Parameters
|
||||||
|
//
|
||||||
|
m_system_configuration.ampl_filter_current.time = 20.0e-3;
|
||||||
|
m_system_configuration.ampl_filter_current.a3 = 3.0;
|
||||||
|
m_system_configuration.ampl_filter_current.a2 = 4.25;
|
||||||
|
m_system_configuration.ampl_filter_current.a1 = 3.0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// RMS Filter Parameters
|
||||||
|
//
|
||||||
|
m_system_configuration.rms_filter_analog_signal.time = 10.0e-3;
|
||||||
|
m_system_configuration.rms_filter_analog_signal.a3 = 3.0;
|
||||||
|
m_system_configuration.rms_filter_analog_signal.a2 = 4.25;
|
||||||
|
m_system_configuration.rms_filter_analog_signal.a1 = 3.0;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Zero Drift Current Input
|
||||||
|
//
|
||||||
|
m_system_configuration.zero_filter.time = 1333.0e-3;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cell DC Voltage Filter
|
||||||
|
//
|
||||||
|
m_system_configuration.cell_dc_voltage_filter.time = 3.0e-3;
|
||||||
|
m_system_configuration.cell_dc_voltage_filter.a3 = 3.0;
|
||||||
|
m_system_configuration.cell_dc_voltage_filter.a2 = 4.25;
|
||||||
|
m_system_configuration.cell_dc_voltage_filter.a1 = 3.0;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Signal Decompose
|
||||||
|
//
|
||||||
|
m_system_configuration.signal_decompose.projection_filter.time = 10.0e-3;
|
||||||
|
m_system_configuration.signal_decompose.projection_filter.a3 = 2.61313;//3.0;
|
||||||
|
m_system_configuration.signal_decompose.projection_filter.a2 = 3.41422;//4.25;
|
||||||
|
m_system_configuration.signal_decompose.projection_filter.a1 = 2.61313;//3.0;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Relative
|
||||||
|
//
|
||||||
|
m_system_configuration.relative_voltage_input.minimal_amplitude_level = 0.1;
|
||||||
|
m_system_configuration.relative_voltage_input.limit_relative_high = 1.1;
|
||||||
|
m_system_configuration.relative_voltage_input.limit_relative_low = -1.1;
|
||||||
|
m_system_configuration.relative_voltage_input.amplitude_filter.time = (float)(1.0/2.0/FP_PI/10.0);
|
||||||
|
m_system_configuration.relative_voltage_input.amplitude_filter.a3 = 3.0;
|
||||||
|
m_system_configuration.relative_voltage_input.amplitude_filter.a2 = 4.25;
|
||||||
|
m_system_configuration.relative_voltage_input.amplitude_filter.a1 = 3.0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Voltage PLL-ABC Parameters
|
||||||
|
//
|
||||||
|
#define PLLABC_FREQUENCY_NOMINAL (float)(2.0*FP_PI*50.0)
|
||||||
|
#define PLLABC_FREQUENCY_CUT (float)(2.0*FP_PI*10.0)
|
||||||
|
#define PLLABC_FREQUENCY_LIMIT_HI PLLABC_FREQUENCY_CUT
|
||||||
|
#define PLLABC_FREQUENCY_LIMIT_LOW -PLLABC_FREQUENCY_CUT
|
||||||
|
m_system_configuration.pll_abc_input_voltage.frequency_nominal = PLLABC_FREQUENCY_NOMINAL;
|
||||||
|
m_system_configuration.pll_abc_input_voltage.filter.time = 1.0/PLLABC_FREQUENCY_CUT;
|
||||||
|
m_system_configuration.pll_abc_input_voltage.controller.gain = PLLABC_FREQUENCY_CUT/2.0;
|
||||||
|
m_system_configuration.pll_abc_input_voltage.controller.time = 4.0/PLLABC_FREQUENCY_CUT;
|
||||||
|
m_system_configuration.pll_abc_input_voltage.controller.low_saturation = PLLABC_FREQUENCY_LIMIT_LOW;
|
||||||
|
m_system_configuration.pll_abc_input_voltage.controller.high_saturation = PLLABC_FREQUENCY_LIMIT_HI;
|
||||||
|
m_system_configuration.pll_abc_input_voltage.position.time = 1.0;
|
||||||
|
m_system_configuration.pll_abc_input_voltage.position.low_saturation = FP_ZERO;
|
||||||
|
m_system_configuration.pll_abc_input_voltage.position.high_saturation = 2.0 * FP_PI;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// System Alarm
|
||||||
|
//
|
||||||
|
// exceed voltage level 1
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_exceed_level_1.level = 264.5;//253.0;
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_exceed_level_1.period = 10.0;
|
||||||
|
//
|
||||||
|
// exceed voltage level 2
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_exceed_level_2.level = 276.0;//264.5;
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_exceed_level_2.period = 5.0;
|
||||||
|
//
|
||||||
|
// exceed voltage level 3
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_exceed_level_3.level = 290.0;//276.0;
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_exceed_level_3.period = 2.0;
|
||||||
|
//
|
||||||
|
// exceed voltage level 4
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_exceed_level_4.level = 345.0;
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_exceed_level_4.period = 0.001;//1.0;
|
||||||
|
//
|
||||||
|
// decrease voltage level 1
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_decrease_level_1.level = 200.0;//218.5;//195.5;
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_decrease_level_1.period = 10.0;
|
||||||
|
//
|
||||||
|
// decrease voltage level 2
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_decrease_level_2.level = 170.0;//207.0;//172.5;
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_decrease_level_2.period = 5.0;
|
||||||
|
//
|
||||||
|
// decrease voltage level 3
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_decrease_level_3.level = 149.5;
|
||||||
|
m_system_configuration.phase_alert_monitor.voltage_decrease_level_3.period = 2.0;
|
||||||
|
//
|
||||||
|
// current overload level 1 120% 60s
|
||||||
|
m_system_configuration.phase_alert_monitor.current_overload_level_1.level = 3.0 * 14.4;
|
||||||
|
m_system_configuration.phase_alert_monitor.current_overload_level_1.period = 60.0;
|
||||||
|
//
|
||||||
|
// current overload level 2 130% 10s
|
||||||
|
m_system_configuration.phase_alert_monitor.current_overload_level_2.level = 3.0 * 15.6;
|
||||||
|
m_system_configuration.phase_alert_monitor.current_overload_level_2.period = 10.0;
|
||||||
|
//
|
||||||
|
// current overload level 3 150% 1ms
|
||||||
|
m_system_configuration.phase_alert_monitor.current_overload_level_3.level = 3.0 * 18.0;
|
||||||
|
m_system_configuration.phase_alert_monitor.current_overload_level_3.period = 0.001;
|
||||||
|
//
|
||||||
|
// current invertor overload level 1 110% 60s
|
||||||
|
m_system_configuration.phase_alert_monitor.current_invertor_overload_level_1.level = 13.2;
|
||||||
|
m_system_configuration.phase_alert_monitor.current_invertor_overload_level_1.period = 60.0;
|
||||||
|
//
|
||||||
|
// current invertor overload level 2 130% 10s
|
||||||
|
m_system_configuration.phase_alert_monitor.current_invertor_overload_level_2.level = 15.6;
|
||||||
|
m_system_configuration.phase_alert_monitor.current_invertor_overload_level_2.period = 10.0;
|
||||||
|
//
|
||||||
|
// current invertor overload level 3 150% 1ms
|
||||||
|
m_system_configuration.phase_alert_monitor.current_invertor_overload_level_3.level = 18.0;
|
||||||
|
m_system_configuration.phase_alert_monitor.current_invertor_overload_level_3.period = 0.001;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
//DIGITAL INPUTS
|
||||||
|
//
|
||||||
|
m_system_configuration.digital_input_config.period = 200.0e-3; //3001 - 3020
|
||||||
|
|
||||||
|
//
|
||||||
|
// FAN CONTROL
|
||||||
|
//
|
||||||
|
m_system_configuration.fan_control.timer_period = 5.0*60.0;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Generator ABC
|
||||||
|
//
|
||||||
|
m_system_configuration.generator_abc.amplitude = 1.0;
|
||||||
|
m_system_configuration.generator_abc.frequency = 2.0*FP_PI*50.0;
|
||||||
|
m_system_configuration.generator_abc.phase_shift = 0.0;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reference PWM-Generator
|
||||||
|
//
|
||||||
|
//m_system_configuration.generator_pwm.frequency = 2.0*FP_PI*1.0;
|
||||||
|
//m_system_configuration.generator_abc.phase_shift = 0.0;
|
||||||
|
|
||||||
|
//m_system_configuration.gen_inp_volt.amplitude.direct.d = 220.0;
|
||||||
|
//
|
||||||
|
//m_system_configuration.gen_out_volt.amplitude.direct.d = 220.0;
|
||||||
|
//m_system_configuration.gen_out_volt.phase.direct.phase = 0.122756;//FP_PI/4.0;
|
||||||
|
//
|
||||||
|
//m_system_configuration.gen_out_current.amplitude.direct.d = 50.0;
|
||||||
|
//m_system_configuration.gen_out_current.phase.direct.phase = 0.122756;//FP_PI/3.0;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Harmonica Analyzer
|
||||||
|
//
|
||||||
|
m_system_configuration.ph_harmonica_5.time = 50.0e-3;
|
||||||
|
m_system_configuration.ph_harmonica_5.a3 = 3.0;
|
||||||
|
m_system_configuration.ph_harmonica_5.a2 = 4.25;
|
||||||
|
m_system_configuration.ph_harmonica_5.a1 = 3.0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reference Intensity Idref Iqref in Start Mode
|
||||||
|
//
|
||||||
|
m_system_configuration.intensity_id_iq_references.damp_factor = 0.7071;
|
||||||
|
m_system_configuration.intensity_id_iq_references.time = 20.0e-3;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Regulators
|
||||||
|
//
|
||||||
|
#if TYPECONTROL == VECTORCONTROL
|
||||||
|
//
|
||||||
|
m_system_configuration.regulator_voltage_load_dq.gain = 0.25;
|
||||||
|
m_system_configuration.regulator_voltage_load_dq.time = 40.0e-3;
|
||||||
|
m_system_configuration.regulator_voltage_load_dq.high_saturation = 950.0;
|
||||||
|
m_system_configuration.regulator_voltage_load_dq.low_saturation = -950.0;
|
||||||
|
//
|
||||||
|
//m_system_configuration. = 1.0;
|
||||||
|
m_system_configuration.integrator_voltage_dq.time = 1.0;
|
||||||
|
m_system_configuration.integrator_voltage_dq.high_saturation = 1.0;;
|
||||||
|
m_system_configuration.integrator_voltage_dq.low_saturation = -1.0;
|
||||||
|
//
|
||||||
|
//m_system_configuration. = 1.0;
|
||||||
|
//m_system_configuration. = 1.0;
|
||||||
|
//m_system_configuration. = 1.0;
|
||||||
|
//m_system_configuration. = -1.0;
|
||||||
|
//
|
||||||
|
m_system_configuration.regulator_current_load_dq.gain = 1.0;
|
||||||
|
// m_system_configuration.regulator_current_load_dq.time = 0.016;
|
||||||
|
m_system_configuration.regulator_current_load_dq.high_saturation = 200.0;
|
||||||
|
m_system_configuration.regulator_current_load_dq.low_saturation = -200.0;
|
||||||
|
//
|
||||||
|
//m_system_configuration. = 1.0;
|
||||||
|
//m_system_configuration. = 0.016;
|
||||||
|
//m_system_configuration. = 200.0;
|
||||||
|
//m_system_configuration. = -200.0;
|
||||||
|
//
|
||||||
|
//m_system_configuration. = 1.0;
|
||||||
|
m_system_configuration.referencer_current_bypass_dq.time = 0.016;
|
||||||
|
m_system_configuration.referencer_current_bypass_dq.high_saturation = 200.0;
|
||||||
|
m_system_configuration.referencer_current_bypass_dq.low_saturation = -200.0;
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TYPECONTROL == SCALARCONTROL
|
||||||
|
//
|
||||||
|
m_system_configuration.regulator_voltage_load_active_reactive.gain = 0.25;
|
||||||
|
m_system_configuration.regulator_voltage_load_active_reactive.time = 40.0e-3;
|
||||||
|
m_system_configuration.regulator_voltage_load_active_reactive.high_saturation = 950.0;
|
||||||
|
m_system_configuration.regulator_voltage_load_active_reactive.low_saturation = -950.0;
|
||||||
|
//
|
||||||
|
m_system_configuration.regulator_current_limit.gain = 1.0;
|
||||||
|
m_system_configuration.regulator_current_limit.time = 1.0;
|
||||||
|
m_system_configuration.regulator_current_limit.high_saturation = 1.0;;
|
||||||
|
m_system_configuration.regulator_current_limit.low_saturation = -1.0;
|
||||||
|
//
|
||||||
|
m_system_configuration.regulator_current_pfc.gain = 1.0;
|
||||||
|
m_system_configuration.regulator_current_pfc.time = 1.0;
|
||||||
|
m_system_configuration.regulator_current_pfc.high_saturation = 1.0;
|
||||||
|
m_system_configuration.regulator_current_pfc.low_saturation = -1.0;
|
||||||
|
//
|
||||||
|
m_system_configuration.current_regulator_active.gain = 1.0;
|
||||||
|
m_system_configuration.current_regulator_active.time = 0.016;
|
||||||
|
m_system_configuration.current_regulator_active.high_saturation = 200.0;
|
||||||
|
m_system_configuration.current_regulator_active.low_saturation = -200.0;
|
||||||
|
//
|
||||||
|
m_system_configuration.current_regulator_reactive.gain = 1.0;
|
||||||
|
m_system_configuration.current_regulator_reactive.time = 0.016;
|
||||||
|
m_system_configuration.current_regulator_reactive.high_saturation = 200.0;
|
||||||
|
m_system_configuration.current_regulator_reactive.low_saturation = -200.0;
|
||||||
|
//
|
||||||
|
m_system_configuration.current_referencer.gain = 1.0;
|
||||||
|
m_system_configuration.current_referencer.time = 0.016;
|
||||||
|
m_system_configuration.current_referencer.high_saturation = 200.0;
|
||||||
|
m_system_configuration.current_referencer.low_saturation = -200.0;
|
||||||
|
//
|
||||||
|
#endif
|
||||||
|
//<>
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Timers
|
||||||
|
//
|
||||||
|
m_system_configuration.timer_start.period = 2.0;
|
||||||
|
m_system_configuration.timer_stop.period = 2.0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
}//hard_code_configuration()
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* FLTSYSLIBheaders.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLTSYSLIB_FLTSYSLIBHEADERS_H_
|
||||||
|
#define FLTSYSLIB_FLTSYSLIBHEADERS_H_
|
||||||
|
|
||||||
|
#include "FLTSYSLIB/AMPL.h"
|
||||||
|
#include "FLTSYSLIB/AMPLFSO.h"
|
||||||
|
#include "FLTSYSLIB/AMPLF4O.h"
|
||||||
|
#include "FLTSYSLIB/Contactor.h"
|
||||||
|
#include "FLTSYSLIB/DigitalInput.h"
|
||||||
|
#include "FLTSYSLIB/DigitalInputAntiNoise.h"
|
||||||
|
#include "FLTSYSLIB/DiscreteInput.h"
|
||||||
|
#include "FLTSYSLIB/DiscreteOutput.h"
|
||||||
|
#include "FLTSYSLIB/Filter.h"
|
||||||
|
#include "FLTSYSLIB/FilterSecond.h"
|
||||||
|
#include "FLTSYSLIB/FilterForth.h"
|
||||||
|
#include "FLTSYSLIB/FilterThird.h"
|
||||||
|
#include "FLTSYSLIB/FTimer.h"
|
||||||
|
#include "FLTSYSLIB/GeneratorABC.h"
|
||||||
|
#include "FLTSYSLIB/HarmonicaFilter4Order.h"
|
||||||
|
#include "FLTSYSLIB/HarmonicaFilterBase.h"
|
||||||
|
#include "FLTSYSLIB/Hysteresis.h"
|
||||||
|
#include "FLTSYSLIB/IController.h"
|
||||||
|
#include "FLTSYSLIB/Integrator.h"
|
||||||
|
#include "FLTSYSLIB/PController.h"
|
||||||
|
#include "FLTSYSLIB/PIController.h"
|
||||||
|
#include "FLTSYSLIB/PLLABC.h"
|
||||||
|
#include "FLTSYSLIB/PLLABCDVR.h"
|
||||||
|
#include "FLTSYSLIB/PLLABCreduced.h"
|
||||||
|
#include "FLTSYSLIB/PLLEQEP.h"
|
||||||
|
#include "FLTSYSLIB/Position.h"
|
||||||
|
#include "FLTSYSLIB/Relay.h"
|
||||||
|
#include "FLTSYSLIB/RMS.h"
|
||||||
|
#include "FLTSYSLIB/RMSF4O.h"
|
||||||
|
#include "FLTSYSLIB/RMSFFO.h"
|
||||||
|
#include "FLTSYSLIB/RMSFSO.h"
|
||||||
|
#include "FLTSYSLIB/Transformation.h"
|
||||||
|
#include "FLTSYSLIB/UNIPWM.h"
|
||||||
|
#include "FLTSYSLIB/ZeroDriftSecond.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* FLTSYSLIB_FLTSYSLIBHEADERS_H_ */
|
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* HeadersMODBUSRTU.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_HEADERSMODBUSRTU_H_
|
||||||
|
#define SYSCTRL_HEADERSMODBUSRTU_H_
|
||||||
|
|
||||||
|
#include "MODBUSRTU/RUBUS.h"
|
||||||
|
#include "MODBUSRTU/RUBUSCOPE.h"
|
||||||
|
#include "MODBUSRTU/RUBUSDataBase.h"
|
||||||
|
#include "MODBUSRTU/RUBUSRegister.h"
|
||||||
|
#include "MODBUSRTU/RUBUSTypes.h"
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_HEADERSMODBUSRTU_H_ */
|
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* TimeStartStop.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/MeasureTimeInterval.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
//Constructor
|
||||||
|
MeasureTimeInterval::MeasureTimeInterval(CPUTIMER_VARS& CPUTimer, Uint32 magic):
|
||||||
|
m_CPUTimer(CPUTimer),
|
||||||
|
m_timer_result((Uint32)0),
|
||||||
|
m_timer_result_previous((Uint32)0),
|
||||||
|
m_magic_number((Uint32)magic),
|
||||||
|
m_period((Uint32)0),
|
||||||
|
m_tim((Uint32)0),
|
||||||
|
m_counter((Uint32)0)
|
||||||
|
{}//end Constructor
|
||||||
|
|
||||||
|
//#pragma CODE_SECTION(".TI.ramfunc");
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void MeasureTimeInterval::start(void)
|
||||||
|
{
|
||||||
|
m_CPUTimer.RegsAddr->TCR.bit.TSS = 1; // Stop CPU Timer
|
||||||
|
m_CPUTimer.RegsAddr->TCR.bit.TRB = 1; // Reload CPU Timer
|
||||||
|
m_CPUTimer.RegsAddr->TCR.bit.TSS = 0; // Start CPU Timer
|
||||||
|
//
|
||||||
|
}//end
|
||||||
|
|
||||||
|
//#pragma CODE_SECTION(".TI.ramfunc");
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void MeasureTimeInterval::stop(void)
|
||||||
|
{
|
||||||
|
m_CPUTimer.RegsAddr->TCR.bit.TSS = 1; // Stop CPU Timer
|
||||||
|
//
|
||||||
|
m_timer_result_previous = m_timer_result;
|
||||||
|
m_period = (Uint32)m_CPUTimer.RegsAddr->PRD.all;
|
||||||
|
m_tim = (Uint32)m_CPUTimer.RegsAddr->TIM.all;
|
||||||
|
//m_timer_result = m_CPUTimer.RegsAddr->PRD.all - m_CPUTimer.RegsAddr->TIM.all - m_magic_number;
|
||||||
|
m_timer_result = (Uint32)((Uint32)m_period - (Uint32)m_tim - (Uint32)m_magic_number);
|
||||||
|
m_counter++;
|
||||||
|
//
|
||||||
|
}//end
|
||||||
|
|
||||||
|
//#pragma CODE_SECTION(".TI.ramfunc");
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void MeasureTimeInterval::reset(void)
|
||||||
|
{
|
||||||
|
m_CPUTimer.RegsAddr->TCR.bit.TSS = 1; // Stop CPU Timer
|
||||||
|
m_CPUTimer.RegsAddr->PRD.all = 0xFFFFFFFF;
|
||||||
|
m_CPUTimer.RegsAddr->TCR.bit.TRB = 1; // Reload CPU Timer
|
||||||
|
//
|
||||||
|
}//end
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* TimeStartStop.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||||
|
#include "DSP2833x_Examples.h"
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_TIMEINTERVAL_H_
|
||||||
|
#define SYSCTRL_TIMEINTERVAL_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
class MeasureTimeInterval
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
CPUTIMER_VARS& m_CPUTimer;
|
||||||
|
Uint32 m_timer_result;
|
||||||
|
Uint32 m_timer_result_previous;
|
||||||
|
Uint32 m_magic_number;
|
||||||
|
Uint32 m_period;
|
||||||
|
Uint32 m_tim;
|
||||||
|
Uint32 m_counter;
|
||||||
|
public:
|
||||||
|
MeasureTimeInterval(CPUTIMER_VARS& CPUTimer, Uint32 magic);
|
||||||
|
public:
|
||||||
|
void start(void);
|
||||||
|
void stop(void);
|
||||||
|
void reset(void);
|
||||||
|
//
|
||||||
|
};//end class MeasureTimeStartStop
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_TIMEINTERVAL_H_ */
|
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* MeasureTimePeriod.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/MeasureTimePeriod.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
//Constructor
|
||||||
|
MeasureTimePeriod::MeasureTimePeriod(CPUTIMER_REGS& CPUTimer, Uint32 magic):
|
||||||
|
m_CPUTimer(CPUTimer),
|
||||||
|
m_timer_result((Uint32)0),
|
||||||
|
m_timer_result_previous((Uint32)0),
|
||||||
|
m_magic_number((Uint32)magic),
|
||||||
|
m_period((Uint32)0),
|
||||||
|
m_tim((Uint32)0),
|
||||||
|
m_counter((Uint32)0),
|
||||||
|
_execute(&SYSCTRL::MeasureTimePeriod::_execute_start)
|
||||||
|
//
|
||||||
|
{}//end Constructor
|
||||||
|
|
||||||
|
//#pragma CODE_SECTION(".TI.ramfunc");
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void MeasureTimePeriod::execute(void)
|
||||||
|
{
|
||||||
|
(this->*_execute)();
|
||||||
|
//
|
||||||
|
}//end
|
||||||
|
//
|
||||||
|
//#pragma CODE_SECTION(".TI.ramfunc");
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void MeasureTimePeriod::reset(void)
|
||||||
|
{
|
||||||
|
m_CPUTimer.TCR.bit.TSS = 1; // Stop CPU Timer
|
||||||
|
m_CPUTimer.PRD.all = (Uint32)0xFFFFFFFF;
|
||||||
|
m_CPUTimer.TCR.bit.TRB = 1; // Reload CPU Timer
|
||||||
|
//
|
||||||
|
_execute = &SYSCTRL::MeasureTimePeriod::_execute_start;
|
||||||
|
//
|
||||||
|
}//end
|
||||||
|
//
|
||||||
|
//#pragma CODE_SECTION(".TI.ramfunc");
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void MeasureTimePeriod::_execute_start(void)
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::MeasureTimePeriod::_execute_scan;
|
||||||
|
//
|
||||||
|
m_CPUTimer.TCR.bit.TSS = 1; // Stop CPU Timer
|
||||||
|
m_CPUTimer.TCR.bit.TRB = 1; // Reload CPU Timer
|
||||||
|
m_CPUTimer.TCR.bit.TSS = 0; // Start CPU Timer
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
}//end
|
||||||
|
//
|
||||||
|
//#pragma CODE_SECTION(".TI.ramfunc");
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void MeasureTimePeriod::_execute_scan(void)
|
||||||
|
{
|
||||||
|
m_CPUTimer.TCR.bit.TSS = 1; // Stop CPU Timer
|
||||||
|
//
|
||||||
|
m_timer_result_previous = (Uint32)m_timer_result;
|
||||||
|
m_period = (Uint32)m_CPUTimer.PRD.all;
|
||||||
|
m_tim = (Uint32)m_CPUTimer.TIM.all;
|
||||||
|
m_timer_result = (Uint32)((Uint32)m_CPUTimer.PRD.all - (Uint32)m_CPUTimer.TIM.all - (Uint32)m_magic_number);
|
||||||
|
//
|
||||||
|
m_CPUTimer.TCR.bit.TRB = 1; // Reload CPU Timer
|
||||||
|
m_CPUTimer.TCR.bit.TSS = 0; // Start CPU Timer
|
||||||
|
//
|
||||||
|
m_counter++;
|
||||||
|
//
|
||||||
|
}//end
|
||||||
|
//
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* MeasureTimePeriod.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||||
|
#include "DSP2833x_Examples.h"
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_MEASURETIMEPERIOD_H_
|
||||||
|
#define SYSCTRL_MEASURETIMEPERIOD_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
class MeasureTimePeriod
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
CPUTIMER_REGS& m_CPUTimer;
|
||||||
|
//CPUTIMER_VARS& m_CPUTimer;
|
||||||
|
Uint32 m_timer_result;
|
||||||
|
Uint32 m_timer_result_previous;
|
||||||
|
Uint32 m_magic_number;
|
||||||
|
Uint32 m_period;
|
||||||
|
Uint32 m_tim;
|
||||||
|
Uint32 m_counter;
|
||||||
|
public:
|
||||||
|
MeasureTimePeriod(CPUTIMER_REGS& pCPUTimer, Uint32 magic);
|
||||||
|
void execute(void);
|
||||||
|
void reset(void);
|
||||||
|
private:
|
||||||
|
void (MeasureTimePeriod::*_execute)(void);
|
||||||
|
void _execute_start(void);
|
||||||
|
void _execute_scan(void);
|
||||||
|
//
|
||||||
|
};//end class MeasureTimePeriod
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_MEASURETIMEPERIOD_H_ */
|
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* MonitorDigitalInputSignal.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/MonitorDigitalInputSignal.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
MonitorDigitalInputSignal::MonitorDigitalInputSignal()
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void MonitorDigitalInputSignal::implement(bool input, MonitorDigitalInputSignalRegister& state)
|
||||||
|
{
|
||||||
|
state.signal.privious = state.signal.state;
|
||||||
|
state.signal.state = input;
|
||||||
|
state.signal.is_on = state.signal.state;
|
||||||
|
state.signal.is_off = !state.signal.state;
|
||||||
|
state.signal.is_switched_on = state.signal.state & !state.signal.privious;
|
||||||
|
state.signal.is_switched_off = !state.signal.state & state.signal.privious;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void MonitorDigitalInputSignal::preset(bool input, MonitorDigitalInputSignalRegister& state)
|
||||||
|
{
|
||||||
|
state.signal.privious = input;
|
||||||
|
state.signal.state = input;
|
||||||
|
state.signal.is_on = input;
|
||||||
|
state.signal.is_off = !input;
|
||||||
|
state.signal.is_switched_on = !state.signal.state & state.signal.privious;
|
||||||
|
state.signal.is_switched_off = state.signal.state & !state.signal.privious;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void MonitorDigitalInputSignal::reset(MonitorDigitalInputSignalRegister& state)
|
||||||
|
{
|
||||||
|
state.all = 0x0008;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* MonitorDigitalInputSignal.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "SYSCTRL/SystemDefinitions.h"
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_MONITORDIGITALINPUTSIGNAL_H_
|
||||||
|
#define SYSCTRL_MONITORDIGITALINPUTSIGNAL_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
struct MonitorDigitalInputSignalBitFiled
|
||||||
|
{
|
||||||
|
uint16_t state:1;
|
||||||
|
uint16_t privious:1;
|
||||||
|
uint16_t is_on:1;
|
||||||
|
uint16_t is_off:1;
|
||||||
|
uint16_t is_switched_on:1;
|
||||||
|
uint16_t is_switched_off:1;
|
||||||
|
//
|
||||||
|
};//
|
||||||
|
|
||||||
|
union MonitorDigitalInputSignalRegister
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
Register16BitField bit;
|
||||||
|
MonitorDigitalInputSignalBitFiled signal;
|
||||||
|
MonitorDigitalInputSignalRegister():
|
||||||
|
all(uint16_t(0))
|
||||||
|
{}
|
||||||
|
MonitorDigitalInputSignalRegister(uint16_t val):
|
||||||
|
all(val)
|
||||||
|
{}
|
||||||
|
};//MonitorDigitalInputSignalRegister
|
||||||
|
|
||||||
|
class MonitorDigitalInputSignal
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MonitorDigitalInputSignal();
|
||||||
|
public:
|
||||||
|
static void implement(bool input, MonitorDigitalInputSignalRegister& state);
|
||||||
|
static void preset(bool input, MonitorDigitalInputSignalRegister& state);
|
||||||
|
static void reset(MonitorDigitalInputSignalRegister& state);
|
||||||
|
//
|
||||||
|
};//MonitorDigitalInputSignal
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_MONITORDIGITALINPUTSIGNAL_H_ */
|
@ -0,0 +1,430 @@
|
|||||||
|
/*
|
||||||
|
* PhaseAlertMonitor.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/PhaseAlertMonitor.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
PhaseAlertMonitor::PhaseAlertMonitor():
|
||||||
|
m_time_sample(-1.0),
|
||||||
|
m_fault(false),
|
||||||
|
m_warning(false),
|
||||||
|
m_monitor(),
|
||||||
|
status(),
|
||||||
|
fault(false),
|
||||||
|
warning(false),
|
||||||
|
m_voltage_ab_exceed_level_1(),
|
||||||
|
m_voltage_bc_exceed_level_1(),
|
||||||
|
m_voltage_ca_exceed_level_1(),
|
||||||
|
m_voltage_ab_exceed_level_2(),
|
||||||
|
m_voltage_bc_exceed_level_2(),
|
||||||
|
m_voltage_ca_exceed_level_2(),
|
||||||
|
m_voltage_ab_exceed_level_3(),
|
||||||
|
m_voltage_bc_exceed_level_3(),
|
||||||
|
m_voltage_ca_exceed_level_3(),
|
||||||
|
m_voltage_ab_exceed_level_4(),
|
||||||
|
m_voltage_bc_exceed_level_4(),
|
||||||
|
m_voltage_ca_exceed_level_4(),
|
||||||
|
m_voltage_ab_decrease_level_1(),
|
||||||
|
m_voltage_bc_decrease_level_1(),
|
||||||
|
m_voltage_ca_decrease_level_1(),
|
||||||
|
m_voltage_ab_decrease_level_2(),
|
||||||
|
m_voltage_bc_decrease_level_2(),
|
||||||
|
m_voltage_ca_decrease_level_2(),
|
||||||
|
m_voltage_ab_decrease_level_3(),
|
||||||
|
m_voltage_bc_decrease_level_3(),
|
||||||
|
m_voltage_ca_decrease_level_3(),
|
||||||
|
m_current_a_overload_level_1(),
|
||||||
|
m_current_b_overload_level_1(),
|
||||||
|
m_current_c_overload_level_1(),
|
||||||
|
m_current_a_overload_level_2(),
|
||||||
|
m_current_b_overload_level_2(),
|
||||||
|
m_current_c_overload_level_2(),
|
||||||
|
m_current_a_overload_level_3(),
|
||||||
|
m_current_b_overload_level_3(),
|
||||||
|
m_current_c_overload_level_3(),
|
||||||
|
//
|
||||||
|
m_current_invertor_a_overload_level_1(),
|
||||||
|
m_current_invertor_b_overload_level_1(),
|
||||||
|
m_current_invertor_c_overload_level_1(),
|
||||||
|
m_current_invertor_a_overload_level_2(),
|
||||||
|
m_current_invertor_b_overload_level_2(),
|
||||||
|
m_current_invertor_c_overload_level_2(),
|
||||||
|
m_current_invertor_a_overload_level_3(),
|
||||||
|
m_current_invertor_b_overload_level_3(),
|
||||||
|
m_current_invertor_c_overload_level_3(),
|
||||||
|
//
|
||||||
|
m_current_input_a_overload_level_1(),
|
||||||
|
m_current_input_b_overload_level_1(),
|
||||||
|
m_current_input_c_overload_level_1(),
|
||||||
|
m_current_input_a_overload_level_2(),
|
||||||
|
m_current_input_b_overload_level_2(),
|
||||||
|
m_current_input_c_overload_level_2(),
|
||||||
|
m_current_input_a_overload_level_3(),
|
||||||
|
m_current_input_b_overload_level_3(),
|
||||||
|
m_current_input_c_overload_level_3(),
|
||||||
|
//
|
||||||
|
_execute(&SYSCTRL::PhaseAlertMonitor::_execute_undef)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
|
||||||
|
void PhaseAlertMonitor::setup(float time_sample)
|
||||||
|
{
|
||||||
|
m_time_sample = time_sample;
|
||||||
|
|
||||||
|
m_voltage_ab_exceed_level_1.setup(m_time_sample);
|
||||||
|
m_voltage_bc_exceed_level_1.setup(m_time_sample);
|
||||||
|
m_voltage_ca_exceed_level_1.setup(m_time_sample);
|
||||||
|
m_voltage_ab_exceed_level_2.setup(m_time_sample);
|
||||||
|
m_voltage_bc_exceed_level_2.setup(m_time_sample);
|
||||||
|
m_voltage_ca_exceed_level_2.setup(m_time_sample);
|
||||||
|
m_voltage_ab_exceed_level_3.setup(m_time_sample);
|
||||||
|
m_voltage_bc_exceed_level_3.setup(m_time_sample);
|
||||||
|
m_voltage_ca_exceed_level_3.setup(m_time_sample);
|
||||||
|
m_voltage_ab_exceed_level_4.setup(m_time_sample);
|
||||||
|
m_voltage_bc_exceed_level_4.setup(m_time_sample);
|
||||||
|
m_voltage_ca_exceed_level_4.setup(m_time_sample);
|
||||||
|
m_voltage_ab_decrease_level_1.setup(m_time_sample);
|
||||||
|
m_voltage_bc_decrease_level_1.setup(m_time_sample);
|
||||||
|
m_voltage_ca_decrease_level_1.setup(m_time_sample);
|
||||||
|
m_voltage_ab_decrease_level_2.setup(m_time_sample);
|
||||||
|
m_voltage_bc_decrease_level_2.setup(m_time_sample);
|
||||||
|
m_voltage_ca_decrease_level_2.setup(m_time_sample);
|
||||||
|
m_voltage_ab_decrease_level_3.setup(m_time_sample);
|
||||||
|
m_voltage_bc_decrease_level_3.setup(m_time_sample);
|
||||||
|
m_voltage_ca_decrease_level_3.setup(m_time_sample);
|
||||||
|
m_current_a_overload_level_1.setup(m_time_sample);
|
||||||
|
m_current_b_overload_level_1.setup(m_time_sample);
|
||||||
|
m_current_c_overload_level_1.setup(m_time_sample);
|
||||||
|
m_current_a_overload_level_2.setup(m_time_sample);
|
||||||
|
m_current_b_overload_level_2.setup(m_time_sample);
|
||||||
|
m_current_c_overload_level_2.setup(m_time_sample);
|
||||||
|
m_current_a_overload_level_3.setup(m_time_sample);
|
||||||
|
m_current_b_overload_level_3.setup(m_time_sample);
|
||||||
|
m_current_c_overload_level_3.setup(m_time_sample);
|
||||||
|
m_current_invertor_a_overload_level_1.setup(m_time_sample);
|
||||||
|
m_current_invertor_b_overload_level_1.setup(m_time_sample);
|
||||||
|
m_current_invertor_c_overload_level_1.setup(m_time_sample);
|
||||||
|
m_current_invertor_a_overload_level_2.setup(m_time_sample);
|
||||||
|
m_current_invertor_b_overload_level_2.setup(m_time_sample);
|
||||||
|
m_current_invertor_c_overload_level_2.setup(m_time_sample);
|
||||||
|
m_current_invertor_a_overload_level_3.setup(m_time_sample);
|
||||||
|
m_current_invertor_b_overload_level_3.setup(m_time_sample);
|
||||||
|
m_current_invertor_c_overload_level_3.setup(m_time_sample);
|
||||||
|
|
||||||
|
m_current_input_a_overload_level_1.setup(m_time_sample);
|
||||||
|
m_current_input_b_overload_level_1.setup(m_time_sample);
|
||||||
|
m_current_input_c_overload_level_1.setup(m_time_sample);
|
||||||
|
m_current_input_a_overload_level_2.setup(m_time_sample);
|
||||||
|
m_current_input_b_overload_level_2.setup(m_time_sample);
|
||||||
|
m_current_input_c_overload_level_2.setup(m_time_sample);
|
||||||
|
m_current_input_a_overload_level_3.setup(m_time_sample);
|
||||||
|
m_current_input_b_overload_level_3.setup(m_time_sample);
|
||||||
|
m_current_input_c_overload_level_3.setup(m_time_sample);
|
||||||
|
//
|
||||||
|
}//setup()
|
||||||
|
//
|
||||||
|
void PhaseAlertMonitor::configure(const PhaseAlertConfiguration& config)
|
||||||
|
{
|
||||||
|
m_voltage_ab_exceed_level_1.configure(config.voltage_exceed_level_1);
|
||||||
|
m_voltage_bc_exceed_level_1.configure(config.voltage_exceed_level_1);
|
||||||
|
m_voltage_ca_exceed_level_1.configure(config.voltage_exceed_level_1);
|
||||||
|
m_voltage_ab_exceed_level_2.configure(config.voltage_exceed_level_2);
|
||||||
|
m_voltage_bc_exceed_level_2.configure(config.voltage_exceed_level_2);
|
||||||
|
m_voltage_ca_exceed_level_2.configure(config.voltage_exceed_level_2);
|
||||||
|
m_voltage_ab_exceed_level_3.configure(config.voltage_exceed_level_3);
|
||||||
|
m_voltage_bc_exceed_level_3.configure(config.voltage_exceed_level_3);
|
||||||
|
m_voltage_ca_exceed_level_3.configure(config.voltage_exceed_level_3);
|
||||||
|
m_voltage_ab_exceed_level_4.configure(config.voltage_exceed_level_4);
|
||||||
|
m_voltage_bc_exceed_level_4.configure(config.voltage_exceed_level_4);
|
||||||
|
m_voltage_ca_exceed_level_4.configure(config.voltage_exceed_level_4);
|
||||||
|
m_voltage_ab_decrease_level_1.configure(config.voltage_decrease_level_1);
|
||||||
|
m_voltage_bc_decrease_level_1.configure(config.voltage_decrease_level_1);
|
||||||
|
m_voltage_ca_decrease_level_1.configure(config.voltage_decrease_level_1);
|
||||||
|
m_voltage_ab_decrease_level_2.configure(config.voltage_decrease_level_2);
|
||||||
|
m_voltage_bc_decrease_level_2.configure(config.voltage_decrease_level_2);
|
||||||
|
m_voltage_ca_decrease_level_2.configure(config.voltage_decrease_level_2);
|
||||||
|
m_voltage_ab_decrease_level_3.configure(config.voltage_decrease_level_3);
|
||||||
|
m_voltage_bc_decrease_level_3.configure(config.voltage_decrease_level_3);
|
||||||
|
m_voltage_ca_decrease_level_3.configure(config.voltage_decrease_level_3);
|
||||||
|
m_current_a_overload_level_1.configure(config.current_overload_level_1);
|
||||||
|
m_current_b_overload_level_1.configure(config.current_overload_level_1);
|
||||||
|
m_current_c_overload_level_1.configure(config.current_overload_level_1);
|
||||||
|
m_current_a_overload_level_2.configure(config.current_overload_level_2);
|
||||||
|
m_current_b_overload_level_2.configure(config.current_overload_level_2);
|
||||||
|
m_current_c_overload_level_2.configure(config.current_overload_level_2);
|
||||||
|
m_current_a_overload_level_3.configure(config.current_overload_level_3);
|
||||||
|
m_current_b_overload_level_3.configure(config.current_overload_level_3);
|
||||||
|
m_current_c_overload_level_3.configure(config.current_overload_level_3);
|
||||||
|
//
|
||||||
|
m_current_invertor_a_overload_level_1.configure(config.current_invertor_overload_level_1);
|
||||||
|
m_current_invertor_b_overload_level_1.configure(config.current_invertor_overload_level_1);
|
||||||
|
m_current_invertor_c_overload_level_1.configure(config.current_invertor_overload_level_1);
|
||||||
|
m_current_invertor_a_overload_level_2.configure(config.current_invertor_overload_level_2);
|
||||||
|
m_current_invertor_b_overload_level_2.configure(config.current_invertor_overload_level_2);
|
||||||
|
m_current_invertor_c_overload_level_2.configure(config.current_invertor_overload_level_2);
|
||||||
|
m_current_invertor_a_overload_level_3.configure(config.current_invertor_overload_level_3);
|
||||||
|
m_current_invertor_b_overload_level_3.configure(config.current_invertor_overload_level_3);
|
||||||
|
m_current_invertor_c_overload_level_3.configure(config.current_invertor_overload_level_3);
|
||||||
|
//
|
||||||
|
m_current_input_a_overload_level_1.configure(config.current_input_overload_level_1);
|
||||||
|
m_current_input_b_overload_level_1.configure(config.current_input_overload_level_1);
|
||||||
|
m_current_input_c_overload_level_1.configure(config.current_input_overload_level_1);
|
||||||
|
m_current_input_a_overload_level_2.configure(config.current_input_overload_level_2);
|
||||||
|
m_current_input_b_overload_level_2.configure(config.current_input_overload_level_2);
|
||||||
|
m_current_input_c_overload_level_2.configure(config.current_input_overload_level_2);
|
||||||
|
m_current_input_a_overload_level_3.configure(config.current_input_overload_level_3);
|
||||||
|
m_current_input_b_overload_level_3.configure(config.current_input_overload_level_3);
|
||||||
|
m_current_input_c_overload_level_3.configure(config.current_input_overload_level_3);
|
||||||
|
|
||||||
|
|
||||||
|
if((m_time_sample > FP_ZERO))
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::PhaseAlertMonitor::_execute_operational;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//configure()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void PhaseAlertMonitor::get_faults(PhaseFaultRegister& ph_a, PhaseFaultRegister& ph_b, PhaseFaultRegister& ph_c)
|
||||||
|
{
|
||||||
|
ph_a.all = m_monitor.phase_a.fault.all;
|
||||||
|
ph_b.all = m_monitor.phase_b.fault.all;
|
||||||
|
ph_c.all = m_monitor.phase_c.fault.all;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void PhaseAlertMonitor::reset()
|
||||||
|
{
|
||||||
|
m_monitor.phase_a.warning.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_a.fault.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_b.warning.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_b.fault.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_c.warning.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_c.fault.all = (uint16_t)0;
|
||||||
|
//
|
||||||
|
m_monitor.phase_a.warning.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_a.fault.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_b.warning.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_b.fault.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_c.warning.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_c.fault.all = (uint16_t)0;
|
||||||
|
//
|
||||||
|
m_voltage_ab_exceed_level_1.reset();
|
||||||
|
m_voltage_bc_exceed_level_1.reset();
|
||||||
|
m_voltage_ca_exceed_level_1.reset();
|
||||||
|
m_voltage_ab_exceed_level_2.reset();
|
||||||
|
m_voltage_bc_exceed_level_2.reset();
|
||||||
|
m_voltage_ca_exceed_level_2.reset();
|
||||||
|
m_voltage_ab_exceed_level_3.reset();
|
||||||
|
m_voltage_bc_exceed_level_3.reset();
|
||||||
|
m_voltage_ca_exceed_level_3.reset();
|
||||||
|
m_voltage_ab_exceed_level_4.reset();
|
||||||
|
m_voltage_bc_exceed_level_4.reset();
|
||||||
|
m_voltage_ca_exceed_level_4.reset();
|
||||||
|
m_voltage_ab_decrease_level_1.reset();
|
||||||
|
m_voltage_bc_decrease_level_1.reset();
|
||||||
|
m_voltage_ca_decrease_level_1.reset();
|
||||||
|
m_voltage_ab_decrease_level_2.reset();
|
||||||
|
m_voltage_bc_decrease_level_2.reset();
|
||||||
|
m_voltage_ca_decrease_level_2.reset();
|
||||||
|
m_voltage_ab_decrease_level_3.reset();
|
||||||
|
m_voltage_bc_decrease_level_3.reset();
|
||||||
|
m_voltage_ca_decrease_level_3.reset();
|
||||||
|
m_current_a_overload_level_1.reset();
|
||||||
|
m_current_b_overload_level_1.reset();
|
||||||
|
m_current_c_overload_level_1.reset();
|
||||||
|
m_current_a_overload_level_2.reset();
|
||||||
|
m_current_b_overload_level_2.reset();
|
||||||
|
m_current_c_overload_level_2.reset();
|
||||||
|
m_current_a_overload_level_3.reset();
|
||||||
|
m_current_b_overload_level_3.reset();
|
||||||
|
m_current_c_overload_level_3.reset();
|
||||||
|
m_current_invertor_a_overload_level_1.reset();
|
||||||
|
m_current_invertor_b_overload_level_1.reset();
|
||||||
|
m_current_invertor_c_overload_level_1.reset();
|
||||||
|
m_current_invertor_a_overload_level_2.reset();
|
||||||
|
m_current_invertor_b_overload_level_2.reset();
|
||||||
|
m_current_invertor_c_overload_level_2.reset();
|
||||||
|
m_current_invertor_a_overload_level_3.reset();
|
||||||
|
m_current_invertor_b_overload_level_3.reset();
|
||||||
|
m_current_invertor_c_overload_level_3.reset();
|
||||||
|
//
|
||||||
|
m_fault = false;
|
||||||
|
m_warning = false;
|
||||||
|
warning = m_warning;
|
||||||
|
fault = m_fault;
|
||||||
|
status = m_monitor;
|
||||||
|
//
|
||||||
|
}//reset()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void PhaseAlertMonitor::execute(float urmsa, float urmsb, float urmsc,
|
||||||
|
float irmsa, float irmsb, float irmsc,
|
||||||
|
float invrmsa, float invrmsb, float invrmsc,
|
||||||
|
float inprmsa, float inprmsb, float inprmsc)
|
||||||
|
{
|
||||||
|
(this->*_execute)(urmsa, urmsb, urmsc, irmsa, irmsb, irmsc, invrmsa, invrmsb, invrmsc, inprmsa, inprmsb, inprmsc);
|
||||||
|
//
|
||||||
|
}//execute()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void PhaseAlertMonitor::_execute_undef(float urmsa, float urmsb, float urmsc,
|
||||||
|
float irmsa, float irmsb, float irmsc,
|
||||||
|
float invrmsa, float invrmsb, float invrmsc,
|
||||||
|
float inprmsa, float inprmsb, float inprmsc)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}//_execute_undef()
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void PhaseAlertMonitor::_execute_operational(float urmsa, float urmsb, float urmsc,
|
||||||
|
float irmsa, float irmsb, float irmsc,
|
||||||
|
float invrmsa, float invrmsb, float invrmsc,
|
||||||
|
float inprmsa, float inprmsb, float inprmsc)
|
||||||
|
{
|
||||||
|
static bool _warning = false;
|
||||||
|
_warning = false;
|
||||||
|
|
||||||
|
m_monitor.phase_a.warning.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_a.fault.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_b.warning.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_b.fault.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_c.warning.all = (uint16_t)0;
|
||||||
|
m_monitor.phase_c.fault.all = (uint16_t)0;
|
||||||
|
//
|
||||||
|
m_voltage_ab_exceed_level_1.execute(urmsa);
|
||||||
|
m_voltage_bc_exceed_level_1.execute(urmsb);
|
||||||
|
m_voltage_ca_exceed_level_1.execute(urmsc);
|
||||||
|
|
||||||
|
m_voltage_ab_exceed_level_2.execute(urmsa);
|
||||||
|
m_voltage_bc_exceed_level_2.execute(urmsb);
|
||||||
|
m_voltage_ca_exceed_level_2.execute(urmsc);
|
||||||
|
|
||||||
|
m_voltage_ab_exceed_level_3.execute(urmsa);
|
||||||
|
m_voltage_bc_exceed_level_3.execute(urmsb);
|
||||||
|
m_voltage_ca_exceed_level_3.execute(urmsc);
|
||||||
|
|
||||||
|
m_voltage_ab_exceed_level_4.execute(urmsa);
|
||||||
|
m_voltage_bc_exceed_level_4.execute(urmsb);
|
||||||
|
m_voltage_ca_exceed_level_4.execute(urmsc);
|
||||||
|
/*
|
||||||
|
m_voltage_a_decrease_level_1.execute(urmsa);
|
||||||
|
m_voltage_b_decrease_level_1.execute(urmsb);
|
||||||
|
m_voltage_c_decrease_level_1.execute(urmsc);
|
||||||
|
|
||||||
|
m_voltage_a_decrease_level_2.execute(urmsa);
|
||||||
|
m_voltage_b_decrease_level_2.execute(urmsb);
|
||||||
|
m_voltage_c_decrease_level_2.execute(urmsc);
|
||||||
|
|
||||||
|
m_voltage_a_decrease_level_3.execute(urmsa);
|
||||||
|
m_voltage_b_decrease_level_3.execute(urmsb);
|
||||||
|
m_voltage_c_decrease_level_3.execute(urmsc);
|
||||||
|
*/
|
||||||
|
m_current_a_overload_level_1.execute(irmsa);
|
||||||
|
m_current_b_overload_level_1.execute(irmsb);
|
||||||
|
m_current_c_overload_level_1.execute(irmsc);
|
||||||
|
m_current_a_overload_level_2.execute(irmsa);
|
||||||
|
m_current_b_overload_level_2.execute(irmsb);
|
||||||
|
m_current_c_overload_level_2.execute(irmsc);
|
||||||
|
m_current_a_overload_level_3.execute(irmsa);
|
||||||
|
m_current_b_overload_level_3.execute(irmsb);
|
||||||
|
m_current_c_overload_level_3.execute(irmsc);
|
||||||
|
m_current_invertor_a_overload_level_1.execute(invrmsa);
|
||||||
|
m_current_invertor_b_overload_level_1.execute(invrmsb);
|
||||||
|
m_current_invertor_c_overload_level_1.execute(invrmsc);
|
||||||
|
m_current_invertor_a_overload_level_2.execute(invrmsa);
|
||||||
|
m_current_invertor_b_overload_level_2.execute(invrmsb);
|
||||||
|
m_current_invertor_c_overload_level_2.execute(invrmsc);
|
||||||
|
m_current_invertor_a_overload_level_3.execute(invrmsa);
|
||||||
|
m_current_invertor_b_overload_level_3.execute(invrmsb);
|
||||||
|
m_current_invertor_c_overload_level_3.execute(invrmsc);
|
||||||
|
//
|
||||||
|
m_current_input_a_overload_level_1.execute(inprmsa);
|
||||||
|
m_current_input_b_overload_level_1.execute(inprmsb);
|
||||||
|
m_current_input_c_overload_level_1.execute(inprmsc);
|
||||||
|
m_current_input_a_overload_level_2.execute(inprmsa);
|
||||||
|
m_current_input_b_overload_level_2.execute(inprmsb);
|
||||||
|
m_current_input_c_overload_level_2.execute(inprmsc);
|
||||||
|
m_current_input_a_overload_level_3.execute(inprmsa);
|
||||||
|
m_current_input_b_overload_level_3.execute(inprmsb);
|
||||||
|
m_current_input_c_overload_level_3.execute(inprmsc);
|
||||||
|
//
|
||||||
|
// set flags
|
||||||
|
m_monitor.phase_a.warning.bit.exceed_voltage_level_1 = m_voltage_ab_exceed_level_1.warning;
|
||||||
|
m_monitor.phase_a.warning.bit.exceed_voltage_level_2 = m_voltage_ab_exceed_level_2.warning;
|
||||||
|
m_monitor.phase_a.fault.bit.exceed_voltage_level_3 = m_voltage_ab_exceed_level_3.fault;
|
||||||
|
m_monitor.phase_a.fault.bit.exceed_voltage_level_4 = m_voltage_ab_exceed_level_4.fault;
|
||||||
|
m_monitor.phase_a.warning.bit.decrease_voltage_level_1 = m_voltage_ab_decrease_level_1.warning;
|
||||||
|
m_monitor.phase_a.warning.bit.decrease_voltage_level_2 = m_voltage_ab_decrease_level_2.warning;
|
||||||
|
m_monitor.phase_a.fault.bit.decrease_voltage_level_3 = m_voltage_ab_decrease_level_3.fault;
|
||||||
|
m_monitor.phase_a.fault.bit.overload_current_level_1 = m_current_a_overload_level_1.fault;
|
||||||
|
m_monitor.phase_a.fault.bit.overload_current_level_2 = m_current_a_overload_level_2.fault;
|
||||||
|
m_monitor.phase_a.fault.bit.overload_current_level_3 = m_current_a_overload_level_3.fault;
|
||||||
|
m_monitor.phase_a.fault.bit.overload_invertor_current_level_1 = m_current_invertor_a_overload_level_1.fault;
|
||||||
|
m_monitor.phase_a.fault.bit.overload_invertor_current_level_2 = m_current_invertor_a_overload_level_2.fault;
|
||||||
|
m_monitor.phase_a.fault.bit.overload_invertor_current_level_3 = m_current_invertor_a_overload_level_3.fault;
|
||||||
|
m_monitor.phase_a.fault.bit.overload_input_current_level_1 = m_current_input_a_overload_level_1.fault;
|
||||||
|
m_monitor.phase_a.fault.bit.overload_input_current_level_2 = m_current_input_a_overload_level_2.fault;
|
||||||
|
m_monitor.phase_a.fault.bit.overload_input_current_level_3 = m_current_input_a_overload_level_3.fault;
|
||||||
|
//
|
||||||
|
m_monitor.phase_b.warning.bit.exceed_voltage_level_1 = m_voltage_bc_exceed_level_1.warning;
|
||||||
|
m_monitor.phase_b.warning.bit.exceed_voltage_level_2 = m_voltage_bc_exceed_level_2.warning;
|
||||||
|
m_monitor.phase_b.fault.bit.exceed_voltage_level_3 = m_voltage_bc_exceed_level_3.fault;
|
||||||
|
m_monitor.phase_b.fault.bit.exceed_voltage_level_4 = m_voltage_bc_exceed_level_4.fault;
|
||||||
|
m_monitor.phase_b.warning.bit.decrease_voltage_level_1 = m_voltage_bc_decrease_level_1.warning;
|
||||||
|
m_monitor.phase_b.warning.bit.decrease_voltage_level_2 = m_voltage_bc_decrease_level_2.warning;
|
||||||
|
m_monitor.phase_b.fault.bit.decrease_voltage_level_3 = m_voltage_bc_decrease_level_3.fault;
|
||||||
|
m_monitor.phase_b.fault.bit.overload_current_level_1 = m_current_b_overload_level_1.fault;
|
||||||
|
m_monitor.phase_b.fault.bit.overload_current_level_2 = m_current_b_overload_level_2.fault;
|
||||||
|
m_monitor.phase_b.fault.bit.overload_current_level_3 = m_current_b_overload_level_3.fault;
|
||||||
|
m_monitor.phase_b.fault.bit.overload_invertor_current_level_1 = m_current_invertor_b_overload_level_1.fault;
|
||||||
|
m_monitor.phase_b.fault.bit.overload_invertor_current_level_2 = m_current_invertor_b_overload_level_2.fault;
|
||||||
|
m_monitor.phase_b.fault.bit.overload_invertor_current_level_3 = m_current_invertor_b_overload_level_3.fault;
|
||||||
|
m_monitor.phase_b.fault.bit.overload_input_current_level_1 = m_current_input_b_overload_level_1.fault;
|
||||||
|
m_monitor.phase_b.fault.bit.overload_input_current_level_2 = m_current_input_b_overload_level_2.fault;
|
||||||
|
m_monitor.phase_b.fault.bit.overload_input_current_level_3 = m_current_input_b_overload_level_3.fault;
|
||||||
|
//
|
||||||
|
m_monitor.phase_c.warning.bit.exceed_voltage_level_1 = m_voltage_ca_exceed_level_1.warning;
|
||||||
|
m_monitor.phase_c.warning.bit.exceed_voltage_level_2 = m_voltage_ca_exceed_level_2.warning;
|
||||||
|
m_monitor.phase_c.fault.bit.exceed_voltage_level_3 = m_voltage_ca_exceed_level_3.fault;
|
||||||
|
m_monitor.phase_c.fault.bit.exceed_voltage_level_4 = m_voltage_ca_exceed_level_4.fault;
|
||||||
|
m_monitor.phase_c.warning.bit.decrease_voltage_level_1 = m_voltage_ca_decrease_level_1.warning;
|
||||||
|
m_monitor.phase_c.warning.bit.decrease_voltage_level_2 = m_voltage_ca_decrease_level_2.warning;
|
||||||
|
m_monitor.phase_c.fault.bit.decrease_voltage_level_3 = m_voltage_ca_decrease_level_3.fault;
|
||||||
|
m_monitor.phase_c.fault.bit.overload_current_level_1 = m_current_c_overload_level_1.fault;
|
||||||
|
m_monitor.phase_c.fault.bit.overload_current_level_2 = m_current_c_overload_level_2.fault;
|
||||||
|
m_monitor.phase_c.fault.bit.overload_current_level_3 = m_current_c_overload_level_3.fault;
|
||||||
|
m_monitor.phase_c.fault.bit.overload_invertor_current_level_1 = m_current_invertor_c_overload_level_1.fault;
|
||||||
|
m_monitor.phase_c.fault.bit.overload_invertor_current_level_2 = m_current_invertor_c_overload_level_2.fault;
|
||||||
|
m_monitor.phase_c.fault.bit.overload_invertor_current_level_3 = m_current_invertor_c_overload_level_3.fault;
|
||||||
|
m_monitor.phase_c.fault.bit.overload_input_current_level_1 = m_current_input_c_overload_level_1.fault;
|
||||||
|
m_monitor.phase_c.fault.bit.overload_input_current_level_2 = m_current_input_c_overload_level_2.fault;
|
||||||
|
m_monitor.phase_c.fault.bit.overload_input_current_level_3 = m_current_input_c_overload_level_3.fault;
|
||||||
|
//
|
||||||
|
status = m_monitor;
|
||||||
|
//
|
||||||
|
if(m_monitor.phase_a.fault.all != (uint16_t)0){ m_fault = true;}
|
||||||
|
if(m_monitor.phase_b.fault.all != (uint16_t)0){ m_fault = true;}
|
||||||
|
if(m_monitor.phase_c.fault.all != (uint16_t)0){ m_fault = true;}
|
||||||
|
//
|
||||||
|
if(m_monitor.phase_a.warning.all != (uint16_t)0){ _warning = true;}
|
||||||
|
if(m_monitor.phase_b.warning.all != (uint16_t)0){ _warning = true;}
|
||||||
|
if(m_monitor.phase_c.warning.all != (uint16_t)0){ _warning = true;}
|
||||||
|
|
||||||
|
m_warning = _warning;
|
||||||
|
warning = m_warning;
|
||||||
|
fault = m_fault;
|
||||||
|
//
|
||||||
|
}//_execute_operational()
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,242 @@
|
|||||||
|
/*
|
||||||
|
* PhaseAlertMonitor.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "SYSCTRL/ALERTHeaders.h"
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_PHASEALERTMONITOR_H_
|
||||||
|
#define SYSCTRL_PHASEALERTMONITOR_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
struct PhaseAlertConfiguration
|
||||||
|
{
|
||||||
|
ALERT::AlertBaseConfiguration voltage_exceed_level_1;
|
||||||
|
ALERT::AlertBaseConfiguration voltage_exceed_level_2;
|
||||||
|
ALERT::AlertBaseConfiguration voltage_exceed_level_3;
|
||||||
|
ALERT::AlertBaseConfiguration voltage_exceed_level_4;
|
||||||
|
ALERT::AlertBaseConfiguration voltage_decrease_level_1;
|
||||||
|
ALERT::AlertBaseConfiguration voltage_decrease_level_2;
|
||||||
|
ALERT::AlertBaseConfiguration voltage_decrease_level_3;
|
||||||
|
ALERT::AlertBaseConfiguration current_overload_level_1;
|
||||||
|
ALERT::AlertBaseConfiguration current_overload_level_2;
|
||||||
|
ALERT::AlertBaseConfiguration current_overload_level_3;
|
||||||
|
ALERT::AlertBaseConfiguration current_invertor_overload_level_1;
|
||||||
|
ALERT::AlertBaseConfiguration current_invertor_overload_level_2;
|
||||||
|
ALERT::AlertBaseConfiguration current_invertor_overload_level_3;
|
||||||
|
ALERT::AlertBaseConfiguration current_input_overload_level_1;
|
||||||
|
ALERT::AlertBaseConfiguration current_input_overload_level_2;
|
||||||
|
ALERT::AlertBaseConfiguration current_input_overload_level_3;
|
||||||
|
PhaseAlertConfiguration():
|
||||||
|
voltage_exceed_level_1(),
|
||||||
|
voltage_exceed_level_2(),
|
||||||
|
voltage_exceed_level_3(),
|
||||||
|
voltage_exceed_level_4(),
|
||||||
|
voltage_decrease_level_1(),
|
||||||
|
voltage_decrease_level_2(),
|
||||||
|
voltage_decrease_level_3(),
|
||||||
|
current_overload_level_1(),
|
||||||
|
current_overload_level_2(),
|
||||||
|
current_overload_level_3(),
|
||||||
|
current_invertor_overload_level_1(),
|
||||||
|
current_invertor_overload_level_2(),
|
||||||
|
current_invertor_overload_level_3(),
|
||||||
|
current_input_overload_level_1(),
|
||||||
|
current_input_overload_level_2(),
|
||||||
|
current_input_overload_level_3()
|
||||||
|
{}
|
||||||
|
//
|
||||||
|
};//SystemAlertConfiguration
|
||||||
|
|
||||||
|
|
||||||
|
struct PhaseWarningBit
|
||||||
|
{
|
||||||
|
uint16_t exceed_voltage_level_1 :1;
|
||||||
|
uint16_t exceed_voltage_level_2 :1;
|
||||||
|
uint16_t decrease_voltage_level_1 :1;
|
||||||
|
uint16_t decrease_voltage_level_2 :1;
|
||||||
|
//
|
||||||
|
};//PhaseWarningBit
|
||||||
|
|
||||||
|
struct PhaseFaultBit
|
||||||
|
{
|
||||||
|
uint16_t exceed_voltage_level_3 :1; // 0
|
||||||
|
uint16_t exceed_voltage_level_4 :1; // 1
|
||||||
|
uint16_t decrease_voltage_level_3 :1; // 2
|
||||||
|
uint16_t phase_lost :1; // 3
|
||||||
|
//
|
||||||
|
uint16_t short_circuit :1; // 4
|
||||||
|
uint16_t high_current :1; // 5
|
||||||
|
uint16_t overload_current_level_1 :1; // 6
|
||||||
|
uint16_t overload_current_level_2 :1; // 7
|
||||||
|
//
|
||||||
|
uint16_t overload_current_level_3 :1; // 8
|
||||||
|
uint16_t overload_invertor_current_level_1 :1; // 9
|
||||||
|
uint16_t overload_invertor_current_level_2 :1; // 10
|
||||||
|
uint16_t overload_invertor_current_level_3 :1; // 11
|
||||||
|
//
|
||||||
|
uint16_t overload_input_current_level_1 :1; // 12
|
||||||
|
uint16_t overload_input_current_level_2 :1; // 13
|
||||||
|
uint16_t overload_input_current_level_3 :1; // 14
|
||||||
|
uint16_t reserved_15 :1; // 15
|
||||||
|
};//PhaseFaultBit
|
||||||
|
|
||||||
|
union PhaseWarningRegister
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
struct PhaseWarningBit bit;
|
||||||
|
PhaseWarningRegister():
|
||||||
|
all(uint16_t(0))
|
||||||
|
{}
|
||||||
|
//
|
||||||
|
};//PhaseWarningRegister
|
||||||
|
|
||||||
|
union PhaseFaultRegister
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
struct PhaseFaultBit bit;
|
||||||
|
PhaseFaultRegister():
|
||||||
|
all(uint16_t(0))
|
||||||
|
{}
|
||||||
|
};//PhaseFaultRegister
|
||||||
|
|
||||||
|
struct PhaseAlertStatusRegister
|
||||||
|
{
|
||||||
|
union PhaseWarningRegister warning;
|
||||||
|
union PhaseFaultRegister fault;
|
||||||
|
PhaseAlertStatusRegister():
|
||||||
|
warning(),
|
||||||
|
fault()
|
||||||
|
{}
|
||||||
|
};//PhaseAlertStatusRegister
|
||||||
|
|
||||||
|
|
||||||
|
struct PhaseAlertRegister
|
||||||
|
{
|
||||||
|
struct PhaseAlertStatusRegister phase_a;
|
||||||
|
struct PhaseAlertStatusRegister phase_b;
|
||||||
|
struct PhaseAlertStatusRegister phase_c;
|
||||||
|
PhaseAlertRegister():
|
||||||
|
phase_a(),
|
||||||
|
phase_b(),
|
||||||
|
phase_c()
|
||||||
|
{}
|
||||||
|
//
|
||||||
|
};//PhaseAlertRegister
|
||||||
|
|
||||||
|
|
||||||
|
class PhaseAlertMonitor
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
float m_time_sample;
|
||||||
|
bool m_fault;
|
||||||
|
bool m_warning;
|
||||||
|
private:
|
||||||
|
PhaseAlertRegister m_monitor;
|
||||||
|
public:
|
||||||
|
PhaseAlertRegister status;
|
||||||
|
bool fault;
|
||||||
|
bool warning;
|
||||||
|
private:
|
||||||
|
ALERT::WarningExceed m_voltage_ab_exceed_level_1;
|
||||||
|
ALERT::WarningExceed m_voltage_bc_exceed_level_1;
|
||||||
|
ALERT::WarningExceed m_voltage_ca_exceed_level_1;
|
||||||
|
//
|
||||||
|
ALERT::WarningExceed m_voltage_ab_exceed_level_2;
|
||||||
|
ALERT::WarningExceed m_voltage_bc_exceed_level_2;
|
||||||
|
ALERT::WarningExceed m_voltage_ca_exceed_level_2;
|
||||||
|
//
|
||||||
|
ALERT::FaultExceed m_voltage_ab_exceed_level_3;
|
||||||
|
ALERT::FaultExceed m_voltage_bc_exceed_level_3;
|
||||||
|
ALERT::FaultExceed m_voltage_ca_exceed_level_3;
|
||||||
|
//
|
||||||
|
ALERT::FaultExceed m_voltage_ab_exceed_level_4;
|
||||||
|
ALERT::FaultExceed m_voltage_bc_exceed_level_4;
|
||||||
|
ALERT::FaultExceed m_voltage_ca_exceed_level_4;
|
||||||
|
//
|
||||||
|
ALERT::WarningDecrease m_voltage_ab_decrease_level_1;
|
||||||
|
ALERT::WarningDecrease m_voltage_bc_decrease_level_1;
|
||||||
|
ALERT::WarningDecrease m_voltage_ca_decrease_level_1;
|
||||||
|
//
|
||||||
|
ALERT::WarningDecrease m_voltage_ab_decrease_level_2;
|
||||||
|
ALERT::WarningDecrease m_voltage_bc_decrease_level_2;
|
||||||
|
ALERT::WarningDecrease m_voltage_ca_decrease_level_2;
|
||||||
|
//
|
||||||
|
ALERT::FaultDecrease m_voltage_ab_decrease_level_3;
|
||||||
|
ALERT::FaultDecrease m_voltage_bc_decrease_level_3;
|
||||||
|
ALERT::FaultDecrease m_voltage_ca_decrease_level_3;
|
||||||
|
//
|
||||||
|
ALERT::FaultExceed m_current_a_overload_level_1;
|
||||||
|
ALERT::FaultExceed m_current_b_overload_level_1;
|
||||||
|
ALERT::FaultExceed m_current_c_overload_level_1;
|
||||||
|
//
|
||||||
|
ALERT::FaultExceed m_current_a_overload_level_2;
|
||||||
|
ALERT::FaultExceed m_current_b_overload_level_2;
|
||||||
|
ALERT::FaultExceed m_current_c_overload_level_2;
|
||||||
|
//
|
||||||
|
ALERT::FaultExceed m_current_a_overload_level_3;
|
||||||
|
ALERT::FaultExceed m_current_b_overload_level_3;
|
||||||
|
ALERT::FaultExceed m_current_c_overload_level_3;
|
||||||
|
//
|
||||||
|
ALERT::FaultExceed m_current_invertor_a_overload_level_1;
|
||||||
|
ALERT::FaultExceed m_current_invertor_b_overload_level_1;
|
||||||
|
ALERT::FaultExceed m_current_invertor_c_overload_level_1;
|
||||||
|
//
|
||||||
|
ALERT::FaultExceed m_current_invertor_a_overload_level_2;
|
||||||
|
ALERT::FaultExceed m_current_invertor_b_overload_level_2;
|
||||||
|
ALERT::FaultExceed m_current_invertor_c_overload_level_2;
|
||||||
|
//
|
||||||
|
ALERT::FaultExceed m_current_invertor_a_overload_level_3;
|
||||||
|
ALERT::FaultExceed m_current_invertor_b_overload_level_3;
|
||||||
|
ALERT::FaultExceed m_current_invertor_c_overload_level_3;
|
||||||
|
|
||||||
|
ALERT::FaultExceed m_current_input_a_overload_level_1;
|
||||||
|
ALERT::FaultExceed m_current_input_b_overload_level_1;
|
||||||
|
ALERT::FaultExceed m_current_input_c_overload_level_1;
|
||||||
|
//
|
||||||
|
ALERT::FaultExceed m_current_input_a_overload_level_2;
|
||||||
|
ALERT::FaultExceed m_current_input_b_overload_level_2;
|
||||||
|
ALERT::FaultExceed m_current_input_c_overload_level_2;
|
||||||
|
//
|
||||||
|
ALERT::FaultExceed m_current_input_a_overload_level_3;
|
||||||
|
ALERT::FaultExceed m_current_input_b_overload_level_3;
|
||||||
|
ALERT::FaultExceed m_current_input_c_overload_level_3;
|
||||||
|
public:
|
||||||
|
PhaseAlertMonitor();
|
||||||
|
void setup(float time_sample);
|
||||||
|
void configure(const PhaseAlertConfiguration& config);
|
||||||
|
public:
|
||||||
|
void get_faults(PhaseFaultRegister& ph_a, PhaseFaultRegister& ph_b, PhaseFaultRegister& ph_c);
|
||||||
|
void reset();
|
||||||
|
public:
|
||||||
|
void execute(float urmsa, float urmsb, float urmsc,
|
||||||
|
float irmsa, float irmsb, float irmsc,
|
||||||
|
float invrmsa, float invrmsb, float invrmsc,
|
||||||
|
float inprmsa, float inmrmsb, float inmrmsc);
|
||||||
|
private:
|
||||||
|
void (PhaseAlertMonitor::*_execute)(float urmsa, float urmsb, float urmsc,
|
||||||
|
float irmsa, float irmsb, float irmsc,
|
||||||
|
float invrmsa, float invrmsb, float invrmsc,
|
||||||
|
float inprmsa, float inmrmsb, float inmrmsc);
|
||||||
|
void _execute_undef(float urmsa, float urmsb, float urmsc,
|
||||||
|
float irmsa, float irmsb, float irmsc,
|
||||||
|
float invrmsa, float invrmsb, float invrmsc,
|
||||||
|
float inprmsa, float inmrmsb, float inmrmsc);
|
||||||
|
void _execute_operational(float urmsa, float urmsb, float urmsc,
|
||||||
|
float irmsa, float irmsb, float irmsc,
|
||||||
|
float invrmsa, float invrmsb, float invrmsc,
|
||||||
|
float inprmsa, float inmrmsb, float inmrmsc);
|
||||||
|
//
|
||||||
|
};//PhaseAlertMonitor
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_PHASEALERTMONITOR_H_ */
|
||||||
|
|
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* AnalogSignalStructure.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_ANALOGSIGNALSTRUCTURE_H_
|
||||||
|
#define SYSCTRL_ANALOGSIGNALSTRUCTURE_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct ProjectionAnalogSignalStructure
|
||||||
|
{
|
||||||
|
float active;
|
||||||
|
float reactive;
|
||||||
|
ProjectionAnalogSignalStructure():
|
||||||
|
active(FP_ZERO),
|
||||||
|
reactive(FP_ZERO)
|
||||||
|
{}
|
||||||
|
};//ProjectionAnalogSignalStructure
|
||||||
|
|
||||||
|
|
||||||
|
struct RelativeAnalogSignalStructure
|
||||||
|
{
|
||||||
|
float amplitude;
|
||||||
|
float relative;
|
||||||
|
void reset()
|
||||||
|
{
|
||||||
|
amplitude = FP_ZERO;
|
||||||
|
relative = FP_ZERO;
|
||||||
|
}
|
||||||
|
RelativeAnalogSignalStructure():
|
||||||
|
amplitude(FP_ZERO),
|
||||||
|
relative(FP_ZERO)
|
||||||
|
{}
|
||||||
|
};//AnalogSignalStructure
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_ANALOGSIGNALSTRUCTURE_H_ */
|
@ -0,0 +1,663 @@
|
|||||||
|
/*
|
||||||
|
* SYSRestart.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/SYSRestart.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
SYSRestart::SYSRestart(SYSCTRL::SystemEnvironment& env):
|
||||||
|
m_env(env),
|
||||||
|
m_mode(SYSCTRL::SYSRestart::UNDEFINED),
|
||||||
|
m_state(SYSCTRL::SYSRestart::EMPTY),
|
||||||
|
m_state_bit_field(),
|
||||||
|
m_time_sample(-1.0),
|
||||||
|
m_config(),
|
||||||
|
m_registers(),
|
||||||
|
status(),
|
||||||
|
_execute(&SYSCTRL::SYSRestart::_execute_undef),
|
||||||
|
_state_run(&SYSCTRL::SYSRestart::_state_empty)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
void SYSRestart::setup(float time_sample)
|
||||||
|
{
|
||||||
|
if(m_mode == SYSCTRL::SYSRestart::UNDEFINED)
|
||||||
|
{
|
||||||
|
if(time_sample > FP_ZERO)
|
||||||
|
{
|
||||||
|
m_time_sample = time_sample;
|
||||||
|
m_mode = SYSCTRL::SYSRestart::CONFIGURATE;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void SYSRestart::configure(SYSRestartConfiguration& config)
|
||||||
|
{
|
||||||
|
bool _status = true;
|
||||||
|
|
||||||
|
if(m_mode == SYSCTRL::SYSRestart::CONFIGURATE)
|
||||||
|
{
|
||||||
|
m_config = config;
|
||||||
|
|
||||||
|
if((m_config.enable.equipment.all != (uint16_t)0)||
|
||||||
|
(m_config.enable.phase_a.all != (uint16_t)0)||
|
||||||
|
(m_config.enable.phase_b.all != (uint16_t)0)||
|
||||||
|
(m_config.enable.phase_c.all != (uint16_t)0))
|
||||||
|
{
|
||||||
|
_status &= m_config.period_timer_hold_fault > m_time_sample ? true : false;
|
||||||
|
_status &= m_config.period_timer_selfclear_attempts > m_time_sample ? true : false;
|
||||||
|
_status &= m_config.period_timer_turnon_switch > m_time_sample ? true : false;
|
||||||
|
_status &= m_config.attempts > 0 ? true : false;
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
m_registers.counter_attempts = 0;
|
||||||
|
m_registers.counter_timer = FP_ZERO;
|
||||||
|
m_registers.counter_timer_selfclear_attempts = FP_ZERO;
|
||||||
|
m_registers.status.all = 0;
|
||||||
|
//
|
||||||
|
if(_status)
|
||||||
|
{
|
||||||
|
m_mode = SYSCTRL::SYSRestart::OPERATIONAL;
|
||||||
|
_execute = &SYSCTRL::SYSRestart::_execute_operational;
|
||||||
|
|
||||||
|
if((m_config.restart_enable.signal.enable)&&
|
||||||
|
((m_config.enable.equipment.all != (uint16_t)0)||
|
||||||
|
(m_config.enable.phase_a.all != (uint16_t)0)||
|
||||||
|
(m_config.enable.phase_b.all != (uint16_t)0)||
|
||||||
|
(m_config.enable.phase_c.all != (uint16_t)0)))
|
||||||
|
{
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_free;
|
||||||
|
m_state = SYSCTRL::SYSRestart::FREE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_empty;
|
||||||
|
m_state = SYSCTRL::SYSRestart::EMPTY;
|
||||||
|
//
|
||||||
|
}// if else
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
SYSRestart::mode_t SYSRestart::get_mode()
|
||||||
|
{
|
||||||
|
return m_mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
SYSRestart::state_t SYSRestart::get_state()
|
||||||
|
{
|
||||||
|
return m_state;
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
uint16_t SYSRestart::get_state_steps()
|
||||||
|
{
|
||||||
|
return m_state_bit_field.all;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
uint16_t SYSRestart::get_attempts()
|
||||||
|
{
|
||||||
|
return m_registers.counter_attempts;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool SYSRestart::compare(SYSCTRL::SYSRestart::mode_t mode)
|
||||||
|
{
|
||||||
|
return mode == m_mode;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
bool SYSRestart::compare_state(SYSRestart::SYSRestart::state_t state)
|
||||||
|
{
|
||||||
|
return state == m_state;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::execute()
|
||||||
|
{
|
||||||
|
(this->*_execute)();
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void SYSRestart::_execute_undef()
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_execute_operational()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
if(m_config.restart_enable.signal.enable)
|
||||||
|
{
|
||||||
|
m_registers.status_fault_register.equipment.all = m_config.enable.equipment.all & m_env.system_faults_register.equipment.all;
|
||||||
|
m_registers.status_fault_register.phase_a.all = m_config.enable.phase_a.all & m_env.system_faults_register.phase_a.all;
|
||||||
|
m_registers.status_fault_register.phase_b.all = m_config.enable.phase_b.all & m_env.system_faults_register.phase_b.all;
|
||||||
|
m_registers.status_fault_register.phase_c.all = m_config.enable.phase_c.all & m_env.system_faults_register.phase_c.all;
|
||||||
|
//
|
||||||
|
m_registers.status.signal.fault = m_registers.status_fault_register.equipment.all == (uint16_t)0 ? false : true;
|
||||||
|
m_registers.status.signal.fault |= m_registers.status_fault_register.phase_a.all == (uint16_t)0 ? false : true;
|
||||||
|
m_registers.status.signal.fault |= m_registers.status_fault_register.phase_b.all == (uint16_t)0 ? false : true;
|
||||||
|
m_registers.status.signal.fault |= m_registers.status_fault_register.phase_c.all == (uint16_t)0 ? false : true;
|
||||||
|
//
|
||||||
|
if(m_registers.counter_attempts != 0)
|
||||||
|
{
|
||||||
|
if(m_registers.counter_timer_selfclear_attempts < m_config.period_timer_selfclear_attempts)
|
||||||
|
{
|
||||||
|
m_registers.counter_timer_selfclear_attempts += m_time_sample;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_registers.counter_attempts = 0;
|
||||||
|
m_registers.counter_timer_selfclear_attempts = FP_ZERO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
SYSCTRL::MonitorDigitalInputSignal::implement(m_registers.status.signal.fault, m_registers.monitor_fault);
|
||||||
|
//
|
||||||
|
_state_execute();
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_set_state_free();
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void SYSRestart::_set_state_empty()
|
||||||
|
{
|
||||||
|
m_state = SYSCTRL::SYSRestart::EMPTY;
|
||||||
|
m_state_bit_field.all = 0;
|
||||||
|
m_state_bit_field.signal.empty = 1;
|
||||||
|
//
|
||||||
|
m_registers.counter_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_registers.status.signal.resetfault = 0;
|
||||||
|
m_registers.status.signal.freezefault = 0;
|
||||||
|
m_registers.status.signal.startup = 0;
|
||||||
|
m_registers.status.signal.turnon_q1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km3 = 0;
|
||||||
|
|
||||||
|
status.all = m_registers.status.all;
|
||||||
|
//
|
||||||
|
SYSCTRL::MonitorDigitalInputSignal::preset(false, m_registers.monitor_fault);
|
||||||
|
//
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_empty;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void SYSRestart::_set_state_free()
|
||||||
|
{
|
||||||
|
m_state = SYSCTRL::SYSRestart::FREE;
|
||||||
|
m_state_bit_field.all = 0;
|
||||||
|
m_state_bit_field.signal.free = 1;
|
||||||
|
//
|
||||||
|
m_registers.counter_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_registers.status.signal.resetfault = 0;
|
||||||
|
m_registers.status.signal.freezefault = 0;
|
||||||
|
m_registers.status.signal.startup = 0;
|
||||||
|
m_registers.status.signal.turnon_q1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km3 = 0;
|
||||||
|
//
|
||||||
|
status.all = m_registers.status.all;
|
||||||
|
//
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_free;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void SYSRestart::_set_state_holdfault()
|
||||||
|
{
|
||||||
|
m_state = SYSCTRL::SYSRestart::HOLDFAULT;
|
||||||
|
m_state_bit_field.signal.free = 0;
|
||||||
|
m_state_bit_field.signal.holdfault = 1;
|
||||||
|
//
|
||||||
|
m_registers.counter_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_registers.status.signal.resetfault = 0;
|
||||||
|
m_registers.status.signal.freezefault = 0;
|
||||||
|
m_registers.status.signal.startup = 0;
|
||||||
|
m_registers.status.signal.turnon_q1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km3 = 0;
|
||||||
|
//
|
||||||
|
status.all = m_registers.status.all;
|
||||||
|
//
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_holdfault;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void SYSRestart::_set_state_resetfault()
|
||||||
|
{
|
||||||
|
m_state = SYSCTRL::SYSRestart::RESETFAULT;
|
||||||
|
m_state_bit_field.signal.resetfault = 1;
|
||||||
|
//
|
||||||
|
m_registers.counter_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_registers.status.signal.resetfault = 1;
|
||||||
|
m_registers.status.signal.freezefault = 0;
|
||||||
|
m_registers.status.signal.startup = 0;
|
||||||
|
m_registers.status.signal.turnon_q1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km3 = 0;
|
||||||
|
//
|
||||||
|
status.all = m_registers.status.all;
|
||||||
|
//
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_resetfault;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void SYSRestart::_set_state_freezefault()
|
||||||
|
{
|
||||||
|
m_state = SYSCTRL::SYSRestart::FREEZEFAULT;
|
||||||
|
m_state_bit_field.all = 0;
|
||||||
|
m_state_bit_field.signal.freezefault = 1;
|
||||||
|
//
|
||||||
|
m_registers.counter_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_registers.status.signal.resetfault = 0;
|
||||||
|
m_registers.status.signal.freezefault = 1;
|
||||||
|
m_registers.status.signal.startup = 0;
|
||||||
|
m_registers.status.signal.turnon_q1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km3 = 0;
|
||||||
|
//
|
||||||
|
status.all = m_registers.status.all;
|
||||||
|
//
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_freezefault;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void SYSRestart::_set_state_holdstop()
|
||||||
|
{
|
||||||
|
m_state = SYSCTRL::SYSRestart::HOLDSTOP;
|
||||||
|
m_state_bit_field.signal.holdstop = 1;
|
||||||
|
//
|
||||||
|
m_registers.counter_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_registers.status.signal.resetfault = 0;
|
||||||
|
m_registers.status.signal.freezefault = 0;
|
||||||
|
m_registers.status.signal.startup = 0;
|
||||||
|
m_registers.status.signal.turnon_q1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km3 = 0;
|
||||||
|
//
|
||||||
|
status.all = m_registers.status.all;
|
||||||
|
//
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_holdstop;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void SYSRestart::_set_state_turnon_q1()
|
||||||
|
{
|
||||||
|
m_state = SYSCTRL::SYSRestart::TURNONQ1;
|
||||||
|
m_state_bit_field.signal.turnonq1 = 1;
|
||||||
|
//
|
||||||
|
m_registers.counter_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_registers.status.signal.resetfault = 0;
|
||||||
|
m_registers.status.signal.freezefault = 0;
|
||||||
|
m_registers.status.signal.startup = 0;
|
||||||
|
m_registers.status.signal.turnon_q1 = 1;
|
||||||
|
m_registers.status.signal.turnon_km1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km3 = 0;
|
||||||
|
//
|
||||||
|
status.all = m_registers.status.all;
|
||||||
|
//
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_turnon_q1;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void SYSRestart::_set_state_turnon_km1()
|
||||||
|
{
|
||||||
|
m_state = SYSCTRL::SYSRestart::TURNONKM1;
|
||||||
|
m_state_bit_field.signal.turnonkm1 = 1;
|
||||||
|
//
|
||||||
|
m_registers.counter_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_registers.status.signal.resetfault = 0;
|
||||||
|
m_registers.status.signal.freezefault = 0;
|
||||||
|
m_registers.status.signal.startup = 0;
|
||||||
|
m_registers.status.signal.turnon_q1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km1 = 1;
|
||||||
|
m_registers.status.signal.turnon_km3 = 0;
|
||||||
|
//
|
||||||
|
status.all = m_registers.status.all;
|
||||||
|
//
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_turnon_km1;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void SYSRestart::_set_state_turnon_km3()
|
||||||
|
{
|
||||||
|
m_state = SYSCTRL::SYSRestart::TURNONKM3;
|
||||||
|
m_state_bit_field.signal.turnonkm3 = 1;
|
||||||
|
//
|
||||||
|
m_registers.counter_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_registers.status.signal.resetfault = 0;
|
||||||
|
m_registers.status.signal.freezefault = 0;
|
||||||
|
m_registers.status.signal.startup = 0;
|
||||||
|
m_registers.status.signal.turnon_q1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km3 = 1;
|
||||||
|
//
|
||||||
|
status.all = m_registers.status.all;
|
||||||
|
//
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_turnon_km3;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline void SYSRestart::_set_state_startup()
|
||||||
|
{
|
||||||
|
m_state = SYSCTRL::SYSRestart::STARTUP;
|
||||||
|
m_state_bit_field.signal.turnonq1 = 1;
|
||||||
|
m_state_bit_field.signal.turnonkm1 = 1;
|
||||||
|
m_state_bit_field.signal.turnonkm3 = 1;
|
||||||
|
m_state_bit_field.signal.startup = 1;
|
||||||
|
//
|
||||||
|
m_registers.counter_timer = FP_ZERO;
|
||||||
|
//
|
||||||
|
m_registers.status.signal.resetfault = 0;
|
||||||
|
m_registers.status.signal.freezefault = 0;
|
||||||
|
m_registers.status.signal.startup = 1;
|
||||||
|
m_registers.status.signal.turnon_q1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km1 = 0;
|
||||||
|
m_registers.status.signal.turnon_km3 = 0;
|
||||||
|
|
||||||
|
status.all = m_registers.status.all;
|
||||||
|
//
|
||||||
|
m_registers.counter_attempts++;
|
||||||
|
//
|
||||||
|
_state_run = &SYSCTRL::SYSRestart::_state_startup;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_state_execute()
|
||||||
|
{
|
||||||
|
(this->*_state_run)();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_state_empty()
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_state_free()
|
||||||
|
{
|
||||||
|
// Change State if appropriate conditions was happened
|
||||||
|
if(m_registers.monitor_fault.signal.is_on)
|
||||||
|
{
|
||||||
|
_set_state_holdfault();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_state_holdfault()
|
||||||
|
{
|
||||||
|
// Change State if appropriate conditions was happened
|
||||||
|
|
||||||
|
if(m_registers.counter_timer < m_config.period_timer_hold_fault)
|
||||||
|
{
|
||||||
|
m_registers.counter_timer += m_time_sample;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
|
||||||
|
if(!m_env.system_fault.boolbit.b0)
|
||||||
|
{
|
||||||
|
_set_state_free();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
|
||||||
|
if(m_registers.counter_attempts >= m_config.attempts)
|
||||||
|
{
|
||||||
|
_set_state_freezefault();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
|
||||||
|
if(m_env.system_fault.boolbit.b0 & (m_registers.counter_timer >= m_config.period_timer_hold_fault))
|
||||||
|
{
|
||||||
|
_set_state_resetfault();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_state_resetfault()
|
||||||
|
{
|
||||||
|
// Change State if appropriate conditions was happened
|
||||||
|
|
||||||
|
if(m_registers.counter_timer < m_config.period_timer_reset)
|
||||||
|
{
|
||||||
|
m_registers.counter_timer += m_time_sample;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
|
||||||
|
if(!m_env.system_fault.boolbit.b0)
|
||||||
|
{
|
||||||
|
_set_state_holdstop();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
|
||||||
|
if(m_env.system_fault.boolbit.b0 & (m_registers.counter_timer >= m_config.period_timer_reset))
|
||||||
|
{
|
||||||
|
_set_state_freezefault();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_state_freezefault()
|
||||||
|
{
|
||||||
|
// Change State if appropriate conditions was happened
|
||||||
|
if(!m_env.system_fault.boolbit.b0)
|
||||||
|
{
|
||||||
|
_set_state_free();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_state_holdstop()
|
||||||
|
{
|
||||||
|
// Change State if appropriate conditions was happened
|
||||||
|
|
||||||
|
if(m_registers.counter_timer < m_config.period_timer_hold_stop)
|
||||||
|
{
|
||||||
|
m_registers.counter_timer += m_time_sample;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
|
||||||
|
if(m_env.system_fault.boolbit.b0 |
|
||||||
|
(!m_env.system_fault.boolbit.b0 & m_env.remote_stop.state.signal.is_on)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_set_state_free();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
|
||||||
|
if(!m_env.system_fault.boolbit.b0 &
|
||||||
|
!m_env.system_ready.boolbit.b0 &
|
||||||
|
(m_registers.counter_timer >= m_config.period_timer_hold_stop)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_set_state_turnon_q1();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
|
||||||
|
if(!m_env.system_fault.boolbit.b0 & m_env.system_ready.boolbit.b0)
|
||||||
|
{
|
||||||
|
_set_state_startup();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_state_turnon_q1()
|
||||||
|
{
|
||||||
|
if(m_registers.counter_timer < m_config.period_timer_turnon_switch)
|
||||||
|
{
|
||||||
|
m_registers.counter_timer += m_time_sample;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
if(m_env.system_fault.boolbit.b0 |
|
||||||
|
(m_registers.counter_timer >= m_config.period_timer_turnon_switch)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_set_state_free();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
|
||||||
|
if(!m_env.system_fault.boolbit.b0 & m_env.input_discrete.signal.auxiliary_q1)
|
||||||
|
{
|
||||||
|
_set_state_turnon_km1();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
|
||||||
|
if(!m_env.system_fault.boolbit.b0 & m_env.system_ready.boolbit.b0)
|
||||||
|
{
|
||||||
|
_set_state_startup();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_state_turnon_km1()
|
||||||
|
{
|
||||||
|
if(m_registers.counter_timer < m_config.period_timer_turnon_switch)
|
||||||
|
{
|
||||||
|
m_registers.counter_timer += m_time_sample;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
if(m_env.system_fault.boolbit.b0 |
|
||||||
|
(m_registers.counter_timer >= m_config.period_timer_turnon_switch)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_set_state_free();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
if(!m_env.system_fault.boolbit.b0 & m_env.input_discrete.signal.auxiliary_km1)
|
||||||
|
{
|
||||||
|
_set_state_turnon_km3();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
if(!m_env.system_fault.boolbit.b0 & m_env.system_ready.boolbit.b0)
|
||||||
|
{
|
||||||
|
_set_state_startup();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_state_turnon_km3()
|
||||||
|
{
|
||||||
|
if(m_registers.counter_timer < m_config.period_timer_turnon_switch)
|
||||||
|
{
|
||||||
|
m_registers.counter_timer += m_time_sample;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
if(m_env.system_fault.boolbit.b0 |
|
||||||
|
(m_registers.counter_timer >= m_config.period_timer_turnon_switch)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_set_state_free();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
|
||||||
|
if(!m_env.system_fault.boolbit.b0 & m_env.system_ready.boolbit.b0)
|
||||||
|
{
|
||||||
|
_set_state_startup();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
}//
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SYSRestart::_state_startup()
|
||||||
|
{
|
||||||
|
// Change State if appropriate conditions was happened
|
||||||
|
|
||||||
|
if(m_registers.counter_timer < m_config.period_timer_startup)
|
||||||
|
{
|
||||||
|
m_registers.counter_timer += m_time_sample;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
|
||||||
|
|
||||||
|
if(m_env.system_fault.boolbit.b0 |
|
||||||
|
(m_registers.counter_timer >= m_config.period_timer_startup) |
|
||||||
|
(m_env.enable_work.boolbit.b0) |
|
||||||
|
(m_env.remote_stop.state.signal.is_on)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_set_state_free();
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,200 @@
|
|||||||
|
/*
|
||||||
|
* SYSRestart.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "SYSCTRL/MonitorDigitalInputSignal.h"
|
||||||
|
#include "SYSCTRL/SystemDefinitions.h"
|
||||||
|
#include "SYSCTRL/PhaseAlertMonitor.h"
|
||||||
|
#include "SYSCTRL/SystemEnvironment.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_SYSRESTART_H_
|
||||||
|
#define SYSCTRL_SYSRESTART_H_
|
||||||
|
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
struct SYSRestartEnableBitField
|
||||||
|
{
|
||||||
|
uint16_t enable: 1;
|
||||||
|
};//SYSRestartEnableBitField
|
||||||
|
|
||||||
|
union SYSRestartEnableRegister
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
struct SYSRestartEnableBitField signal;
|
||||||
|
SYSRestartEnableRegister():
|
||||||
|
all((uint16_t)0)
|
||||||
|
{}
|
||||||
|
};//SYSRestartEnableRegister
|
||||||
|
|
||||||
|
|
||||||
|
struct SYSRestartStatusBitField
|
||||||
|
{
|
||||||
|
uint16_t fault : 1;
|
||||||
|
uint16_t resetfault : 1;
|
||||||
|
uint16_t freezefault : 1;
|
||||||
|
uint16_t startup : 1;
|
||||||
|
uint16_t turnon_q1 : 1;
|
||||||
|
uint16_t turnon_km1 : 1;
|
||||||
|
uint16_t turnon_km3 : 1;
|
||||||
|
};//SYSRestartStatusBitField
|
||||||
|
//
|
||||||
|
|
||||||
|
union SYSRestartStatusRegister
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
struct SYSRestartStatusBitField signal;
|
||||||
|
SYSRestartStatusRegister():
|
||||||
|
all((uint16_t)0)
|
||||||
|
{}
|
||||||
|
};//SYSRestartStatusRegister
|
||||||
|
|
||||||
|
|
||||||
|
struct SYSRestartRegisters
|
||||||
|
{
|
||||||
|
float counter_timer;
|
||||||
|
float counter_timer_selfclear_attempts;
|
||||||
|
uint16_t counter_attempts;
|
||||||
|
SYSCTRL::SystemFaultsRegister status_fault_register;
|
||||||
|
SYSCTRL::MonitorDigitalInputSignalRegister monitor_fault;
|
||||||
|
SYSCTRL::MonitorDigitalInputSignalRegister monitor_resetfault;
|
||||||
|
SYSCTRL::MonitorDigitalInputSignalRegister monitor_startup;
|
||||||
|
SYSRestartStatusRegister status;
|
||||||
|
SYSRestartRegisters():
|
||||||
|
counter_timer(FP_ZERO),
|
||||||
|
counter_timer_selfclear_attempts(FP_ZERO),
|
||||||
|
counter_attempts(0),
|
||||||
|
status_fault_register(),
|
||||||
|
monitor_fault(),
|
||||||
|
monitor_resetfault(),
|
||||||
|
monitor_startup(),
|
||||||
|
status()
|
||||||
|
{}
|
||||||
|
};//SYSRestartRegisters
|
||||||
|
|
||||||
|
struct SYSRestartConfiguration
|
||||||
|
{
|
||||||
|
SYSRestartEnableRegister restart_enable;
|
||||||
|
float period_timer_hold_fault;
|
||||||
|
float period_timer_reset;
|
||||||
|
float period_timer_hold_stop;
|
||||||
|
float period_timer_turnon_switch;
|
||||||
|
float period_timer_startup;
|
||||||
|
float period_timer_selfclear_attempts;
|
||||||
|
uint16_t attempts;
|
||||||
|
SYSCTRL::SystemFaultsRegister enable;
|
||||||
|
SYSRestartConfiguration():
|
||||||
|
restart_enable(),
|
||||||
|
period_timer_hold_fault(-1.0),
|
||||||
|
period_timer_reset(-1.0),
|
||||||
|
period_timer_hold_stop(-1.0),
|
||||||
|
period_timer_turnon_switch(-1.0),
|
||||||
|
period_timer_startup(-1.0),
|
||||||
|
period_timer_selfclear_attempts(-1.0),
|
||||||
|
attempts(0),
|
||||||
|
enable()
|
||||||
|
{}
|
||||||
|
};//SYSRestartConfiguration
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct SYSRestartStateBitField
|
||||||
|
{
|
||||||
|
uint16_t free : 1; // bit 0
|
||||||
|
uint16_t holdfault : 1; // bit 1
|
||||||
|
uint16_t resetfault : 1; // bit 2
|
||||||
|
uint16_t holdstop : 1; // bit 3
|
||||||
|
uint16_t turnonq1 : 1; // bit 4
|
||||||
|
uint16_t turnonkm1 : 1; // bit 5
|
||||||
|
uint16_t turnonkm3 : 1; // bit 6
|
||||||
|
uint16_t startup : 1; // bit 7
|
||||||
|
uint16_t freezefault: 1; // bit 8
|
||||||
|
uint16_t empty : 1; // bit 9
|
||||||
|
//
|
||||||
|
};//SYSRestartStateBitField
|
||||||
|
|
||||||
|
union SYSRestartStateRegister
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
SYSRestartStateBitField signal;
|
||||||
|
SYSRestartStateRegister():
|
||||||
|
all(0)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class SYSRestart
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL};
|
||||||
|
enum state_t {FREE, HOLDFAULT, RESETFAULT, HOLDSTOP, TURNONQ1, TURNONKM1, TURNONKM3, STARTUP, FREEZEFAULT, EMPTY};
|
||||||
|
private:
|
||||||
|
SYSCTRL::SystemEnvironment& m_env;
|
||||||
|
private:
|
||||||
|
mode_t m_mode;
|
||||||
|
state_t m_state;
|
||||||
|
SYSRestartStateRegister m_state_bit_field;
|
||||||
|
// Setup parameters
|
||||||
|
float m_time_sample;
|
||||||
|
// Configuration parameters
|
||||||
|
SYSCTRL::SYSRestartConfiguration m_config;
|
||||||
|
//
|
||||||
|
SYSCTRL::SYSRestartRegisters m_registers;
|
||||||
|
public:
|
||||||
|
SYSRestartStatusRegister status;
|
||||||
|
public:
|
||||||
|
SYSRestart(SYSCTRL::SystemEnvironment& m_env);
|
||||||
|
void setup(float time_sample);
|
||||||
|
void configure(SYSRestartConfiguration& config);
|
||||||
|
public:
|
||||||
|
mode_t get_mode();
|
||||||
|
state_t get_state();
|
||||||
|
uint16_t get_state_steps();
|
||||||
|
uint16_t get_attempts();
|
||||||
|
bool compare(mode_t mode);
|
||||||
|
bool compare_state(state_t state);
|
||||||
|
public:
|
||||||
|
void execute();
|
||||||
|
private:
|
||||||
|
void (SYSRestart::*_execute)();
|
||||||
|
void _execute_undef();
|
||||||
|
void _execute_operational();
|
||||||
|
private:
|
||||||
|
inline void _set_state_empty();
|
||||||
|
inline void _set_state_free();
|
||||||
|
inline void _set_state_holdfault();
|
||||||
|
inline void _set_state_resetfault();
|
||||||
|
inline void _set_state_freezefault();
|
||||||
|
inline void _set_state_holdstop();
|
||||||
|
inline void _set_state_turnon_q1();
|
||||||
|
inline void _set_state_turnon_km1();
|
||||||
|
inline void _set_state_turnon_km3();
|
||||||
|
inline void _set_state_startup();
|
||||||
|
private:
|
||||||
|
void _state_execute();
|
||||||
|
void (SYSRestart::*_state_run)();
|
||||||
|
void _state_empty();
|
||||||
|
void _state_free();
|
||||||
|
void _state_holdfault();
|
||||||
|
void _state_resetfault();
|
||||||
|
void _state_freezefault();
|
||||||
|
void _state_holdstop();
|
||||||
|
void _state_turnon_q1();
|
||||||
|
void _state_turnon_km1();
|
||||||
|
void _state_turnon_km3();
|
||||||
|
void _state_startup();
|
||||||
|
//
|
||||||
|
};// SYSRestart
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_SYSRESTART_H_ */
|
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* ScaleCompute.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/ScaleCompute.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
//CONSTRUCTOR
|
||||||
|
ScaleCompute::ScaleCompute(float& phase_a, float& phase_b, float& phase_c, float& scale_a, float& scale_b, float& scale_c):
|
||||||
|
m_command(),
|
||||||
|
m_enable(),
|
||||||
|
//
|
||||||
|
m_reference_value(FP_ZERO),
|
||||||
|
//
|
||||||
|
m_p_phase_a(phase_a),
|
||||||
|
m_p_phase_b(phase_b),
|
||||||
|
m_p_phase_c(phase_c),
|
||||||
|
//
|
||||||
|
m_p_scale_a(scale_a),
|
||||||
|
m_p_scale_b(scale_b),
|
||||||
|
m_p_scale_c(scale_c),
|
||||||
|
//
|
||||||
|
m_value_phase_a(FP_ZERO),
|
||||||
|
m_value_phase_b(FP_ZERO),
|
||||||
|
m_value_phase_c(FP_ZERO),
|
||||||
|
//
|
||||||
|
m_scale_phase_a(FP_ZERO),
|
||||||
|
m_scale_phase_b(FP_ZERO),
|
||||||
|
m_scale_phase_c(FP_ZERO)
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void ScaleCompute::set_reference(float reference)
|
||||||
|
{
|
||||||
|
m_reference_value = reference;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void ScaleCompute::set_enable()
|
||||||
|
{
|
||||||
|
m_enable.bit.enable = 1;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void ScaleCompute::clear_enable()
|
||||||
|
{
|
||||||
|
m_enable.bit.enable = 0;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void ScaleCompute::fix()
|
||||||
|
{
|
||||||
|
if(m_enable.bit.enable == 1)
|
||||||
|
{
|
||||||
|
m_value_phase_a = m_p_phase_a;
|
||||||
|
m_value_phase_b = m_p_phase_b;
|
||||||
|
m_value_phase_c = m_p_phase_c;
|
||||||
|
//
|
||||||
|
m_scale_phase_a = new_scale_compute(m_reference_value, m_value_phase_a, m_p_scale_a);
|
||||||
|
m_scale_phase_b = new_scale_compute(m_reference_value, m_value_phase_b, m_p_scale_b);
|
||||||
|
m_scale_phase_c = new_scale_compute(m_reference_value, m_value_phase_c, m_p_scale_c);
|
||||||
|
//
|
||||||
|
m_p_scale_a = m_scale_phase_a;
|
||||||
|
m_p_scale_b = m_scale_phase_b;
|
||||||
|
m_p_scale_c = m_scale_phase_c;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
}//
|
||||||
|
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
inline float ScaleCompute::new_scale_compute(float ref, float value, float scale)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if((value != FP_ZERO) && (ref != FP_ZERO))
|
||||||
|
{
|
||||||
|
return ref * scale / value;
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return scale;
|
||||||
|
//
|
||||||
|
}//if else
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* ScaleCompute.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_SCALECOMPUTE_H_
|
||||||
|
#define SYSCTRL_SCALECOMPUTE_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
struct ScaleComputeEnableBit
|
||||||
|
{
|
||||||
|
uint16_t enable: 1;
|
||||||
|
};//ScaleComputeEnableBit
|
||||||
|
|
||||||
|
|
||||||
|
union ScaleComputeEnableRegister
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
ScaleComputeEnableBit bit;
|
||||||
|
};//ScaleComputeEnableRegister
|
||||||
|
|
||||||
|
|
||||||
|
struct ScaleComputeCommandBit
|
||||||
|
{
|
||||||
|
uint16_t start: 1;
|
||||||
|
};//ScaleComputeCommandBit
|
||||||
|
|
||||||
|
union ScaleComputeCommandRegister
|
||||||
|
{
|
||||||
|
uint16_t all;
|
||||||
|
ScaleComputeCommandBit bit;
|
||||||
|
};//ScaleComputeCommandRegister
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ScaleCompute
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
ScaleComputeCommandRegister m_command;
|
||||||
|
ScaleComputeEnableRegister m_enable;
|
||||||
|
float m_reference_value;
|
||||||
|
//
|
||||||
|
float& m_p_phase_a;
|
||||||
|
float& m_p_phase_b;
|
||||||
|
float& m_p_phase_c;
|
||||||
|
//
|
||||||
|
float& m_p_scale_a;
|
||||||
|
float& m_p_scale_b;
|
||||||
|
float& m_p_scale_c;
|
||||||
|
//
|
||||||
|
float m_value_phase_a;
|
||||||
|
float m_value_phase_b;
|
||||||
|
float m_value_phase_c;
|
||||||
|
//
|
||||||
|
float m_scale_phase_a;
|
||||||
|
float m_scale_phase_b;
|
||||||
|
float m_scale_phase_c;
|
||||||
|
public:
|
||||||
|
ScaleCompute(float& phase_a, float& phase_b, float& phase_c, float& scale_a, float& scale_b, float& scale_c);
|
||||||
|
void set_reference(float reference);
|
||||||
|
void set_enable();
|
||||||
|
void clear_enable();
|
||||||
|
void fix();
|
||||||
|
private:
|
||||||
|
inline float new_scale_compute(float ref, float value, float scale);
|
||||||
|
//
|
||||||
|
};//class ScaleCompute
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_SCALECOMPUTE_H_ */
|
@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* SignalDecompose.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/SignalDecompose.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
SignalDecompose::SignalDecompose():
|
||||||
|
m_time_sample(-1.0),
|
||||||
|
m_projection_active(),
|
||||||
|
m_projection_reactive(),
|
||||||
|
m_projection_filter_active(),
|
||||||
|
m_projection_filter_reactive(),
|
||||||
|
_execute(&SYSCTRL::SignalDecompose::_execute_undef)
|
||||||
|
//
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
|
||||||
|
void SignalDecompose::setup(float time_sample)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_time_sample = time_sample;
|
||||||
|
m_projection_filter_active.setup(m_time_sample);
|
||||||
|
m_projection_filter_reactive.setup(m_time_sample);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void SignalDecompose::configure(const SignalDecomposeConfiguration& config)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_projection_filter_active.configure(config.projection_filter);
|
||||||
|
m_projection_filter_reactive.configure(config.projection_filter);
|
||||||
|
//
|
||||||
|
if((m_time_sample > FP_ZERO) && (config.projection_filter.time > m_time_sample))
|
||||||
|
{
|
||||||
|
_execute = &SYSCTRL::SignalDecompose::_execute_operational;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SignalDecompose::reset()
|
||||||
|
{
|
||||||
|
m_projection_active = FP_ZERO;
|
||||||
|
m_projection_reactive = FP_ZERO;
|
||||||
|
m_projection_filter_active.reset();
|
||||||
|
m_projection_filter_reactive.reset();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SignalDecompose::get_outputs(float& projection_active, float& projection_reactive)
|
||||||
|
{
|
||||||
|
projection_active = m_projection_active;
|
||||||
|
projection_reactive = m_projection_reactive;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SignalDecompose::execute(float reference, float ort_cos, float ort_sin)
|
||||||
|
{
|
||||||
|
(this->*_execute)(reference, ort_cos, ort_sin);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void SignalDecompose::_execute_undef(float reference, float ort_cos, float ort_sin)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SignalDecompose::_execute_operational(float reference, float ort_cos, float ort_sin)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
m_projection_active = m_projection_filter_active.execute(1.4142 * reference * ort_cos);
|
||||||
|
//
|
||||||
|
m_projection_reactive = m_projection_filter_reactive.execute(-(1.4142 * reference * ort_sin));
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* SignalDecompose.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "SYSCTRL/BaseComponent.h"
|
||||||
|
#include "SYSCTRL/HeadersFLTSYSLIB.h"
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_SIGNALDECOMPOSE_H_
|
||||||
|
#define SYSCTRL_SIGNALDECOMPOSE_H_
|
||||||
|
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
struct SignalDecomposeStructure
|
||||||
|
{
|
||||||
|
float projection_active;
|
||||||
|
float projection_reactive;
|
||||||
|
void reset()
|
||||||
|
{
|
||||||
|
projection_active = FP_ZERO;
|
||||||
|
projection_reactive = FP_ZERO;
|
||||||
|
}
|
||||||
|
SignalDecomposeStructure():
|
||||||
|
projection_active(FP_ZERO),
|
||||||
|
projection_reactive(FP_ZERO)
|
||||||
|
{}
|
||||||
|
};//
|
||||||
|
|
||||||
|
struct SignalDecomposeConfiguration
|
||||||
|
{
|
||||||
|
FLTSYSLIB::FilterForthConfiguration projection_filter;
|
||||||
|
SignalDecomposeConfiguration():
|
||||||
|
projection_filter()
|
||||||
|
{}
|
||||||
|
};//SignalDecomposeConfiguration
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class SignalDecompose
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
float m_time_sample;
|
||||||
|
private:
|
||||||
|
float m_projection_active;
|
||||||
|
float m_projection_reactive;
|
||||||
|
FLTSYSLIB::FilterForth m_projection_filter_active;
|
||||||
|
FLTSYSLIB::FilterForth m_projection_filter_reactive;
|
||||||
|
public:
|
||||||
|
SignalDecompose();
|
||||||
|
void setup(float time_sample);
|
||||||
|
void configure(const SignalDecomposeConfiguration& config);
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
void get_outputs(float& projection_active, float& projection_reactive);
|
||||||
|
public:
|
||||||
|
void execute(float reference, float ort_cos, float ort_sin);
|
||||||
|
private:
|
||||||
|
void (SignalDecompose::*_execute)(float reference, float ort_cos, float ort_sin);
|
||||||
|
void _execute_undef(float reference, float ort_cos, float ort_sin);
|
||||||
|
void _execute_operational(float reference, float ort_cos, float ort_sin);
|
||||||
|
//
|
||||||
|
};//SignalDecompose
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_SIGNALDECOMPOSE_H_ */
|
@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* RelativeSignal.cpp
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SYSCTRL/SignalRelative.h"
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
//CONSTRUCTOR
|
||||||
|
SignalRelative::SignalRelative():
|
||||||
|
BaseComponent(),
|
||||||
|
m_amplitude(FP_ZERO),
|
||||||
|
m_relative(FP_ZERO),
|
||||||
|
m_limit_relative_high(FP_ZERO),
|
||||||
|
m_limit_relative_low(FP_ZERO),
|
||||||
|
m_minimal_amplitude_level(FP_ZERO),
|
||||||
|
m_ampl_filter(),
|
||||||
|
_execute(&SYSCTRL::SignalRelative::_execute_undef)
|
||||||
|
{}//CONSTRUCTOR
|
||||||
|
//
|
||||||
|
void SignalRelative::setup(const SignalRelativeSetup& setup)
|
||||||
|
{
|
||||||
|
static bool status = true;
|
||||||
|
|
||||||
|
if(m_mode == SYSCTRL::SignalRelative::UNDEFINED)
|
||||||
|
{
|
||||||
|
m_time_sample = setup.time_sample;
|
||||||
|
m_ampl_filter.setup(m_time_sample);
|
||||||
|
|
||||||
|
status &= m_time_sample > FP_ZERO ? true : false;
|
||||||
|
status &= m_ampl_filter.compare(FLTSYSLIB::AMPL::CONFIGURATE);
|
||||||
|
|
||||||
|
if(status)
|
||||||
|
{
|
||||||
|
m_mode = SYSCTRL::SignalRelative::CONFIGURATE;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
void SignalRelative::configure(const SignalRelativeConfiguration& config)
|
||||||
|
{
|
||||||
|
static bool status = true;
|
||||||
|
|
||||||
|
if(m_mode == SYSCTRL::SignalRelative::CONFIGURATE)
|
||||||
|
{
|
||||||
|
m_limit_relative_high = config.limit_relative_high;
|
||||||
|
m_limit_relative_low = config.limit_relative_low;
|
||||||
|
m_minimal_amplitude_level = config.minimal_amplitude_level;
|
||||||
|
m_ampl_filter.configure(config.amplitude_filter);
|
||||||
|
|
||||||
|
status &= m_limit_relative_high > m_limit_relative_low ? true : false;
|
||||||
|
status &= m_minimal_amplitude_level > FP_ZERO ? true : false;
|
||||||
|
status &= m_ampl_filter.compare(FLTSYSLIB::AMPL::OPERATIONAL);
|
||||||
|
|
||||||
|
if(status)
|
||||||
|
{
|
||||||
|
m_mode = SYSCTRL::SignalRelative::OPERATIONAL;
|
||||||
|
_execute = &SYSCTRL::SignalRelative::_execute_operational;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SignalRelative::reset()
|
||||||
|
{
|
||||||
|
m_amplitude = FP_ZERO;
|
||||||
|
m_relative = FP_ZERO;
|
||||||
|
m_ampl_filter.reset();
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SignalRelative::get_outputs(float& amplitude, float& relative)
|
||||||
|
{
|
||||||
|
amplitude = m_amplitude;
|
||||||
|
relative = m_relative;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SignalRelative::execute(float reference)
|
||||||
|
{
|
||||||
|
(this->*_execute)(reference);
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SignalRelative::_execute_undef(float reference)
|
||||||
|
{}//
|
||||||
|
//
|
||||||
|
#pragma CODE_SECTION("ramfuncs");
|
||||||
|
void SignalRelative::_execute_operational(float reference)
|
||||||
|
{
|
||||||
|
static float _relative = FP_ZERO;
|
||||||
|
m_amplitude = m_ampl_filter.execute(reference);
|
||||||
|
|
||||||
|
if(m_amplitude > m_minimal_amplitude_level)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
_relative = reference / m_amplitude;
|
||||||
|
//
|
||||||
|
if(_relative > m_limit_relative_high)
|
||||||
|
{
|
||||||
|
_relative = m_limit_relative_high;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
if(_relative < m_limit_relative_low)
|
||||||
|
{
|
||||||
|
_relative = m_limit_relative_low;
|
||||||
|
//
|
||||||
|
}//if
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_relative = FP_ZERO;
|
||||||
|
//
|
||||||
|
}// if else
|
||||||
|
//
|
||||||
|
m_relative = _relative;
|
||||||
|
//
|
||||||
|
}//
|
||||||
|
//
|
||||||
|
} /* namespace SYSCTRL */
|
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* RelativeSignal.h
|
||||||
|
*
|
||||||
|
* Author: Aleksey Gerasimenko
|
||||||
|
* gerasimenko.aleksey.n@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "SYSCTRL/BaseComponent.h"
|
||||||
|
#include "SYSCTRL/HeadersFLTSYSLIB.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SYSCTRL_RELATIVESIGNAL_H_
|
||||||
|
#define SYSCTRL_RELATIVESIGNAL_H_
|
||||||
|
|
||||||
|
namespace SYSCTRL
|
||||||
|
{
|
||||||
|
|
||||||
|
struct SignalRelativeSetup
|
||||||
|
{
|
||||||
|
float time_sample;
|
||||||
|
SignalRelativeSetup():
|
||||||
|
time_sample(-1.0)
|
||||||
|
{}
|
||||||
|
};//SignalRelativeSetup
|
||||||
|
|
||||||
|
|
||||||
|
struct SignalRelativeConfiguration
|
||||||
|
{
|
||||||
|
float limit_relative_high;
|
||||||
|
float limit_relative_low;
|
||||||
|
float minimal_amplitude_level;
|
||||||
|
FLTSYSLIB::AMPLF4OConfiguration amplitude_filter;
|
||||||
|
SignalRelativeConfiguration():
|
||||||
|
limit_relative_high(1.0),
|
||||||
|
limit_relative_low(-1.0),
|
||||||
|
minimal_amplitude_level(0.1),
|
||||||
|
amplitude_filter()
|
||||||
|
{}
|
||||||
|
};//SignalRelativeConfiguration
|
||||||
|
|
||||||
|
class SignalRelative: public BaseComponent
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
float m_amplitude;
|
||||||
|
float m_relative;
|
||||||
|
private:
|
||||||
|
float m_limit_relative_high;
|
||||||
|
float m_limit_relative_low;
|
||||||
|
float m_minimal_amplitude_level;
|
||||||
|
private:
|
||||||
|
FLTSYSLIB::AMPLF4O m_ampl_filter;
|
||||||
|
public:
|
||||||
|
SignalRelative();
|
||||||
|
void setup(const SignalRelativeSetup& setup);
|
||||||
|
void configure(const SignalRelativeConfiguration& config);
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
void get_outputs(float& amplitude, float& relative);
|
||||||
|
public:
|
||||||
|
void execute(float reference);
|
||||||
|
private:
|
||||||
|
void (SignalRelative::*_execute)(float reference);
|
||||||
|
void _execute_undef(float reference);
|
||||||
|
void _execute_operational(float reference);
|
||||||
|
//
|
||||||
|
};//RelativeSignal
|
||||||
|
|
||||||
|
} /* namespace SYSCTRL */
|
||||||
|
|
||||||
|
#endif /* SYSCTRL_RELATIVESIGNAL_H_ */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue