{"id":27,"date":"2008-08-21T22:30:54","date_gmt":"2008-08-22T03:30:54","guid":{"rendered":"https:\/\/blogs.mathworks.com\/seth\/2008\/08\/21\/mask-initialization-and-self-modifying-blocks\/"},"modified":"2008-08-21T22:45:24","modified_gmt":"2008-08-22T03:45:24","slug":"mask-initialization-and-self-modifying-blocks","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/simulink\/2008\/08\/21\/mask-initialization-and-self-modifying-blocks\/","title":{"rendered":"Mask Initialization and Self-Modifying Blocks"},"content":{"rendered":"<p>In previous posts, I introduced <a\r\nhref=\"https:\/\/blogs.mathworks.com\/seth\/2008\/08\/05\/advanced-masking-concepts\/\">advanced\r\nmasking concepts<\/a> and discussed how to build a masked library block with a <a\r\nhref=\"https:\/\/blogs.mathworks.com\/seth\/2008\/08\/13\/dynamic-mask-dialogs\/\">dynamic\r\nmask dialog<\/a>.\u00a0\u00a0 In this post, I will show how the example Saturation block\r\nadds\/deletes ports and rewires itself depending on its configuration.<\/p>\r\n\r\n<p><strong>The Saturation Block Example<\/strong><\/p>\r\n\r\n<p><img decoding=\"async\" src=\"https:\/\/blogs.mathworks.com\/images\/seth\/2008Q3\/dynamicBlock.gif\" alt=\"Animation of the saturation block mask.\" border=\"1\"><\/p>\r\n\r\n<p>After configuring the block dialog, clicking Apply or OK\r\nexecutes the mask initialization callback.\u00a0 The mask initialization callback is\r\nwhere most of the work for a mask happens.\u00a0 Mask initialization commands should\r\ntake the parameter values set in the mask dialog and configure the block so it\r\nis ready to run.\u00a0 In the Saturation block example, the block is switching\r\nbetween two basic configurations, the Dynamic Saturation and the Fixed\r\nSaturation.<\/p>\r\n\r\n<p><img decoding=\"async\" src=\"https:\/\/blogs.mathworks.com\/images\/seth\/2008Q3\/startingBlocksPortOrConstants.png\" alt=\"Saturation blocks using constants and ports\"><\/p>\r\n\r\n<p>The difference between the configurations is the type of\r\nblock used for up and lo.\u00a0 They are ports to provide dynamic limits, and\r\nconstants to provide fixed limits.<\/p>\r\n\r\n<p><strong>Key point:<\/strong> do the least amount of work that you can\r\nin the mask initialization.<\/p>\r\n\r\n<p>Mask initialization code should do the minimum amount of\r\nwork that it can because mask initialization runs many times in the life of a\r\nmodel.\u00a0 In addition to running when you click OK or Apply, mask initialization runs\r\nat the start of every simulation and update diagram, when you call set_param to\r\nmodify the block, and when you are building the model as you drop the block\r\ninto the system.<\/p>\r\n\r\n<p>The mask parameters are the variable names set on the\r\nparameters page of the mask editor. (See below)<\/p>\r\n\r\n<p><img decoding=\"async\" src=\"https:\/\/blogs.mathworks.com\/images\/seth\/2008Q3\/saturationMaskParameters.png\" alt=\"Saturation block mask editor parameters\"><\/p>\r\n\r\n<p>Blocks in the system under the mask can access these variables\r\nin the mask workspace.\u00a0 Initialization commands also run in the mask workspace,\r\nso these variables are part of the mask initialization callback. (see below)\u00a0 If\r\na block will rewire itself, or add ports, you must check <em>Allow library block\r\nto modify its contents<\/em>.<\/p>\r\n\r\n<p><img decoding=\"async\" src=\"https:\/\/blogs.mathworks.com\/images\/seth\/2008Q3\/saturationMaskInitialization.png\" alt=\"Mask editor initialization page\"><\/p>\r\n\r\n<p>For the saturation block, I chose to call an M-function to\r\ndo the work of the initialization command.\u00a0 I find it is more convenient to\r\ndebug and the MATLAB editor is a more comfortable development for mask\r\ninitialization commands that are more than a few lines.<\/p>\r\n\r\n<p><strong>Use the state of the mask GUI to control the code<\/strong><\/p>\r\n\r\n<p>My function is saturation_init_cb.\u00a0 I pass into the function\r\nall the variables it needs from the mask workspace.\u00a0 This is more efficient\r\nthan calling get_param on the block.\u00a0 I always pass in the result of <a\r\nhref=\"https:\/\/www.mathworks.com\/help\/simulink\/slref\/gcb.html\">gcb<\/a>\r\n(<strong>g<\/strong>et pathname of <strong>c<\/strong>urrent <strong>b<\/strong>lock).\u00a0 I will use this path\r\nwhen I need to reference the blocks inside the saturation block subsystem.<\/p>\r\n\r\n<p>In order to do the least amount of work, my mask\r\ninitialization checks the system to see if changes are needed.\u00a0 The check for\r\nthe upper limit source runs through the switch statement to handle the two\r\npossible values, internal or external.\u00a0 The code then checks for the BlockType\r\nof the <em>saturation<\/em>\/up block.\u00a0 If it is not the right type, we call the\r\nlocal replace function to replace the block.\u00a0 If we have added a constant, we\r\nset the Value of that constant to use the uplim variable from the mask.\u00a0 A\r\nsimilar action is repeated for the lower limit.<\/p>\r\n\r\n<code>\r\n<span style='font-size:12.0pt;line-height:115%;font-family:\r\n\"Courier New\";color:forestgreen'>% saturation_init_cb Mask Initialization<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>function<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> saturation_init_cb(blk,uplimsrc,uplim,<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:blue'>...<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:black'>lowlimsrc,lowlim)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:forestgreen'>% Check for upper limit source<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>switch<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> uplimsrc<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>case<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:#A020F0'>'external'<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:forestgreen'>% Check for constant<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>if<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> strcmp(get_param([blk <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/up'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'BlockType'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>),<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:blue'>...<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:#A020F0'>'Constant'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 replace([blk <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/up'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'built-in\/Inport'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>);<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>end<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>case<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:#A020F0'>'internal'<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:forestgreen'>% Check for inport<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>if<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> strcmp(get_param([blk <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/up'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'BlockType'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>),<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:blue'>...<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:#A020F0'>'Inport'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 replace([blk <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/up'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'built-in\/Constant'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_param([blk <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/up'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'Value'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>,<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:#A020F0'>'uplim'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>end<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>end<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>\u00a0<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:forestgreen'>% Check for lower limit source<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>switch<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> lowlimsrc<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>case<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:#A020F0'>'external'<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:forestgreen'>% Check for constant<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>if<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> strcmp(get_param([blk <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/lo'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'BlockType'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>),<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:blue'>...<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:#A020F0'>'Constant'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 replace([blk <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/lo'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'built-in\/Inport'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>end<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>case<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:#A020F0'>'internal'<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:forestgreen'>% Check for inport<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>if<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> strcmp(get_param([blk <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/lo'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'BlockType'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>),<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:blue'>...<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:#A020F0'>'Inport'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 replace([blk,<\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/lo'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'built-in\/Constant'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_param([blk <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/lo'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'Value'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>,<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:#A020F0'>'lowlim'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>end<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>end<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>&nbsp;<\/span><br>\r\n<\/code>\r\n\r\n<p>The replace function gets the position and orientation from\r\nthe old block, deletes it and then adds the new block in its place.<\/p>\r\n\r\n<code>\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:forestgreen'>% Local replace function<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>function<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> replace(oldblock,newblock)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>pos = get_param(oldblock,<\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'Position'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>);<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>orient = get_param(oldblock,<\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'Orientation'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>);<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>delete_block(oldblock);<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>add_block(newblock,oldblock,<\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'Position'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>,pos,<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:blue'>...<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0 <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:#A020F0'>'Orientation'<\/span><span style='font-size:12.0pt;font-family:\r\n\"Courier New\";color:black'>,orient);<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>&nbsp;<\/span><br>\r\n    <\/code>\r\n\r\n<p>Note, the replace_block function in Simulink could not be\r\nused here because it is meant for model wide changes.\u00a0 While it is possible to\r\nlimit the affect of replace_block to a specific system, replace block doesn\u2019t\r\nwork on library blocks.\u00a0\u00a0 Self-modifiable masked blocks are library blocks, so this\r\nis a common helper function used for this kind of mask.<\/p>\r\n\r\n<p><strong>Renumbering ports to control the order<\/strong><\/p>\r\n\r\n<p>The port number affects the order that the ports show up on\r\nthe outside of the block.\u00a0 Wires cross the boundary of the block and remain\r\nconnected through the inport that they are originally connected to.\u00a0 A port can\r\nbe inserted before or after existing ports on the block by changing the\r\nnumbering of all ports.\u00a0 The following code sets the port numbers by checking\r\nthe values of uplimsrc and lowlimsrc.\u00a0 When the upper limit source is external,\r\nthat will be the first port.\u00a0 If not, the first port is the u input.\u00a0 I can\r\nkeep track of the order and number of the ports by incrementing the numbering\r\nvariable each time I set a port number.<\/p>\r\n\r\n<code>\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:forestgreen'>% Renumber ports<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:forestgreen'>% when using external upper limit, <br>% set blk\/up port to 1<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>n = 1;<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>if<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> strcmp(uplimsrc,<\/span><span style='font-size:12.0pt;font-family:\r\n\"Courier New\";color:#A020F0'>'external'<\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:black'>)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0 set_param([blk <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/up'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'Port'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>,num2str(n))<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0 n = 2; <\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:forestgreen'>% increase n<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>end<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>\u00a0<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:forestgreen'>% set u port to n<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>set_param([blk <\/span><span style='font-size:12.0pt;font-family:\r\n\"Courier New\";color:#A020F0'>'\/u'<\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:black'>],<\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'Port'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>,num2str(n))<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\n\r\n\r\ncolor:forestgreen'>% when using external lower limit, <br>% set blk\/lo port to n+1<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>if<\/span><span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'> strcmp(lowlimsrc,<\/span><span style='font-size:12.0pt;font-family:\r\n\"Courier New\";color:#A020F0'>'external'<\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:black'>)<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:black'>\u00a0\u00a0\u00a0 set_param([blk <\/span><span style='font-size:12.0pt;\r\nfont-family:\"Courier New\";color:#A020F0'>'\/lo'<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:black'>],<\/span><span style='font-size:\r\n12.0pt;font-family:\"Courier New\";color:#A020F0'>'Port'<\/span><span\r\nstyle='font-size:12.0pt;font-family:\"Courier New\";color:black'>,num2str(n+1))<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>end<\/span><br>\r\n\r\n\r\n<span style='font-size:12.0pt;font-family:\"Courier New\";\r\ncolor:blue'>\u00a0<\/span><br>\r\n<\/code>\r\n\r\n<p><strong>Now it\u2019s your turn<\/strong><\/p>\r\n\r\n<p>I have shared some of my best practices for programming\r\nself-modifying blocks.\u00a0 What techniques have you used to program masks? Share\r\nyour <a href=\"https:\/\/blogs.mathworks.com\/seth\/?p=27&amp;#comment\">comments here<\/a>.<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>In previous posts, I introduced advanced\r\nmasking concepts and discussed how to build a masked library block with a dynamic\r\nmask dialog.\u00a0\u00a0 In this post, I will show how the example Saturation... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/simulink\/2008\/08\/21\/mask-initialization-and-self-modifying-blocks\/\">read more >><\/a><\/p>","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[47],"tags":[48,441],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/posts\/27"}],"collection":[{"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/comments?post=27"}],"version-history":[{"count":0,"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/posts\/27\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/media?parent=27"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/categories?post=27"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/tags?post=27"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}