EPICS Controls Argonne National Laboratory

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  <20182019  2020  2021  2022  2023  2024  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  <20182019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Re: bitSets and PVStructure
From: Michael Davidsaver <[email protected]>
To: Heinz Junkes <[email protected]>
Cc: Talk EPICS Tech <[email protected]>
Date: Tue, 14 Aug 2018 09:41:27 -0700
> Only the data for fields that change value between requests are sent.”

A more precise statement would be, "only data for fields marked as changed will be sent".
So this is only done if the server (or ChannelProvider generally) manages a "what changed" bit set.
Setting bit #0 is the shorthand for "everything changed".

eg. QSRV does this tracking for Monitor, but not Get.

https://github.com/mdavidsaver/pva2pva/blob/master/pdbApp/pdbsingle.cpp#L410-L411

... as I think about it, it should (now) be possible to remove these two lines.

On 08/14/2018 09:12 AM, Heinz Junkes wrote:
> I have a question about bitSets.
> 
> I use the example program from exampleCPP get.cpp
> with the code fragment
> 
>         PvaClientGetDataPtr data = pvaClientGet->getData();
>         BitSetPtr bitSet =  data->getChangedBitSet();
> 
> Cardinality is "1" although obviously nothing changes.
> Bit #0 is set “structure”.
> 
> Now to my question. Is bitSet set by the server?
> 
> And then I don't understand that either (from the documentation).
> 
> "Only fields that change are transmitted.
> Only the data for fields that change value between requests are sent.”
> 
> in the pvaGet I only request “value”.
> 
> The PV I am looking at is a classic V3 PV (ca) and on my server runs pvAccess-Server (qsrv).
> 
> ioc:
> 
> dbpr CRYAFM:AWG0:DDSA:SetDDSFreq,4
> 
> ACKS: NO_ALARM      ACKT: YES           ADEL: 0             ALST: 123456        
> AOFF: 0             ASG:                ASLO: 0             ASP: 0x0            
> BKLNK: 00 00 00 00 00 00 00 00 00 00 00 00                  BKPT: 00            
> DESC: Frequency DDS DDSA:               DISA: 0             DISP: 0             
> DISS: NO_ALARM      DISV: 1             DOL:CONSTANT        DPVT: 0x19df880     
> DRVH: 0             DRVL: 0             DSET: 0x4fb724      DTYP: asynFloat64   
> EGU: Hz             EGUF: 0             EGUL: 0             EOFF: 0             
> ESLO: 1             EVNT:               FLNK:CONSTANT 0     HHSV: NO_ALARM      
> HIGH: 0             HIHI: 0             HOPR: 0             HSV: NO_ALARM       
> HYST: 0             INIT: 0             IVOA: Continue normally                 
> IVOV: 0             LALM: 123456        LBRK: 0             LCNT: 0             
> LINR: NO CONVERSION LLSV: NO_ALARM      LOLO: 0             LOPR: 0             
> LOW: 0              LSET: 0x1942808     LSV: NO_ALARM       MDEL: 0             
> MLIS: 00 00 00 00 00 00 00 00 00 00 00 00                   MLOK: 01 94 e7 40   
> MLST: 123456        NAME: CRYAFM:AWG0:DDSA:SetDDSFreq       NSEV: NO_ALARM      
> NSTA: NO_ALARM      OIF: Full           OLDSIMM: NO         OMOD: 0             
> OMSL: supervisory   ORAW: 123456        ORBV: 0             OROC: 0             
> OUT:INST_IO @asyn(awg0, 0)DDS Frequency OVAL: 123456        PACT: 0             
> PBRK: 0x0           PHAS: 0             PINI: NO            PPN: 0x0            
> PPNR: 0x0           PREC: 3             PRIO: LOW           PROC: 0             
> PUTF: 0             PVAL: 123456        RBV: 0              RDES: 0xcdc5d0      
> ROFF: 0             RPRO: 0             RSET: 0x4fbac8      RVAL: 123456        
> SCAN: Passive       SDIS:CONSTANT       SDLY: -1            SEVR: NO_ALARM      
> SIML:CONSTANT       SIMM: NO            SIMPVT: 0x0         SIMS: NO_ALARM      
> SIOL:CONSTANT       SPVT: 0x0           SSCN: <nil>         STAT: NO_ALARM      
> TIME: 2018-08-14 08:51:37.697697041     TPRO: 0             TSE: 0              
> TSEL:CONSTANT       UDF: 0              UDFS: INVALID       VAL: 123456         
> 
> humma-kavula:examples junkes$ cainfo CRYAFM:AWG0:DDSA:SetDDSFreq
> CRYAFM:AWG0:DDSA:SetDDSFreq
>     State:            connected
>     Host:             cry-test.rz-berlin.mpg.de:5064
>     Access:           read, write
>     Native data type: DBF_DOUBLE
>     Request type:     DBR_DOUBLE
>     Element count:    1
> 
> 
> humma-kavula:examples junkes$ pvinfo CRYAFM:AWG0:DDSA:SetDDSFreq
> CHANNEL  : CRYAFM:AWG0:DDSA:SetDDSFreq
> STATE    : CONNECTED
> ADDRESS  : 141.14.128.53:5075
> epics:nt/NTScalar:1.0
>     double value
>     alarm_t alarm
>         int severity
>         int status
>         string message
>     time_t timeStamp
>         long secondsPastEpoch
>         int nanoseconds
>         int userTag
>     display_t display
>         double limitLow
>         double limitHigh
>         string description
>         string format
>         string units
>     control_t control
>         double limitLow
>         double limitHigh
>         double minStep
>     valueAlarm_t valueAlarm
>         boolean active
>         double lowAlarmLimit
>         double lowWarningLimit
>         double highWarningLimit
>         double highAlarmLimit
>         int lowAlarmSeverity
>         int lowWarningSeverity
>         int highWarningSeverity
>         int highAlarmSeverity
>         double hysteresis
> 
> 
> get, nothing is changing ???
> 
> code fragment:
> 
>    void get()
>     {
> 
>         if(!channelConnected) {
>             cout << channelName << " channel not connected\n";
>             return;
>         }
>         if(!getConnected) {
>             cout << channelName << " channelGet not connected\n";
>             return;
>         }
>         pvaClientGet->get();
>         PvaClientGetDataPtr data = pvaClientGet->getData();
>         BitSetPtr bitSet =  data->getChangedBitSet();
> cout << "bitset Cardinality : " << bitSet->cardinality() << endl;
>         if(bitSet->cardinality()>0) {
>              cout << "changed " << channelName << endl;
>              data->showChanged(cout);
>              cout << "bitSet " << *bitSet << endl;
>         }
>     }
> 
> 
> output:
> 
> channelGetConnect CRYAFM:AWG0:DDSA:SetDDSFreq status Status [type=OK]
> channelGetDone CRYAFM:AWG0:DDSA:SetDDSFreq status Status [type=OK]
> bitset Cardinality : 1
> changed CRYAFM:AWG0:DDSA:SetDDSFreq
>  = epics:nt/NTScalar:1.0 
>     double value 123456
>     alarm_t alarm
>         int severity 0
>         int status 0
>         string message NO_ALARM
>     time_t timeStamp
>         long secondsPastEpoch 1534254697
>         int nanoseconds 697697041
>         int userTag 0
>     display_t display
>         double limitLow 0
>         double limitHigh 0
>         string description Frequency DDS DDSA:
>         string format 
>         string units Hz
>     control_t control
>         double limitLow 0
>         double limitHigh 0
>         double minStep 0
>     valueAlarm_t valueAlarm
>         boolean active false
>         double lowAlarmLimit nan
>         double lowWarningLimit nan
>         double highWarningLimit nan
>         double highAlarmLimit nan
>         int lowAlarmSeverity 0
>         int lowWarningSeverity 0
>         int highWarningSeverity 0
>         int highAlarmSeverity 0
>         double hysteresis 0
> 
> bitSet {0}
> 
> 
> channelGetDone CRYAFM:AWG0:DDSA:SetDDSFreq status Status [type=OK]
> bitset Cardinality : 1
> changed CRYAFM:AWG0:DDSA:SetDDSFreq
>  = epics:nt/NTScalar:1.0 
>     double value 123456
>     alarm_t alarm
>         int severity 0
>         int status 0
>         string message NO_ALARM
>     time_t timeStamp
>         long secondsPastEpoch 1534254697
>         int nanoseconds 697697041
>         int userTag 0
>     display_t display
>         double limitLow 0
>         double limitHigh 0
>         string description Frequency DDS DDSA:
>         string format 
>         string units Hz
>     control_t control
>         double limitLow 0
>         double limitHigh 0
>         double minStep 0
>     valueAlarm_t valueAlarm
>         boolean active false
>         double lowAlarmLimit nan
>         double lowWarningLimit nan
>         double highWarningLimit nan
>         double highAlarmLimit nan
>         int lowAlarmSeverity 0
>         int lowWarningSeverity 0
>         int highWarningSeverity 0
>         int highAlarmSeverity 0
>         double hysteresis 0
> 
> bitSet {0}
> 
> 
> 
> 
> ----------------------------------------------------------------------
> Das FHI verarbeitet, speichert und loescht Daten im Rahmen seiner
> Geschaeftstaetigkeit gemaess der Datenschutz-Grundverordnung (DSGVO)
> [General Data Protection Regulation (GDPR)] der Europaeischen Union.
> 


References:
bitSets and PVStructure Heinz Junkes

Navigate by Date:
Prev: bitSets and PVStructure Heinz Junkes
Next: Re: bitSets and PVStructure Marty Kraimer
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  <20182019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: bitSets and PVStructure Heinz Junkes
Next: Re: bitSets and PVStructure Marty Kraimer
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  <20182019  2020  2021  2022  2023  2024 
ANJ, 14 Aug 2018 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·