├── .gitignore ├── Bladed_NREL5MW_model ├── NREL_5MW_CPC.prj ├── NREL_5MW_CPC.prx └── wind012.wnd ├── LICENSE ├── README.md ├── Simulink_32bit ├── BlankCntrlr_SimulinkSetupAndBuild.m ├── BlankCntrlr_model.mdl ├── DISCONtmf_LINUX │ └── discon.tmf ├── DISCONtmf_PC │ └── discon.tmf ├── README.txt ├── discon.tlc ├── discon_main.c └── setup_mssdk71.bat └── Simulink_64bit ├── DISCON_Empty.slx ├── DISCON_NREL5MW.slx ├── Parameters_NREL5MW.mat ├── discon.tlc ├── discon_main.c └── discon_vc.tmf /.gitignore: -------------------------------------------------------------------------------- 1 | slprj -------------------------------------------------------------------------------- /Bladed_NREL5MW_model/NREL_5MW_CPC.prj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 0.2 4 | 5 | 1172 | 1173 | 1174 | Position 1175 | false 1176 | 1177 | 1178 | cdecl 1179 | 1180 | Continuous 1181 | 0 1182 | 1183 | false 1184 | 1185 | true 1186 | -0.13962632270625383 1187 | 0.13962632270625383 1188 | false 1189 | 0 1190 | 0 1191 | 1192 | 1193 | 188.49543355168146 1194 | 0.02 1195 | 1196 | 1197 | 0.3 1198 | 1199 | false 1200 | 1201 | 0 1202 | 0 1203 | 1204 | false 1205 | 1206 | 0 1207 | 0 1208 | 1209 | 0 1210 | false 1211 | 1212 | false 1213 | 0 1214 | 0 1215 | 0 1216 | 0 1217 | 0 1218 | 1219 | 1220 | 1221 | 1222 | 0 1223 | 0 1224 | 1225 | 1226 | false 1227 | false 1228 | false 1229 | false 1230 | 1231 | 1232 | false 1233 | 1234 | Constant 1235 | 0 1236 | 1237 | 1238 | 1239 | 1240 | 1241 | false 1242 | 1243 | 0 1244 | 0 1245 | {{0} {0}} 1246 | 1247 | 1248 | 1249 | 1250 | -------------------------------------------------------------------------------- /Bladed_NREL5MW_model/wind012.wnd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TUDelft-DataDrivenControl/DISCON_Simulink/daa4d1f5667ac145cbdcb7333946c860d7f5ea37/Bladed_NREL5MW_model/wind012.wnd -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Delft Center for Systems & Control, Data-Driven Control (TU Delft) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # External Controller design for GH Bladed and OpenFAST (Bladed interface) 2 | 3 | ## Contents 4 | 5 | ### Folder -- Bladed_NREL5MW_model: 6 | - NREL_5MW_CPC.prj/prx GH Bladed project of a 5MW turbine 7 | - wind012.wnd Sample 12 m/s turbulent wind file (Bladed) 8 | 9 | ### Folder -- Simulink_32bit: 10 | Refer to README.txt file in the folder (Credits and thanks to J. Butterworth, Envision Energy) 11 | 12 | ### Folder -- Simulink_64bit: 13 | - DISCON_Empty.slx Empty controller file, including all available inputs and outputs 14 | - DISCON_NREL5MW.slx Baseline NREL5MW controller for use with Bladed or OpenFAST 15 | - Parameters_NREL5MW.mat Parameters needed for compilation of the controller 16 | - discon.c C file (needed for the generation of DISCON.DLL from a Simulink model) 17 | - discon.tlc TLC file (needed for the generation of DISCON.DLL from a Simulink model) 18 | - discon_vc.tmf TMF file (needed for the generation of DISCON.DLL from a Simulink model) 19 | 20 | ## Requirements (for 64-bit DLL/SO compilation): 21 | 1. GH Bladed 22 | 2. MATLAB / Simulink, tested with 2018b, but might also work with other versions 23 | 3. Microsoft Visual Studio 2005/2008/2010 24 | 25 | ## Compiling DISCON DLL 32-bit: 26 | 1a. For 32-bit DLL compilation, install Windows Windows SDK 7.1, and see further instructions in the "Simulink_32bit\README.txt" file: 27 | https://nl.mathworks.com/matlabcentral/answers/101105-how-do-i-install-microsoft-windows-sdk-7-1 28 | 29 | ## Compiling DISCON DLL 64-bit: 30 | 1. For 64-bit compilation, download the latest 64-bit MATLAB version (tested with 2018b) and install the MinGW compiler: 31 | https://nl.mathworks.com/support/compilers.html 32 | 2. Open MATLAB and load the Parameters_NREL5MW.mat in your current workspace 33 | 3. Change your current folder to the .\Simulink_files folder 34 | 4. Open DISCON_xxx.slx in Simulink 35 | 5. Press CTRL-B to build a DLL 36 | 37 | Note: When compiling a 32-bit DISCON DLL, you can use the DLL with Bladed and a 32-bit version of OpenFAST (fast_win32.exe). When you use a 64-bit version of MATLAB, the compiled DLL will also be 64-bit, which is incompatible with Bladed, but compatible with 64-bit OpenFAST (openfast_x64.exe). 38 | 39 | Comments: 40 | 1. Do not change the names of the inputs and outputs blocks in DISCON_xxx.slx 41 | 2. Do not change the name DISCON_xxx.slx to DISCON.slx (all other names are allowed) 42 | 43 | ## Referencing 44 | When you use DISCON_Simulink in any publication, please cite the following paper: 45 | * Mulders, S.P. and Zaaijer, M.B. and Bos, R. and van Wingerden, J.W. "Wind turbine control: open-source software for control education, standardization and compilation". Journal of Physics: Conference Series. Vol. 1452. No. 1. IOP Publishing, 2020. [Link to the paper](https://iopscience.iop.org/article/10.1088/1742-6596/1452/1/012010) 46 | 47 | ## References 48 | Sebastiaan Mulders 49 | S.P.Mulders@tudelft.nl 50 | Delft Center of Systems and Control 51 | Delft University of Technology 52 | 53 | Credits to: 54 | 55 | Ivo Houtzager 56 | Delft Center of Systems and Control 57 | Delft University of Technology 58 | 59 | Jeffrey Butterworth, Ph.D. (Support in making 32 bit compilation possible with a 64 bit MATLAB) 60 | Envision Energy 61 | 1919 14th Street, Suite 800 62 | Boulder, CO 80302 63 | -------------------------------------------------------------------------------- /Simulink_32bit/BlankCntrlr_SimulinkSetupAndBuild.m: -------------------------------------------------------------------------------- 1 | 2 | close all, clear, clc; 3 | 4 | 5 | 6 | % This simple script aligns the path to the model ... and then 7 | % generates code from the Simulink model and builds the DLL or SO. 8 | 9 | SmlkMdl = 'BlankCntrlr_model'; 10 | 11 | 12 | Ts = 0.01; % Sec 13 | 14 | open(SmlkMdl) 15 | 16 | % Building the DLL (Windows) or SO (Linux) 17 | % ================================================== 18 | if ispc % WINDOWS DLL Build (32-bit DLL from 32 or 64 bit Matlab) 19 | % Copy the discon.tmf file from DISCONtmf_PC and put it in your build 20 | % directory (with discon_main.c, discon.tlc, etc.). This will 21 | % provide the details needed to build a DLL (rather than an SO). 22 | if strcmp(computer('arch'),'win64') % 64-bit Matlab installation. 23 | % Build DLL in two-step process that supports creating 32-bit DLL creation 24 | % from a 64-bit installation of Matlab (R2017a). 25 | % Note: Using 'Microsoft Windows SDK 7.1 (C)' for C language compilation. 26 | % Set compiler with 'mex -setup' 27 | % Two-step process: 28 | % 1) Generate code-only from Simulink model 29 | % 2) Replace resulting R2017a(64bit) setup_mssdk71.bat with R2013b(32bit) 30 | % setup_mssdk71.bat file and finish building the DLL. 31 | sprintf('32-bit DLL build with 64-bit Matlab installation.../n') 32 | codegenfolder = sprintf('%s_discon_rtw',SmlkMdl); 33 | R2013bSDKSetup = fullfile(pwd,'setup_mssdk71.bat'); % Path to the R2013b setup_mssdk71.bat (saved in git). 34 | load_system(SmlkMdl); 35 | set_param(SmlkMdl, 'GenCodeOnly', true); 36 | slbuild(SmlkMdl); 37 | cd(codegenfolder); 38 | delete('setup_mssdk71.bat'); 39 | copyfile(R2013bSDKSetup); 40 | system([SmlkMdl '.bat']); 41 | cd('../'); 42 | else % 32-bit Matlab installation. 43 | % If using 32-bit installation of Matlab, can simply generate code and 44 | % build DLL directly from the Simulink model (Ctrl-B) in the same way that 45 | % a *.so is built in Linux. Or with the following commands... 46 | sprintf('32-bit DLL build with 32-bit Matlab installation.../n') 47 | load_system(SmlkMdl); 48 | slbuild(SmlkMdl); 49 | codegenfolder = sprintf('%s_discon_rtw',SmlkMdl); 50 | cd(codegenfolder); 51 | system([SmlkMdl '.bat']); 52 | cd('../'); 53 | end 54 | else % LINUX SO Build (64-bit DLL from 64-bit Matlab) 55 | % Copy the discon.tmf file from DISCONtmf_LINUX and put it in your build 56 | % directory (with discon_main.c, discon.tlc, etc.). This will provide 57 | % the details needed to build an SO (rather than a DLL). 58 | % Open the model and uncheck "generate code only" in the "code generation 59 | % tab" of "model configuration parameters". I'm still looking for a way 60 | % to automate this in the same way as the WINDOWS version. 61 | % If using 64-bit installation of Matlab, can simply generate code and 62 | % build SO directly from the Simulink model (Ctrl-B), 63 | % or with the following commands... 64 | sprintf('64-bit SO build with 64-bit Matlab installation.../n') 65 | load_system(SmlkMdl); 66 | slbuild(SmlkMdl); 67 | end 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /Simulink_32bit/DISCONtmf_LINUX/discon.tmf: -------------------------------------------------------------------------------- 1 | # Copyright 1994-2016 The MathWorks, Inc. 2 | # 3 | # File : grt_unix.tmf 4 | # 5 | # Abstract: 6 | # Template makefile for building a UNIX-based stand-alone generic 7 | # real-time version of Simulink model using generated C code. 8 | # 9 | # This makefile attempts to conform to the guidelines specified in the 10 | # IEEE Std 1003.2-1992 (POSIX) standard. It is designed to be used 11 | # with GNU Make which is located in matlabroot/rtw/bin. 12 | # 13 | # Note that this template is automatically customized by the build 14 | # procedure to create ".mk" 15 | # 16 | # The following defines can be used to modify the behavior of the 17 | # build: 18 | # OPT_OPTS - Optimization options. Default is -O. 19 | # CPP_OPTS - C++ compiler options. 20 | # OPTS - User specific compile options. 21 | # USER_SRCS - Additional user sources, such as files needed by 22 | # S-functions. 23 | # USER_INCLUDES - Additional include paths 24 | # (i.e. USER_INCLUDES="-Iwhere-ever -Iwhere-ever2") 25 | # 26 | # To enable debugging: 27 | # set DEBUG_BUILD = 1 below, which will trigger OPTS=-g and 28 | # LDFLAGS += -g (may vary with compiler version, see compiler doc) 29 | # 30 | # This template makefile is designed to be used with a system target 31 | # file that contains 'rtwgensettings.BuildDirSuffix' see grt.tlc 32 | 33 | #------------------------ Macros read by make_rtw ------------------------------ 34 | # 35 | # The following macros are read by the build procedure: 36 | # 37 | # MAKECMD - This is the command used to invoke the make utility 38 | # HOST - What platform this template makefile is targeted for 39 | # (i.e. PC or UNIX) 40 | # BUILD - Invoke make from the build procedure (yes/no)? 41 | # SYS_TARGET_FILE - Name of system target file. 42 | 43 | MAKECMD = |>MATLAB_BIN<|/|>ARCH<|/gmake 44 | HOST = UNIX 45 | BUILD = yes 46 | SYS_TARGET_FILE = discon.tlc 47 | COMPILER_TOOL_CHAIN = unix 48 | 49 | 50 | #---------------------- Tokens expanded by make_rtw ---------------------------- 51 | # 52 | # The following tokens, when wrapped with "|>" and "<|" are expanded by the 53 | # build procedure. 54 | # 55 | # MODEL_NAME - Name of the Simulink block diagram 56 | # MODEL_MODULES - Any additional generated source modules 57 | # MAKEFILE_NAME - Name of makefile created from template makefile .mk 58 | # MATLAB_ROOT - Path to where MATLAB is installed. 59 | # S_FUNCTIONS - List of S-functions. 60 | # S_FUNCTIONS_LIB - List of S-functions libraries to link. 61 | # NUMST - Number of sample times 62 | # TID01EQ - yes (1) or no (0): Are sampling rates of continuous task 63 | # (tid=0) and 1st discrete task equal. 64 | # NCSTATES - Number of continuous states 65 | # COMPUTER - Computer type. See the MATLAB computer command. 66 | # BUILDARGS - Options passed in at the command line. 67 | # MULTITASKING - yes (1) or no (0): Is solver mode multitasking 68 | # MAT_FILE - yes (1) or no (0): Should mat file logging be done 69 | # EXT_MODE - yes (1) or no (0): Build for external mode 70 | # TMW_EXTMODE_TESTING - yes (1) or no (0): Build ext_test.c for external mode 71 | # testing. 72 | # EXTMODE_TRANSPORT - Index of transport mechanism (e.g. tcpip, serial) for extmode 73 | # EXTMODE_STATIC - yes (1) or no (0): Use static instead of dynamic mem alloc. 74 | # EXTMODE_STATIC_SIZE - Size of static memory allocation buffer. 75 | # GEN_MDLREF_SFCN - (1/0): are we generating model reference wrapper s-function 76 | # TGT_FCN_LIB - Target Funtion library to use 77 | # MODELREFS - List of referenced models 78 | 79 | MODEL = |>MODEL_NAME<| 80 | MODULES = |>MODEL_MODULES<| 81 | MAKEFILE = |>MAKEFILE_NAME<| 82 | MATLAB_ROOT = |>MATLAB_ROOT<| 83 | ALT_MATLAB_ROOT = |>ALT_MATLAB_ROOT<| 84 | MATLAB_BIN = |>MATLAB_BIN<| 85 | MASTER_ANCHOR_DIR = |>MASTER_ANCHOR_DIR<| 86 | START_DIR = |>START_DIR<| 87 | S_FUNCTIONS = |>S_FUNCTIONS<| 88 | S_FUNCTIONS_LIB = |>S_FUNCTIONS_LIB<| 89 | NUMST = |>NUMST<| 90 | TID01EQ = |>TID01EQ<| 91 | NCSTATES = |>NCSTATES<| 92 | COMPUTER = |>COMPUTER<| 93 | BUILDARGS = |>BUILDARGS<| 94 | MULTITASKING = |>MULTITASKING<| 95 | MAT_FILE = |>MAT_FILE<| 96 | EXT_MODE = |>EXT_MODE<| 97 | TMW_EXTMODE_TESTING = |>TMW_EXTMODE_TESTING<| 98 | EXTMODE_TRANSPORT = |>EXTMODE_TRANSPORT<| 99 | EXTMODE_STATIC = |>EXTMODE_STATIC_ALLOC<| 100 | EXTMODE_STATIC_SIZE = |>EXTMODE_STATIC_ALLOC_SIZE<| 101 | MEXEXT = |>MEXEXT<| 102 | TGT_FCN_LIB = |>TGT_FCN_LIB<| 103 | MODELREFS = |>MODELREFS<| 104 | SHARED_SRC = |>SHARED_SRC<| 105 | SHARED_SRC_DIR = |>SHARED_SRC_DIR<| 106 | SHARED_BIN_DIR = |>SHARED_BIN_DIR<| 107 | SHARED_LIB = |>SHARED_LIB<| 108 | TARGET_LANG_EXT = |>TARGET_LANG_EXT<| 109 | OPTIMIZATION_FLAGS = |>OPTIMIZATION_FLAGS<| 110 | ADDITIONAL_LDFLAGS = |>ADDITIONAL_LDFLAGS<| 111 | DEFINES_CUSTOM = |>DEFINES_CUSTOM<| 112 | SYSTEM_LIBS = |>SYSTEM_LIBS<| 113 | CODE_INTERFACE_PACKAGING = |>CODE_INTERFACE_PACKAGING<| 114 | 115 | CLASSIC_INTERFACE = |>CLASSIC_INTERFACE<| 116 | # Optional for GRT 117 | ALLOCATIONFCN = |>GENERATE_ALLOC_FCN<| 118 | ONESTEPFCN = |>COMBINE_OUTPUT_UPDATE_FCNS<| 119 | TERMFCN = 1 120 | MULTI_INSTANCE_CODE = |>MULTI_INSTANCE_CODE<| 121 | 122 | # To enable debugging: 123 | # set DEBUG_BUILD = 1 124 | DEBUG_BUILD = 0 125 | 126 | #--------------------------- Model and reference models ----------------------- 127 | MODELLIB = |>MODELLIB<| 128 | MODELREF_LINK_LIBS = |>MODELREF_LINK_LIBS<| 129 | MODELREF_INC_PATH = |>START_MDLREFINC_EXPAND_INCLUDES<|-I|>MODELREF_INC_PATH<| |>END_MDLREFINC_EXPAND_INCLUDES<| 130 | RELATIVE_PATH_TO_ANCHOR = |>RELATIVE_PATH_TO_ANCHOR<| 131 | # NONE: standalone, SIM: modelref sim, RTW: modelref coder target 132 | MODELREF_TARGET_TYPE = |>MODELREF_TARGET_TYPE<| 133 | 134 | #-- In the case when directory name contains space --- 135 | ifneq ($(MATLAB_ROOT),$(ALT_MATLAB_ROOT)) 136 | MATLAB_ROOT := $(ALT_MATLAB_ROOT) 137 | endif 138 | 139 | #--------------------------- Tool Specifications ------------------------------- 140 | 141 | include $(MATLAB_ROOT)/rtw/c/tools/unixtools.mk 142 | 143 | #------------------------------ Include Path ----------------------------------- 144 | 145 | MATLAB_INCLUDES = \ 146 | -I$(MATLAB_ROOT)/simulink/include \ 147 | -I$(MATLAB_ROOT)/extern/include \ 148 | -I$(MATLAB_ROOT)/rtw/c/src \ 149 | -I$(MATLAB_ROOT)/rtw/c/src/ext_mode/common 150 | 151 | # Additional file include paths 152 | ADD_INCLUDES = \ 153 | |>START_EXPAND_INCLUDES<| -I|>EXPAND_DIR_NAME<| \ 154 | |>END_EXPAND_INCLUDES<| 155 | 156 | SHARED_INCLUDES = 157 | ifneq ($(SHARED_SRC_DIR),) 158 | SHARED_INCLUDES = -I$(SHARED_SRC_DIR) 159 | endif 160 | 161 | INCLUDES = -I. -I$(RELATIVE_PATH_TO_ANCHOR) $(MATLAB_INCLUDES) $(ADD_INCLUDES) $(USER_INCLUDES) \ 162 | $(INSTRUMENT_INCLUDES) $(MODELREF_INC_PATH) $(SHARED_INCLUDES) 163 | 164 | #----------------------------- External mode ----------------------------------- 165 | # Uncomment -DVERBOSE to have information printed to stdout 166 | # To add a new transport layer, see the comments in 167 | # /toolbox/simulink/simulink/extmode_transports.m 168 | ifeq ($(EXT_MODE),1) 169 | EXT_CC_OPTS = -DEXT_MODE -D$(COMPUTER) #-DVERBOSE 170 | EXT_LIB = 171 | EXT_SRC = ext_svr.c updown.c ext_work.c 172 | LINT_EXT_COMMON_SRC = 173 | LINT_EXT_TCPIP_SRC = 174 | ifeq ($(EXTMODE_TRANSPORT),0) #tcpip 175 | EXT_SRC += rtiostream_interface.c rtiostream_tcpip.c 176 | LINT_EXT_COMMON_SRC = ext_svr.c updown.c ext_work.c \ 177 | rtiostream_interface.c 178 | LINT_EXT_TCPIP_SRC = rtiostream_tcpip.c 179 | endif 180 | ifeq ($(EXTMODE_TRANSPORT),1) #serial 181 | EXT_SRC += ext_svr_serial_transport.c ext_serial_pkt.c 182 | EXT_SRC += rtiostream_serial_interface.c rtiostream_serial.c 183 | endif 184 | ifeq ($(TMW_EXTMODE_TESTING),1) 185 | EXT_SRC += ext_test.c 186 | EXT_CC_OPTS += -DTMW_EXTMODE_TESTING 187 | endif 188 | ifeq ($(EXTMODE_STATIC),1) 189 | EXT_SRC += mem_mgr.c 190 | LINT_EXT_COMMON_SRC += mem_mgr.c 191 | EXT_CC_OPTS += -DEXTMODE_STATIC -DEXTMODE_STATIC_SIZE=$(EXTMODE_STATIC_SIZE) 192 | endif 193 | ifeq ($(COMPUTER),SOL64) 194 | EXT_LIB = -lsocket -lnsl 195 | endif 196 | endif 197 | 198 | #----------------------------- Real-Time Model --------------------------------- 199 | RTM_CC_OPTS = -DUSE_RTMODEL 200 | 201 | #-------------------------------- C Flags -------------------------------------- 202 | 203 | # Optimization Options 204 | ifndef OPT_OPTS 205 | OPT_OPTS = $(DEFAULT_OPT_OPTS) 206 | endif 207 | 208 | # General User Options 209 | ifeq ($(DEBUG_BUILD),0) 210 | DBG_FLAG = 211 | else 212 | # Set OPTS=-g and any additional flags for debugging 213 | DBG_FLAG = -g 214 | LDFLAGS += -g 215 | endif 216 | 217 | LDFLAGS += -Wl,-rpath,"$(MATLAB_ROOT)/bin/$(ARCH)" -L"$(MATLAB_ROOT)/bin/$(ARCH)" 218 | # https://gcc.gnu.org/bugs/segfault.html 219 | # -g -rdynamic -O0 -v -Q -da 220 | 221 | # Compiler options, etc: 222 | ifneq ($(OPTIMIZATION_FLAGS),) 223 | CC_OPTS = $(OPTS) $(EXT_CC_OPTS) $(RTM_CC_OPTS) $(OPTIMIZATION_FLAGS) 224 | else 225 | CC_OPTS = $(OPT_OPTS) $(OPTS) $(EXT_CC_OPTS) $(RTM_CC_OPTS) 226 | endif 227 | 228 | 229 | CPP_REQ_DEFINES = -DMODEL=$(MODEL) -DRT -DNUMST=$(NUMST) \ 230 | -DTID01EQ=$(TID01EQ) -DNCSTATES=$(NCSTATES) -DUNIX \ 231 | -DMT=$(MULTITASKING) -DHAVESTDIO -DMAT_FILE=$(MAT_FILE) \ 232 | -DONESTEPFCN=$(ONESTEPFCN) -DTERMFCN=$(TERMFCN) \ 233 | -DMULTI_INSTANCE_CODE=$(MULTI_INSTANCE_CODE) \ 234 | -DCLASSIC_INTERFACE=$(CLASSIC_INTERFACE) \ 235 | -DALLOCATIONFCN=$(ALLOCATIONFCN) 236 | 237 | 238 | CFLAGS = $(ANSI_OPTS) $(DBG_FLAG) $(CC_OPTS) $(DEFINES_CUSTOM) $(CPP_REQ_DEFINES) $(INCLUDES) -std=c99 239 | # -Wall -Q -g 240 | # https://gcc.gnu.org/bugs/segfault.html 241 | CPPFLAGS = $(CPP_ANSI_OPTS) $(DBG_FLAG) $(CPP_OPTS) $(CC_OPTS) $(DEFINES_CUSTOM) $(CPP_REQ_DEFINES) $(INCLUDES) 242 | #-------------------------- Additional Libraries ------------------------------ 243 | 244 | SYSTEM_LIBS += $(EXT_LIB) -lm 245 | 246 | LIBS = 247 | |>START_PRECOMP_LIBRARIES<| 248 | ifeq ($(OPT_OPTS),$(DEFAULT_OPT_OPTS)) 249 | LIBS += |>EXPAND_LIBRARY_LOCATION<|/|>EXPAND_LIBRARY_NAME<|_std.a 250 | else 251 | LIBS += |>EXPAND_LIBRARY_NAME<|.a 252 | endif 253 | |>END_PRECOMP_LIBRARIES<| |>START_EXPAND_LIBRARIES<| 254 | LIBS += |>EXPAND_LIBRARY_NAME<|.a |>END_EXPAND_LIBRARIES<| 255 | LIBS += $(S_FUNCTIONS_LIB) $(INSTRUMENT_LIBS) 256 | 257 | #----------------------------- Source Files ------------------------------------ 258 | 259 | USER_SRCS = 260 | 261 | USER_OBJS = $(addsuffix .o, $(basename $(USER_SRCS))) 262 | LOCAL_USER_OBJS = $(notdir $(USER_OBJS)) 263 | 264 | 265 | 266 | SRCS = $(MODULES) $(S_FUNCTIONS) 267 | 268 | ifeq ($(MODELREF_TARGET_TYPE), NONE) 269 | # PRODUCT = $(RELATIVE_PATH_TO_ANCHOR)/$(MODEL) 270 | # PRODUCT = $(RELATIVE_PATH_TO_ANCHOR)/$(MODEL).so 271 | PRODUCT = $(RELATIVE_PATH_TO_ANCHOR)/DISCON.so 272 | BIN_SETTING = $(LD) -shared $(LDFLAGS) -o $(PRODUCT) 273 | BUILD_PRODUCT_TYPE = "executable" 274 | ifeq ($(CLASSIC_INTERFACE), 1) 275 | MAIN_SRC = discon_main.c 276 | OTHER_SRC = rt_sim.c 277 | else 278 | ifeq ($(MULTI_INSTANCE_CODE), 1) 279 | ifeq "$(CODE_INTERFACE_PACKAGING)" "C++ class" 280 | MAIN_SRC = rt_cppclass_main.cpp 281 | else 282 | MAIN_SRC = rt_malloc_main.c 283 | endif 284 | else 285 | MAIN_SRC = rt_main.c 286 | endif 287 | OTHER_SRC = 288 | endif 289 | SRCS += $(MODEL).$(TARGET_LANG_EXT) $(MAIN_SRC) $(OTHER_SRC) $(EXT_SRC) 290 | else 291 | # Model reference coder target 292 | PRODUCT = $(MODELLIB) 293 | BUILD_PRODUCT_TYPE = "library" 294 | endif 295 | 296 | OBJS = $(addsuffix .o, $(basename $(SRCS))) $(USER_OBJS) 297 | LINK_OBJS = $(addsuffix .o, $(basename $(SRCS))) $(LOCAL_USER_OBJS) 298 | 299 | SHARED_SRC := $(wildcard $(SHARED_SRC)) 300 | SHARED_OBJS_NO_PATH = $(addsuffix .o, $(basename $(notdir $(SHARED_SRC)))) 301 | SHARED_OBJS = $(addprefix $(join $(SHARED_BIN_DIR), /), $(SHARED_OBJS_NO_PATH)) 302 | 303 | ADDITIONAL_LDFLAGS += $(ARCH_SPECIFIC_LDFLAGS) 304 | 305 | #------------- Test Compile using gcc -Wall to look for warnings --------------- 306 | # 307 | # DO_GCC_TEST=1 runs gcc with compiler warning flags on all the source files 308 | # used in this build. This includes the generated code, and any user source 309 | # files needed for the build and placed in this directory. 310 | # 311 | # WARN_ON_GLNX=1 runs the linux compiler with warnings flags. On hand-written 312 | # code we use the max amount of flags availabe while on the generated code, a 313 | # few less. 314 | # 315 | # See rtw/c/tools/unixtools.mk for the definition of GCC_WARN_OPTS 316 | GCC_TEST_CMD := echo 317 | GCC_TEST_OUT := > /dev/null 318 | ifeq ($(DO_GCC_TEST), 1) 319 | GCC_TEST := gcc -c -o /dev/null $(GCC_WARN_OPTS_MAX) $(CPP_REQ_DEFINES) \ 320 | $(INCLUDES) 321 | GCC_TEST_CMD := echo; echo "\#\#\# GCC_TEST $(GCC_TEST) $<"; $(GCC_TEST) 322 | GCC_TEST_OUT := ; echo 323 | endif 324 | 325 | #----------------------------- Lint (sol2 only) -------------------------------- 326 | 327 | ifeq ($(CLASSIC_INTERFACE), 1) 328 | LINT_SRCS = discon_main.c \ 329 | $(MATLAB_ROOT)/rtw/c/src/rt_sim.c 330 | else 331 | ifeq "$(CODE_INTERFACE_PACKAGING)" "C++ class" 332 | LINT_SRCS = $(MATLAB_ROOT)/rtw/c/src/common/rt_cppclass_main.cpp 333 | else 334 | LINT_SRCS = $(MATLAB_ROOT)/rtw/c/src/common/rt_main.c 335 | endif 336 | endif 337 | ifneq ($(LINT_EXT_COMMON_SRC), ) 338 | LINT_SRCS += $(MATLAB_ROOT)/rtw/c/src/ext_mode/common/$(LINT_EXT_COMMON_SRC) 339 | endif 340 | ifneq ($(LINT_EXT_TCPIP_SRC), ) 341 | LINT_SRCS += $(MATLAB_ROOT)/rtw/c/src/rtiostream/rtiostreamtcpip/$(LINT_EXT_TCPIP_SRC) 342 | endif 343 | LINT_SRCS += $(MODEL).$(TARGET_LANG_EXT) $(MODULES) $(USER_SRCS) $(S_FUNCTIONS) 344 | LINTOPTSFILE = $(MODEL).lintopts 345 | 346 | LINT_ERROFF1 = E_NAME_DEF_NOT_USED2,E_NAME_DECL_NOT_USED_DEF2 347 | LINT_ERROFF2 = $(LINT_ERROFF1),E_FUNC_ARG_UNUSED 348 | LINT_ERROFF = $(LINT_ERROFF2),E_INDISTING_FROM_TRUNC2,E_NAME_USED_NOT_DEF2 349 | 350 | #--------------------------------- Rules --------------------------------------- 351 | ifeq ($(MODELREF_TARGET_TYPE),NONE) 352 | $(PRODUCT) : $(OBJS) $(SHARED_LIB) $(LIBS) $(MODELREF_LINK_LIBS) 353 | $(BIN_SETTING) $(LINK_OBJS) $(MODELREF_LINK_LIBS) $(SHARED_LIB) $(LIBS) $(ADDITIONAL_LDFLAGS) $(SYSTEM_LIBS) 354 | @echo "### Created $(BUILD_PRODUCT_TYPE): $@" 355 | else 356 | $(PRODUCT) : $(OBJS) $(SHARED_LIB) 357 | @rm -f $(MODELLIB) 358 | $(AR) ruvs $(MODELLIB) $(LINK_OBJS) 359 | @echo "### Created $(MODELLIB)" 360 | @echo "### Created $(BUILD_PRODUCT_TYPE): $@" 361 | endif 362 | 363 | ifneq ($(SHARED_SRC_DIR),) 364 | $(SHARED_BIN_DIR)/%.o : $(SHARED_SRC_DIR)/%.c 365 | $(CC) -c -o $@ $(CFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 366 | 367 | $(SHARED_BIN_DIR)/%.o : $(SHARED_SRC_DIR)/%.cpp 368 | $(CPP) -c -o $@ $(CPPFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 369 | endif 370 | 371 | %.o : %.c 372 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 373 | $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG) "$<" 374 | 375 | %.o : %.cpp 376 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 377 | $(CPP) -c $(CPPFLAGS) $(GCC_WALL_FLAG) "$<" 378 | 379 | %.o : $(RELATIVE_PATH_TO_ANCHOR)/%.c 380 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 381 | $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG) "$<" 382 | 383 | %.o : $(RELATIVE_PATH_TO_ANCHOR)/%.cpp 384 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 385 | $(CPP) -c $(CPPFLAGS) "$<" 386 | 387 | ifeq ($(CLASSIC_INTERFACE), 1) 388 | ifeq ($(TARGET_LANG_EXT),cpp) 389 | %.o : $(MATLAB_ROOT)/rtw/c/grt/%.c 390 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 391 | $(CPP) -c $(CPPFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 392 | else 393 | %.o : $(MATLAB_ROOT)/rtw/c/grt/%.c 394 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 395 | $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 396 | endif 397 | else 398 | ifeq ($(TARGET_LANG_EXT),cpp) 399 | %.o : $(MATLAB_ROOT)/rtw/c/src/common/%.cpp 400 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 401 | $(CPP) -c $(CPPFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 402 | 403 | %.o : $(MATLAB_ROOT)/rtw/c/src/common/%.c 404 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 405 | $(CPP) -c $(CPPFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 406 | else 407 | %.o : $(MATLAB_ROOT)/rtw/c/src/common/%.c 408 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 409 | $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 410 | endif 411 | endif 412 | 413 | %.o : $(MATLAB_ROOT)/rtw/c/src/%.c 414 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 415 | $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 416 | 417 | %.o : $(MATLAB_ROOT)/rtw/c/src/ext_mode/common/%.c 418 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 419 | $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 420 | 421 | %.o : $(MATLAB_ROOT)/rtw/c/src/rtiostream/rtiostreamtcpip/%.c 422 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 423 | $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 424 | 425 | %.o : $(MATLAB_ROOT)/rtw/c/src/ext_mode/custom/%.c 426 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 427 | $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 428 | 429 | |>START_EXPAND_RULES<|%.o : |>EXPAND_DIR_NAME<|/%.c 430 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 431 | $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 432 | 433 | |>END_EXPAND_RULES<| 434 | 435 | |>START_EXPAND_RULES<|%.o : |>EXPAND_DIR_NAME<|/%.cpp 436 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 437 | $(CPP) -c $(CPPFLAGS) "$<" 438 | |>END_EXPAND_RULES<| 439 | 440 | %.o : $(MATLAB_ROOT)/simulink/src/%.c 441 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 442 | $(CC) -c $(CFLAGS) $(GCC_WALL_FLAG_MAX) "$<" 443 | 444 | %.o : $(MATLAB_ROOT)/simulink/src/%.cpp 445 | @$(GCC_TEST_CMD) "$<" $(GCC_TEST_OUT) 446 | $(CPP) -c $(CPPFLAGS) "$<" 447 | 448 | #------------------------------- Libraries ------------------------------------- 449 | 450 | |>START_EXPAND_LIBRARIES<|MODULES_|>EXPAND_LIBRARY_NAME<| = \ 451 | |>START_EXPAND_MODULES<| |>EXPAND_MODULE_NAME<|.o \ 452 | |>END_EXPAND_MODULES<| 453 | 454 | |>EXPAND_LIBRARY_NAME<|.a : $(MAKEFILE) rtw_proj.tmw $(MODULES_|>EXPAND_LIBRARY_NAME<|) 455 | @echo "### Creating $@ " 456 | $(AR) rs $@ $(MODULES_|>EXPAND_LIBRARY_NAME<|) 457 | @echo "### $@ Created " 458 | 459 | |>END_EXPAND_LIBRARIES<| 460 | 461 | |>START_PRECOMP_LIBRARIES<|MODULES_|>EXPAND_LIBRARY_NAME<| = \ 462 | |>START_EXPAND_MODULES<| |>EXPAND_MODULE_NAME<|.o \ 463 | |>END_EXPAND_MODULES<| 464 | 465 | |>EXPAND_LIBRARY_NAME<|.a : $(MAKEFILE) rtw_proj.tmw $(MODULES_|>EXPAND_LIBRARY_NAME<|) 466 | @echo "### Creating $@ " 467 | $(AR) rs $@ $(MODULES_|>EXPAND_LIBRARY_NAME<|) 468 | @echo "### $@ Created " 469 | 470 | |>END_PRECOMP_LIBRARIES<| 471 | 472 | #----------------------------- Dependencies ------------------------------------ 473 | 474 | $(OBJS) : $(MAKEFILE) rtw_proj.tmw 475 | 476 | $(SHARED_LIB) : $(SHARED_OBJS) 477 | @echo "### Creating $@ " 478 | $(AR) ruvs $@ $(SHARED_OBJS) 479 | @echo "### $@ Created " 480 | 481 | 482 | #--------- Miscellaneous rules to purge, clean and lint (sol2 only) ------------ 483 | 484 | purge : clean 485 | @echo "### Deleting the generated source code for $(MODEL)" 486 | @\rm -f $(MODEL).c $(MODEL).h $(MODEL)_types.h $(MODEL)_data.c \ 487 | $(MODEL)_private.h $(MODEL).rtw $(MODULES) rtw_proj.tmw $(MAKEFILE) 488 | 489 | clean : 490 | @echo "### Deleting the objects and $(PRODUCT)" 491 | @\rm -f $(LINK_OBJS) $(PRODUCT) 492 | 493 | lint : rtwlib.ln 494 | @lint -errchk -errhdr=%user -errtags=yes -F -L. -lrtwlib -x -Xc \ 495 | -erroff=$(LINT_ERROFF) \ 496 | -D_POSIX_C_SOURCE $(CFLAGS) $(LINT_SRCS) 497 | @\rm -f $(LINTOPTSFILE) 498 | @echo 499 | @echo "### Created lint output only, no executable" 500 | @echo 501 | 502 | rtwlib.ln : $(MAKEFILE) rtw_proj.tmw 503 | @echo 504 | @echo "### Linting ..." 505 | @echo 506 | @\rm -f llib-lrtwlib.ln $(LINTOPTSFILE) 507 | @echo "-dirout=. -errchk -errhdr=%user " >> $(LINTOPTSFILE) 508 | @echo "-errtags -F -ortwlib -x -Xc " >> $(LINTOPTSFILE) 509 | @echo "-erroff=$(LINT_ERROFF) " >> $(LINTOPTSFILE) 510 | @echo "-D_POSIX_C_SOURCE $(CFLAGS) " >> $(LINTOPTSFILE) 511 | @for file in $(MATLAB_ROOT)/rtw/c/libsrc/*.c; do \ 512 | echo "$$file " >> $(LINTOPTSFILE); \ 513 | done 514 | lint -flagsrc=$(LINTOPTSFILE) 515 | 516 | # EOF: grt_unix.tmf 517 | -------------------------------------------------------------------------------- /Simulink_32bit/DISCONtmf_PC/discon.tmf: -------------------------------------------------------------------------------- 1 | # Copyright 1994-2009 The MathWorks, Inc. 2 | # 3 | # File : discon_vc.tmf $Revision: 1.71.4.31 $ 4 | # 5 | # Abstract: 6 | # Real-Time Workshop template makefile for building a Windows-based 7 | # stand-alone generic real-time version of Simulink model using 8 | # generated C code and the 9 | # Microsoft Visual C/C++ compiler versions: 6.0, 7.1, 8.0 10 | # 11 | # Note that this template is automatically customized by the Real-Time 12 | # Workshop build procedure to create ".mk" 13 | # 14 | # The following defines can be used to modify the behavior of the 15 | # build: 16 | # 17 | # OPT_OPTS - Optimization option. See DEFAULT_OPT_OPTS in 18 | # vctools.mak for default. 19 | # OPTS - User specific options. 20 | # CPP_OPTS - C++ compiler options. 21 | # USER_SRCS - Additional user sources, such as files needed by 22 | # S-functions. 23 | # USER_INCLUDES - Additional include paths 24 | # (i.e. USER_INCLUDES="-Iwhere-ever -Iwhere-ever2") 25 | # 26 | # To enable debugging: 27 | # set DEBUG_BUILD = 1, which will trigger OPTS=-Zi (may vary with 28 | # compiler version, see compiler doc) 29 | # 30 | # This template makefile is designed to be used with a system target 31 | # file that contains 'rtwgensettings.BuildDirSuffix' see grt.tlc 32 | 33 | 34 | #------------------------ Macros read by make_rtw ----------------------------- 35 | # 36 | # The following macros are read by the Real-Time Workshop build procedure: 37 | # 38 | # MAKECMD - This is the command used to invoke the make utility 39 | # HOST - What platform this template makefile is targeted for 40 | # (i.e. PC or UNIX) 41 | # BUILD - Invoke make from the Real-Time Workshop build procedure 42 | # (yes/no)? 43 | # SYS_TARGET_FILE - Name of system target file. 44 | 45 | MAKECMD = nmake 46 | HOST = PC 47 | BUILD = yes 48 | SYS_TARGET_FILE = discon.tlc 49 | BUILD_SUCCESS = ^#^#^# Created 50 | COMPILER_TOOL_CHAIN = vc 51 | 52 | #---------------------- Tokens expanded by make_rtw --------------------------- 53 | # 54 | # The following tokens, when wrapped with "|>" and "<|" are expanded by the 55 | # Real-Time Workshop build procedure. 56 | # 57 | # MODEL_NAME - Name of the Simulink block diagram 58 | # MODEL_MODULES - Any additional generated source modules 59 | # MAKEFILE_NAME - Name of makefile created from template makefile .mk 60 | # MATLAB_ROOT - Path to were MATLAB is installed. 61 | # MATLAB_BIN - Path to MATLAB executable. 62 | # S_FUNCTIONS - List of S-functions. 63 | # S_FUNCTIONS_LIB - List of S-functions libraries to link. 64 | # SOLVER - Solver source file name 65 | # NUMST - Number of sample times 66 | # TID01EQ - yes (1) or no (0): Are sampling rates of continuous task 67 | # (tid=0) and 1st discrete task equal. 68 | # NCSTATES - Number of continuous states 69 | # BUILDARGS - Options passed in at the command line. 70 | # MULTITASKING - yes (1) or no (0): Is solver mode multitasking 71 | # EXT_MODE - yes (1) or no (0): Build for external mode 72 | # TMW_EXTMODE_TESTING - yes (1) or no (0): Build ext_test.c for external mode 73 | # testing. 74 | # EXTMODE_TRANSPORT - Index of transport mechanism (e.g. tcpip, serial) for extmode 75 | # EXTMODE_STATIC - yes (1) or no (0): Use static instead of dynamic mem alloc. 76 | # EXTMODE_STATIC_SIZE - Size of static memory allocation buffer. 77 | # MEX_OPT_FILE - mex option file name 78 | # VISUAL_VER - Visual C++ version information 79 | 80 | MODEL = |>MODEL_NAME<| 81 | MODULES = |>MODEL_MODULES<| 82 | MAKEFILE = |>MAKEFILE_NAME<| 83 | MATLAB_ROOT = |>MATLAB_ROOT<| 84 | ALT_MATLAB_ROOT = |>ALT_MATLAB_ROOT<| 85 | MATLAB_BIN = |>MATLAB_BIN<| 86 | ALT_MATLAB_BIN = |>ALT_MATLAB_BIN<| 87 | MASTER_ANCHOR_DIR = |>MASTER_ANCHOR_DIR<| 88 | START_DIR = |>START_DIR<| 89 | S_FUNCTIONS = |>S_FUNCTIONS<| 90 | S_FUNCTIONS_LIB = |>S_FUNCTIONS_LIB<| 91 | SOLVER = |>SOLVER<| 92 | NUMST = |>NUMST<| 93 | TID01EQ = |>TID01EQ<| 94 | NCSTATES = |>NCSTATES<| 95 | BUILDARGS = |>BUILDARGS<| 96 | MULTITASKING = |>MULTITASKING<| 97 | EXT_MODE = |>EXT_MODE<| 98 | TMW_EXTMODE_TESTING = |>TMW_EXTMODE_TESTING<| 99 | EXTMODE_TRANSPORT = |>EXTMODE_TRANSPORT<| 100 | EXTMODE_STATIC = |>EXTMODE_STATIC_ALLOC<| 101 | EXTMODE_STATIC_SIZE = |>EXTMODE_STATIC_ALLOC_SIZE<| 102 | 103 | MODELREFS = |>MODELREFS<| 104 | SHARED_SRC = |>SHARED_SRC<| 105 | SHARED_SRC_DIR = |>SHARED_SRC_DIR<| 106 | SHARED_BIN_DIR = |>SHARED_BIN_DIR<| 107 | SHARED_LIB = |>SHARED_LIB<| 108 | TARGET_LANG_EXT = |>TARGET_LANG_EXT<| 109 | MEX_OPT_FILE = |>MEX_OPT_FILE<| 110 | VISUAL_VER = |>VISUAL_VER<| 111 | OPTIMIZATION_FLAGS = |>OPTIMIZATION_FLAGS<| 112 | ADDITIONAL_LDFLAGS = |>ADDITIONAL_LDFLAGS<| 113 | 114 | # To enable debugging: 115 | # set DEBUG_BUILD = 1 116 | DEBUG_BUILD = 0 117 | 118 | #--------------------------- Model and reference models ----------------------- 119 | MODELLIB = |>MODELLIB<| 120 | MODELREF_LINK_LIBS = |>MODELREF_LINK_LIBS<| 121 | MODELREF_LINK_RSPFILE = |>MODELREF_LINK_RSPFILE_NAME<| 122 | MODELREF_INC_PATH = |>START_MDLREFINC_EXPAND_INCLUDES<|-I|>MODELREF_INC_PATH<| |>END_MDLREFINC_EXPAND_INCLUDES<| 123 | RELATIVE_PATH_TO_ANCHOR = |>RELATIVE_PATH_TO_ANCHOR<| 124 | MODELREF_TARGET_TYPE = |>MODELREF_TARGET_TYPE<| 125 | 126 | !if "$(MATLAB_ROOT)" != "$(ALT_MATLAB_ROOT)" 127 | MATLAB_ROOT = $(ALT_MATLAB_ROOT) 128 | !endif 129 | !if "$(MATLAB_BIN)" != "$(ALT_MATLAB_BIN)" 130 | MATLAB_BIN = $(ALT_MATLAB_BIN) 131 | !endif 132 | 133 | #--------------------------- Tool Specifications ------------------------------ 134 | 135 | !include $(MATLAB_ROOT)\rtw\c\tools\vctools.mak 136 | 137 | PERL = $(MATLAB_ROOT)\sys\perl\win32\bin\perl 138 | #------------------------------ Include/Lib Path ------------------------------ 139 | 140 | MATLAB_INCLUDES = $(MATLAB_ROOT)\simulink\include 141 | MATLAB_INCLUDES = $(MATLAB_INCLUDES);$(MATLAB_ROOT)\extern\include 142 | MATLAB_INCLUDES = $(MATLAB_INCLUDES);$(MATLAB_ROOT)\rtw\c\src 143 | MATLAB_INCLUDES = $(MATLAB_INCLUDES);$(MATLAB_ROOT)\rtw\c\src\ext_mode\common 144 | 145 | # Additional file include paths 146 | |>START_EXPAND_INCLUDES<| 147 | MATLAB_INCLUDES = $(MATLAB_INCLUDES);|>EXPAND_DIR_NAME<||>END_EXPAND_INCLUDES<| 148 | 149 | INCLUDE = .;$(RELATIVE_PATH_TO_ANCHOR);$(MATLAB_INCLUDES);$(INCLUDE) 150 | 151 | !if "$(SHARED_SRC_DIR)" != "" 152 | INCLUDE = $(INCLUDE);$(SHARED_SRC_DIR) 153 | !endif 154 | 155 | #------------------------ External mode --------------------------------------- 156 | # Uncomment -DVERBOSE to have information printed to stdout 157 | # To add a new transport layer, see the comments in 158 | # /toolbox/simulink/simulink/extmode_transports.m 159 | !if $(EXT_MODE) == 1 160 | EXT_CC_OPTS = -DEXT_MODE # -DVERBOSE 161 | !if $(EXTMODE_TRANSPORT) == 0 #tcpip 162 | EXT_SRC = ext_svr.c updown.c ext_work.c rtiostream_interface.c rtiostream_tcpip.c 163 | EXT_LIB = wsock32.lib 164 | !endif 165 | !if $(EXTMODE_TRANSPORT) == 1 #serial_win32 166 | EXT_SRC = ext_svr.c updown.c ext_work.c ext_svr_serial_transport.c 167 | EXT_SRC = $(EXT_SRC) ext_serial_pkt.c ext_serial_win32_port.c 168 | EXT_LIB = 169 | !endif 170 | !if $(TMW_EXTMODE_TESTING) == 1 171 | EXT_SRC = $(EXT_SRC) ext_test.c 172 | EXT_CC_OPTS = $(EXT_CC_OPTS) -DTMW_EXTMODE_TESTING 173 | !endif 174 | !if $(EXTMODE_STATIC) == 1 175 | EXT_SRC = $(EXT_SRC) mem_mgr.c 176 | EXT_CC_OPTS = $(EXT_CC_OPTS) -DEXTMODE_STATIC -DEXTMODE_STATIC_SIZE=$(EXTMODE_STATIC_SIZE) 177 | !endif 178 | !else 179 | EXT_SRC = 180 | EXT_CC_OPTS = 181 | EXT_LIB = 182 | !endif 183 | 184 | #------------------------ rtModel ---------------------------------------------- 185 | 186 | RTM_CC_OPTS = -DUSE_RTMODEL 187 | 188 | #----------------- Compiler and Linker Options -------------------------------- 189 | 190 | # Optimization Options 191 | OPT_OPTS = $(DEFAULT_OPT_OPTS) 192 | 193 | # General User Options 194 | !if "$(DEBUG_BUILD)" == "0" 195 | OPTS = 196 | !else 197 | # Set OPT_OPTS=-Zi and any additional flags for debugging 198 | OPTS = -Zi 199 | !endif 200 | 201 | !if "$(OPTIMIZATION_FLAGS)" != "" 202 | CC_OPTS = $(OPTS) $(EXT_CC_OPTS) $(RTM_CC_OPTS) $(OPTIMIZATION_FLAGS) 203 | !else 204 | CC_OPTS = $(OPT_OPTS) $(OPTS) $(EXT_CC_OPTS) $(RTM_CC_OPTS) 205 | !endif 206 | CPP_REQ_DEFINES = -DMODEL=$(MODEL) -DRT -DNUMST=$(NUMST) \ 207 | -DTID01EQ=$(TID01EQ) -DNCSTATES=$(NCSTATES) \ 208 | -DMT=$(MULTITASKING) -DHAVESTDIO 209 | 210 | # Uncomment this line to move warning level to W4 211 | # cflags = $(cflags:W3=W4) 212 | CFLAGS = $(MODELREF_INC_PATH) $(cflags) $(cvarsmt) $(CFLAGS_VERSPECIFIC)\ 213 | $(CC_OPTS) $(CPP_REQ_DEFINES) $(USER_INCLUDES) 214 | CPPFLAGS = $(MODELREF_INC_PATH) $(cflags) $(cvarsmt) $(CPPFLAGS_VERSPECIFIC)\ 215 | $(CPP_OPTS) $(CC_OPTS) $(CPP_REQ_DEFINES) $(USER_INCLUDES) 216 | LDFLAGS = $(ldebug) $(conflags) $(EXT_LIB) $(conlibsmt) libcpmt.lib $(ADDITIONAL_LDFLAGS) 217 | 218 | 219 | # libcpmt.lib is the multi-threaded, static lib version of the C++ standard lib 220 | 221 | #----------------------------- Source Files ----------------------------------- 222 | 223 | 224 | #Dynamic library 225 | !if "$(MODELREF_TARGET_TYPE)" == "NONE" 226 | PRODUCT = $(RELATIVE_PATH_TO_ANCHOR)\DISCON.dll 227 | 228 | REQ_SRCS = $(MODEL).$(TARGET_LANG_EXT) $(MODULES) \ 229 | discon_main.c rt_sim.c $(SOLVER) $(EXT_SRC) 230 | 231 | #Model Reference Target 232 | !else 233 | PRODUCT = $(MODELLIB) 234 | REQ_SRCS = $(MODULES) 235 | !endif 236 | 237 | USER_SRCS = 238 | 239 | SRCS = $(REQ_SRCS) $(USER_SRCS) $(S_FUNCTIONS) 240 | OBJS_CPP_UPPER = $(SRCS:.CPP=.obj) 241 | OBJS_CPP_LOWER = $(OBJS_CPP_UPPER:.cpp=.obj) 242 | OBJS_C_UPPER = $(OBJS_CPP_LOWER:.C=.obj) 243 | OBJS = $(OBJS_C_UPPER:.c=.obj) 244 | SHARED_OBJS = $(SHARED_SRC:.c=.obj) 245 | # ------------------------- Additional Libraries ------------------------------ 246 | 247 | LIBS = 248 | |>START_PRECOMP_LIBRARIES<| 249 | !if "$(OPT_OPTS)" == "$(DEFAULT_OPT_OPTS)" 250 | LIBS = $(LIBS) |>EXPAND_LIBRARY_LOCATION<|\|>EXPAND_LIBRARY_NAME<|_vc.lib 251 | !else 252 | LIBS = $(LIBS) |>EXPAND_LIBRARY_NAME<|.lib 253 | !endif |>END_PRECOMP_LIBRARIES<| 254 | |>START_EXPAND_LIBRARIES<| 255 | LIBS = $(LIBS) |>EXPAND_LIBRARY_NAME<|.lib |>END_EXPAND_LIBRARIES<| 256 | LIBS = $(LIBS) 257 | 258 | # ---------------------------- Linker Script ---------------------------------- 259 | 260 | CMD_FILE = $(MODEL).lnk 261 | GEN_LNK_SCRIPT = $(MATLAB_ROOT)\rtw\c\tools\mkvc_lnk.pl 262 | 263 | #--------------------------------- Rules -------------------------------------- 264 | all: set_environment_variables $(PRODUCT) 265 | 266 | !if "$(MODELREF_TARGET_TYPE)" == "NONE" 267 | #--- Stand-alone model --- 268 | $(PRODUCT) : $(OBJS) $(SHARED_LIB) $(LIBS) $(MODELREF_LINK_LIBS) 269 | @cmd /C "echo ### Linking ..." 270 | $(PERL) $(GEN_LNK_SCRIPT) $(CMD_FILE) $(OBJS) 271 | $(LD) /DLL $(LDFLAGS) $(S_FUNCTIONS_LIB) $(SHARED_LIB) $(LIBS) $(MAT_LIBS) @$(CMD_FILE) @$(MODELREF_LINK_RSPFILE) -out:$@ 272 | @del $(CMD_FILE) 273 | @cmd /C "echo $(BUILD_SUCCESS) dynamic library DISCON.dll" 274 | !else 275 | #--- Model reference RTW Target --- 276 | $(PRODUCT) : $(OBJS) $(SHARED_LIB) 277 | @cmd /C "echo ### Linking ..." 278 | $(PERL) $(GEN_LNK_SCRIPT) $(CMD_FILE) $(OBJS) 279 | $(LD) -lib /OUT:$(MODELLIB) @$(CMD_FILE) $(S_FUNCTIONS_LIB) 280 | @cmd /C "echo $(BUILD_SUCCESS) static library $(MODELLIB)" 281 | !endif 282 | 283 | {$(MATLAB_ROOT)\rtw\c\grt}.c.obj : 284 | @cmd /C "echo ### Compiling $<" 285 | $(CC) $(CFLAGS) $< 286 | 287 | {$(MATLAB_ROOT)\rtw\c\src}.c.obj : 288 | @cmd /C "echo ### Compiling $<" 289 | $(CC) $(CFLAGS) $< 290 | 291 | {$(MATLAB_ROOT)\rtw\c\src\ext_mode\common}.c.obj : 292 | @cmd /C "echo ### Compiling $<" 293 | $(CC) $(CFLAGS) $< 294 | 295 | {$(MATLAB_ROOT)\rtw\c\src\rtiostream\rtiostreamtcpip}.c.obj : 296 | @cmd /C "echo ### Compiling $<" 297 | $(CC) $(CFLAGS) $< 298 | 299 | {$(MATLAB_ROOT)\rtw\c\src\ext_mode\serial}.c.obj : 300 | @cmd /C "echo ### Compiling $<" 301 | $(CC) $(CFLAGS) $< 302 | 303 | {$(MATLAB_ROOT)\rtw\c\src\ext_mode\custom}.c.obj : 304 | @cmd /C "echo ### Compiling $<" 305 | $(CC) $(CFLAGS) $< 306 | 307 | # Additional sources 308 | 309 | |>START_EXPAND_RULES<|{|>EXPAND_DIR_NAME<|}.c.obj : 310 | @cmd /C "echo ### Compiling $<" 311 | $(CC) $(CFLAGS) $< 312 | 313 | |>END_EXPAND_RULES<| 314 | 315 | |>START_EXPAND_RULES<|{|>EXPAND_DIR_NAME<|}.cpp.obj : 316 | @cmd /C "echo ### Compiling $<" 317 | $(CC) $(CPPFLAGS) $< 318 | 319 | |>END_EXPAND_RULES<| 320 | 321 | # Look in simulink/src helper files 322 | 323 | {$(MATLAB_ROOT)\simulink\src}.c.obj : 324 | @cmd /C "echo ### Compiling $<" 325 | $(CC) $(CFLAGS) $< 326 | 327 | {$(MATLAB_ROOT)\simulink\src}.cpp.obj : 328 | @cmd /C "echo ### Compiling $<" 329 | $(CC) $(CPPFLAGS) $< 330 | 331 | # Put these rule last, otherwise nmake will check toolboxes first 332 | 333 | {$(RELATIVE_PATH_TO_ANCHOR)}.c.obj : 334 | @cmd /C "echo ### Compiling $<" 335 | $(CC) $(CFLAGS) $< 336 | 337 | {$(RELATIVE_PATH_TO_ANCHOR)}.cpp.obj : 338 | @cmd /C "echo ### Compiling $<" 339 | $(CC) $(CPPFLAGS) $< 340 | 341 | .c.obj : 342 | @cmd /C "echo ### Compiling $<" 343 | $(CC) $(CFLAGS) $< 344 | 345 | .cpp.obj : 346 | @cmd /C "echo ### Compiling $<" 347 | $(CC) $(CPPFLAGS) $< 348 | 349 | !if "$(SHARED_LIB)" != "" 350 | $(SHARED_LIB) : $(SHARED_SRC) 351 | @cmd /C "echo ### Creating $@" 352 | @$(CC) $(CFLAGS) -Fo$(SHARED_BIN_DIR)\ @<< 353 | $? 354 | << 355 | @$(LIBCMD) /nologo /out:$@ $(SHARED_OBJS) 356 | @cmd /C "echo ### $@ Created" 357 | !endif 358 | 359 | 360 | set_environment_variables: 361 | @set INCLUDE=$(INCLUDE) 362 | @set LIB=$(LIB) 363 | 364 | # Libraries: 365 | 366 | |>START_EXPAND_LIBRARIES<|MODULES_|>EXPAND_LIBRARY_NAME<| = \ 367 | |>START_EXPAND_MODULES<| |>EXPAND_MODULE_NAME<|.obj \ 368 | |>END_EXPAND_MODULES<| 369 | 370 | |>EXPAND_LIBRARY_NAME<|.lib : rtw_proj.tmw $(MAKEFILE) $(MODULES_|>EXPAND_LIBRARY_NAME<|) 371 | @cmd /C "echo ### Creating $@" 372 | $(LIBCMD) /nologo /out:$@ $(MODULES_|>EXPAND_LIBRARY_NAME<|) 373 | @cmd /C "echo ### $@ Created" 374 | 375 | |>END_EXPAND_LIBRARIES<| 376 | 377 | |>START_PRECOMP_LIBRARIES<|MODULES_|>EXPAND_LIBRARY_NAME<| = \ 378 | |>START_EXPAND_MODULES<| |>EXPAND_MODULE_NAME<|.obj \ 379 | |>END_EXPAND_MODULES<| 380 | 381 | |>EXPAND_LIBRARY_NAME<|.lib : rtw_proj.tmw $(MAKEFILE) $(MODULES_|>EXPAND_LIBRARY_NAME<|) 382 | @cmd /C "echo ### Creating $@" 383 | $(LIBCMD) /nologo /out:$@ $(MODULES_|>EXPAND_LIBRARY_NAME<|) 384 | @cmd /C "echo ### $@ Created" 385 | 386 | |>END_PRECOMP_LIBRARIES<| 387 | 388 | #----------------------------- Dependencies ----------------------------------- 389 | 390 | $(OBJS) : $(MAKEFILE) rtw_proj.tmw 391 | -------------------------------------------------------------------------------- /Simulink_32bit/README.txt: -------------------------------------------------------------------------------- 1 | August 10, 2017 -- J. Butterworth 2 | Creating "Bladed-Style" DLLs (Windows) and SOs (Linux) from Matlab R2017a 3 | 4 | 5 | Files and Directories: 6 | ====================== 7 | * File: README.txt -- This readme file 8 | * File: BlankCntrlr_SimulinkSetupAndBuild.m -- Matlab m-file that walks the user through the build process 9 | * File: BlankCntrlr_model.mdl -- A Simulink model set up to be a empty ("dummy") controller. It is configured to be built into a DLL or SO in this process 10 | * File: discon_main.c -- DISCON main file 11 | * File: discon.tlc -- DISCON target file 12 | * File: setup_mssdk71.bat -- Bat file that allows the build of a 32-bit DLL from a 64bit installation of Matlab (in this case, R2017a) 13 | * Directory: DISCONtmf_LINUX -- Directory that contains discon.tmf, a template makefile configured for LINUX 14 | * Directory: DISCONtmf_PC -- Directory that contains discon.tmf, a template makefile configured for WINDOWS 15 | 16 | Setup: 17 | ====================== 18 | As before, the sampling time Ts must be defined in the MATLAB workspace, as it is needed for compilation. 19 | For WINDOWS, use the Windows SDK 7.1 compiler and configure Matlab to use it.... 20 | You also need to install the Windows SDK 7.1, and after installation enable it with the mex –setup command in MATLAB, see: 21 | https://nl.mathworks.com/matlabcentral/answers/101105-how-do-i-install-microsoft-windows-sdk-7-1 22 | https://www.microsoft.com/en-us/download/details.aspx?id=8279 23 | For LINUX, use the gcc compiler and and configure Matlab to use it. 24 | 25 | 26 | 27 | Building the DLL (Windows -- 32-bit DLL from 32-bit or 64-bit Matlab): 28 | ====================== 29 | Copy the discon.tmf file from DISCONtmf_PC and put it in your build directory (with discon_main.c, discon.tlc, etc.). This will provide the details needed to build a DLL (rather than an SO). 30 | 31 | Run the script BlankCntrlr_SimulinkSetupAndBuild.m. The script will determine if Matlab is a 32-bit of 64-bit installation and build the DLL appropriately. 32 | 33 | For a 64-bit Matlab installation: 34 | The DLL is created in two-step process that supports creating 32-bit DLL creation from a 64-bit installation of Matlab (R2017a) 35 | 1) Generate code-only from Simulink model 36 | 2) Replace resulting R2017a(64bit) setup_mssdk71.bat with R2013b(32bit) setup_mssdk71.bat file and finish building the DLL. 37 | 38 | For a 32-bit Matlab installation: 39 | One can simply generate code and build the DLL directly from the Simulink model {Ctrl-B} (but one MUST uncheck "generate code only" in the "code generation tab" of "model configuration parameters" in the Simulink model). Also, the script BlankCntrlr_SimulinkSetupAndBuild.m can build the model regardless of the "generate code only" setting. 40 | 41 | 42 | 43 | Building the SO (LINUX -- 64-bit SO from 64-bit Matlab): 44 | ====================== 45 | Copy the discon.tmf file from DISCONtmf_LINUX and put it in your build directory (with discon_main.c, discon.tlc, etc.). This will provide the details needed to build an SO (rather than a DLL). 46 | 47 | Open the model and uncheck "generate code only" in the "code generation tab" of "model configuration parameters". I'm still looking for a way to automate this in the same way as the WINDOWS version. 48 | 49 | One can simply generate code and build the DLL directly from the Simulink model {Ctrl-B}. Also, the script BlankCntrlr_SimulinkSetupAndBuild.m can build the model regardless of the "generate code only" setting. 50 | 51 | 52 | -------------------------------------------------------------------------------- /Simulink_32bit/discon.tlc: -------------------------------------------------------------------------------- 1 | %% SYSTLC: DISCON DLL Target (for use with GH BLADED) \ 2 | %% TMF: discon_vc.tmf MAKE: make_rtw EXTMODE: ext_comm 3 | %% 4 | %% $RCSfile: discon.tlc,v $ 5 | %% $Revision: 1.31.4.8 $ 6 | %% $Date: 2004/07/01 04:40:51 $ 7 | %% 8 | %% Copyright 1994-2004 The MathWorks, Inc. 9 | %% Abstract: Generic real-time system target file. 10 | %% 11 | %selectfile NULL_FILE 12 | 13 | %assign TargetType = "RT" 14 | %assign Language = "C" 15 | %assign GenRTModel = 1 16 | %assign _GRT_ = 1 17 | 18 | %assign MatFileLogging = 1 19 | 20 | %include "codegenentry.tlc" 21 | 22 | 23 | %% The contents between 'BEGIN_RTW_OPTIONS' and 'END_RTW_OPTIONS' in this file 24 | %% are used to maintain backward compatibility to R13 and preR13 custom target 25 | %% file only. If you want to use this file as a template to develop your 26 | %% own system target file, you need to remove the 'CONFIGSET_TARGET_COMPONENT' 27 | %% section at the end of this file. 28 | %% 29 | /% 30 | BEGIN_RTW_OPTIONS 31 | 32 | % second page of category item 33 | rtwoptions(1).prompt = 'DISCON code generation options'; 34 | rtwoptions(1).type = 'Category'; 35 | rtwoptions(1).enable = 'on'; 36 | rtwoptions(1).default = 2; % number of items under this category 37 | % excluding this one. 38 | rtwoptions(1).popupstrings = ''; 39 | rtwoptions(1).tlcvariable = ''; 40 | rtwoptions(1).tooltip = ''; 41 | rtwoptions(1).callback = ''; 42 | rtwoptions(1).opencallback = ''; 43 | rtwoptions(1).closecallback = ''; 44 | rtwoptions(1).makevariable = ''; 45 | 46 | rtwoptions(2).prompt = 'MAT-file variable name modifier'; 47 | rtwoptions(2).type = 'Popup'; 48 | rtwoptions(2).default = 'rt_'; 49 | rtwoptions(2).popupstrings = 'rt_|_rt|none'; 50 | rtwoptions(2).tlcvariable = 'LogVarNameModifier'; 51 | rtwoptions(2).tooltip = ... 52 | ['prefix rt_ to variable name,', sprintf('\n'), ... 53 | 'append _rt to variable name,', sprintf('\n'), ... 54 | 'or no modification']; 55 | 56 | rtwoptions(3).prompt = 'Ignore custom storage classes'; 57 | rtwoptions(3).type = 'Checkbox'; 58 | rtwoptions(3).default = 'on'; 59 | rtwoptions(3).tlcvariable = 'IgnoreCustomStorageClasses'; 60 | rtwoptions(3).tooltip = ['Treat custom storage classes as ''Auto''.']; 61 | rtwoptions(3).opencallback = [ ... 62 | 'objTag = ''Ignore custom storage classes_CheckboxTag'';', ... 63 | 'obj = findobj(DialogFig,''Tag'',objTag);', ... 64 | 'set(obj, ''Enable'', sl(''onoff'',ecoderinstalled));']; 65 | 66 | rtwoptions(4).prompt = 'External Mode code generation options'; 67 | rtwoptions(4).type = 'Category'; 68 | rtwoptions(4).enable = 'on'; 69 | rtwoptions(4).default = 5; % number of items under this category 70 | % excluding this one. 71 | rtwoptions(4).popupstrings = ''; 72 | rtwoptions(4).tlcvariable = ''; 73 | rtwoptions(4).tooltip = ''; 74 | rtwoptions(4).callback = ''; 75 | rtwoptions(4).opencallback = ''; 76 | rtwoptions(4).closecallback = ''; 77 | rtwoptions(4).makevariable = ''; 78 | 79 | rtwoptions(5).prompt = 'External mode'; 80 | rtwoptions(5).type = 'Checkbox'; 81 | rtwoptions(5).default = 'off'; 82 | rtwoptions(5).tlcvariable = 'ExtMode'; 83 | rtwoptions(5).makevariable = 'EXT_MODE'; 84 | rtwoptions(5).tooltip = ... 85 | ['Adds communication support',sprintf('\n'), ... 86 | 'for use with Simulink external mode']; 87 | 88 | % Enable/disable other external mode controls. 89 | rtwoptions(5).callback = [ ... 90 | 'DialogFig = get(gcbo,''Parent'');',... 91 | 'sl(''extmodecallback'', ''extmode_checkbox_callback'', DialogFig);', ... 92 | ]; 93 | 94 | rtwoptions(6).prompt = 'Transport'; 95 | rtwoptions(6).type = 'Popup'; 96 | rtwoptions(6).default = 'tcpip'; 97 | rtwoptions(6).popupstrings = ['tcpip|', ... 98 | 'serial_win32']; 99 | rtwoptions(6).tlcvariable = 'ExtModeTransport'; 100 | rtwoptions(6).makevariable = 'EXTMODE_TRANSPORT'; 101 | rtwoptions(6).tooltip = ... 102 | ['Chooses transport mechanism for external mode']; 103 | 104 | % Synchronize with "External mode" checkbox option 105 | rtwoptions(6).opencallback = [ ... 106 | 'ExtModeTable = {''tcpip'' ''ext_comm'';', ... 107 | '''serial_win32'' ''ext_serial_win32_comm''};', ... 108 | 'ud = DialogUserData;', ... 109 | 'ud = extmodecallback(''transport_popup_opencallback'',model,DialogFig,ud,ExtModeTable);', ... 110 | 'DialogUserData = ud;', ... 111 | ]; 112 | 113 | % Set extmode mex-file according to extmode transport mechanism. 114 | rtwoptions(6).closecallback = [ ... 115 | 'ExtModeTable = {''tcpip'' ''ext_comm'';', ... 116 | '''serial_win32'' ''ext_serial_win32_comm''};', ... 117 | 'ud = DialogUserData;', ... 118 | 'ud = extmodecallback(''transport_popup_closecallback'',model,DialogFig,ud,ExtModeTable);', ... 119 | 'DialogUserData = ud;', ... 120 | ]; 121 | 122 | rtwoptions(7).prompt = 'Static memory allocation'; 123 | rtwoptions(7).type = 'Checkbox'; 124 | rtwoptions(7).default = 'off'; 125 | rtwoptions(7).tlcvariable = 'ExtModeStaticAlloc'; 126 | rtwoptions(7).makevariable = 'EXTMODE_STATIC_ALLOC'; 127 | rtwoptions(7).tooltip = ... 128 | ['Forces external mode to use static',sprintf('\n'), ... 129 | 'instead of dynamic memory allocation']; 130 | 131 | % Enable/disable external mode static allocation size selection. 132 | rtwoptions(7).callback = [ ... 133 | 'DialogFig = get(gcbo,''Parent'');',... 134 | 'sl(''extmodecallback'', ''staticmem_checkbox_callback'', DialogFig);', ... 135 | ]; 136 | 137 | % Synchronize with "External mode" checkbox option 138 | rtwoptions(7).opencallback = [ ... 139 | 'extmodecallback(''staticmem_checkbox_opencallback'',DialogFig);', ... 140 | ]; 141 | 142 | rtwoptions(8).prompt = 'Static memory buffer size'; 143 | rtwoptions(8).type = 'Edit'; 144 | rtwoptions(8).default = '1000000'; 145 | rtwoptions(8).tlcvariable = 'ExtModeStaticAllocSize'; 146 | rtwoptions(8).makevariable = 'EXTMODE_STATIC_ALLOC_SIZE'; 147 | rtwoptions(8).tooltip = ... 148 | ['Size of external mode static allocation buffer']; 149 | 150 | % Synchronize with "External mode static allocation" option 151 | rtwoptions(8).opencallback = [ ... 152 | 'extmodecallback(''staticmemsize_edit_opencallback'',DialogFig);', ... 153 | ]; 154 | 155 | rtwoptions(9).prompt = 'External mode testing'; 156 | rtwoptions(9).type = 'NonUI'; 157 | rtwoptions(9).default = '0'; 158 | rtwoptions(9).tlcvariable = 'ExtModeTesting'; 159 | rtwoptions(9).makevariable = 'TMW_EXTMODE_TESTING'; 160 | rtwoptions(9).tooltip = ... 161 | ['Internal testing flag for Simulink external mode']; 162 | 163 | %----------------------------------------% 164 | % Configure RTW code generation settings % 165 | %----------------------------------------% 166 | 167 | rtwgensettings.BuildDirSuffix = '_discon_rtw'; 168 | 169 | END_RTW_OPTIONS 170 | %/ 171 | %% The content between 'BEGIN_CONFIGSET_TARGET_COMPONENT' and 172 | %% 'END_CONFIGSET_TARGET_COMPONENT' is for the MathWorks internal use 173 | %% only. You must remove this section if you intend to use this file 174 | %% as a template for your own system target development. 175 | /% 176 | BEGIN_CONFIGSET_TARGET_COMPONENT 177 | 178 | targetComponentClass = 'Simulink.GRTTargetCC'; 179 | 180 | END_CONFIGSET_TARGET_COMPONENT 181 | %/ 182 | 183 | -------------------------------------------------------------------------------- /Simulink_32bit/discon_main.c: -------------------------------------------------------------------------------- 1 | /* 2 | * File : discon_main.c 3 | * 4 | * Abstract: 5 | * A DISCON main for the use with GH BLADED that runs under most 6 | * operating systems. 7 | * 8 | * This file may be a useful starting point when targeting a new 9 | * controller. 10 | * 11 | * Updated 11-Apr-2017 by B. Jonkman, for Matlab R2017a 12 | * 13 | * Compiler specified defines: 14 | * RT - Required. 15 | * MODEL=modelname - Required. 16 | * NUMST=# - Required. Number of sample times. 17 | * NCSTATES=# - Required. Number of continuous states. 18 | * TID01EQ=1 or 0 - Optional. Only define to 1 if sample time task 19 | * id's 0 and 1 have equal rates. 20 | * MULTITASKING - Optional. (use MT for a synonym). 21 | * SAVEFILE - Optional (non-quoted) name of .mat file to create. 22 | * Default is .mat 23 | */ 24 | 25 | /*=========* 26 | * Headers * 27 | *=========*/ 28 | #include 29 | #include 30 | #include 31 | #include 32 | //#include 33 | 34 | #include "rtwtypes.h" 35 | #include "rtmodel.h" 36 | #include "rt_sim.h" 37 | #include "rt_logging.h" 38 | #ifdef UseMMIDataLogging 39 | #include "rt_logging_mmi.h" 40 | #endif 41 | #include "rt_nonfinite.h" 42 | #include "ext_work.h" 43 | 44 | /*=========* 45 | * Defines * 46 | *=========*/ 47 | 48 | // Generic helper definitions for shared library support 49 | #if defined _WIN32 || defined __CYGWIN__ 50 | #define DISCON_DLL_IMPORT __declspec(dllimport) 51 | #define DISCON_DLL_EXPORT __declspec(dllexport) 52 | #define DISCON_DLL_LOCAL 53 | #else 54 | #if __GNUC__ >= 4 55 | #define DISCON_DLL_IMPORT __attribute__ ((visibility ("default"))) 56 | #define DISCON_DLL_EXPORT __attribute__ ((visibility ("default"))) 57 | #define DISCON_DLL_LOCAL __attribute__ ((visibility ("hidden"))) 58 | #else 59 | #define DISCON_DLL_IMPORT 60 | #define DISCON_DLL_EXPORT 61 | #define DISCON_DLL_LOCAL 62 | #endif 63 | #endif 64 | 65 | #define DISCON_API DISCON_DLL_EXPORT 66 | #define DISCON_LOCAL DISCON_DLL_LOCAL 67 | 68 | // # ifdef __GNUC__ 69 | // # define CDECL __attribute__ ((__cdecl__)) 70 | // # else 71 | // # define CDECL __cdecl 72 | // # endif 73 | 74 | # ifdef __GNUC__ 75 | # define CDECL 76 | # else 77 | # define CDECL __cdecl 78 | # endif 79 | 80 | 81 | 82 | #ifndef TRUE 83 | #define FALSE (0) 84 | #define TRUE (1) 85 | #endif 86 | 87 | 88 | #ifndef EXIT_FAILURE 89 | #define EXIT_FAILURE 1 90 | #endif 91 | #ifndef EXIT_SUCCESS 92 | #define EXIT_SUCCESS 0 93 | #endif 94 | 95 | #define QUOTE1(name) #name 96 | #define QUOTE(name) QUOTE1(name) /* need to expand name */ 97 | 98 | #ifndef RT 99 | #error "must define RT" 100 | #endif 101 | 102 | #ifndef MODEL 103 | #error "must define MODEL" 104 | #endif 105 | 106 | #ifndef NUMST 107 | #error "must define number of sample times, NUMST" 108 | #endif 109 | 110 | #ifndef NCSTATES 111 | #error "must define NCSTATES" 112 | #endif 113 | 114 | #ifndef SAVEFILE 115 | #define MATFILE2(file) #file ".mat" 116 | #define MATFILE1(file) MATFILE2(file) 117 | #define MATFILE MATFILE1(MODEL) 118 | #else 119 | #define MATFILE QUOTE(SAVEFILE) 120 | #endif 121 | 122 | #define RUN_FOREVER -1.0 123 | 124 | #define EXPAND_CONCAT(name1,name2) name1 ## name2 125 | #define CONCAT(name1,name2) EXPAND_CONCAT(name1,name2) 126 | #define RT_MODEL CONCAT(MODEL,_rtModel) 127 | 128 | #define EXPAND_CONCAT3(name1,name2,name3) name1 ## _ ## name2.name3 129 | #define CONCAT3(name1,name2,name3) EXPAND_CONCAT3(name1,name2,name3) 130 | #define SIG_MODEL(suffix,name) CONCAT3(MODEL,suffix,name) 131 | 132 | #define NINT(a) ((a) >= 0.0 ? (int)((a)+0.5) : (int)((a)-0.5)) 133 | #define MIN(a,b) ((a)>(b)?(b):(a)) 134 | 135 | /*====================* 136 | * External functions * 137 | *====================*/ 138 | extern RT_MODEL *MODEL(void); 139 | 140 | extern void MdlInitializeSizes(void); 141 | extern void MdlInitializeSampleTimes(void); 142 | extern void MdlStart(void); 143 | extern void MdlOutputs(int_T tid); 144 | extern void MdlUpdate(int_T tid); 145 | extern void MdlTerminate(void); 146 | 147 | #if NCSTATES > 0 148 | extern void rt_ODECreateIntegrationData(RTWSolverInfo *si); 149 | extern void rt_ODEUpdateContinuousStates(RTWSolverInfo *si); 150 | 151 | # define rt_CreateIntegrationData(S) \ 152 | rt_ODECreateIntegrationData(rtmGetRTWSolverInfo(S)); 153 | # define rt_UpdateContinuousStates(S) \ 154 | rt_ODEUpdateContinuousStates(rtmGetRTWSolverInfo(S)); 155 | # else 156 | # define rt_CreateIntegrationData(S) \ 157 | rtsiSetSolverName(rtmGetRTWSolverInfo(S),"FixedStepDiscrete"); 158 | # define rt_UpdateContinuousStates(S) /* Do Nothing */ 159 | #endif 160 | 161 | 162 | /*==================================* 163 | * Global data local to this module * 164 | *==================================*/ 165 | static struct { 166 | int_T stopExecutionFlag; 167 | int_T isrOverrun; 168 | int_T overrunFlags[NUMST]; 169 | int_T eventFlags[NUMST]; 170 | const char_T *errmsg; 171 | } GBLbuf; 172 | 173 | #ifdef EXT_MODE 174 | # define rtExtModeSingleTaskUpload(S) \ 175 | { \ 176 | int stIdx; \ 177 | rtExtModeUploadCheckTrigger(rtmGetNumSampleTimes(S)); \ 178 | for (stIdx=0; stIdx= 0) { 610 | /* Main calculation */ 611 | aviFail[0] = calcOutputController(rGeneratorSpeed, rRatedSpeed, 612 | rBelowRatedPitch, rForeAftTower, rSideTower, 613 | rRotorAzimuth, rOP1RootMoment, rOP2RootMoment, 614 | rOP3RootMoment, rMeasuredPitch, rMeasuredTorque, 615 | rModeGain, &rTorqueDemand, &rBlade1Pitch, 616 | &rBlade2Pitch, &rBlade3Pitch, errorMsg); 617 | //&rBlade2Pitch, &rBlade3Pitch, &errorMsg); 618 | } 619 | else if (iStatus == -1) { 620 | /* Main calculation */ 621 | aviFail[0] = calcOutputController(rGeneratorSpeed, rRatedSpeed, 622 | rBelowRatedPitch, rForeAftTower, rSideTower, 623 | rRotorAzimuth, rOP1RootMoment, rOP2RootMoment, 624 | rOP3RootMoment, rMeasuredPitch, rMeasuredTorque, 625 | rModeGain, &rTorqueDemand, &rBlade1Pitch, 626 | &rBlade2Pitch, &rBlade3Pitch, errorMsg); 627 | //&rBlade2Pitch, &rBlade3Pitch, &errorMsg); 628 | 629 | /* Perform Cleanup */ 630 | aviFail[0] = performCleanup(errorMsg); 631 | } 632 | else { 633 | aviFail[0] = -1; 634 | sprintf(errorMsg, "iStatus is not recognized: %d", iStatus); 635 | } 636 | 637 | /* Store variables too Bladed (See Appendix A) */ 638 | avrSwap[27] = 1; /* Individual Pitch control */ 639 | avrSwap[34] = 1; /* Generator contactor status */ 640 | avrSwap[35] = 0; /* Shaft brake status: 0=off */ 641 | avrSwap[40] = 0; /* Demanded yaw actuator torque */ 642 | avrSwap[41] = rBlade1Pitch; /* Blade 1 pitch angle demand */ 643 | avrSwap[42] = rBlade2Pitch; /* Blade 2 pitch angle demand */ 644 | avrSwap[43] = rBlade3Pitch; /* Blade 3 pitch angle demand */ 645 | avrSwap[46] = rTorqueDemand; /* Torque angle demand */ 646 | avrSwap[47] = 0; /* Demanded nacelle yaw rate */ 647 | avrSwap[54] = 0; /* Pitch override */ 648 | avrSwap[55] = 0; /* Torque override */ 649 | avrSwap[64] = 0; /* Number of variables returned for logging */ 650 | avrSwap[71] = 0; /* Generator start-up resistance */ 651 | avrSwap[78] = 1; /* Request for loads: 0=none */ 652 | avrSwap[79] = 0; /* Variable slip current status */ 653 | avrSwap[80] = 0; /* Variable slip current demand */ 654 | 655 | /* Return message */ 656 | memcpy(avcMsg, errorMsg, MIN(256, NINT(avrSwap[48]))); 657 | 658 | return; 659 | } /* end DISCON */ 660 | 661 | /* EOF: discon_main.c */ 662 | -------------------------------------------------------------------------------- /Simulink_32bit/setup_mssdk71.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | rem MSSDK71OPTS.BAT 3 | rem 4 | rem Compile and link options used for building MEX-files 5 | rem using the Microsoft Windows Software Development Kit. 6 | rem 7 | rem $Revision: 1.1.6.4 $ $Date: 2012/07/23 18:50:26 $ 8 | rem Copyright 2010 The MathWorks, Inc. 9 | rem 10 | rem StorageVersion: 1.0 11 | rem C++keyFileName: MSSDK71OPTS.BAT 12 | rem C++keyName: Microsoft SDK 13 | rem C++keyManufacturer: Microsoft 14 | rem C++keyVersion: 7.1 15 | rem C++keyLanguage: C++ 16 | rem C++keyLinkerName: Microsoft SDK 17 | rem C++keyLinkerVersion: 7.1 18 | rem 19 | rem ******************************************************************** 20 | rem General parameters 21 | rem ******************************************************************** 22 | 23 | set MATLAB=%MATLAB% 24 | set VSINSTALLDIR=c:\Program Files (x86)\Microsoft Visual Studio 10.0 25 | set VCINSTALLDIR=%VSINSTALLDIR%\VC 26 | rem In this case, LINKERDIR is being used to specify the location of the SDK 27 | set LINKERDIR=C:\Program Files\Microsoft SDKs\Windows\v7.1\ 28 | set PATH=%VCINSTALLDIR%\bin;%VCINSTALLDIR%\VCPackages;%VSINSTALLDIR%\Common7\IDE;%VSINSTALLDIR%\Common7\Tools;%LINKERDIR%\bin;%MATLAB_BIN%;%PATH% 29 | set INCLUDE=%VCINSTALLDIR%\INCLUDE;%LINKERDIR%\include;%LINKERDIR%\include\gl;%VCINSTALLDIR%\ATLMFC\INCLUDE;%INCLUDE% 30 | set LIB=%VCINSTALLDIR%\LIB;%LINKERDIR%\LIB;%VCINSTALLDIR%\ATLMFC\LIB;%MATLAB%\extern\lib\win32;%LIB% 31 | set MW_TARGET_ARCH=win32 32 | 33 | rem ******************************************************************** 34 | rem Compiler parameters 35 | rem ******************************************************************** 36 | set COMPILER=cl 37 | set COMPFLAGS=/c /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo /MD 38 | set OPTIMFLAGS=/O2 /Oy- /DNDEBUG 39 | set DEBUGFLAGS=/Z7 40 | set NAME_OBJECT=/Fo 41 | 42 | rem ******************************************************************** 43 | rem Linker parameters 44 | rem ******************************************************************** 45 | set LIBLOC=%MATLAB%\extern\lib\win32\microsoft 46 | set LINKER=link 47 | set LINKFLAGS=/dll /export:%ENTRYPOINT% /LIBPATH:"%LIBLOC%" libmx.lib libmex.lib libmat.lib /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /manifest /incremental:NO /implib:"%LIB_NAME%.x" /MAP:"%OUTDIR%%MEX_NAME%%MEX_EXT%.map" 48 | set LINKOPTIMFLAGS= 49 | set LINKDEBUGFLAGS=/debug /PDB:"%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb" 50 | set LINK_FILE= 51 | set LINK_LIB= 52 | set NAME_OUTPUT=/out:"%OUTDIR%%MEX_NAME%%MEX_EXT%" 53 | set RSP_FILE_INDICATOR=@ 54 | 55 | rem ******************************************************************** 56 | rem Resource compiler parameters 57 | rem ******************************************************************** 58 | set RC_COMPILER=rc /fo "%OUTDIR%mexversion.res" 59 | set RC_LINKER= 60 | 61 | set POSTLINK_CMDS=del "%LIB_NAME%.x" "%LIB_NAME%.exp" 62 | set POSTLINK_CMDS1=mt -outputresource:"%OUTDIR%%MEX_NAME%%MEX_EXT%;2" -manifest "%OUTDIR%%MEX_NAME%%MEX_EXT%.manifest" 63 | set POSTLINK_CMDS2=del "%OUTDIR%%MEX_NAME%%MEX_EXT%.manifest" 64 | set POSTLINK_CMDS3=del "%OUTDIR%%MEX_NAME%%MEX_EXT%.map" 65 | -------------------------------------------------------------------------------- /Simulink_64bit/DISCON_Empty.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TUDelft-DataDrivenControl/DISCON_Simulink/daa4d1f5667ac145cbdcb7333946c860d7f5ea37/Simulink_64bit/DISCON_Empty.slx -------------------------------------------------------------------------------- /Simulink_64bit/DISCON_NREL5MW.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TUDelft-DataDrivenControl/DISCON_Simulink/daa4d1f5667ac145cbdcb7333946c860d7f5ea37/Simulink_64bit/DISCON_NREL5MW.slx -------------------------------------------------------------------------------- /Simulink_64bit/Parameters_NREL5MW.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TUDelft-DataDrivenControl/DISCON_Simulink/daa4d1f5667ac145cbdcb7333946c860d7f5ea37/Simulink_64bit/Parameters_NREL5MW.mat -------------------------------------------------------------------------------- /Simulink_64bit/discon.tlc: -------------------------------------------------------------------------------- 1 | %% SYSTLC: DISCON DLL Target (for use with GH BLADED) \ 2 | %% TMF: grt_default_tmf MAKE: make_rtw EXTMODE: ext_comm 3 | %% SYSTLC: Create Visual C/C++ Solution File for Simulink Coder\ 4 | %% TMF: discon_vc.tmf MAKE: make_rtw EXTMODE: ext_comm 5 | %% 6 | %% 7 | %% 8 | %% 9 | %% 10 | %% Copyright 1994-2016 The MathWorks, Inc. 11 | %% Abstract: Generic real-time system target file. 12 | %% 13 | %selectfile NULL_FILE 14 | 15 | %assign TargetType = "RT" 16 | %assign Language = "C" 17 | %assign GenRTModel = 1 18 | %assign _GRT_ = 1 19 | %assign TargetRegistMutexOp = 1 20 | %assign TargetRegistSynchroOp = 1 21 | 22 | %include "codegenentry.tlc" 23 | 24 | 25 | %% The contents between 'BEGIN_RTW_OPTIONS' and 'END_RTW_OPTIONS' in this file 26 | %% are used to maintain backward compatibility to R13 and preR13 custom target 27 | %% file only. If you want to use this file as a template to develop your 28 | %% own system target file, you need to remove the 'CONFIGSET_TARGET_COMPONENT' 29 | %% section at the end of this file. 30 | %% 31 | /% 32 | BEGIN_RTW_OPTIONS 33 | 34 | % second page of category item 35 | rtwoptions(1).prompt = 'DISCON code generation options'; 36 | rtwoptions(1).type = 'Category'; 37 | rtwoptions(1).enable = 'on'; 38 | rtwoptions(1).default = 2; % number of items under this category 39 | % excluding this one. 40 | rtwoptions(1).popupstrings = ''; 41 | rtwoptions(1).tlcvariable = ''; 42 | rtwoptions(1).tooltip = ''; 43 | rtwoptions(1).callback = ''; 44 | rtwoptions(1).opencallback = ''; 45 | rtwoptions(1).closecallback = ''; 46 | rtwoptions(1).makevariable = ''; 47 | 48 | rtwoptions(2).prompt = 'MAT-file variable name modifier'; 49 | rtwoptions(2).type = 'Popup'; 50 | rtwoptions(2).default = 'rt_'; 51 | rtwoptions(2).popupstrings = 'rt_|_rt|none'; 52 | rtwoptions(2).tlcvariable = 'LogVarNameModifier'; 53 | rtwoptions(2).tooltip = ... 54 | ['prefix rt_ to variable name,', sprintf('\n'), ... 55 | 'append _rt to variable name,', sprintf('\n'), ... 56 | 'or no modification']; 57 | 58 | rtwoptions(3).prompt = 'Ignore custom storage classes'; 59 | rtwoptions(3).type = 'Checkbox'; 60 | rtwoptions(3).default = 'on'; 61 | rtwoptions(3).tlcvariable = 'IgnoreCustomStorageClasses'; 62 | rtwoptions(3).tooltip = ['Treat custom storage classes as ''Auto''.']; 63 | rtwoptions(3).opencallback = [ ... 64 | 'objTag = ''Ignore custom storage classes_CheckboxTag'';', ... 65 | 'obj = findobj(DialogFig,''Tag'',objTag);', ... 66 | 'set(obj, ''Enable'', sl(''onoff'',ecoderinstalled));']; 67 | 68 | rtwoptions(4).prompt = 'External Mode code generation options'; 69 | rtwoptions(4).type = 'Category'; 70 | rtwoptions(4).enable = 'on'; 71 | rtwoptions(4).default = 5; % number of items under this category 72 | % excluding this one. 73 | rtwoptions(4).popupstrings = ''; 74 | rtwoptions(4).tlcvariable = ''; 75 | rtwoptions(4).tooltip = ''; 76 | rtwoptions(4).callback = ''; 77 | rtwoptions(4).opencallback = ''; 78 | rtwoptions(4).closecallback = ''; 79 | rtwoptions(4).makevariable = ''; 80 | 81 | rtwoptions(5).prompt = 'External mode'; 82 | rtwoptions(5).type = 'Checkbox'; 83 | rtwoptions(5).default = 'off'; 84 | rtwoptions(5).tlcvariable = 'ExtMode'; 85 | rtwoptions(5).makevariable = 'EXT_MODE'; 86 | rtwoptions(5).tooltip = ... 87 | ['Adds communication support',sprintf('\n'), ... 88 | 'for use with Simulink external mode']; 89 | 90 | % Enable/disable other external mode controls. 91 | rtwoptions(5).callback = [ ... 92 | 'DialogFig = get(gcbo,''Parent'');',... 93 | 'sl(''extmodecallback'', ''extmode_checkbox_callback'', DialogFig);', ... 94 | ]; 95 | 96 | rtwoptions(6).prompt = 'Transport'; 97 | rtwoptions(6).type = 'Popup'; 98 | rtwoptions(6).default = 'tcpip'; 99 | rtwoptions(6).popupstrings = ['tcpip|', ... 100 | 'serial']; 101 | rtwoptions(6).tlcvariable = 'ExtModeTransport'; 102 | rtwoptions(6).makevariable = 'EXTMODE_TRANSPORT'; 103 | rtwoptions(6).tooltip = ... 104 | ['Chooses transport mechanism for external mode']; 105 | 106 | % Synchronize with "External mode" checkbox option 107 | rtwoptions(6).opencallback = [ ... 108 | 'ExtModeTable = {''tcpip'' ''ext_comm'';', ... 109 | '''serial'' ''ext_serial_win32_comm''};', ... 110 | 'ud = DialogUserData;', ... 111 | 'ud = extmodecallback(''transport_popup_opencallback'',model,DialogFig,ud,ExtModeTable);', ... 112 | 'DialogUserData = ud;', ... 113 | ]; 114 | 115 | % Set extmode mex-file according to extmode transport mechanism. 116 | rtwoptions(6).closecallback = [ ... 117 | 'ExtModeTable = {''tcpip'' ''ext_comm'';', ... 118 | '''serial'' ''ext_serial_win32_comm''};', ... 119 | 'ud = DialogUserData;', ... 120 | 'ud = extmodecallback(''transport_popup_closecallback'',model,DialogFig,ud,ExtModeTable);', ... 121 | 'DialogUserData = ud;', ... 122 | ]; 123 | 124 | rtwoptions(7).prompt = 'Static memory allocation'; 125 | rtwoptions(7).type = 'Checkbox'; 126 | rtwoptions(7).default = 'off'; 127 | rtwoptions(7).tlcvariable = 'ExtModeStaticAlloc'; 128 | rtwoptions(7).makevariable = 'EXTMODE_STATIC_ALLOC'; 129 | rtwoptions(7).tooltip = ... 130 | ['Forces external mode to use static',sprintf('\n'), ... 131 | 'instead of dynamic memory allocation']; 132 | 133 | % Enable/disable external mode static allocation size selection. 134 | rtwoptions(7).callback = [ ... 135 | 'DialogFig = get(gcbo,''Parent'');',... 136 | 'sl(''extmodecallback'', ''staticmem_checkbox_callback'', DialogFig);', ... 137 | ]; 138 | 139 | % Synchronize with "External mode" checkbox option 140 | rtwoptions(7).opencallback = [ ... 141 | 'extmodecallback(''staticmem_checkbox_opencallback'',DialogFig);', ... 142 | ]; 143 | 144 | rtwoptions(8).prompt = 'Static memory buffer size'; 145 | rtwoptions(8).type = 'Edit'; 146 | rtwoptions(8).default = '1000000'; 147 | rtwoptions(8).tlcvariable = 'ExtModeStaticAllocSize'; 148 | rtwoptions(8).makevariable = 'EXTMODE_STATIC_ALLOC_SIZE'; 149 | rtwoptions(8).tooltip = ... 150 | ['Size of external mode static allocation buffer']; 151 | 152 | % Synchronize with "External mode static allocation" option 153 | rtwoptions(8).opencallback = [ ... 154 | 'extmodecallback(''staticmemsize_edit_opencallback'',DialogFig);', ... 155 | ]; 156 | 157 | rtwoptions(9).prompt = 'External mode testing'; 158 | rtwoptions(9).type = 'NonUI'; 159 | rtwoptions(9).default = '0'; 160 | rtwoptions(9).tlcvariable = 'ExtModeTesting'; 161 | rtwoptions(9).makevariable = 'TMW_EXTMODE_TESTING'; 162 | rtwoptions(9).tooltip = ... 163 | ['Internal testing flag for Simulink external mode']; 164 | 165 | %----------------------------------------% 166 | % Configure RTW code generation settings % 167 | %----------------------------------------% 168 | 169 | rtwgensettings.BuildDirSuffix = '_discon_rtw'; 170 | 171 | END_RTW_OPTIONS 172 | %/ 173 | %% The content between 'BEGIN_CONFIGSET_TARGET_COMPONENT' and 174 | %% 'END_CONFIGSET_TARGET_COMPONENT' is for the MathWorks internal use 175 | %% only. You must remove this section if you intend to use this file 176 | %% as a template for your own system target development. 177 | /% 178 | BEGIN_CONFIGSET_TARGET_COMPONENT 179 | 180 | targetComponentClass = 'Simulink.GRTTargetCC'; 181 | 182 | END_CONFIGSET_TARGET_COMPONENT 183 | %/ 184 | 185 | -------------------------------------------------------------------------------- /Simulink_64bit/discon_main.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 1994-2012 The MathWorks, Inc. 3 | * 4 | * File : classic_main.c 5 | * 6 | * Abstract: 7 | * A Generic "Real-Time (single tasking or pseudo-multitasking, 8 | * statically allocated data)" main that runs under most 9 | * operating systems. 10 | * 11 | * This file may be a useful starting point when targeting a new 12 | * processor or microcontroller. 13 | * 14 | * 15 | * Compiler specified defines: 16 | * RT - Required. 17 | * MODEL=modelname - Required. 18 | * NUMST=# - Required. Number of sample times. 19 | * NCSTATES=# - Required. Number of continuous states. 20 | * TID01EQ=1 or 0 - Optional. Only define to 1 if sample time task 21 | * id's 0 and 1 have equal rates. 22 | * MULTITASKING - Optional. (use MT for a synonym). 23 | * SAVEFILE - Optional (non-quoted) name of .mat file to create. 24 | * Default is .mat 25 | */ 26 | 27 | #include 28 | #include 29 | #include 30 | #include 31 | FILE *pFile; //Added by JW to read the init file 32 | 33 | #include "rtwtypes.h" 34 | # include "rtmodel.h" 35 | #include "rt_sim.h" 36 | #include "rt_logging.h" 37 | #ifdef UseMMIDataLogging 38 | #include "rt_logging_mmi.h" 39 | #endif 40 | 41 | #include "ext_work.h" 42 | 43 | 44 | 45 | /*=========* 46 | * Defines * 47 | *=========*/ 48 | 49 | #ifndef TRUE 50 | #define FALSE (0) 51 | #define TRUE (1) 52 | #endif 53 | 54 | #ifndef EXIT_FAILURE 55 | #define EXIT_FAILURE 1 56 | #endif 57 | #ifndef EXIT_SUCCESS 58 | #define EXIT_SUCCESS 0 59 | #endif 60 | 61 | #define QUOTE1(name) #name 62 | #define QUOTE(name) QUOTE1(name) /* need to expand name */ 63 | 64 | #ifndef RT 65 | # error "must define RT" 66 | #endif 67 | 68 | #ifndef MODEL 69 | # error "must define MODEL" 70 | #endif 71 | 72 | #ifndef NUMST 73 | # error "must define number of sample times, NUMST" 74 | #endif 75 | 76 | #ifndef NCSTATES 77 | # error "must define NCSTATES" 78 | #endif 79 | 80 | #ifndef SAVEFILE 81 | # define MATFILE2(file) #file ".mat" 82 | # define MATFILE1(file) MATFILE2(file) 83 | # define MATFILE MATFILE1(MODEL) 84 | #else 85 | # define MATFILE QUOTE(SAVEFILE) 86 | #endif 87 | 88 | #define RUN_FOREVER -1.0 89 | 90 | #define EXPAND_CONCAT(name1,name2) name1 ## name2 91 | #define CONCAT(name1,name2) EXPAND_CONCAT(name1,name2) 92 | #define RT_MODEL CONCAT(MODEL,_rtModel) 93 | 94 | #define EXPAND_CONCAT3(name1,name2,name3) name1 ## _ ## name2 ## . ## name3 95 | #define CONCAT3(name1,name2,name3) EXPAND_CONCAT3(name1,name2,name3) 96 | #define SIG_MODEL(suffix,name) CONCAT3(MODEL,suffix,name) 97 | 98 | #define NINT(a) ((a) >= 0.0 ? (int)((a)+0.5) : (int)((a)-0.5)) 99 | #define MIN(a,b) ((a)>(b)?(b):(a)) 100 | 101 | /*====================* 102 | * External functions * 103 | *====================*/ 104 | #ifdef __cplusplus 105 | 106 | extern "C" { 107 | 108 | #endif 109 | 110 | extern RT_MODEL *MODEL(void); 111 | 112 | extern void MdlInitializeSizes(void); 113 | extern void MdlInitializeSampleTimes(void); 114 | extern void MdlStart(void); 115 | extern void MdlOutputs(int_T tid); 116 | extern void MdlUpdate(int_T tid); 117 | extern void MdlTerminate(void); 118 | 119 | extern void __declspec(dllexport) __cdecl DISCON(float *avrSwap, int *aviFail, char *accInfile, char *avcOutname, char *avcMsg); 120 | 121 | #ifdef __cplusplus 122 | 123 | } 124 | #endif 125 | 126 | #if NCSTATES > 0 127 | #ifdef __cplusplus 128 | 129 | extern "C" { 130 | 131 | #endif 132 | extern void rt_ODECreateIntegrationData(RTWSolverInfo *si); 133 | extern void rt_ODEUpdateContinuousStates(RTWSolverInfo *si); 134 | #ifdef __cplusplus 135 | 136 | } 137 | #endif 138 | 139 | # define rt_CreateIntegrationData(S) \ 140 | rt_ODECreateIntegrationData(rtmGetRTWSolverInfo(S)); 141 | # define rt_UpdateContinuousStates(S) \ 142 | rt_ODEUpdateContinuousStates(rtmGetRTWSolverInfo(S)); 143 | # else 144 | # define rt_CreateIntegrationData(S) \ 145 | rtsiSetSolverName(rtmGetRTWSolverInfo(S),"FixedStepDiscrete"); 146 | # define rt_UpdateContinuousStates(S) /* Do Nothing */ 147 | #endif 148 | 149 | 150 | /*==================================* 151 | * Global data local to this module * 152 | *==================================*/ 153 | 154 | static struct { 155 | int_T stopExecutionFlag; 156 | int_T isrOverrun; 157 | int_T overrunFlags[NUMST]; 158 | int_T eventFlags[NUMST]; 159 | const char_T *errmsg; 160 | } GBLbuf; 161 | 162 | 163 | #ifdef EXT_MODE 164 | # define rtExtModeSingleTaskUpload(S) \ 165 | { \ 166 | int stIdx; \ 167 | rtExtModeUploadCheckTrigger(rtmGetNumSampleTimes(S)); \ 168 | for (stIdx=0; stIdx -w -port \n",QUOTE(MODEL)); 640 | (void) printf("arguments:\n"); 641 | (void) printf(" -tf - overrides final time specified in " 642 | "Simulink (inf for no limit).\n"); 643 | (void) printf(" -w - waits for Simulink to start model " 644 | "in External Mode.\n"); 645 | (void) printf(" -port - overrides 17725 default port in " 646 | "External Mode, valid range 256 to 65535.\n"); 647 | } 648 | 649 | /* This function is added by JW to read the external inputs from Bladed */ 650 | float* SetParams(float *avrSwap) 651 | { 652 | char mystring [200]; 653 | int iStatus; 654 | 655 | iStatus = NINT(avrSwap[0]); 656 | 657 | if (iStatus == 0) 658 | { 659 | pFile = fopen ("discon.in","r"); 660 | if (pFile == NULL) {avrSwap[128]=1;} 661 | else { 662 | fgets (mystring , 200 , pFile); 663 | avrSwap[119]=atof(mystring); 664 | fgets (mystring , 200 , pFile); 665 | avrSwap[120]=atof(mystring); 666 | fgets (mystring , 200 , pFile); 667 | avrSwap[121]=atof(mystring); 668 | fgets (mystring , 200 , pFile); 669 | avrSwap[122]=atof(mystring); 670 | fgets (mystring , 200 , pFile); 671 | avrSwap[123]=atof(mystring); 672 | fgets (mystring , 200 , pFile); 673 | avrSwap[124]=atof(mystring); 674 | fgets (mystring , 200 , pFile); 675 | avrSwap[125]=atof(mystring); 676 | fgets (mystring , 200 , pFile); 677 | avrSwap[126]=atof(mystring); 678 | fgets (mystring , 200 , pFile); 679 | avrSwap[127]=atof(mystring); 680 | fgets (mystring , 200 , pFile); 681 | avrSwap[128]=atof(mystring); 682 | fgets (mystring , 200 , pFile); 683 | avrSwap[129]=atof(mystring); 684 | fgets (mystring , 200 , pFile); 685 | avrSwap[130]=atof(mystring); 686 | fgets (mystring , 200 , pFile); 687 | avrSwap[131]=atof(mystring); 688 | fgets (mystring , 200 , pFile); 689 | avrSwap[132]=atof(mystring); 690 | fgets (mystring , 200 , pFile); 691 | avrSwap[133]=atof(mystring); 692 | fgets (mystring , 200 , pFile); 693 | avrSwap[134]=atof(mystring); 694 | fgets (mystring , 200 , pFile); 695 | avrSwap[135]=atof(mystring); 696 | fgets (mystring , 200 , pFile); 697 | avrSwap[136]=atof(mystring); 698 | fgets (mystring , 200 , pFile); 699 | avrSwap[137]=atof(mystring); 700 | fgets (mystring , 200 , pFile); 701 | avrSwap[138]=atof(mystring); 702 | fclose (pFile); 703 | } 704 | } 705 | return(avrSwap); 706 | } 707 | 708 | /*===================* 709 | * Visible functions * 710 | *===================*/ 711 | 712 | 713 | /* Function: main ============================================================= 714 | * 715 | * Abstract: 716 | * Execute model on a generic target such as a workstation. 717 | */ 718 | void __declspec(dllexport) __cdecl DISCON(float *avrSwap, int *aviFail, char *accInfile, char *avcOutname, char *avcMsg) 719 | { 720 | int iStatus, iFirstLog; 721 | char errorMsg[257], OutName[1025];// inFile[257]; 722 | float rTime, rSample, rGeneratorSpeed, rRatedSpeed, rBelowRatedPitch, 723 | rRotorAzimuth, rOP1RootMoment, rOP2RootMoment, rOP3RootMoment, rIP1RootMoment, rIP2RootMoment, rIP3RootMoment, 724 | rForeAftTower, rSideTower, rMeasuredPitch, rMeasuredTorque, rShaftTorque, 725 | rModeGain, rInit, rUserVar1, rUserVar2, rUserVar3, rUserVar4, rUserVar5, rUserVar6, rUserVar7, rUserVar8, rUserVar9, rUserVar10, 726 | rUserVar11,rUserVar12,rUserVar13,rUserVar14,rUserVar15,rUserVar16,rUserVar17,rUserVar18,rUserVar19,rUserVar20,rYawError,rYawBearingRate,rElectricalPower; 727 | static float rTorqueDemand, rPitchDemand, rBlade1Pitch, rBlade2Pitch, 728 | rBlade3Pitch, rYawRate, rLog1,rLog2,rLog3,rLog4,rLog5,rLog6,rLog7,rLog8,rLog9,rLog10,rLog11,rLog12,rLog13,rLog14,rLog15,rLog16,rLog17,rLog18,rLog19,rLog20; 729 | 730 | /* Take local copies of strings */ 731 | //memcpy(inFile, accInfile, NINT(avrSwap[49])); 732 | //inFile[NINT(avrSwap[49])+1] = '\0'; 733 | //memcpy(outName, avcOutname, NINT(avrSwap[50])); 734 | //outName[NINT(avrSwap[50])+1] = '\0'; 735 | 736 | /* Set message to blank */ 737 | memset(errorMsg, ' ', 257); 738 | 739 | /* Set constants JW turned this on, see function just above this call*/ 740 | SetParams(avrSwap); /*PF disable this call for Labview's sake*/ 741 | 742 | /* Load variables from Bladed (See Appendix A) */ 743 | iStatus = NINT(avrSwap[0]); 744 | rInit = avrSwap[0]; 745 | rUserVar1 = avrSwap[119]; 746 | rUserVar2 = avrSwap[120]; 747 | rUserVar3 = avrSwap[121]; 748 | rUserVar4 = avrSwap[122]; 749 | rUserVar5 = avrSwap[123]; 750 | rUserVar6 = avrSwap[124]; 751 | rUserVar7 = avrSwap[125]; 752 | rUserVar8 = avrSwap[126]; 753 | rUserVar9 = avrSwap[127]; 754 | rUserVar10 = avrSwap[128]; 755 | rUserVar11 = avrSwap[129]; 756 | rUserVar12 = avrSwap[130]; 757 | rUserVar13 = avrSwap[131]; 758 | rUserVar14 = avrSwap[132]; 759 | rUserVar15 = avrSwap[133]; 760 | rUserVar16 = avrSwap[134]; 761 | rUserVar17 = avrSwap[135]; 762 | rUserVar18 = avrSwap[136]; 763 | rUserVar19 = avrSwap[137]; 764 | rUserVar20 = avrSwap[138]; 765 | rTime = avrSwap[1]; 766 | rSample = avrSwap[2]; 767 | rMeasuredPitch = avrSwap[3]; 768 | rBelowRatedPitch = avrSwap[4]; 769 | rModeGain = avrSwap[15]; 770 | rRatedSpeed = avrSwap[18]; 771 | rGeneratorSpeed = avrSwap[19]; 772 | rMeasuredTorque = avrSwap[22]; /* this was number 22 but I believe it should be 108 but that is the LSS Torque */ 773 | rShaftTorque = avrSwap[108]; 774 | rOP1RootMoment = avrSwap[29]; 775 | rOP2RootMoment = avrSwap[30]; 776 | rOP3RootMoment = avrSwap[31]; 777 | rIP1RootMoment = avrSwap[68]; 778 | rIP2RootMoment = avrSwap[69]; 779 | rIP3RootMoment = avrSwap[70]; 780 | rForeAftTower = avrSwap[52]; 781 | rSideTower = avrSwap[53]; 782 | rRotorAzimuth = avrSwap[59]; 783 | rYawError = avrSwap[23]; 784 | rYawBearingRate = avrSwap[162]; 785 | rElectricalPower = avrSwap[14]; 786 | 787 | /* determine iStatus */ 788 | aviFail[0] = 0; 789 | if (iStatus == 0) { 790 | 791 | /* Initialize Controller */ 792 | aviFail[0] = initiateController(errorMsg); 793 | 794 | aviFail[0] = calcOutputController(rUserVar1, rUserVar2, rUserVar3, rUserVar4, rUserVar5,rUserVar6, rUserVar7, rUserVar8, rUserVar9, rUserVar10, 795 | rUserVar11,rUserVar12,rUserVar13,rUserVar14,rUserVar15,rUserVar16,rUserVar17,rUserVar18,rUserVar19,rUserVar20, rInit, rGeneratorSpeed, rRatedSpeed, 796 | rBelowRatedPitch, rForeAftTower, rSideTower, 797 | rRotorAzimuth, rOP1RootMoment, rOP2RootMoment, 798 | rOP3RootMoment, rIP1RootMoment, rIP2RootMoment, 799 | rIP3RootMoment, rMeasuredPitch, rMeasuredTorque, rShaftTorque, 800 | rModeGain, rYawError, rYawBearingRate, rElectricalPower, &rTorqueDemand, &rBlade1Pitch, 801 | &rBlade2Pitch, &rBlade3Pitch, &rPitchDemand, &errorMsg, &rYawRate, 802 | &rLog1,&rLog2,&rLog3,&rLog4,&rLog5,&rLog6,&rLog7,&rLog8,&rLog9,&rLog10,&rLog11,&rLog12,&rLog13,&rLog14,&rLog15,&rLog16,&rLog17,&rLog18,&rLog19,&rLog20); 803 | 804 | 805 | rPitchDemand = rMeasuredPitch; 806 | rTorqueDemand = rMeasuredTorque; 807 | sprintf(errorMsg, "Controller initialization complete"); 808 | } 809 | else if (iStatus >= 0) { 810 | /* Main calculation */ 811 | aviFail[0] = calcOutputController(rUserVar1, rUserVar2, rUserVar3, rUserVar4, rUserVar5,rUserVar6, rUserVar7, rUserVar8, rUserVar9, rUserVar10, 812 | rUserVar11,rUserVar12,rUserVar13,rUserVar14,rUserVar15,rUserVar16,rUserVar17,rUserVar18,rUserVar19,rUserVar20, rInit, rGeneratorSpeed, rRatedSpeed, 813 | rBelowRatedPitch, rForeAftTower, rSideTower, 814 | rRotorAzimuth, rOP1RootMoment, rOP2RootMoment, 815 | rOP3RootMoment, rIP1RootMoment, rIP2RootMoment, 816 | rIP3RootMoment, rMeasuredPitch, rMeasuredTorque, rShaftTorque, 817 | rModeGain, rYawError, rYawBearingRate, rElectricalPower, &rTorqueDemand, &rBlade1Pitch, 818 | &rBlade2Pitch, &rBlade3Pitch, &rPitchDemand, &errorMsg, &rYawRate, 819 | &rLog1,&rLog2,&rLog3,&rLog4,&rLog5,&rLog6,&rLog7,&rLog8,&rLog9,&rLog10,&rLog11,&rLog12,&rLog13,&rLog14,&rLog15,&rLog16,&rLog17,&rLog18,&rLog19,&rLog20); 820 | } 821 | else if (iStatus == -1) { 822 | /* Main calculation */ 823 | aviFail[0] = calcOutputController(rUserVar1, rUserVar2, rUserVar3, rUserVar4, rUserVar5,rUserVar6, rUserVar7, rUserVar8, rUserVar9, rUserVar10, 824 | rUserVar11,rUserVar12,rUserVar13,rUserVar14,rUserVar15,rUserVar16,rUserVar17,rUserVar18,rUserVar19,rUserVar20, rInit, rGeneratorSpeed, rRatedSpeed, 825 | rBelowRatedPitch, rForeAftTower, rSideTower, 826 | rRotorAzimuth, rOP1RootMoment, rOP2RootMoment, 827 | rOP3RootMoment, rIP1RootMoment, rIP2RootMoment, 828 | rIP3RootMoment, rMeasuredPitch, rMeasuredTorque, rShaftTorque, 829 | rModeGain, rYawError, rYawBearingRate, rElectricalPower, &rTorqueDemand, &rBlade1Pitch, 830 | &rBlade2Pitch, &rBlade3Pitch, &rPitchDemand, &errorMsg, &rYawRate, 831 | &rLog1,&rLog2,&rLog3,&rLog4,&rLog5,&rLog6,&rLog7,&rLog8,&rLog9,&rLog10,&rLog11,&rLog12,&rLog13,&rLog14,&rLog15,&rLog16,&rLog17,&rLog18,&rLog19,&rLog20); 832 | 833 | /* Perform Cleanup */ 834 | aviFail[0] = performCleanup(errorMsg); 835 | } 836 | else { 837 | aviFail[0] = -1; 838 | sprintf(errorMsg, "iStatus is not recognized: %d", iStatus); 839 | } 840 | 841 | /* Store variables to Bladed (See Appendix A) */ 842 | avrSwap[9] = 0; /* Pitch Angle */ 843 | avrSwap[27] = 1; /* Individual Pitch control */ 844 | avrSwap[34] = 1; /* Generator contactor status */ 845 | avrSwap[35] = 0; /* Shaft brake status: 0=off */ 846 | avrSwap[40] = 0; /* Demanded yaw actuator torque */ 847 | avrSwap[41] = rBlade1Pitch; /* Blade 1 pitch angle demand */ 848 | avrSwap[42] = rBlade2Pitch; /* Blade 2 pitch angle demand */ 849 | avrSwap[43] = rBlade3Pitch; /* Blade 3 pitch angle demand */ 850 | avrSwap[44] = rPitchDemand; /* Pitch angle demand CPC*/ 851 | avrSwap[46] = rTorqueDemand; /* Generator torque demand */ 852 | avrSwap[47] = rYawRate; /* Demanded nacelle yaw rate */ 853 | avrSwap[54] = 0; /* Pitch override */ 854 | avrSwap[55] = 0; /* Torque override */ 855 | avrSwap[71] = 0; /* Generator start-up resistance */ 856 | avrSwap[78] = 1; /* Request for loads: 0=none */ 857 | avrSwap[79] = 0; /* Variable slip current status */ 858 | avrSwap[80] = 0; /* Variable slip current demand */ 859 | 860 | // To read the log variables in bladed (JW) 861 | avrSwap[64] =0; /* Number of variables returned for logging */ 862 | iFirstLog = NINT(avrSwap[62])-1; //added also this iFirstLog as an integer 863 | strcpy(OutName, "Log1:-;Log2:-;Log3:-;Log4:-;Log5:-;Log6:-;Log7:-;Log8:-;Log9:-;Log10:-;Log11:-;Log12:-;Log13:-;Log14:-;Log15:-;Log16:-;Log17:-;Log18:-;Log19:-;Log20:-;"); //Names and units 864 | avrSwap[iFirstLog] =rLog1; /*avrSwap[144] = rLog1;*/ 865 | avrSwap[iFirstLog+1] =rLog2; /*avrSwap[144] = rLog2;*/ 866 | avrSwap[iFirstLog+2] =rLog3; /*avrSwap[144] = rLog3;*/ 867 | avrSwap[iFirstLog+3] =rLog4; /*avrSwap[144] = rLog4;*/ 868 | avrSwap[iFirstLog+4] =rLog5; /*avrSwap[144] = rLog5;*/ 869 | avrSwap[iFirstLog+5] =rLog6; /*avrSwap[144] = rLog6;*/ 870 | avrSwap[iFirstLog+6] =rLog7; /*avrSwap[144] = rLog7;*/ 871 | avrSwap[iFirstLog+7] =rLog8; /*avrSwap[144] = rLog8;*/ 872 | avrSwap[iFirstLog+8] =rLog9; /*avrSwap[144] = rLog9;*/ 873 | avrSwap[iFirstLog+9] =rLog10; /*avrSwap[144] = rLog10;*/ 874 | avrSwap[iFirstLog+10] =rLog11; /*avrSwap[144] = rLog11;*/ 875 | avrSwap[iFirstLog+11] =rLog12; /*avrSwap[144] = rLog12;*/ 876 | avrSwap[iFirstLog+12] =rLog13; /*avrSwap[144] = rLog13;*/ 877 | avrSwap[iFirstLog+13] =rLog14; /*avrSwap[144] = rLog14;*/ 878 | avrSwap[iFirstLog+14] =rLog15; /*avrSwap[144] = rLog15;*/ 879 | avrSwap[iFirstLog+15] =rLog16; /*avrSwap[144] = rLog16;*/ 880 | avrSwap[iFirstLog+16] =rLog17; /*avrSwap[144] = rLog17;*/ 881 | avrSwap[iFirstLog+17] =rLog18; /*avrSwap[144] = rLog18;*/ 882 | avrSwap[iFirstLog+18] =rLog19; /*avrSwap[144] = rLog19;*/ 883 | avrSwap[iFirstLog+19] =rLog20; /*avrSwap[144] = rLog20;*/ 884 | 885 | //Return strings 886 | memcpy(avcOutname,OutName, NINT(avrSwap[63])); 887 | memcpy(avcMsg,errorMsg,MIN(256,NINT(avrSwap[48]))); 888 | 889 | return; 890 | } 891 | /* end DISON */ 892 | 893 | 894 | 895 | /* EOF: discon_main.c */ 896 | -------------------------------------------------------------------------------- /Simulink_64bit/discon_vc.tmf: -------------------------------------------------------------------------------- 1 | # Copyright 1994-2014 The MathWorks, Inc. 2 | # 3 | # File : discon_vc.tmf $Revision: 1.71.4.31 $ 4 | # 5 | # Abstract: 6 | # Template makefile for building a Windows-based stand-alone generic 7 | # real-time version of Simulink model using generated C code and the 8 | 9 | # Microsoft Visual C/C++ compiler versions: 6.0, 7.1, 8.0 10 | # 11 | # Note that this template is automatically customized by the build 12 | # procedure to create ".mk" 13 | # 14 | # The following defines can be used to modify the behavior of the 15 | # build: 16 | # 17 | # OPT_OPTS - Optimization option. See DEFAULT_OPT_OPTS in 18 | # vctools.mak for default. 19 | # OPTS - User specific options. 20 | # CPP_OPTS - C++ compiler options. 21 | # USER_SRCS - Additional user sources, such as files needed by 22 | # S-functions. 23 | # USER_INCLUDES - Additional include paths 24 | # (i.e. USER_INCLUDES="-Iwhere-ever -Iwhere-ever2") 25 | # 26 | # To enable debugging: 27 | # set DEBUG_BUILD = 1, which will trigger OPTS=-Zi (may vary with 28 | # compiler version, see compiler doc) 29 | # 30 | # This template makefile is designed to be used with a system target 31 | # file that contains 'rtwgensettings.BuildDirSuffix' see grt.tlc 32 | 33 | 34 | #------------------------ Macros read by make_rtw ----------------------------- 35 | # 36 | # The following macros are read by the build procedure: 37 | # 38 | # MAKECMD - This is the command used to invoke the make utility 39 | # HOST - What platform this template makefile is targeted for 40 | # (i.e. PC or UNIX) 41 | # BUILD - Invoke make from the build procedure (yes/no)? 42 | # SYS_TARGET_FILE - Name of system target file. 43 | 44 | MAKECMD = nmake 45 | HOST = PC 46 | BUILD = yes 47 | SYS_TARGET_FILE = discon.tlc 48 | BUILD_SUCCESS = ^#^#^# Created 49 | COMPILER_TOOL_CHAIN = vc 50 | 51 | #---------------------- Tokens expanded by make_rtw --------------------------- 52 | # 53 | # The following tokens, when wrapped with "|>" and "<|" are expanded by the 54 | # build procedure. 55 | # 56 | # MODEL_NAME - Name of the Simulink block diagram 57 | # MODEL_MODULES - Any additional generated source modules 58 | # MAKEFILE_NAME - Name of makefile created from template makefile .mk 59 | # MATLAB_ROOT - Path to where MATLAB is installed. 60 | # MATLAB_BIN - Path to MATLAB executable. 61 | # S_FUNCTIONS - List of S-functions. 62 | # S_FUNCTIONS_LIB - List of S-functions libraries to link. 63 | # SOLVER - Solver source file name 64 | # NUMST - Number of sample times 65 | # TID01EQ - yes (1) or no (0): Are sampling rates of continuous task 66 | # (tid=0) and 1st discrete task equal. 67 | # NCSTATES - Number of continuous states 68 | # BUILDARGS - Options passed in at the command line. 69 | # MULTITASKING - yes (1) or no (0): Is solver mode multitasking 70 | # MAT_FILE - yes (1) or no (0): Should mat file logging be done 71 | # EXT_MODE - yes (1) or no (0): Build for external mode 72 | # TMW_EXTMODE_TESTING - yes (1) or no (0): Build ext_test.c for external mode 73 | # testing. 74 | # EXTMODE_TRANSPORT - Index of transport mechanism (e.g. tcpip, serial) for extmode 75 | # EXTMODE_STATIC - yes (1) or no (0): Use static instead of dynamic mem alloc. 76 | # EXTMODE_STATIC_SIZE - Size of static memory allocation buffer. 77 | # MEX_OPT_FILE - mex option file name 78 | # VISUAL_VER - Visual C++ version information 79 | 80 | MODEL = |>MODEL_NAME<| 81 | MODULES = |>MODEL_MODULES<| 82 | MAKEFILE = |>MAKEFILE_NAME<| 83 | MATLAB_ROOT = |>MATLAB_ROOT<| 84 | ALT_MATLAB_ROOT = |>ALT_MATLAB_ROOT<| 85 | MATLAB_BIN = |>MATLAB_BIN<| 86 | ALT_MATLAB_BIN = |>ALT_MATLAB_BIN<| 87 | MASTER_ANCHOR_DIR = |>MASTER_ANCHOR_DIR<| 88 | START_DIR = |>START_DIR<| 89 | S_FUNCTIONS = |>S_FUNCTIONS<| 90 | S_FUNCTIONS_LIB = |>S_FUNCTIONS_LIB<| 91 | NUMST = |>NUMST<| 92 | TID01EQ = |>TID01EQ<| 93 | NCSTATES = |>NCSTATES<| 94 | BUILDARGS = |>BUILDARGS<| 95 | MULTITASKING = |>MULTITASKING<| 96 | MAT_FILE = |>MAT_FILE<| 97 | EXT_MODE = |>EXT_MODE<| 98 | TMW_EXTMODE_TESTING = |>TMW_EXTMODE_TESTING<| 99 | EXTMODE_TRANSPORT = |>EXTMODE_TRANSPORT<| 100 | EXTMODE_STATIC = |>EXTMODE_STATIC_ALLOC<| 101 | EXTMODE_STATIC_SIZE = |>EXTMODE_STATIC_ALLOC_SIZE<| 102 | 103 | CODE_INTERFACE_PACKAGING = |>CODE_INTERFACE_PACKAGING<| 104 | 105 | CLASSIC_INTERFACE = |>CLASSIC_INTERFACE<| 106 | # Optional for GRT 107 | ALLOCATIONFCN = |>GENERATE_ALLOC_FCN<| 108 | ONESTEPFCN = |>COMBINE_OUTPUT_UPDATE_FCNS<| 109 | TERMFCN = 1 110 | MULTI_INSTANCE_CODE = |>MULTI_INSTANCE_CODE<| 111 | 112 | MODELREFS = |>MODELREFS<| 113 | SHARED_SRC = |>SHARED_SRC<| 114 | SHARED_SRC_DIR = |>SHARED_SRC_DIR<| 115 | SHARED_BIN_DIR = |>SHARED_BIN_DIR<| 116 | SHARED_LIB = |>SHARED_LIB<| 117 | TARGET_LANG_EXT = |>TARGET_LANG_EXT<| 118 | MEX_OPT_FILE = |>MEX_OPT_FILE<| 119 | VISUAL_VER = |>VISUAL_VER<| 120 | OPTIMIZATION_FLAGS = |>OPTIMIZATION_FLAGS<| 121 | ADDITIONAL_LDFLAGS = |>ADDITIONAL_LDFLAGS<| 122 | 123 | # To enable debugging: 124 | # set DEBUG_BUILD = 1 125 | DEBUG_BUILD = 0 126 | 127 | #--------------------------- Model and reference models ----------------------- 128 | MODELLIB = |>MODELLIB<| 129 | MODELREF_LINK_LIBS = |>MODELREF_LINK_LIBS<| 130 | MODELREF_LINK_RSPFILE = |>MODELREF_LINK_RSPFILE_NAME<| 131 | MODELREF_INC_PATH = |>START_MDLREFINC_EXPAND_INCLUDES<|-I|>MODELREF_INC_PATH<| |>END_MDLREFINC_EXPAND_INCLUDES<| 132 | RELATIVE_PATH_TO_ANCHOR = |>RELATIVE_PATH_TO_ANCHOR<| 133 | MODELREF_TARGET_TYPE = |>MODELREF_TARGET_TYPE<| 134 | 135 | !if "$(MATLAB_ROOT)" != "$(ALT_MATLAB_ROOT)" 136 | MATLAB_ROOT = $(ALT_MATLAB_ROOT) 137 | !endif 138 | !if "$(MATLAB_BIN)" != "$(ALT_MATLAB_BIN)" 139 | MATLAB_BIN = $(ALT_MATLAB_BIN) 140 | !endif 141 | 142 | #--------------------------- Tool Specifications ------------------------------ 143 | 144 | !include $(MATLAB_ROOT)\rtw\c\tools\vctools.mak 145 | 146 | PERL = $(MATLAB_ROOT)\sys\perl\win32\bin\perl 147 | #------------------------------ Include/Lib Path ------------------------------ 148 | 149 | MATLAB_INCLUDES = $(MATLAB_ROOT)\simulink\include 150 | MATLAB_INCLUDES = $(MATLAB_INCLUDES);$(MATLAB_ROOT)\extern\include 151 | MATLAB_INCLUDES = $(MATLAB_INCLUDES);$(MATLAB_ROOT)\rtw\c\src 152 | MATLAB_INCLUDES = $(MATLAB_INCLUDES);$(MATLAB_ROOT)\rtw\c\src\ext_mode\common 153 | 154 | # Additional file include paths 155 | |>START_EXPAND_INCLUDES<| 156 | MATLAB_INCLUDES = $(MATLAB_INCLUDES);|>EXPAND_DIR_NAME<||>END_EXPAND_INCLUDES<| 157 | 158 | INCLUDE = .;$(RELATIVE_PATH_TO_ANCHOR);$(MATLAB_INCLUDES);$(INCLUDE) 159 | 160 | !if "$(SHARED_SRC_DIR)" != "" 161 | INCLUDE = $(INCLUDE);$(SHARED_SRC_DIR) 162 | !endif 163 | 164 | #------------------------ External mode --------------------------------------- 165 | # Uncomment -DVERBOSE to have information printed to stdout 166 | # To add a new transport layer, see the comments in 167 | # /toolbox/simulink/simulink/extmode_transports.m 168 | !if $(EXT_MODE) == 1 169 | EXT_CC_OPTS = -DEXT_MODE # -DVERBOSE 170 | !if $(EXTMODE_TRANSPORT) == 0 #tcpip 171 | EXT_SRC = ext_svr.c updown.c ext_work.c rtiostream_interface.c rtiostream_tcpip.c 172 | EXT_LIB = wsock32.lib 173 | !endif 174 | !if $(EXTMODE_TRANSPORT) == 1 #serial_win32 175 | EXT_SRC = ext_svr.c updown.c ext_work.c ext_svr_serial_transport.c 176 | EXT_SRC = $(EXT_SRC) ext_serial_pkt.c rtiostream_serial_interface.c rtiostream_serial.c 177 | EXT_LIB = 178 | !endif 179 | !if $(TMW_EXTMODE_TESTING) == 1 180 | EXT_SRC = $(EXT_SRC) ext_test.c 181 | EXT_CC_OPTS = $(EXT_CC_OPTS) -DTMW_EXTMODE_TESTING 182 | !endif 183 | !if $(EXTMODE_STATIC) == 1 184 | EXT_SRC = $(EXT_SRC) mem_mgr.c 185 | EXT_CC_OPTS = $(EXT_CC_OPTS) -DEXTMODE_STATIC -DEXTMODE_STATIC_SIZE=$(EXTMODE_STATIC_SIZE) 186 | !endif 187 | !else 188 | EXT_SRC = 189 | EXT_CC_OPTS = 190 | EXT_LIB = 191 | !endif 192 | 193 | #------------------------ rtModel ---------------------------------------------- 194 | 195 | RTM_CC_OPTS = -DUSE_RTMODEL 196 | 197 | #----------------- Compiler and Linker Options -------------------------------- 198 | 199 | # Optimization Options 200 | OPT_OPTS = $(DEFAULT_OPT_OPTS) 201 | 202 | # General User Options 203 | !if "$(DEBUG_BUILD)" == "0" 204 | DBG_FLAG = 205 | !else 206 | # Set OPT_OPTS=-Zi and any additional flags for debugging 207 | DBG_FLAG = -Zi 208 | !endif 209 | 210 | !if "$(OPTIMIZATION_FLAGS)" != "" 211 | CC_OPTS = $(OPTS) $(EXT_CC_OPTS) $(RTM_CC_OPTS) $(OPTIMIZATION_FLAGS) 212 | !else 213 | CC_OPTS = $(OPT_OPTS) $(OPTS) $(EXT_CC_OPTS) $(RTM_CC_OPTS) 214 | !endif 215 | CPP_REQ_DEFINES = -DMODEL=$(MODEL) -DRT -DNUMST=$(NUMST) \ 216 | -DTID01EQ=$(TID01EQ) -DNCSTATES=$(NCSTATES) \ 217 | -DMT=$(MULTITASKING) -DHAVESTDIO -DMAT_FILE=$(MAT_FILE) \ 218 | -DONESTEPFCN=$(ONESTEPFCN) -DTERMFCN=$(TERMFCN) \ 219 | -DMULTI_INSTANCE_CODE=$(MULTI_INSTANCE_CODE) \ 220 | -DCLASSIC_INTERFACE=$(CLASSIC_INTERFACE) \ 221 | -DALLOCATIONFCN=$(ALLOCATIONFCN) 222 | 223 | # Uncomment this line to move warning level to W4 224 | # cflags = $(cflags:W3=W4) 225 | CFLAGS = $(MODELREF_INC_PATH) $(cflags) $(cvarsmt) $(CFLAGS_VERSPECIFIC)\ 226 | $(DBG_FLAG) $(CC_OPTS) $(CPP_REQ_DEFINES) $(USER_INCLUDES) 227 | CPPFLAGS = $(MODELREF_INC_PATH) $(cflags) $(cvarsmt) $(CPPFLAGS_VERSPECIFIC)\ 228 | $(DBG_FLAG) $(CPP_OPTS) $(CC_OPTS) $(CPP_REQ_DEFINES) $(USER_INCLUDES) 229 | LDFLAGS = $(ldebug) $(conflags) $(EXT_LIB) $(conlibsmt) libcpmt.lib $(ADDITIONAL_LDFLAGS) 230 | 231 | 232 | # libcpmt.lib is the multi-threaded, static lib version of the C++ standard lib 233 | 234 | #----------------------------- Source Files ----------------------------------- 235 | 236 | 237 | #Dynamic library 238 | !if "$(MODELREF_TARGET_TYPE)" == "NONE" 239 | PRODUCT = $(RELATIVE_PATH_TO_ANCHOR)\DISCON.dll 240 | 241 | !if "$(CLASSIC_INTERFACE)" == "1" 242 | MAIN_SRC = classic_main.c 243 | OTHER_SRC = rt_sim.c 244 | !else 245 | !if "$(MULTI_INSTANCE_CODE)" == "1" 246 | !if "$(CODE_INTERFACE_PACKAGING)" == "C++ class" 247 | MAIN_SRC = rt_cppclass_main.cpp 248 | !else 249 | MAIN_SRC = rt_malloc_main.c 250 | !endif 251 | !else 252 | MAIN_SRC = rt_main.c 253 | !endif 254 | OTHER_SRC = 255 | !endif 256 | REQ_SRCS = $(MODEL).$(TARGET_LANG_EXT) $(MODULES) \ 257 | discon_main.c rt_sim.c $(EXT_SRC) 258 | 259 | #Model Reference Target 260 | !else 261 | PRODUCT = $(MODELLIB) 262 | REQ_SRCS = $(MODULES) 263 | !endif 264 | 265 | USER_SRCS = 266 | 267 | SRCS = $(REQ_SRCS) $(USER_SRCS) $(S_FUNCTIONS) 268 | OBJS_CPP_UPPER = $(SRCS:.CPP=.obj) 269 | OBJS_CPP_LOWER = $(OBJS_CPP_UPPER:.cpp=.obj) 270 | OBJS_C_UPPER = $(OBJS_CPP_LOWER:.C=.obj) 271 | OBJS = $(OBJS_C_UPPER:.c=.obj) 272 | SHARED_OBJS = $(SHARED_BIN_DIR)\*.obj 273 | # ------------------------- Additional Libraries ------------------------------ 274 | 275 | LIBS = 276 | |>START_PRECOMP_LIBRARIES<| 277 | !if "$(OPT_OPTS)" == "$(DEFAULT_OPT_OPTS)" 278 | LIBS = $(LIBS) |>EXPAND_LIBRARY_LOCATION<|\|>EXPAND_LIBRARY_NAME<|_vc.lib 279 | !else 280 | LIBS = $(LIBS) |>EXPAND_LIBRARY_NAME<|.lib 281 | !endif |>END_PRECOMP_LIBRARIES<| 282 | |>START_EXPAND_LIBRARIES<| 283 | LIBS = $(LIBS) |>EXPAND_LIBRARY_NAME<|.lib |>END_EXPAND_LIBRARIES<| 284 | LIBS = $(LIBS) 285 | 286 | # ---------------------------- Linker Script ---------------------------------- 287 | 288 | CMD_FILE = $(MODEL).lnk 289 | GEN_LNK_SCRIPT = $(MATLAB_ROOT)\rtw\c\tools\mkvc_lnk.pl 290 | 291 | #--------------------------------- Rules -------------------------------------- 292 | all: set_environment_variables $(PRODUCT) 293 | 294 | !if "$(MODELREF_TARGET_TYPE)" == "NONE" 295 | #--- Stand-alone model --- 296 | $(PRODUCT) : $(OBJS) $(SHARED_LIB) $(LIBS) $(MODELREF_LINK_LIBS) 297 | @cmd /C "echo ### Linking ..." 298 | $(PERL) $(GEN_LNK_SCRIPT) $(CMD_FILE) $(OBJS) 299 | $(LD) /DLL $(LDFLAGS) $(S_FUNCTIONS_LIB) $(SHARED_LIB) $(LIBS) $(MAT_LIBS) @$(CMD_FILE) @$(MODELREF_LINK_RSPFILE) -out:$@ 300 | @del $(CMD_FILE) 301 | @cmd /C "echo $(BUILD_SUCCESS) dynamic library DISCON.dll" 302 | !else 303 | #--- Model reference Coder Target --- 304 | $(PRODUCT) : $(OBJS) $(SHARED_LIB) 305 | @cmd /C "echo ### Linking ..." 306 | $(PERL) $(GEN_LNK_SCRIPT) $(CMD_FILE) $(OBJS) 307 | $(LD) -lib /OUT:$(MODELLIB) @$(CMD_FILE) $(S_FUNCTIONS_LIB) 308 | @cmd /C "echo $(BUILD_SUCCESS) static library $(MODELLIB)" 309 | !endif 310 | 311 | !if "$(CLASSIC_INTERFACE)" == "1" 312 | !if "$(TARGET_LANG_EXT)" == "cpp" 313 | {$(MATLAB_ROOT)\rtw\c\grt}.c.obj : 314 | @cmd /C "echo ### Compiling $<" 315 | $(CC) /TP $(CPPFLAGS) $< 316 | !else 317 | {$(MATLAB_ROOT)\rtw\c\grt}.c.obj : 318 | @cmd /C "echo ### Compiling $<" 319 | $(CC) $(CFLAGS) $< 320 | !endif 321 | !else 322 | !if "$(TARGET_LANG_EXT)" == "cpp" 323 | {$(MATLAB_ROOT)\rtw\c\src\common}.cpp.obj : 324 | @cmd /C "echo ### Compiling $<" 325 | $(CC) /TP $(CPPFLAGS) $< 326 | 327 | {$(MATLAB_ROOT)\rtw\c\src\common}.c.obj : 328 | @cmd /C "echo ### Compiling $<" 329 | $(CC) /TP $(CPPFLAGS) $< 330 | !else 331 | {$(MATLAB_ROOT)\rtw\c\src\common}.c.obj : 332 | @cmd /C "echo ### Compiling $<" 333 | $(CC) $(CFLAGS) $< 334 | !endif 335 | !endif 336 | 337 | {$(MATLAB_ROOT)\rtw\c\src}.c.obj : 338 | @cmd /C "echo ### Compiling $<" 339 | $(CC) $(CFLAGS) $< 340 | 341 | {$(MATLAB_ROOT)\rtw\c\src\ext_mode\common}.c.obj : 342 | @cmd /C "echo ### Compiling $<" 343 | $(CC) $(CFLAGS) $< 344 | 345 | {$(MATLAB_ROOT)\rtw\c\src\rtiostream\rtiostreamtcpip}.c.obj : 346 | @cmd /C "echo ### Compiling $<" 347 | $(CC) $(CFLAGS) $< 348 | 349 | {$(MATLAB_ROOT)\rtw\c\src\ext_mode\serial}.c.obj : 350 | @cmd /C "echo ### Compiling $<" 351 | $(CC) $(CFLAGS) $< 352 | 353 | {$(MATLAB_ROOT)\rtw\c\src\ext_mode\custom}.c.obj : 354 | @cmd /C "echo ### Compiling $<" 355 | $(CC) $(CFLAGS) $< 356 | 357 | # Additional sources 358 | 359 | |>START_EXPAND_RULES<|{|>EXPAND_DIR_NAME<|}.c.obj : 360 | @cmd /C "echo ### Compiling $<" 361 | $(CC) $(CFLAGS) $< 362 | 363 | |>END_EXPAND_RULES<| 364 | 365 | |>START_EXPAND_RULES<|{|>EXPAND_DIR_NAME<|}.cpp.obj : 366 | @cmd /C "echo ### Compiling $<" 367 | $(CC) $(CPPFLAGS) $< 368 | 369 | |>END_EXPAND_RULES<| 370 | 371 | # Look in simulink/src helper files 372 | 373 | {$(MATLAB_ROOT)\simulink\src}.c.obj : 374 | @cmd /C "echo ### Compiling $<" 375 | $(CC) $(CFLAGS) $< 376 | 377 | {$(MATLAB_ROOT)\simulink\src}.cpp.obj : 378 | @cmd /C "echo ### Compiling $<" 379 | $(CC) $(CPPFLAGS) $< 380 | 381 | # Put these rule last, otherwise nmake will check toolboxes first 382 | 383 | {$(RELATIVE_PATH_TO_ANCHOR)}.c.obj : 384 | @cmd /C "echo ### Compiling $<" 385 | $(CC) $(CFLAGS) $< 386 | 387 | {$(RELATIVE_PATH_TO_ANCHOR)}.cpp.obj : 388 | @cmd /C "echo ### Compiling $<" 389 | $(CC) $(CPPFLAGS) $< 390 | 391 | .c.obj : 392 | @cmd /C "echo ### Compiling $<" 393 | $(CC) $(CFLAGS) $< 394 | 395 | .cpp.obj : 396 | @cmd /C "echo ### Compiling $<" 397 | $(CC) $(CPPFLAGS) $< 398 | 399 | !if "$(SHARED_LIB)" != "" 400 | $(SHARED_LIB) : $(SHARED_SRC) 401 | @cmd /C "echo ### Creating $@" 402 | @$(CC) $(CFLAGS) -Fo$(SHARED_BIN_DIR)\ @<< 403 | $? 404 | << 405 | @$(LIBCMD) /nologo /out:$@ $(SHARED_OBJS) 406 | @cmd /C "echo ### $@ Created" 407 | !endif 408 | 409 | 410 | set_environment_variables: 411 | @set INCLUDE=$(INCLUDE) 412 | @set LIB=$(LIB) 413 | 414 | # Libraries: 415 | 416 | |>START_EXPAND_LIBRARIES<|MODULES_|>EXPAND_LIBRARY_NAME<| = \ 417 | |>START_EXPAND_MODULES<| |>EXPAND_MODULE_NAME<|.obj \ 418 | |>END_EXPAND_MODULES<| 419 | 420 | |>EXPAND_LIBRARY_NAME<|.lib : rtw_proj.tmw $(MAKEFILE) $(MODULES_|>EXPAND_LIBRARY_NAME<|) 421 | @cmd /C "echo ### Creating $@" 422 | $(LIBCMD) /nologo /out:$@ $(MODULES_|>EXPAND_LIBRARY_NAME<|) 423 | @cmd /C "echo ### $@ Created" 424 | 425 | |>END_EXPAND_LIBRARIES<| 426 | 427 | |>START_PRECOMP_LIBRARIES<|MODULES_|>EXPAND_LIBRARY_NAME<| = \ 428 | |>START_EXPAND_MODULES<| |>EXPAND_MODULE_NAME<|.obj \ 429 | |>END_EXPAND_MODULES<| 430 | 431 | |>EXPAND_LIBRARY_NAME<|.lib : rtw_proj.tmw $(MAKEFILE) $(MODULES_|>EXPAND_LIBRARY_NAME<|) 432 | @cmd /C "echo ### Creating $@" 433 | $(LIBCMD) /nologo /out:$@ $(MODULES_|>EXPAND_LIBRARY_NAME<|) 434 | @cmd /C "echo ### $@ Created" 435 | 436 | |>END_PRECOMP_LIBRARIES<| 437 | 438 | #----------------------------- Dependencies ----------------------------------- 439 | 440 | $(OBJS) : $(MAKEFILE) rtw_proj.tmw 441 | --------------------------------------------------------------------------------