{"id":63,"date":"2009-08-20T01:55:12","date_gmt":"2009-08-20T01:55:12","guid":{"rendered":"https:\/\/blogs.mathworks.com\/seth\/2009\/08\/20\/a-better-if-else-construct\/"},"modified":"2009-08-20T03:32:18","modified_gmt":"2009-08-20T03:32:18","slug":"a-better-if-else-construct","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/simulink\/2009\/08\/20\/a-better-if-else-construct\/","title":{"rendered":"A Better If-Else Construct"},"content":{"rendered":"<style>\r\n<!--\r\n \/* Font Definitions *\/\r\n @font-face\r\n\t{font-family:\"Cambria Math\";\r\n\tpanose-1:2 4 5 3 5 4 6 3 2 4;}\r\n@font-face\r\n\t{font-family:Calibri;\r\n\tpanose-1:2 15 5 2 2 2 4 3 2 4;}\r\n@font-face\r\n\t{font-family:Tahoma;\r\n\tpanose-1:2 11 6 4 3 5 4 4 2 4;}\r\n \/* Style Definitions *\/\r\n p.MsoNormal, li.MsoNormal, div.MsoNormal\r\n\t{margin-top:0in;\r\n\tmargin-right:0in;\r\n\tmargin-bottom:10.0pt;\r\n\tmargin-left:0in;\r\n\tline-height:115%;\r\n\tfont-size:11.0pt;\r\n\tfont-family:\"Calibri\",\"sans-serif\";}\r\na:link, span.MsoHyperlink\r\n\t{color:blue;\r\n\ttext-decoration:underline;}\r\na:visited, span.MsoHyperlinkFollowed\r\n\t{color:purple;\r\n\ttext-decoration:underline;}\r\npre\r\n\t{mso-style-link:\"HTML Preformatted Char\";\r\n\tmargin:0in;\r\n\tmargin-bottom:.0001pt;\r\n\tfont-size:10.0pt;\r\n\tfont-family:\"Courier New\";\r\n\tcolor:#1122AA;}\r\np.MsoAcetate, li.MsoAcetate, div.MsoAcetate\r\n\t{mso-style-link:\"Balloon Text Char\";\r\n\tmargin:0in;\r\n\tmargin-bottom:.0001pt;\r\n\tfont-size:8.0pt;\r\n\tfont-family:\"Tahoma\",\"sans-serif\";}\r\nspan.BalloonTextChar\r\n\t{mso-style-name:\"Balloon Text Char\";\r\n\tmso-style-link:\"Balloon Text\";\r\n\tfont-family:\"Tahoma\",\"sans-serif\";}\r\nspan.HTMLPreformattedChar\r\n\t{mso-style-name:\"HTML Preformatted Char\";\r\n\tmso-style-link:\"HTML Preformatted\";\r\n\tfont-family:\"Courier New\";\r\n\tcolor:#1122AA;}\r\nspan.ln1\r\n\t{mso-style-name:ln1;\r\n\tcolor:#888888;\r\n\tfont-style:italic;}\r\nspan.ct1\r\n\t{mso-style-name:ct1;\r\n\tcolor:#117755;\r\n\tfont-style:italic;}\r\nspan.kw1\r\n\t{mso-style-name:kw1;\r\n\tcolor:#112266;}\r\n.MsoPapDefault\r\n\t{margin-bottom:10.0pt;\r\n\tline-height:115%;}\r\n@page Section1\r\n\t{size:8.5in 11.0in;\r\n\tmargin:1.0in 1.0in 1.0in 1.0in;}\r\ndiv.Section1\r\n\t{page:Section1;}\r\n-->\r\n<\/style>\r\n\r\n<p>In a previous post, I answered a question about <a\r\nhref=\"https:\/\/blogs.mathworks.com\/seth\/2009\/06\/02\/the-if-else-construct-in-models\/\">how\r\nto model an If-Else behavior<\/a>.\u00a0 Here I will restate the algorithm I want to create:<\/p>\r\n\r\n<p><em>if(sel==0)<br>\r\nout = 2*in1;<br>\r\nelseif (sel==1)<br>\r\nout = 3*in2;<\/em><\/p>\r\n\r\n<p>The first answer I gave relied upon a Switch block and the <em>Conditional\r\nInput Branch Execution<\/em> optimization to get an efficient If-Else construct\r\nin the model.\u00a0 While this works, I don\u2019t like reliance on an optimization to\r\nprovide good behavior.\u00a0 Sometimes, small changes to the model prevent Simulink\r\nfrom applying an optimization.\u00a0 I think it is best to implement requirements explicitly.\u00a0\r\nIn this post, I want to show you a way to model explicitly an If-Else conditional\r\nexecution behavior.<\/p>\r\n\r\n<p><strong>Conditionally Executed Subsystems and Merge<\/strong><\/p>\r\n\r\n<p>The If-Else construct requires decision logic to control the\r\nexecution of algorithm contained within the expression. \u00a0One way to do this is\r\nusing the If block (from the Ports &amp; Subsystems library), combined with the\r\nIf Action Subsystem.\u00a0 The If Action Subsystem executes based on the conditional\r\nexpression in the If block.\u00a0 If you have used Function Call subsystems, this is\r\nvery similar.<\/p>\r\n\r\n<p><img decoding=\"async\" src=\"https:\/\/blogs.mathworks.com\/images\/seth\/2009Q3\/ifActionConstruct.png\" alt=\"The If Else, Else If, Action construct in Simulink blocks.\"><\/p>\r\n\r\n<p>The If block provides control over If and ElseIf conditions,\r\nand there is even an option to provide an Else signal.<\/p>\r\n\r\n<p><img decoding=\"async\" src=\"https:\/\/blogs.mathworks.com\/images\/seth\/2009Q3\/ifBlockParameters.png\" alt=\"The Simulink If Block parameters.\"><\/p>\r\n\r\n<p>This model will give you the conditional execution of the\r\ntwo subsystem, however, the subsystems write their outputs to separate signals.\r\n\u00a0How do you get two subsystem to write to the same signal?<\/p>\r\n\r\n<p><strong>Merge the Signals<\/strong><\/p>\r\n\r\n<p>The Merge block provides a way for both subsystems to write\r\nto the same signal.<\/p>\r\n\r\n<p><img decoding=\"async\" src=\"https:\/\/blogs.mathworks.com\/images\/seth\/2009Q3\/MergeSignals.png\" \r\nalt=\"The Merge Block provides a way to specify that multiple signal write to the same memory location.\"><\/p>\r\n\r\n<p>In many ways, the Merge block doesn\u2019t behave like a block\r\nwith the traditional input\/output relationship.\u00a0 I think of it more like a\r\njumper across multiple wires.\u00a0 The merge block specifies that all signals\r\nconnected to it have the same value and actually share the same memory.\u00a0 This\r\nis the programming practice of specifying multiple writers to the same\r\nvariable.<\/p>\r\n\r\n<p><strong>Generated Code with Merge<\/strong><\/p>\r\n\r\n<p>The code generated from the above model looks a lot like our\r\noriginal algorithm.<\/p>\r\n\r\n<code style=\"font-size: 12pt;\"><span class=ln1>\u00a0\u00a0 34\u00a0\u00a0 <\/span>\u00a0\u00a0<span class=ct1>\/* If: '&lt;Root&gt;\/If' incorporates:<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 35\u00a0\u00a0 <\/span><span class=ct1>\u00a0\u00a0\u00a0*\u00a0 ActionPort: '&lt;S1&gt;\/Action Port'<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 36 \u00a0\u00a0<\/span><span class=ct1>\u00a0\u00a0\u00a0*\u00a0 ActionPort: '&lt;S2&gt;\/Action Port'<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 37\u00a0\u00a0 <\/span><span class=ct1>\u00a0\u00a0\u00a0*\u00a0 Inport: '&lt;Root&gt;\/In3'<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 38\u00a0\u00a0 <\/span><span class=ct1>\u00a0\u00a0\u00a0*\u00a0 SubSystem: '&lt;Root&gt;\/If Action Subsystem'<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 39\u00a0\u00a0 <\/span><span class=ct1>\u00a0\u00a0\u00a0*\u00a0 SubSystem: '&lt;Root&gt;\/If Action Subsystem1'<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 40\u00a0\u00a0 <\/span><span class=ct1>\u00a0\u00a0\u00a0*\/<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 41\u00a0\u00a0 <\/span>\u00a0\u00a0<span class=kw1>if<\/span> (sel == 0.0) <strong>{<\/strong><br><span\r\nclass=ln1>\u00a0\u00a0 42\u00a0\u00a0 <\/span>\u00a0\u00a0\u00a0\u00a0<span class=ct1>\/* Gain: '&lt;S1&gt;\/Gain' incorporates:<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 43\u00a0\u00a0 <\/span><span class=ct1>\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0 Inport: '&lt;Root&gt;\/In1'<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 44\u00a0\u00a0 <\/span><span class=ct1>\u00a0\u00a0\u00a0\u00a0\u00a0*\/<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 45\u00a0\u00a0 <\/span>\u00a0\u00a0\u00a0\u00a0out = 2.0 * u1;<br><span class=ln1>\u00a0\u00a0 46\u00a0\u00a0 <\/span>\u00a0\u00a0<strong>}<\/strong> <span\r\nclass=kw1>else<\/span> <strong>{<\/strong><br><span class=ln1>\u00a0\u00a0 47\u00a0\u00a0 <\/span>\u00a0\u00a0\u00a0\u00a0<span\r\nclass=kw1>if<\/span> (sel == 1.0) <strong>{<\/strong><br><span class=ln1>\u00a0\u00a0 48\u00a0\u00a0 <\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span\r\nclass=ct1>\/* Gain: '&lt;S2&gt;\/Gain' incorporates:<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 49\u00a0\u00a0 <\/span><span class=ct1>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*\u00a0 Inport: '&lt;Root&gt;\/In2'<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 50\u00a0\u00a0 <\/span><span class=ct1>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*\/<\/span><br><span\r\nclass=ln1>\u00a0\u00a0 51\u00a0\u00a0 <\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0out = 3.0 * u2;<br><span class=ln1>\u00a0\u00a0 52\u00a0\u00a0 <\/span>\u00a0\u00a0\u00a0\u00a0<strong>}<\/strong><br><span\r\nclass=ln1>\u00a0\u00a0 53\u00a0\u00a0 <\/span>\u00a0\u00a0<strong>}<\/strong><\/code>\r\n\r\n\r\n\r\n<p><strong>Correct use of Merge<\/strong><\/p>\r\n\r\n<p>Because Merge blocks are a memory specification rather than\r\nan algorithmic construct, there are some <a\r\nhref=\"https:\/\/www.mathworks.com\/help\/releases\/R2009a\/toolbox\/simulink\/slref\/merge.html\">guidelines\r\nfor using merge blocks<\/a>.\u00a0 The documentation shows some correct and incorrect\r\nusage patterns.\u00a0 If you use merge block in your model, I suggest you run the <a\r\nhref=\"https:\/\/www.mathworks.com\/help\/releases\/R2009a\/toolbox\/simulink\/slref\/bq6d4aa-1.html#bragjl8-1\">Model\r\nAdvisor Check for proper Merge block usage<\/a>.<\/p>\r\n\r\n<p><strong>Now it\u2019s your turn<\/strong><\/p>\r\n\r\n<p>Do you use the Merge block in your models?\u00a0 Leave a <a\r\nhref=\"https:\/\/blogs.mathworks.com\/seth\/?p=63&amp;#comment\">comment here<\/a> and\r\nshare your experience.<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>\r\n\r\n\r\n\r\nIn a previous post, I answered a question about how\r\nto model an If-Else behavior.\u00a0 Here I will restate the algorithm I want to create:\r\n\r\nif(sel==0)\r\nout = 2*in1;\r\nelseif (sel==1)\r\nout =... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/simulink\/2009\/08\/20\/a-better-if-else-construct\/\">read more >><\/a><\/p>","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[21,30,55,33],"tags":[101,100,441],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/posts\/63"}],"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=63"}],"version-history":[{"count":0,"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/posts\/63\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/media?parent=63"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/categories?post=63"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/simulink\/wp-json\/wp\/v2\/tags?post=63"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}