<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Aptos;}
@font-face
        {font-family:"\@SimSun";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:12.0pt;
        font-family:SimSun;
        mso-fareast-language:ZH-CN;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        font-size:12.0pt;
        font-family:SimSun;
        mso-fareast-language:ZH-CN;}
span.EmailStyle20
        {mso-style-type:personal-compose;
        font-family:"Aptos",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:332415335;
        mso-list-type:hybrid;
        mso-list-template-ids:453683904 2074482694 336134147 336134149 336134145 336134147 336134149 336134145 336134147 336134149;}
@list l0:level1
        {mso-level-start-at:2;
        mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;
        mso-fareast-font-family:Aptos;
        mso-bidi-font-family:"Times New Roman";}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1
        {mso-list-id:2011715127;
        mso-list-type:hybrid;
        mso-list-template-ids:188498080 336134161 336134169 336134171 336134159 336134169 336134171 336134159 336134169 336134171;}
@list l1:level1
        {mso-level-text:"%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l1:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l1:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l2
        {mso-list-id:2130274160;
        mso-list-type:hybrid;
        mso-list-template-ids:-1814390708 -1801524390 336134147 336134149 336134145 336134147 336134149 336134145 336134147 336134149;}
@list l2:level1
        {mso-level-start-at:2;
        mso-level-number-format:bullet;
        mso-level-text:-;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Aptos",sans-serif;
        mso-fareast-font-family:Aptos;
        mso-bidi-font-family:"Times New Roman";}
@list l2:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l2:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l2:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l2:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l2:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l2:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l2:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l2:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-NZ" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif;mso-fareast-language:EN-US">Hi Circle,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif;mso-fareast-language:EN-US">Re below, I’m also cc’ing the forum in case anyone has more input to add.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> From: Circle Fang
<a href="mailto:circlefang@live.com">circlefang@live.com</a> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> Sent: Wednesday, 16 April 2025 20:02<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> To: Graeme Foot
<a href="mailto:Graeme.Foot@touchcut.com">Graeme.Foot@touchcut.com</a><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> Subject: DC synchronization demo about etherlab master<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> Dear Graeme,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> I am interested in some motion control research, and I am really thankful about all your response in etherlab-users mail-list, that help me a lot. And i am very sorry if my mail dirturbe
 you, I am not able to post questions on the maillist.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> I like the way you mentioned here
<a href="https://lists.etherlab.org/pipermail/etherlab-users/2018-May/014740.html">
https://lists.etherlab.org/pipermail/etherlab-users/2018-May/014740.html</a> by CACHED PDOs sent in next cycle, but i am not able to find the attachment you mentioned here,
<a href="https://lists.etherlab.org/pipermail/etherlab-users/2022-March/019231.html">
https://lists.etherlab.org/pipermail/etherlab-users/2022-March/019231.html</a>. Is it possible that you send me a copy?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> I am having dc sync error occasionally with 4 YASKAWA servos(first time with this brand) connected a line to the master, even 0x92c is very small like no more than 20. I am using xenomai
 in the traditional ways (the master is synchronized to reference with PDOs in current cycle), and my realtime cycle(1ms) takes various mount of time. And if my OS is ok, then the only thing i can do is sync 0 shift_time(now 300us) and CACHED PDOs sent in next
 cycle as you mentioned? Do you have any other suggestions? <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> I also have one more question about sync0 and shift time, is "DC cyclic operation start time to 64460955283935" the first sync0 time in slave? I saw in some docs said the sync0_shift is only
 a time after snyc0 in the slave(like all motors move at the same time, i.e., after shift time), If so, why we use sync0_shift to calculate dc_start_time? because dc errors is about the time SM2 and sync0, it's not because sync0_shift.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> This confuse me for several years, and I would be very very appreciated if you give me some guidance.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> Thanks again<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">> Circle<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">I’ve attached the email you mention and the test program.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">Inside ecMaster_syncDistClock() I call ecrt_master_64bit_reference_clock_time_queue().  This is used to put a long running timestamp in the wireshark logs so you can check and
 ensure your cycle period is not drifting.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">If drifting is not the problem then calling ecrt_master_send() at a consistent time (with enough time on the wire before the DC Sync time at the slave) is essential.  As you
 say, I do this by caching the data to write from the previous cycle and send it as soon as I receive and process the previous domain information.  This ensures the previous frames have returned and reduces the jitter of the send.  I also set the dc shift time
 on the slaves to 500us (half of my 1ms period) so that the frames have half the cycle to reach all the slaves and the other half of the cycle to return.  (We only have 60 to 80 slaves so are nowhere near needing to worry about time on the wire, unless we decide
 at some stage to reduce the cycle period.)  The calculations for the next period can then also be performed in parallel to the frames being on the wire.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">A few other options are:<o:p></o:p></span></p>
<ol style="margin-top:0cm" start="1" type="1">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l1 level1 lfo1"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">Set your DC Sync offset to 900us.  A time large enough to process the previous frame reads, do calcs, send and time on
 the wire.  The drawback is that non DC slaves will apply their data more early than the dc slaves.<o:p></o:p></span></li></ol>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<ol style="margin-top:0cm" start="2" type="1">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l1 level1 lfo1"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">Wake up the master twice.  E.g.:<o:p></o:p></span></li></ol>
<p class="MsoListParagraph"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">At 0us: Wake up and perform the send<o:p></o:p></span></p>
<p class="MsoListParagraph"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">At 500us: Wake up and receive, do calcs<o:p></o:p></span></p>
<p class="MsoListParagraph"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">At 1000us: Wake up and perform the send<o:p></o:p></span></p>
<p class="MsoListParagraph"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">Etc.<o:p></o:p></span></p>
<p class="MsoListParagraph"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoListParagraph"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">Also, people have asked the forum previously if you can wake up at an event when the PDO data frames return.  There is no such event, so they have attempted to poll for
 this.  The master is not designed for this so it doesn’t work so well.  What you can do however is figure out how much time the frames take on the wire by looking at the “ethercat sl -v -p0” command and look at the Diff [ns] value for port 1 (or calc the diff
 between the first and last port if using a start topology).  That will tell you how long it takes for the frames to go out and return to the first slave.  Add a little overhead for the master send / receive and you can tune the mid cycle wake up time above
 to maximize the calc time.  That of course then becomes system specific (and can change if you have hot plug groups).<o:p></o:p></span></p>
<p class="MsoListParagraph"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<ol style="margin-top:0cm" start="3" type="1">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l1 level1 lfo1"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">Do what TwinCAT does and separate the calc from the EtherCAT processing (different threads and memory space).<o:p></o:p></span></li></ol>
<p class="MsoListParagraph"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">The EtherCAT module wakes up at 0us and reads linked data from other modules, it then reads the returned PDO information and caches it for other process to read, applies
 the PDO write data and sends it.<o:p></o:p></span></p>
<p class="MsoListParagraph"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">The calc modules can wake up when they want and follow the same steps, read linked data from other modules (including the EtherCAT PDO data), perform calcs, write results
 to the modules out data.<o:p></o:p></span></p>
<p class="MsoListParagraph"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">This is kind of similar to my caching method except that it uses the different modules to achieve the data caching and decouples the EtherCAT data cycle and calculations. 
 It’s also helpful due to TwinCAT using overlapped PDO’s.  Different calc modules can also have different cycle rates, but the EtherCAT module needs to run at least at the fastest module cycle rate.  There’s also more locking issues to resolve and memory shuffling.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">Re your last question, I’m not really sure what you are asking but from my recollection:<o:p></o:p></span></p>
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo3"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">The sync0 time is to do with getting all dc clock slaves to a common time base and in sync with your masters nominal cycle
 zero time.  The dc syncing after that is just to keep the master and dc slaves in sync with each other.<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo3"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">By default slaves will apply data from incoming PDO’s immediately, and write outgoing data at their current values.  DC
 capable slaves can optionally have DC sync enabled (with ecrt_slave_config_dc()), which effectively caches the incoming PDO data to be applied at the shift time, so all DC slaves can activate their incoming data at the same time (or in a coordinated fashion). 
 It also caches write data at the same time (or at its own offset with sync1).  The only requirement is that the slave needs to have processed the PDO frames each cycle before the offset time, else it starts raising errors.<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo3"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">The master can choose when in the nominal cycle period it sends the PDO frames, but as close to the cycle zero point with
 minimal jitter is preferable.  (Minimal jitter is especially good for the non dc activated slaves.)<o:p></o:p></span></li></ul>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">ecrt_slave_config_dc() params:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:106.35pt;text-indent:-92.15pt"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">sc                                     the slave to configure<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:106.35pt;text-indent:-92.15pt"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">assign_activate       the assign activate word the slave uses to enable DC sync (often 0x0300) (see ETG ethercat_esc_datasheet_sec2_registers
 pdf, registers 0x0980, 0x0981)<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:106.35pt;text-indent:-92.15pt"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">sync0_cycle               your nominal EtherCAT master cycle time (e.g. 1ms)<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:106.35pt;text-indent:-92.15pt"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">sync0_shift                 when to raise the sync0 event, as a shift time from the nominal cycle zero time (aka when to apply
 the read PDO values in the cycle period)<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:106.35pt;text-indent:-92.15pt"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">sync1_cycle               some slaves can have a sync1 event, used for caching PDO write values at a different time to sync0. 
 Not generally required, use 0 to ignore<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:106.35pt;text-indent:-92.15pt"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">sync1_shift                 not generally required, use 0 to ignore.  The master has a bug with this.  There’s a patch floating
 around to fix this if needed<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">In summary, the sync0 event is when the PDO data is applied.  If you active the slaves dc, then the sync0 occurs at the sync0_shift time after the nominal cycle zero time.  If
 it is not activated the sync0 event is raised as the PDO data comes in so it is applied immediately.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif">Graeme.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
</div>
</div>
</body>
</html>