{"id":28568,"date":"2021-09-07T04:11:14","date_gmt":"2021-09-07T11:11:14","guid":{"rendered":"https:\/\/blog.digilentinc.com\/?p=28568"},"modified":"2023-02-07T17:40:50","modified_gmt":"2023-02-08T01:40:50","slug":"how-do-i-use-multiple-analog-discovery-2s-in-waveforms","status":"publish","type":"post","link":"https:\/\/digilent.com\/blog\/how-do-i-use-multiple-analog-discovery-2s-in-waveforms\/","title":{"rendered":"How Do I Use Multiple Analog Discovery 2&#8217;s in WaveForms?"},"content":{"rendered":"<h2>Adding More Channels in WaveForms<\/h2>\n<p>Let&#8217;s assume you have an <a href=\"https:\/\/digilent.com\/shop\/analog-discovery-2-100ms-s-usb-oscilloscope-logic-analyzer-and-variable-power-supply\/?utm_source=digilent+blog&amp;utm_medium=referral&amp;utm_campaign=analog+discovery+2\">Analog Discovery 2<\/a> and love it, but your setup needs more than two oscilloscope channels and the <a href=\"https:\/\/digilent.com\/shop\/analog-discovery-pro-3000-series-portable-high-resolution-mixed-signal-oscilloscopes\/\">more powerful ADP3450<\/a> with FOUR oscilloscope channels would be a bit overkill, like driving a rocket ship to the grocery store. Wouldn&#8217;t it be great if a single instance of WaveForms could manage multiple devices to result in the equivalent of a multi-channel scope\/generator?\u00a0 Luckily, the advanced triggering options in WaveForms will let you synchronize multiple Digilent Test and Measurement devices so that they can capture, or provide, data simultaneously. Learn more by visiting the discussion on the <a href=\"https:\/\/forum.digilentinc.com\/topic\/8787-multiple-ad2-devices-in-single-waveforms-instance\/?sortby=date\">Digilent Forum<\/a>.<\/p>\n<h2>Using the Script Editor<\/h2>\n<ol>\n<li>Slave application\/device saves the data to a file<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-28575\" src=\"https:\/\/www.digilent.com\/blog\/wp-content\/uploads\/2021\/09\/waveforms-weekly-15-using-multiple-Analog2-2.jpg\" alt=\"Connecting multiple devices\" width=\"580\" height=\"222\" data-wp-pid=\"28575\" srcset=\"https:\/\/digilent.com\/blog\/wp-content\/uploads\/2021\/09\/waveforms-weekly-15-using-multiple-Analog2-2.jpg 981w, https:\/\/digilent.com\/blog\/wp-content\/uploads\/2021\/09\/waveforms-weekly-15-using-multiple-Analog2-2-600x229.jpg 600w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/>\n<pre class=\"ipsCode prettyprint lang-javascript prettyprinted\"><span class=\"pun\">{<\/span>\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> f <\/span><span class=\"pun\">=<\/span> File<span class=\"pun\">(<\/span><span class=\"str\">\"1.bin\"<\/span><span class=\"pun\">)<\/span><span class=\"pln\">\r\nf<\/span><span class=\"pun\">.<\/span><span class=\"pln\">writeDouble<\/span><span class=\"pun\">(<\/span>Scope<span class=\"pun\">.<\/span>Channel1<span class=\"pun\">.<\/span><span class=\"pln\">alldata<\/span><span class=\"pun\">)<\/span>\r\n<span class=\"pun\">}<\/span>\r\n<span class=\"pun\">{<\/span>\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> f <\/span><span class=\"pun\">=<\/span> File<span class=\"pun\">(<\/span><span class=\"str\">\"2.bin\"<\/span><span class=\"pun\">)<\/span><span class=\"pln\">\r\nf<\/span><span class=\"pun\">.<\/span><span class=\"pln\">writeDouble<\/span><span class=\"pun\">(<\/span>Scope<span class=\"pun\">.<\/span>Channel2<span class=\"pun\">.<\/span><span class=\"pln\">alldata<\/span><span class=\"pun\">)<\/span>\r\n<span class=\"pun\">}<\/span><\/pre>\n<\/li>\n<li>Master application\/device loads the data to ref1\/ref2<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-28576\" src=\"https:\/\/www.digilent.com\/blog\/wp-content\/uploads\/2021\/09\/waveforms-weekly-15-using-multiple-Analog2.jpg\" alt=\"Connecting multiple devices\" width=\"580\" height=\"255\" data-wp-pid=\"28576\" \/>\n<ul>\n<li>\n<h1><\/h1>\n<pre class=\"ipsCode prettyprint lang-javascript prettyprinted\"><span class=\"pun\">{<\/span>\r\n<span class=\"com\">\/\/ update time information, restore offset\/range<\/span>\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> r <\/span><span class=\"pun\">=<\/span> Scope<span class=\"pun\">.<\/span>Ref1<span class=\"pun\">.<\/span>Range<span class=\"pun\">.<\/span><span class=\"pln\">value\r\n<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> o <\/span><span class=\"pun\">=<\/span> Scope<span class=\"pun\">.<\/span>Ref1<span class=\"pun\">.<\/span>Offset<span class=\"pun\">.<\/span><span class=\"pln\">value\r\n<\/span>Scope<span class=\"pun\">.<\/span>Ref1<span class=\"pun\">.<\/span>Clone<span class=\"pun\">(<\/span>Scope<span class=\"pun\">.<\/span>Channel1<span class=\"pun\">)<\/span> \r\nScope<span class=\"pun\">.<\/span>Ref1<span class=\"pun\">.<\/span>Range<span class=\"pun\">.<\/span><span class=\"pln\">value <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> r\r\n<\/span>Scope<span class=\"pun\">.<\/span>Ref1<span class=\"pun\">.<\/span>Offset<span class=\"pun\">.<\/span><span class=\"pln\">value <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> o\r\n<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> f <\/span><span class=\"pun\">=<\/span> File<span class=\"pun\">(<\/span><span class=\"str\">\"1.bin\"<\/span><span class=\"pun\">)<\/span>\r\n<span class=\"com\">\/\/ we might have to wait for the other process to save the data<\/span>\r\n<span class=\"kwd\">for<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> i <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> i <\/span><span class=\"pun\">&lt;<\/span> <span class=\"lit\">1000<\/span> <span class=\"pun\">&amp;&amp;<\/span> <span class=\"pun\">!<\/span><span class=\"pln\">f<\/span><span class=\"pun\">.<\/span><span class=\"pln\">exist<\/span><span class=\"pun\">();<\/span><span class=\"pln\"> i<\/span><span class=\"pun\">++);<\/span>\r\n<span class=\"com\">\/\/ read data and set it to reference channel<\/span>\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> rg <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> f<\/span><span class=\"pun\">.<\/span><span class=\"pln\">readDouble<\/span><span class=\"pun\">()<\/span><span class=\"pln\">\r\nf<\/span><span class=\"pun\">.<\/span><span class=\"pln\">deleteFile<\/span><span class=\"pun\">()<\/span>\r\nScope<span class=\"pun\">.<\/span>Ref1<span class=\"pun\">.<\/span><span class=\"pln\">data <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> rg\r\n<\/span><span class=\"pun\">}<\/span>\r\n<span class=\"pun\">{<\/span>\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> r <\/span><span class=\"pun\">=<\/span> Scope<span class=\"pun\">.<\/span>Ref2<span class=\"pun\">.<\/span>Range<span class=\"pun\">.<\/span><span class=\"pln\">value\r\n<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> o <\/span><span class=\"pun\">=<\/span> Scope<span class=\"pun\">.<\/span>Ref2<span class=\"pun\">.<\/span>Offset<span class=\"pun\">.<\/span><span class=\"pln\">value\r\n<\/span>Scope<span class=\"pun\">.<\/span>Ref2<span class=\"pun\">.<\/span>Clone<span class=\"pun\">(<\/span>Scope<span class=\"pun\">.<\/span>Channel2<span class=\"pun\">)<\/span> \r\nScope<span class=\"pun\">.<\/span>Ref2<span class=\"pun\">.<\/span>Range<span class=\"pun\">.<\/span><span class=\"pln\">value <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> r\r\n<\/span>Scope<span class=\"pun\">.<\/span>Ref2<span class=\"pun\">.<\/span>Offset<span class=\"pun\">.<\/span><span class=\"pln\">value <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> o\r\n<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> f <\/span><span class=\"pun\">=<\/span> File<span class=\"pun\">(<\/span><span class=\"str\">\"2.bin\"<\/span><span class=\"pun\">)<\/span>\r\n<span class=\"kwd\">for<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> i <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> i <\/span><span class=\"pun\">&lt;<\/span> <span class=\"lit\">1000<\/span> <span class=\"pun\">&amp;&amp;<\/span> <span class=\"pun\">!<\/span><span class=\"pln\">f<\/span><span class=\"pun\">.<\/span><span class=\"pln\">exist<\/span><span class=\"pun\">();<\/span><span class=\"pln\"> i<\/span><span class=\"pun\">++);<\/span>\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> rg <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> f<\/span><span class=\"pun\">.<\/span><span class=\"pln\">readDouble<\/span><span class=\"pun\">()<\/span><span class=\"pln\">\r\nf<\/span><span class=\"pun\">.<\/span><span class=\"pln\">deleteFile<\/span><span class=\"pun\">()<\/span>\r\nScope<span class=\"pun\">.<\/span>Ref2<span class=\"pun\">.<\/span><span class=\"pln\">data <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> rg\r\n<\/span><span class=\"pun\">}<\/span><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><em>*Important note*\u00a0<\/em>For each instance of the time base or position changing, the Ref channel needs to be updated. You can accomplish this by using the Clone function (below):<\/p>\n<pre class=\"ipsCode prettyprint lang-javascript prettyprinted\"><span class=\"com\">\/\/ update time information, restore offset\/range<\/span>\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> r <\/span><span class=\"pun\">=<\/span> Scope<span class=\"pun\">.<\/span>Ref1<span class=\"pun\">.<\/span>Range<span class=\"pun\">.<\/span><span class=\"pln\">value\r\n<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> o <\/span><span class=\"pun\">=<\/span> Scope<span class=\"pun\">.<\/span>Ref1<span class=\"pun\">.<\/span>Offset<span class=\"pun\">.<\/span><span class=\"pln\">value\r\n<\/span>Scope<span class=\"pun\">.<\/span>Ref1<span class=\"pun\">.<\/span>Clone<span class=\"pun\">(<\/span>Scope<span class=\"pun\">.<\/span>Channel1<span class=\"pun\">)<\/span> \r\nScope<span class=\"pun\">.<\/span>Ref1<span class=\"pun\">.<\/span>Range<span class=\"pun\">.<\/span><span class=\"pln\">value <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> r\r\n<\/span>Scope<span class=\"pun\">.<\/span>Ref1<span class=\"pun\">.<\/span>Offset<span class=\"pun\">.<\/span><span class=\"pln\">value <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> o<\/span><\/pre>\n<div class='watch-action'><div class='watch-position align-left'><div class='action-like'><a class='lbg-style6 like-28568 jlk' data-task='like' data-post_id='28568' data-nonce='ee750c7abc' rel='nofollow'><img src='https:\/\/digilent.com\/blog\/wp-content\/plugins\/wti-like-post-pro\/images\/pixel.gif' title='Like' \/><span class='lc-28568 lc'>0<\/span><\/a><\/div><div class='action-unlike'><a class='unlbg-style6 unlike-28568 jlk' data-task='unlike' data-post_id='28568' data-nonce='ee750c7abc' rel='nofollow'><img src='https:\/\/digilent.com\/blog\/wp-content\/plugins\/wti-like-post-pro\/images\/pixel.gif' title='Unlike' \/><span class='unlc-28568 unlc'>0<\/span><\/a><\/div><\/div> <div class='status-28568 status align-left'>Be the 1st to vote.<\/div><\/div><div class='wti-clear'><\/div>","protected":false},"excerpt":{"rendered":"<p>Adding More Channels in WaveForms Let&#8217;s assume you have an Analog Discovery 2 and love it, but your setup needs more than two oscilloscope channels and the more powerful ADP3450 &hellip; <\/p>\n","protected":false},"author":50,"featured_media":28575,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4325,4323,4312,1563],"tags":[4342,1736,452],"ppma_author":[4502],"class_list":["post-28568","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-debug-validation-test","category-software","category-usb-scopes-analyzers-generators","category-guide","tag-ad2","tag-analog-discovery-2","tag-waveforms"],"jetpack_featured_media_url":"https:\/\/digilent.com\/blog\/wp-content\/uploads\/2021\/09\/waveforms-weekly-15-using-multiple-Analog2-2.jpg","authors":[{"term_id":4502,"user_id":50,"is_guest":0,"slug":"davidh","display_name":"David Horn","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/44030532fc8d2bc9aa1d05f87c27d6f9?s=96&d=mm&r=g","author_category":"","user_url":"","last_name":"Horn","last_name_2":"","first_name":"David","first_name_2":"","job_title":"","description":""}],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/posts\/28568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/users\/50"}],"replies":[{"embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/comments?post=28568"}],"version-history":[{"count":1,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/posts\/28568\/revisions"}],"predecessor-version":[{"id":29634,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/posts\/28568\/revisions\/29634"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/media\/28575"}],"wp:attachment":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/media?parent=28568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/categories?post=28568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/tags?post=28568"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=28568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}