1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 <2019> 2020 2021 2022 2023 2024 2025 | Index | 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 <2019> 2020 2021 2022 2023 2024 2025 |
<== Date ==> | <== Thread ==> |
---|
Subject: | RE: AsynDriver with delayed and async communication |
From: | Mark Rivers via Tech-talk <[email protected]> |
To: | 'Joao Afonso' <[email protected]>, 'Eric Norum' <[email protected]> |
Cc: | "[email protected]" <[email protected]> |
Date: | Mon, 4 Feb 2019 21:48:32 +0000 |
Hi Joao, Andrew has already answered many of your questions. Ø
The only issue I have is that it is a bit counter-intuitive to use a output record for a GET command. But it works. Ø
Is this what you were suggesting? What I was suggesting was that the records would all be ao/ai, bo/bi, longout/longin, mbbo/mbbi, etc. records in user units (volts, degrees, etc.). Those records communicate with the asynPortDriver. The asynPortDriver constructs the strings
and writes and reads them with asynOctetSyncIO. That way there are not output records to do a read, except perhaps a single bo record that tells the driver “read all inputs now”. The driver then builds and sends the strings to the device. The driver could
also be set to poll at a user-defined rate, where the polling rate is set by an ao record. If you want to tell the driver to read a particular value “now” then you do need an output record to the driver to do that. Mark From: Joao Afonso <[email protected]>
Hello, Thank you for your responses.
I tried this (using SETs and GETs with separate records) and it seems to work for the SET property commands. For example, for setting a signed int (as a string), I have: record(stringout, "INT32S:S") } If I monitor (camonitor) the record, and send a value (caput), the value I sent will be immediately displayed. Then, a few moments later, when the response arrives, it will update accordingly: INT32S:S 2019-02-04 17:28:21.653208
This seems to be fine, for what I wanted! Anyway, is there a way to avoid updating the record, before the readback is executed (in this case, the 'aaa' would not be displayed) ? ----------- For GET commands it got a bit more complicated... At first, I tested it with an input record (stringin), with SCAN=Passive. And with this, I expected the record to be processed when I used caget. However, I noticed that the 'readOctet' was never being run, so the value stayed the same. After reading the documentation, it seems to me that this is not possible
unless I "trigger" the processing of the record (by running caput, or by linking to it from another record with PP). Is there a way to - always - trigger the processing of an input record when do a get, like using caget? Anyway, I found a solution that works, and it is probably what you were proposing: If I treat the GET commands with output records (like I did for SET), then I just have to apply the same recipe: record(stringout, "INT32S:G") } In this case, by using caput I can trigger the sending of a GET command (handled also by writeOctet), and when the responses arrives to the read thread, it will
update the record through the readback. The only issue I have is that it is a bit counter-intuitive to use a output record for a GET command. But it works. Is this what you were suggesting? Best regards, Joao From: Mark Rivers [[email protected]] >> You really don’t need the SET response record because that information be set in the STAT and SEVR of the SET record. Ø
Perhaps, but I don’t see how the SET command would get its response — the network input port/stream is tied up by the read thread, right? Or do SET and GET commands use separate ports? Also, if SET commands can be ’slow’ then
their responses woud be better handled by a read thread. My mistake, I forgot that the SET message takes a long time to reply so its response also needs to be handled by the read thread. The output record can get its STAT and SEVR updated from the polling thread, but only if it has the asyn:READBACK info tag. See the asyn/testErrorsApp for an example. So a single record can still work to hold
the Set value, Set status, Get value, and Get status. If the Set and the Get generate different errors the STAT will toggle between them.
Mark From: Eric Norum <[email protected]>
On Jan 31, 2019, at 10:08 AM, Mark Rivers via Tech-talk <[email protected]> wrote:
Perhaps, but I don’t see how the SET command would get its response — the network input port/stream is tied up by the read thread, right? Or do SET and GET commands use separate ports? Also, if SET commands can
be ’slow’ then their responses woud be better handled by a read thread.
I’ve found it useful to have a ’trigger readback’ record. That makes it easy to control the rate at which readbacks are requested. So my $0.02 is that it’s best to have four records. Although perhaps s single ’trigger readback’ record could be used to request a number of responses. -- |