EPICS Home

Experimental Physics and Industrial Control System


 
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  <20202021  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  <20202021  2022  2023  2024  2025 
<== Date ==> <== Thread ==>

Subject: 回复: Reading multiple parameters from an incoming message.
From: "Li, Ji via Tech-talk" <tech-talk at aps.anl.gov>
To: Mark Rivers <rivers at cars.uchicago.edu>
Cc: "tech-talk at aps.anl.gov" <tech-talk at aps.anl.gov>
Date: Wed, 30 Dec 2020 03:14:14 +0000
Happy New Year, Mark.

This problem is still on my table and to be solved.

============================

Your .db file passes 3 arguments to the protocol file, %(P), $(Q), $(CMD).  But in the protocol file I only see \$1 and \$2, not \$3.  Is this correct?


The first two parameters $(P) and $(Q) are common for all records, so I assigned values to them in global{} in the .substitutions file. The command sent out by this specific protocol is "status" which was hard coded it in the protocol (for others protocols the commands vary), so $(P) and $(Q) are sufficient for this record. I put $(CMD) in it as a dummy argument since I could not make empty substitution in the .substitutions file as loading

----------------------------

file "$(HARVARD)/db/pump33dds-ax-status-a.db"

{

pattern

}

----------------------------

throws errors.


But I think would be an good idea to make use of $(CMD) for disambiguation.

============================
You have commented out the line that defines the input terminator in the protocol file:

#InTerminator = 0x11;

How will asyn know when to return a string without a timeout if there is no terminator defined?


The returned messages from the pump don't have terminators. When InTerminator was defined, asyn would not return until timeout. The protocols without InTerminator work for me, at least I can set parameters and read them out from the pump. I think asyn returns as soon as the input message matches the expected pattern - for most of them, $ax_status, such as "::".

There're alarms for those PVs, but I doubt they are related to InTerminator.

 ============================

I think the protocol would be easier to read if you change this:

in "%d %*d %*d %*c%*c%*c%*c%*c%*c\n%*d %*d %*d %*c%*c%*c%*c%*c%*c\n" $ax_status;

to this:

in "%d %*d %*d %*6c\n%*d %*d %*d %*6c\n" $ax_status;


This looks much better. I updated the protocol.
============================

Best,

-Ji Li



发件人: Mark Rivers <rivers at cars.uchicago.edu>
发送时间: 2020年12月29日 18:45
收件人: Li, Ji <liji at bnl.gov>
抄送: tech-talk at aps.anl.gov <tech-talk at aps.anl.gov>
主题: RE: Reading multiple parameters from an incoming message.
 

Hi Ji Li,

 

Sorry for the delay in replying.  Maybe you have figured this out?

 

If not, I have some questions:

 

Your .db file passes 3 arguments to the protocol file, %(P), $(Q), $(CMD).  But in the protocol file I only see \$1 and \$2, not \$3.  Is this correct?

 

You have commented out the line that defines the input terminator in the protocol file:

#InTerminator = 0x11;

 

How will asyn know when to return a string without a timeout if there is no terminator defined?

 

I think the protocol would be easier to read if you change this:

in "%d %*d %*d %*c%*c%*c%*c%*c%*c\n%*d %*d %*d %*c%*c%*c%*c%*c%*c\n" $ax_status;

 

to this:

in "%d %*d %*d %*6c\n%*d %*d %*d %*6c\n" $ax_status;

 

Mark

 

 

From: Li, Ji <liji at bnl.gov>
Sent: Thursday, December 24, 2020 5:36 PM
To: Mark Rivers <rivers at cars.uchicago.edu>
Cc: tech-talk at aps.anl.gov
Subject:
回复: Reading multiple parameters from an incoming message.

 

Hi Mark,

 

I was referring to the PV for RATEA - $(P){$(Q)-Ax:A}:RATE:RBV.

 

Please see the attached files for the protocol, the database, the substitutions file, and the st.cmd. I only worked on Independent Condition to operate the two syringes separately. For better clarity I removed other protocols/databases definitions.

 

The .proto file contains the definition of this protocol and the referenced macro.

 

I have several .db files for different categories of information (rate/volume/time/...). The attached .db file defines the status PV - currently only RATEA. I expect implementation of other PVs that get values from this status message would be similar once I'm done with RATEA.

 

 

Best,

 

-Ji Li

 

 


发件人: Mark Rivers <rivers at cars.uchicago.edu>
发送时间: 20201224 14:53
收件人: Li, Ji <liji at bnl.gov>
抄送: tech-talk at aps.anl.gov <tech-talk at aps.anl.gov>
主题: Re: Reading multiple parameters from an incoming message.

 

Hi Ji Li,


Can you send the rest of the database and protocol files, or at least the Status record and the $ax_status definition.

> The PV was showing INVALID(UDF_ALARM). Since the IOC didn't throw errors, I suppose the message was parsed correctly. How could this alarm have been caused?

Which PV are you referring to?

Mark



________________________________
From: Tech-talk <tech-talk-bounces at aps.anl.gov> on behalf of Li, Ji via Tech-talk <tech-talk at aps.anl.gov>
Sent: Thursday, December 24, 2020 11:04 AM
To: tech-talk at aps.anl.gov
Subject: Reading multiple parameters from an incoming message.

Hi,

I'm working on an EPICS package for a Harvard Pump 33 DDS syringe pump using streamdevice protocols. I need to read several parameters from an incoming message that combines the status of two axes/syringes, which has the following format:

RATEA TIMEA VOLA STATUSA
RATEB TIMEB VOLB STATUSB

RATEA/B, TIMEA/B and VOLA/B are integers, and STATUSA/B are 6-character strings with each character indicating a specific status.

I'm trying to parse the message using multiple protocols and records. For RATEA, only grab the first integer:

Protocol:
=======================
getStatusRateAxA {
    out "status";
    in "%d %*d %*d %*c%*c%*c%*c%*c%*c\n%*d %*d %*d %*c%*c%*c%*c%*c%*c\n" $ax_status;
}
=======================

Record:
=======================
record(ai, "$(P){$(Q)-Ax:A}:RATE:RBV") {
  field(DESC, "Axis A rate readback")
  field(DTYP, "stream")
  field(INP, "@pump33dds.proto getStatusRateAxA($(P), $(Q), $(CMD)) $(PORT)")
  field(PREC, "0")
}
=======================

The .substitutions file referring to this record was loaded without errors. When I tried to retrieve status information, the IOC shell printed the following information without errors:

=======================
epics> 2020/12/24 11:29:06.797 /dev/ttyUSB0 write 8
status\r\n
2020/12/24 11:29:06.833 /dev/ttyUSB0 read 71
50000000000 0 22307784 w...I.\n83333333330 24723 2055394602192 i...I.\n::
=======================

"::" in the incoming message should be parsed by "$ax_status" in the protocol and it worked for other messages.

The PV was showing INVALID(UDF_ALARM). Since the IOC didn't throw errors, I suppose the message was parsed correctly. How could this alarm have been caused?

Best,

-Ji Li


Replies:
Re: Reading multiple parameters from an incoming message. Mark Rivers via Tech-talk
References:
Reading multiple parameters from an incoming message. Li, Ji via Tech-talk
Re: Reading multiple parameters from an incoming message. Mark Rivers via Tech-talk
回复: Reading multiple parameters from an incoming message. Li, Ji via Tech-talk
RE: Reading multiple parameters from an incoming message. Mark Rivers via Tech-talk

Navigate by Date:
Prev: 回复: Question about the font name for EDM lzf neu via Tech-talk
Next: Re: Reading multiple parameters from an incoming message. Mark Rivers via Tech-talk
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  <20202021  2022  2023  2024  2025 
Navigate by Thread:
Prev: RE: Reading multiple parameters from an incoming message. Mark Rivers via Tech-talk
Next: Re: Reading multiple parameters from an incoming message. Mark Rivers via Tech-talk
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  <20202021  2022  2023  2024  2025