Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Author Signature:

Date:

Approved by:

Signature:

Institute:

Date:

Keywords: ACS, BACI, CORBA|Released by:|Signature:|

Institute:

Date:

...

M. Plesko

J. Stefan Institute

G. Chiozzi

European Southern Observatory

M. Sekoranja

...

Change Record

REVISION

DATE

AUTHOR

SECTIONS/PAGES AFFECTED

 

REMARKS

 

 

1.0

2001-03-04

M.Plesko

All

 

 

 

 

1.1

2002-05-08

M. Plesko

clarified section 4.4, reduced font size of code consistently to 10

 

 

 

 

1.2

2002-12-10

M. Sekoranja

All

 

Updated to the actual ACS 2.0 status and fixed some typos.

 

 

1.3

2003-11-11

A. Caproni

 

 

Updated to ACS3.0

 

 

1.4

2005-03-17

G.Chiozzi

 

 

Removed IDL interface. Updated documentation of characteristics

 

 

1.5

????TODO: fill out this date once the current revision work is completed, and also update "REMARKS".

T. Nakamoto

All

 

Thoroughly revised the whole document to clarify unclear specifications, to solve inconsistency between the actual implementation in C++ and the specification and to fix typos and corrupted format. Chapter 4 was removed because the most of the contents was duplication of other parts in this document. Unduplicated contents in Chapter 4 were moved to another part in this document, or ACS Basic Control Interface Specification.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Table of Content

1 Introduction
1.1 Scope
1.2 Audience
1.3 Acronyms
1.4 References
1.5 Executive summary
2 Concepts
2.1 Design Goals of BACI
2.2 Definitions
2.3 Basic Types and Objects
3 Applying BACI Patterns to ACS Property Data Types
3.1 Callbacks
3.2 Event Sets and Alarms
3.3 Monitors
3.4 Properties
3.4.1 Methods and Attributes Common to All Properties
3.4.2 The Interface for Double Properties
3.4.3 The Interface for Ppattern
3.4.4 The interface for Pstring
4 Solutions to Some Particular Requests for ACS
4.1 Properties with Sequences
4.2 Properties with Structs
4.3 Monitor Timing
4.4 Generic Access to Characteristics

...

of Content

Table of Contents

Introduction

Scope

This document specifies the CORBA interfaces for the Basic Control Interface (BACI) part of ACS. In order to be nearly self-sufficient, it repeats the main BACI concepts in simpler terms. In case of inconsistency, the original BACI specification \[1\] takes precedence.

...

Wiki Markup
This document specifies the CORBA interfaces for the Basic Control Interface (BACI) part of ACS. In order to be nearly self-sufficient, it repeats the main BACI concepts in simpler terms. In case of inconsistency, the original BACI specification \[1\] takes precedence.

...

Audience

This document is intended mainly for application programmers of clients or servers that need to know the implementation of BACI types for ACS. It also specifies some points, which are left by BACI to the implementation.

...

Acronyms

CORBA

Common Object Request Broker Architecture

BACI

Basic Control Interface

ACS

ALMA Control System

API

Application Programmer's Interface

IDL

Interface Definition Language

MACI

Management and Access Control Interface

...


...

References

  1. ACS Basic Control Interface Specification TODO: append document version number after it is updated.
  2. OMG Time Service Specification, formal/97-12-21.pdfQUESTIONpdf QUESTION: Which document is it? Provide the link to the document.
  3. ACS Error System ArchitectureQUESTIONArchitecture QUESTION: This is a quite important document for jBACI implementation. Is ACA_Error_System.doc (title: ACS Eror System) the document that this reference refers to? The document title is different.
  4. Logging and Archiving
  5. Abeans White Paper QUESTION: Shall we can get rid of this?
  6. BACI White Paper QUESTION: Which document is it? Provide the link to the document.
  7. Management and Control Interface Specification

...

Executive summary

BACI is meant to be a standardized interface so that applications and pieces of control systems can be hooked to it from either side. The BACI prescribes a model of Components that are commonly used in all control systems. It is the largest common denominator that can be found among different types of experimental facilities. As such it should enable portability of core control software and ultimately reduce the dispersed efforts at various laboratories where the same software is written all over and over.
BACI is but a definition of interface patterns with the use of IDL, not a definition of an application programmer's interface (API). A concrete API must first define interfaces for Component Properties. This is the task of the present document. The definition of different types of Components and which properties they contain is the task of people who know devices and beyond the scope of this document.
This document uses the following patterns described in the BACI specifications: callback, event set, monitor and property. It defines interfaces for these patterns on concrete data types such as double, long, string, etc. The result is an IDL module, whose components are building blocks for devices and which is implemented with a generic library. Programmers of concrete device servers use the IDL components to define their devices and use the generic library to efficiently write servers. All the common tasks of servers, such as handling and managing client requests, CORBA Object (COB) life-cycle management, dispatching monitor callbacks, initializing servant code, etc. is done by the generic libraries that are provided by ACS in the BACI and MACI (Management and Access Control Interface). The programmer only has to write the so called "business logic", i.e. the way a device behaves.

...

...

Concepts

...

Info

Most

...

of

...

the

...

discussion

...

in

...

this

...

chapter

...

is

...

a

...

repetition

...

from

...

other

...

documents

...

\[1,6\].

...

Design Goals of BACI

The design goals of BACI are:

...

  • EPICS: each controlled device property has a set of standard characteristics
  • CDEV: devices are objects that are a collection of properties
  • TACO: a server manages the interface for one type of devices
  • DOOCS: the object is keeping short term history data
  • all: synchronous and asynchronous get/set calls are supported

...

Definitions

A Component is a CORBA object that corresponds to the model of a physical device, e.g. power supply, vacuum pump, current monitor, etc. The Component is the basic entity of the BACI, because it is the most natural concept for modeling physical entities. Commands that are executed on a Component, like on, off or reset are referred to as methods of the Component. Each Component has a number of Component Properties that are controlled, e.g. electric current, status, position, etc. A Component also has a set of Characteristics, which are static data, usually - but not necessarily – read from a configuration database.

Properties, which are also defined as objects in the BACI, are referred to as IDL attributes of the Component. Properties are distinguished by type (integer, double, etc.) and by being read-only or read-write objects. Each such "property object" has specific characteristics, e.g. the value, the minimum, etc. The methods of a property allow to retrieve or modify these characteristics: get(), set(), min_value(), etc. While there are in principle an infinite number of Component types, one for each physical controlled device, there are very few different property types. It makes therefore sense to standardize those types, which is exactly the aim of this document.

Most of the device commands and property methods are executed asynchronously by the remote object. The results of the operations are communicated to the client by means of a callback. A callback is an object interface that must be implemented by the client, so that it can be invoked by the remote object. During this process, the remote object functions as a client and the client performs as a server.

A Component servant is a CORBA aware piece of code that implements one specific Component interface. A servant usually communicates with the hardware via VME, fieldbus, or similar. Note that devices of the same type, i.e. having the same IDL interface, can be exported by several different device servers, residing on different hosts. A typical example is a telescope complex with several identical but independent telescopes. The servant for "telescope1/motor" exports the motors of telescope 1, while the servant for "telescope2/motor" exports the motors of the other telescope. Both types of motors have the same IDL.

...

Basic Types and Objects

Wiki Markup
Device properties have one of the following scalar types This list of types was extracted from ACS/LGPL/CommonSoftware/baciidl/ws/idl/baci.idl in ALMA-RELEASE-B branch of Subversion revision 242801.: *float{*}, *double{*}, *long* (32-bit signed integer), *uLong* (32-bit unsigned integer), *longLong* (64-bit signed integer), *uLongLong* (64-bit unsigned integer), *boolean{*}, *string{*}, *pattern* and *enum*QUESTION: As far as I investigated the current jBACI implementation (jbaci/idl/testjBACIEnumProp.idl and jbaci/test/alma/ACS/jbaci/enumProp/test), it seems that device server developers have to define their own enum types in IDL and provide their implementation for each enum type. It would simply cause duplication 
How is it done in C++?, where "{*}pattern{*}" stands for an unsigned long. The typedef pattern is used because this type will mostly be used to encode a pattern of status bits. Furthermore, "pattern" is a single word as opposed to "unsigned long". The type pattern can be used also for raw binary data. In the next generation of ACS we plan to use code generators, either from a special template preprocessor or from UML models. Then, it will be much easier to add any new type, therefore it doesn't make much sense to spend the time now.QUESTION: What is the current situation? I would like to make this sentence up-to-date. Or, maybe this sentence can be simply removed because how each type is implemented is irrelevant to, at least, client developers.
Several values of the same type are stored as a sequence, according to the IDL type definition, e.g.:
typedef sequence<double> doubleSeq;
\\
Such sequences are already provided by acscommon.idl. Sequences are used when multiple devices are controlled with one method call or when a history of values of one property is requested. The use of sequences for individual values is possible but strongly discouraged, as properties are supposed to be simple objects related to one I/O channel.
The only Component properties with sequences of value types are *floatSeq* (RO and RW), *doubleSeq* (RO and RW), *longSeq* (RO and RW), *uLongSeq* (RO and RW), *boolean* (RO and RW) and *ROstringSeq* (RO only)  This list of types was extracted from ACS/LGPL/CommonSoftware/baciidl/ws/idl/baci.idl in ALMA-RELEASE-B branch of Subversion revision 242801., because others have not been requested. But they can be added at any moment. The same argument as in the paragraph above holds here, too. 
Each value read from the control system has an associated time-stamp. The time should be ideally represented by the CORBA time service through the UTO interface (which is not the POSIX time). As the time service is not yet part of most of the ORBs and the astronomers have other requirements on time, we use a different interface. We use the following definitions for Time and TimeInterval:
typedef unsigned long long Time;
\\
where Time is the absolute time in 100 ns since 1582-10-15 00:00:00QUESTION: I couldn't find any definition of timezone. Does ALMA assume a specific timezone for Time type?, see \[2\]. And
typedef unsigned long long TimeInterval;
\\
where TimeInterval is used for the difference between two absolute time points.
For each operation (action, command, monitor or alarm event), the time stamps, errors and alarm codes are returned through the interface Completion, which is defined as:
\\
\\
struct Completion \{
\\
 unsigned long long timeStamp;  // time stamp in 100th of nsQUESTION: What timestamp is it? Is it the time the hardware provides? Or, is it the time that the device server (or BACI property) calls the callback?
 \\
 ACSErr::ACSErrType type;  // error type (group)
 \\
 ACSErr::ErrorCode code; // error code
 \\
 sequence<ACSErr::ErrorTrace, 1> previousError;   // previos error(s) (error trace)
\\
\}; 
\\
The completion structure is described in more detail in the BACI\[1\] and the ACS Error System Architecture \[3\] documentsTODO: check out this document and learn how previoussError field shall be filled.. Here, we will discuss the basic concepts. When there was no error, struct Completion contains the timestamp, the non-error type (ACSErrTypeOK) and code (ACSErrOK) and an empty previousError (error trace). BACI does not define values of the completion code, because it is open to particular implementations.
When there is an error, completion returns information that allows to pinpoint the reasons; previousError data structure contains detailed information about the error, either used to display or log the information - see the documents on error handling \[3\] and logging \[4\] for more.
\\
Listing 1: Definition of  ACSErrType  extracetd by acserr.idl.
#ifndef _ACSERR_IDL_
#define _ACSERR_IDL_
\\
#pragma prefix "alma"
\\
module ACSErr \{
\\
...
\\
    typedef unsigned long ACSErrType;
    typedef unsigned long ErrorCode;
\\
...
\\
\};
\\
#endif
\\
Error types and their corresponding codes are defined in XML files. For each error type, a unique XML file must be defined by the developer. The type ACSErrTypeMonitor is reserved for monitor callbacks that can be either time or value triggered.
\\
Listing 2: The XML for ACSErrTypeMonitor (ACSErrTypeMonitor.xml).
<?xml version="1.0" encoding="UTF-8"?>
 <Type xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ACSError.xsd" name="ACSErrTypeMonitor" 
type="1" _prefix="alma">
 <Code name="ACSErrMonitorOnTimer" shortDescription="A regular timer monitor triggered the event." description="A regular timer monitor triggered the event."/>
 <Code name="ACSErrMonitorOnValue" shortDescription="The value changed by a specified amount or more." description="The value changed by a specified amount or more."/>
</Type>
\\
Code is automatically generated from the XML file.
Listing 3: Definition of ACS ACSErrTypeMonitor type.
#ifndef  _ACSErrTypeMonitor_IDL_
#define  _ACSErrTypeMonitor_IDL_
\\
#include <acserr.idl>
\\
#pragma prefix "alma"
\\
module ACSErr \{
 // type
 const ACSErr::ACSErrType ACSErrTypeMonitor = 1;
\};
\\
module ACSErrTypeMonitor \{QUESTION: What error type and what error code should be used when BACI property wants to say that it couldn't obtain a valid value from the hardware.
\\
When a new monitor is created, BACI property is obliged to call working() callback method within normal_timeout. It is possible that the hardware cannot respond by the specified time, but BACI property still has to call working() callback method so that the client won't time out. When calling working(), BACI property has to pass some value as the first argument, but that value will be a dummy value (because it is not the value that hardware returns). Thus, BACI property has to tell the client that the value is dummy somehow. Is there a standard way for that? Or, does the device server developer have to define such error code/type for each device?
\\
 //ED: A regular timer monitor triggered the event.
 const ACSErr::ErrorCode ACSErrMonitorOnTimer = 0;
 //ED: The value changed by a specified amount or more.
 const ACSErr::ErrorCode ACSErrMonitorOnValue = 1;
\\
        // exceptions:
\\
\};//module
\\
#endif
\\
The type ACSErrTypeAlarm is reserved for alarm messages that originate from the property value.
 Listing 4: Definition of ACS ACSErrTypeAlarm type.
#ifndef  _ACSErrTypeAlarm_IDL_
#define  _ACSErrTypeAlarm_IDL_
\\
#include <acserr.idl>
\\
#pragma prefix "alma"
\\
module ACSErr \{
 // type
 const ACSErr::ACSErrType ACSErrTypeAlarm = 2;
\};
\\
module ACSErrTypeAlarm \{
\\
 //ED: All alarm conditions have disappeared.
 const ACSErr::ErrorCode ACSErrAlarmCleared = 0;
 //ED: At least one alarm condition remains.
 const ACSErr::ErrorCode ACSErrAlarmChanged = 1;
 //ED: Value below alarm LoLo (includes hysteresis).
 const ACSErr::ErrorCode ACSErrAlarmLow = 2;
 //ED: Value above alarm HiHi (includes hysteresis).
 const ACSErr::ErrorCode ACSErrAlarmHigh = 3;
 //ED: An alarm on the status determined by software.
 const ACSErr::ErrorCode ACSErrAlarmSoftware = 4;
 //ED: An alarm on the status from the hardware.
 const ACSErr::ErrorCode ACSErrAlarmHardware = 5;
\\
        // exceptions:
\\
\};
\\
Alarms as defined above are notifications about the state of the controlled property. Alarms are asynchronous and completely independent events. They have nothing to do with errors that occur during execution flow. In case such errors occur, the type and code values indicate this error condition, and the variable called error may contain a pointer to another completion structure. QUESTION: What is "variable called error"? Such variable does not exist in Completion structure. It does not even contain a variable that holds a pointer to another completion structure. previousError fields in Completion structure only contains the array of ACSErr::ErrorTrace.
\\
Maybe this sentence could be simply removed?The particular values of the type and code are specific to the server implementation.
The completion structure may have a pointer to yet another completion, and so on. We see that all those completion structures form a linked list in the recursive error sequence, which called error stack.QUESTION: Again, Completion structure does not have a pointer to another completion. There is actually a linked list of ACSErr:ErrorTrace in previousError variable, but ACSErr::ErrorTrace does not contain a pointer to Completion structure according to the reference document 2. Does this sentence mean the device server can extend Completion structure as they want? If so, is it necessary to address this issue here? Hence it is possible to return and analyze the full stack of errors in the method call sequence, as specified in \[3\]. This is usually done by the ACS libraries, either in the BACI server or in the Abeans \[5\] client libraries. The application programmer is relieved from this work. We will therefore not go into details here. If the Completion type and code indicate an error-free condition, the error stack must be empty. 
Errors and alarms are returned through the completion structure and not via CORBA exceptions, because most of the method calls are asynchronous. Callbacks, which are executed on the client in a separate thread, cannot raise exceptions. For reasons of uniformity, also synchronously executed methods that deal with control processes, return the same completion structure.
If methods on remote objects (either Component or property) fail for unexpected reasons, in particular methods that do not even return a completion, such as calls to characteristics or invocation of monitors, then, and only then, exceptions are thrown. If the remote object can not be reached, then the local ORB raises a CORBA::NO_IMPLEMENT exception. If the remote object can not finish the request for whatever reason, it raises CORBA::NO_RESOURCES. These exceptions are unchecked, i.e. they are not predeclared in the signature of the method in the IDL file.

Anchor
_Toc98844444
_Toc98844444
Applying BACI Patterns to ACS Property Data Types

...

  • The client has to first create a callback object, then it invokes the remote asynchronous command, giving the reference to the callback object as one of the parameters of the call
  • The callback is executed on request of the device server, completely independent of the normal execution flow on the client. The callback is therefore running in a separate thread. The thread itself is created and managed by CORBA, so there is no work for the client programmer.
Wiki Markup
BACI also prescribes the pattern, how asynchronous requests must be done:
request(par1, par2,…,in CB<type> cb, in CBDescIn desc);
\\
We see, that when the client passes the callback to the server, it must accompany it with the CBDescIn structure. And both are always at the end of the parameter list. The callback object CB<type> is explained in detail below. The parameter desc (for descriptor) allows the client to describe some attributes of the callback object:
struct CBDescIn\{
  TimeInterval normal_timeout;
  TimeInterval negotiable_timeout; // not used in ACS, 
  Tag id_tag; // Provided by Client to uniquely tag the incoming callback call.
\};
\\
The TimeInterval normal_timeout is sent by the client to the server to inform it that it expects a reply in the normal_timeout period, before it will raise a timeout error condition. The server must complete the operation or send a notification that the operation is still in progress. The Tag id_tag is discussed with the CBDescOut structure.
For clients written in Java, the Abeans \[5\] library conveniently does all the work, so that the programmer doesn't even have to know CORBA and even less all those callbacks and descriptors.
The callback interface for simple types is illustrated with these two examples:
interface CBvoid: Callback\{
  oneway void working(in Completion c, in CBDescOut desc);
  oneway void done(in Completion c, in CBDescOut desc);
\};
interface CBdouble: Callback\{  
  oneway void working(in double value, in Completion c, in CBDescOut desc);  
  oneway void done(in double value, in Completion c, in CBDescOut desc); 
\};
\\
All callback methods are of type oneway, which means that the invoker (the device server in this case) does not have to wait for the callback methods to finish. The reason for this is that we do not want to influence the performance of device servers if client code is written badly.
The callback CBvoid does not return any value, only the time stamp and possible errors in the completion structure. It is used mainly to return the completion after an asynchronous command has been executed or to act as an event without data. Since BACI takes extreme care to be type-safe, there is one callback class for each data type that is transferred. The above example of CBdouble is for values of type double. Callbacks for other types are equivalent; just replace all three occurrences of "double" with the appropriate primitive type.
The CBDescOut type defines a structure that is a descriptor of the callback with information from the server:
struct CBDescOut\{
  TimeInterval estimated_timeout; 
  Tag id_tag; 
\};
\\
The parameter estimated_timeout contains the estimated time for the callback to be returned. This value can be used by the client for timeout handling – if the callback is not received within this time plus some safety margin, the client can assume that there was a problem on the server side.
The id_tag is a numeric index (the Tag data type is nothing but an unsigned long), which has been provided by the client in the CBDescIn structure, when making the asynchronous request. This can be used by the client to distinguish callbacks from different requests.
When the callback is used for asynchronous notification in response to some action, the done method must be invoked when the action terminates, either with error condition or success. When the client processes the done invocation, it may discard the callback. If the action is time consuming, i.e. it cannot be completed before the normal_timeout parameter, the server must issue a working notification periodically (the server works under presupposition that each invocation resets the client's timeout timer to the normal_timeout period). The client must not discard the callback before done notification is called or one of the notifications timeout on the client side. See the BACI specifications for a detailed discussion on timeouts.
In normal cases, a "single-shot" command invokes the done method of the callback, while monitors regularly call working. 

Anchor
_Toc98844446
_Toc98844446
Event Sets and Alarms

...

Anchor
_Toc98844448
_Toc98844448
Properties

Wiki Markup
Having defined all concepts, we can now put them together into the most important interface of BACI, the property. The BACI specifications define only the core method of the root property interface, meaningfully called Property. For ACS, we have to define concrete properties that will be used to control and supervise all points of ALMA. In order to keep the interface definitions reasonably simple, we have kept the number of different property types small.
Properties are the basic entities that are manipulated by the control system. For a discussion on the meaning of properties and their relation to Components see the BACI white paper\[6\]. Two basic flavors of properties exist: RO = read-only (e.g. encoder position, device status) and RW = read-write (e.g. power supply voltage, pointing coordinate). In addition, properties have a certain type like double, long, string, etc.
!worddav254deeaa31b662cce7058d7e95ec63b1.png|height=305,width=389!
_Figure 1: Inheritance diagram for Acs::PdoubleSeq_
For the normal user of ACS, the object hierarchy of properties has little meaning (see figure 1). It may be confusing at best, because the only properties that a Component actually contains are of the type RO and RW. However, the hierarchy is very important for the code generator (not yet provided for ACS) and to account for all BACI concepts, which include groups of Components and others. In this document, we will simply state and explain all methods that all Properties have and then jump directly to the presentation of RO and RW properties.

Anchor
_Toc98844449
_Toc98844449
Methods and Attributes Common to All Properties

Wiki Markup
The following methods and attributes are common to all properties, because they come from the interfaces higher up the inheritance hierarchy (CharacteristicModel, Property, TypelessProperty). They can be common, because they do not depend on the type of the property value. A normal client would use only those in italics. The others are mainly used by generic clients, like the Object Explorer, and the Abeans libraries that provide Java Beans components for fast client development.
readonly attribute string name; // The fully qualified name of the Property
\\
//generic access to characteristics, even those that are not declared in the IDL
any get_characteristic_by_name(in string name) raises (NoSuchCharacteristic);
\\
//returns a sequence of characteristic names that match the regular expressions
//reg_exp. It returns a sequence of length 0 if no match is found.  
stringSeq find_characteristic(in string reg_exp);
\\
// The name of the parent Component
readonly attribute string characteristic_component_name; 
\\
//Returns a PropertySet object containing all characteristics of the Property.
CosPropertyService::PropertySet get_all_characteristics();
\\
readonly attribute string description; // the description of the Property
readonly attribute string format;      // the format for printf in C-syntax 
readonly attribute string units;       // the units of the Property
readonly attribute pattern resolution; // a bitpattern of significant bits
\\
// Publish the value of the property.
// This method is meant to be called when the value of this property must be
// archived/monitored in relation to a change or error of another monitor point.
void publish_now();
\\
Some more explanations on the definitions: The main BACI components, such as Component and Property are named: they have a name, which the manager (see \[7\]) can convert to object reference if the client has the correct access level (only for Component). A Property cannot exist on its own - it is always a read-only attribute of a Component and thus knows the name of it. It does not keep an object reference to the Component for security reasons. The attribute pattern resolution is actually a bit pattern representing the significant bits of the word carrying the value. It is useful also for returning the resolution of analog-digital converters in case of numeric properties.

Anchor
_Toc98844450
_Toc98844450
The Interface for Double PropertiesTODO: compare the contents of this section with baci.idl and update this section accordingly. Or, maybe we can copy the contents of this section to the inline documents in baci.idl, and put the link to baci.idl so that we don't have to worry about the consistency between two separate documents.

...

Sequences are very easy to add: keep the Property exactly the same as for scalar types, including all characteristics. Wherever a value is returned in a scalar type, return a sequence. It is simplest to explain with an example. This is all the IDL that is related to ROdoubleSeq and RWdoubleSeq (the syntax related to a sequence of doubles is highlighted with bold typeface):
typedef sequence<doubleSeq> doubleSeqSeq;
interface CBdoubleSeq: Callback{
oneway void working(in doubleSeq value, in Completion c, in CBDescOut desc);
oneway void done(in doubleSeq value, in Completion c, in CBDescOut desc);
};
interface PdoubleSeq: TypelessProperty{ doubleSeq get_sync(out Completion c);
void get_async(in CBdoubleSeq cb, in CBDescIn desc); long get_history(in long n_last_values, out doubleSeqSeq vs, out TimeSeq ts);
Monitordouble create_monitor(in CBdoubleSeq cb, in CBDescIn desc);QUESTION: This method returns an instance of Monitordouble, which means that value trigger is available for sequence types, but when the value trigger shall be invoked? Is it invoked when any element in the sequence fulfills the value trigger criteria? Or, is it invoked when all elements in the sequence fulfill the criteria?
Monitordouble create_postponed_monitor(in Time start_time, in CBdoubleSeq cb, in CBDescIn desc);
readonly attribute TimeInterval default_timer_trigger; readonly attribute TimeInterval min_timer_trigger; readonly attribute double min_delta_trigger; readonly attribute double default_value; readonly attribute double graph_min; readonly attribute double graph_max; readonly attribute double min_step;};
/* Yes, the ROdoubleSeq contains no items related to sequences. The Alarm is always triggered for a single value exceeding the limits, therefore the scalar Alarmdouble event is fired */
interface ROdoubleSeq: PdoubleSeq{ Subscription new_subscription_Alarmdouble(in Alarmdouble cb, in CBDescIn desc);TODO: As far as I investigated C++ BACI code, the alarm is raised or cleared per element in the sequence. Check if the behavior of the alarm with test code and document it here or somewhere else (maybe baci.idl is better).
readonly attribute double alarm_low_on;
readonly attribute double alarm_low_off;
readonly attribute double alarm_high_on;
readonly attribute double alarm_high_off;
};
interface RWdoubleSeq: PdoubleSeq{
Completion set_sync(in doubleSeq value); void set_async(in doubleSeq value, in CBvoid cb, in CBDescIn desc);
void set_nonblocking(in doubleSeq value);
void increment(in CBvoid cb, in CBDescIn desc);
void decrement(in CBvoid cb, in CBDescIn desc); readonly attribute double min_value;
readonly attribute double max_value;
};

Anchor
_Toc98844455
_Toc98844455
Properties with Structs

...