Sunteți pe pagina 1din 62

I/A Series® System

Inter-Process
Communications Calls

B0193BB

Rev D
February 16, 2011
Invensys, Foxboro, I/A Series, the Invensys logo, and SPECTRUM are trademarks of Invensys plc, its
subsidiaries, and affiliates.
All other brand names may be trademarks of their respective owners.

Copyright 1989-2011 Invensys Systems, Inc.


All rights reserved

SOFTWARE LICENSE AND COPYRIGHT INFORMATION


Before using the Foxboro supplied software supported by this Foxboro documentation, you
should read and understand the following information concerning copyrighted software.
1. The license provisions in the Foxboro Software License for your system govern your
obligations and usage rights to the software described in this documentation. If any
portion of those license provisions is violated, The Foxboro Company will no longer
provide you with support services and assumes no further responsibilities for your sys-
tem or its operation.
2. All software issued by The Foxboro Company, and copies of the software that you are
specifically permitted to make, are protected in accordance with Federal copyright
laws. It is illegal to make copies of any software media provided to you by The Fox-
boro Company for any purpose other than those purposes mentioned in the Foxboro
Software License.
Contents
Preface..................................................................................................................................... v
Revision Information ................................................................................................................ v
Reference Documents ............................................................................................................... v

1. IPC Concepts .................................................................................................................... 1


Connected Data Transfers ......................................................................................................... 1
Connectionless Data Transfers .................................................................................................. 2
Synchronous IPC Calls ............................................................................................................. 2
Asynchronous IPC Calls ............................................................................................................ 3
Examples of IPC Call Uses ........................................................................................................ 3
IPC Return Codes ..................................................................................................................... 4
Table of IPC Calls ..................................................................................................................... 4
Data Values and Structures ....................................................................................................... 5
Integer Type Values ............................................................................................................. 5
Data Structures (for 50 Series Only) ..................................................................................... 5
Connectionless Data Transfer (CDT) Process Registration Table .................................... 5
Connection Data Transfer (DT) Process Registration Table ............................................ 6
Event Control Structure (for 50 Series Only) .................................................................. 6
Initialization and Configuration Parameters (for 50 Series Only) .............................................. 7

2. Administrative Calls .......................................................................................................... 9


cs_register — Register to Use IPC ............................................................................................. 9
cs_reg_exit — Register With Automatic Unregister ................................................................ 10
add_alias — Add Another Alias Name .................................................................................... 10
del_alias — Delete an Alias Name ........................................................................................... 11
cs_activate — Activate a Registered IPC User ......................................................................... 11
e_cs_activate — Event Activate a Registered IPC User ............................................................ 12
cs_unregister — Unregister Task With IPC ............................................................................ 13

3. Connected Data Transfer Services ................................................................................... 15


cs_connect — Connect to Another Task ................................................................................. 15
c_answer — Respond to a Connect ......................................................................................... 16
c_send — Send a Message ....................................................................................................... 17
c_receive — Receive a Message .............................................................................................. 18
c_disconnect — Disconnect Specified Channel ....................................................................... 20

iii
B0193BB – Rev D Contents

4. Connectionless Data Transfer Calls................................................................................. 21


cl_send — Send Data Without A Connection ....................................................................... 21
clu_send — Unacknowledged Non-Broadcast Connectionless Send ....................................... 22
cl_receive — Receive Data Without A Connection ................................................................. 24
cl_cancel — Cancel a cl_receive Call ....................................................................................... 25
cl_bcast — Send to a Group of Stations .................................................................................. 26

5. Utility IPC Calls ............................................................................................................. 29


c_chkio — Check on a Connection Async Call ....................................................................... 29
c_chkio_s — Check on a Connected Async Channel .............................................................. 30
cl_chkio — Check on a Connectionless Async call .................................................................. 31
c_worevent — Wait for an Event ............................................................................................ 32
c_waitevent — Wait for Unlimited Event ............................................................................... 34
c_selevent — Select Event ....................................................................................................... 35

6. Timer Services (for 50 Series Only) ................................................................................. 37


start_time ................................................................................................................................ 37
restart_time ............................................................................................................................. 38
stop_time ................................................................................................................................ 39

Appendix A. IPC Calls Sample Programs ............................................................................ 41


IPC Calls Connectionless “Sender” Program ........................................................................... 41
IPC Calls Connectionless “Receiver” Program ........................................................................ 42
IPC Calls Connected “Sender” Program ................................................................................. 43
IPC Calls Connected “Receiver” Program ............................................................................... 44

Appendix B. IPC Error Codes ............................................................................................. 47

Index .................................................................................................................................... 51

iv
Preface
This document is for process control software engineers who wish to write application programs
to run on the I/A Series System.
Readers are assumed to know the C programming language, particularly pointers and data struc-
tures. They are also assumed to be familiar with the SunOS or VENIX (or UNIX) operating sys-
tem. The I/A Series documentation set does not include any programming language manuals.

Revision Information
For this release of the document (B0193BB-D), the following changes were made:
Appendix B “IPC Error Codes”
 Added this appendix.

Reference Documents
 SunOS Reference Manual I, II, III
 VENIX User Reference Manual
 VENIX Programmer’s Reference Manual
 VENIX Administrator’s Reference Manual
 VENIX Support Tools Guide
 Program Development (B0193BA)
 Object Manager Calls (B0193BC)
 Human Interface Calls (B0193BD)
Most are available on the I/A Series Electronic Documentation CD-ROM (K0173TQ or
K0173WT) provided by the Foxboro business unit of Invensys Operations Management (IOM).
The latest revisions may also be available through the IOM Global Customer Support at
http://support.ips.invensys.com.

v
B0193BB – Rev D Preface

vi
1. IPC Concepts
The Inter-Process Communications (IPC) calls provide a method for tasks written in C to pass
messages to one another. “Process,” in this case, refers to a program or script in execution, not a
process in the user’s plant. Use these messages to:
 Pass data or control information
 Notify another task of an event
 Coordinate the use of common network resources
 Distribute some of a task’s functions.
The two communicating tasks do not need to be aware of one another’s location. Also, IPC can
broadcast messages to identically named tasks in different stations.
This section describes some of the details of how IPC operates so that programmers can make the
best use of it. IPC calls are simple to use, but at the same time it is possible to create very complex
data transfer routines.
Covered in this section are:
 Registering a task to use IPC
 Activating a task to use IPC
 Connected data transfers
 Connectionless data transfers
 Awakening a task by sending it a message
 Asynchronous communications
 Synchronous communications
 Event flags
 Examples of IPC call uses
 Return codes.

Connected Data Transfers


A permanent connection between tasks has several advantages:
 Subsequent data transfers between tasks are faster
 Messages are guaranteed to be delivered in the order sent
 IPC does not have to locate the other task each time a message is to be sent
 The communications line is maintained by the system.
However, connections take up more memory space, cost CPU time, and increase network traffic,
which may be wasteful during periods between data transfers.
The maximum number of channels into and out of a task depends on the number of communica-
tions transport connections set during configuration.

1
B0193BB – Rev D 1. IPC Concepts

Each connection to another task is established on a specific “channel.” The channel id number is
returned to you when you connect, and to the other task when it answers a connect request. Alias
names are not used in connected calls.
You may issue only one c_answer call at a time. The c_answer call responds to requests by other
tasks to establish a channel (connection) over which you both can send and receive.
Over a single channel you may only have one c_receive call outstanding to retrieve messages.
If the connection is broken for any reason, you are notified the next time you attempt to use the
channel.
You can send a group of messages as a virtual single message by using the end-of-message (EOM)
flag on the last message in the group.

Connectionless Data Transfers


Connectionless data transfers also have several advantages:
 There is no memory or CPU time overhead for maintaining the connection during
idle periods.
 By using up to 20 aliases, you can receive messages under different task aliases as a
means of classifying them.
 You can have many separate cl_receive calls active at once by having each use a differ-
ent task alias.
 The cl_receive call, allows you to issue a cl_chkio call to check the results, which
gives you a positive indication of whether the message was received, and how many
bytes were received.
Connectionless data transfers have some disadvantages, as listed below:
 Connectionless calls require that you specify the destination task name each time.
 The destination task must be located each time, unless you specify its location.
 Connectionless messages can arrive out of order.

Synchronous IPC Calls


Synchronous calls block task execution until the call is completed or until a user-specified timer
expires.
IPC calls that block execution until the call is complete:
cs_register del_alias cl_chkio cs_connect
cs_unregister cl_bcast cl_cancel e_cs_activate
c_send c_chkio c_disconnect
add_alias c_chkio_s cs_activate

IPC call that blocks execution until complete or a timer expires:


c_worevent
c_waitevent

2
1. IPC Concepts B0193BB – Rev D

Since the task suspends until the call completes or times out, you can check the results by examin-
ing the value that the call returns, and you can do it in code that executes immediately after the
call.
Timer values represent fifths of a second.
You cannot issue a synchronous call over a connection or to a task alias while an asynchronous call
is pending on the same connection or alias. This includes IPC calls, Object Manager calls, and all
other calls.
Understanding why this is so may be easier after reading the next section on asynchronous calls.

Asynchronous IPC Calls


Asynchronous calls return control to your task as soon as the call is initiated, even if the call has
not finished its job. These calls either allow you to specify an event number, or they return a
request id to you. You must check on the status of these calls later in your program.
The asynchronous calls are:
c_receive c_answer cl_send cl_receive
c_selevent start_time restart_time stop_time

clu_send is neither synchronous or asynchronous in that it initiates immediately and you cannot
check its status.
On a given channel (i.e., connected service), you can have only one c_receive call active at a
time. For example, two c_receives would require two different channels.
For a given task alias (i.e., connectionless service), you can have only one cl_receive call active at
a time. Two cl_receives would require two task aliases.
Keep in mind that as long as an asynchronous call is pending over a given connection or alias, no
synchronous calls can be made using the same connection or task alias. This includes Object
Manager calls and all others. “Pending” means that, although control has been returned to your
task, the call has not finished doing its job yet.

Examples of IPC Call Uses


Here is an example, in general terms of the order in which these calls might be used:
Administrative Calls
1. Register to use IPC (cs_register).
2. Activate your task (cs_activate).

Connected Data Transfers


3. Form a connection to another task (cs_connect). Other task answers (c_answer)
and checks answer (c_chkio).
4. Send your message (c_send). Other task receives (c_receive) and checks (c_chkio).
5. Disconnect (c_disconnect).

Connectionless Data Transfers

3
B0193BB – Rev D 1. IPC Concepts

6. Send data without a connection (cl_send or cl_bcast).


7. Add aliases that you want your task known as (add_alias).
8. You must check a cl_send (cl_chkio). Other task receives (cl_receive) and checks
(cl_chkio). Other task can cancel all receives pending (cl_cancel).

Administrative Calls
9. Remove aliases from your task (del_alias).
10. Remove task from the registration list (cs_unregister).

IPC Return Codes


Each call returns a value that tells you what happened to the call. That is, whether it completed
successfully, and if not, why not.
The possible return codes are listed with each call.
These return code variables are defined in the IPC include file, ipc.sys for software releases up to
2.2 and in ipc.h for software releases 3.0 and later.
All of the IPC call return codes that represent errors are negative numbers. In this way you can
check for errors by testing for any return code less than zero. (This is not necessarily true for other
subsystems’ calls.)

Table of IPC Calls


Table 1-1. IPC Calls

Type IPC Call Sync/Async Aliases? Event Flag?


ADMIN cs_register sync no no
cs_reg_exit sync no no
add_alias sync yes no
del_alias sync yes no
cs_activate sync no no
cs_unregister
sync no no
CONNECTED cs_connect sync no no
c_answer async no yes
c_send sync no no
c_receive async no yes
c_disconnect sync no no
e_cs_activate
sync no no
CONNECT- cl_send async yes yes
LESS clu_send --- yes no
cl_receive async yes yes
cl_cancel sync yes no
cl_bcast sync no no

4
1. IPC Concepts B0193BB – Rev D

Table 1-1. IPC Calls (Continued)

Type IPC Call Sync/Async Aliases? Event Flag?


UTILITY c_chkio sync no no
c_chkio_s sync no no
cl_chkio sync no no
c_waitevent sync no no
c_worevent sync no no
c_selevent
async no no
TIMER start_time async no no
restart_time async no no
stop_time async no no

Data Values and Structures


Integer Type Values
On 20/30 Series the returned value type integer is 2 bytes and on 50 Series, the returned value
type integer is 4 bytes.
Example of a complete cl_send() call sequence:
msg_id = cl_send[d_name,info,size,buffer,event];
event_num = c_worevent[1,0];
result = cl_chkio]msg_id,CLSEND,info,buffer];

Where msg_id, event_num, and result are an integer type return code:
char *d_name;
struct chk_clinfo *info;
lchar *buffer;
struct event_spec *event;

Data Structures (for 50 Series Only)


The following sections describe the data structures that are used by the IPC calls to pass informa-
tion between the calls and your application.

Connectionless Data Transfer (CDT) Process Registration Table


One structure is allocated per registered process.
struct CDT_PRT
{
unsigned char avail_stat ; /*node availability */
unsigned char ue_num ; /*number of aliases */
unsigned char exit_flag ; /*exit services flag */
unsigned char cl_rcv_ctr ; /*outstanding cl_recv counter */
unsigned char msg_cnt ; /*msg count for this process */
unsigned char usr_type ; /*type of user using IPC */
unsigned short unique_num ; /*unique number of a process */
struct ue_info *ue_list ; /*ptr to UE & process name list*/
struct event_ent *event ; /*pointer to the event entry */
BCB_PTR head ; /*Items are put on the head */

5
B0193BB – Rev D 1. IPC Concepts

BCB_PTR tail ; /*and taken off the tail */


unsigned int pid ; /*ipc process identification */
unsigned short cl_snd_ind ; /*outstanding cl_send states */
};

Connection Data Transfer (DT) Process Registration Table


One structure is allocated per registered process.
struct DT_PRT
{
char ap_name[IPC_NAME_LEN];
unsigned char avail_stat ; /*node availability */
unsigned char exit_flag ; /*exit service flag */
unsigned char num_chans ; /*# of allocated channels */
unsigned char avail_chans; /*available channels */
unsigned char usr_type ; /*type of user using IPC */
unsigned short unique_num ; /*unique number of a process*/
struct channel_info *channel ; /*pointer to channel list */
struct event_ent *event ; /*pointer to event entry */
unsigned int pid ; /*ipc process identification*/
};

Event Control Structure (for 50 Series Only)


One structure is allocated for each timer service (ts) per process and contains the process timer
data.
struct ts_event
{
int timetype ; /*one-shot or auto timer */
short time_id ; /*CTS timer id */
unsigned short timeefn ; /*timer event number */
unsigned int timeval ; /*timer value */
}
One structure is allocated per process for both CDT and DT types. It contains the data about the
process that is using IPC event services.
struct event_ent
{
int state ; /*state of event */
struct proc *p_select ; /*proc of selected process */
char result ; /*sleep / awakened result */
char num_timer ; /*number of timers */
short cts_id ; /*CTS timer id for worevent */
short type ; /*worevent or waitevent flag */
short num_efnw ; /*number of 32 events */
unsigned char snd_efn[MAX_SND_OUT];/*associated efn cl_sends*/
struct ts_event tm[PROC_IPC_TIMER] ; /*database timer service*/
unsigned int *event_oc ; /*pointer to event occurring */
unsigned int *event_req; /*pointer to event request */
unsigned int *susp_mask; /*pointer to suspension mask */
unsigned int *event_tmp; /*working area for waitevent */
};

6
1. IPC Concepts B0193BB – Rev D

Initialization and Configuration Parameters (for


50 Series Only)
IPC maintains the station configuration parameters in the file cmx_cfg.c which is supported by
the COMEX subsystem. The total number of connections available per station is restricted by the
COMEX configuration availability.
The maximum number of IPC CDT process registration table entries supported for 50 Series sta-
tions is 255, the default is 96. The maximum number of IPC DT process registration table entries
supported for 50 Series stations is 255, the default is 96. The total number of timer services for 50
Series stations is 50. IPC parameters such as NUM_DT_PROCESS and
NUM_CDT_PROCESS are configurable via a user configurable parameter file for station reboot
and restart. These parameters, on 50 Series stations, may be changed through the ipc_init() func-
tion (refer to the 50 Series Configurable Operating System document).
ipc_init() is an internal IPC function that performs initialization during station reboot and
restart. It reads parameters from a system configuration data station_cfg_params and saves them
in an IPC configuration structure and variables. It then allocates space for the Connection Data
Process Registration Table (DT) and Connectionless Data Process Registration Table (CDT).
The calling sequence of ipc_init() is as follows:
if (station is restart)
{
The station must be in single user mode before this portion of code can be
executed.
Go through each CDT table to free up any outstanding ue_info resources.
Go through each DT table to free up any outstanding channel_info resources.
Reset ipc_unique.
Clear llc_recv_enable flag.
Free CDT and DT tables.
}
ipc_cfg.ndt = station_cfg_params.ipc_cfg_data.num_conn_reg;
ipc_cfg.ncdt = station_cfg_params.ipc_cfg_data.num_cnls_reg;
max_ipc_timer = station_cfg_params.ipc_cfg_data.num_timers_per_sta;
Allocate space for both CDT and DT Process Registration tables.
Return (INIT_SUCCESS)

7
B0193BB – Rev D 1. IPC Concepts

8
2. Administrative Calls
These are the calls used to set up for communications via IPC. You must register with IPC and
activate, the other calls are optional.
cs_register Register your task with IPC
cs_reg_exit Register With Automatic Unregister when task is exiting
add_alias Add other names that your task can be known as
del_alias Delete alias names form the alias list
cs_activate Activate your task before issuing any IPC calls
e_cs_activate Event activate your task before issuing any IPC calls
cs_unregister Unregister your task with IPC

cs_register — Register to Use IPC


Every application task that uses IPC calls must register with the IPC subsystem. This returns an
integer value (see the return codes). This call is synchronous; it suspends until completion.
Format:
int cs_register[ap_name,numalias,alias,service,max_insts,max_chnls]
char *ap_name;
int numalias;
char *alias[numalias];
int service;
int max_chnls;
int max_insts;

Where:

ap_name The name (not an alias) of the application task making the IPC calls. Use
this name in the Object Manager’s obj_create call to make your process
globally known.

numalias The number of other names by which this task can be referred. You can
specify up to 20 aliases. This is for connectionless service only. For con-
nected service, numalias = 0.

alias An array containing pointers to alias names that you wish to specify (con-
nectionless service only). If an alias is to be available throughout the net-
work, use the Object Manager call obj_create with the alias as type
PROCESS. The array must be as big as numalias.

service 0 = Connected Data Transfer service.


1 = Connectionless Data Transfer service.
If you want both, use two cs_register calls.

9
B0193BB – Rev D 2. Administrative Calls

max_chnls Specify up to eight channels for connected service; specify zero for connec-
tionless service.

max_insts This must be zero. It is reserved for future use.


Return Codes:
CALL_COMPLETE Task registration successful
E_NO_SERV The requested service is not available
E_UE_EXISTS Name already registered by someone else
E_MAX_CHAN Illegal value for max_chnls
E_NO_RES No IPC resources (space) left; try again later
E_ILL_AL_VAL Illegal number of aliases
E_ILL_NAM_SZ Illegal alias or ap_name length
E_NO_DT_ALIAS No aliases allowed for connected service

NOTE
NOTES:
1.) Alias names must be unique within a station; those available outside the station
must be unique to the network.
2.) You can register a task in a system-initialization task to avoid re-registering the
task every time it runs.
3.) If a message comes in for a task that is registered, but not running, the system
will locate and load the task.

cs_reg_exit — Register With Automatic Unregister


The format, inputs, return codes for this call are identical to the cs_register call (previous sec-
tion). The difference is that IPC automatically unregisters the task when it exits. This call is syn-
chronous, your task suspends until completion.
With cs_register, you have to issue a cl_cancel, c_disconnect, and an x (depending on service)
to unregister.
With the cs_reg_exit call, IPC performs all of these operations for you when the program aborts
or exits normally.
Keep in mind that a task that is registered but not executing can be awakened (caused to execute)
by a message from another task. This call would prevent that, for the specified connection or alias,
by unregistering it when it exits.

add_alias — Add Another Alias Name


This call enables a registered, activated task to add an alias name to the alias list. This call is syn-
chronous, your task suspends until completion. It is for connectionless service only. Aliases are
explained in the Program Development document.

Format: int add_alias[aname]


char *aname; /* aname is the name being added */

10
2. Administrative Calls B0193BB – Rev D

Return Codes:
CALL_COMPLETE Alias name added successfully
E_NO_ACT You have not issued a cs_activate call
E_NOT_REG You have not issued a cs_register call
E_INV_ANAME Invalid alias name
E_NO_RES No IPC space for another alias; try again later
E_ILL_AL_VAL Attempt to exceed max number of aliases
E_ILL_NAM_SZ Name size not 1 to 12 characters

del_alias — Delete an Alias Name


This call enables a registered, activated user task to delete an alias name from the task alias list.
This call is synchronous, your task suspends until completion.

Format: int del_alias[aname]


char *aname; /* aname is the name being deleted */
Return Codes:
CALL_COMPLETE Alias name deleted successfully
E_NO_ACT You have not issued a cs_activate call
E_NOT_REG You have not issued a cs_register call
E_ONGO_IPC The alias has a send or receive pending (cancel the receive or
check the send and try again)
E_INV_ANAME Invalid alias name
E_ILL_NAM_SZ Name size not 1 to 12 characters

cs_activate — Activate a Registered IPC User


Each time a task runs, it must activate the name by which it wants IPC to know it and by default
IPC reserves 32 asynchronous events for the task. This call is synchronous, your task suspends
until completion.

Format: int cs_activate[ap_name,service]


char *ap_name;

int service;

Where:

ap_name The name (not an alias) of the application task that is making the IPC
calls.

service 0 = Connected Data Transfer service


1 = Connectionless Data Transfer service
If you want both, use two cs_activate calls.

11
B0193BB – Rev D 2. Administrative Calls

Return Codes:
CALL_COMPLETE Task activation successful
E_NO_SERV Service not available or illegal value
E_INV_NAM Syntax error in application task name
E_NOT_REG Calling task is not registered for IPC
E_INV_UE Unknown application task name
E_MULT_ACT This name and service already active
E_NO_RES No IPC resources (space) left; try again later
E_ILL_NAM_SZ Name size not 1 to 12 characters

NOTE
NOTES:
1.) Make a separate cs_activate call for each type of service (connected or connec-
tionless) that the application will be using.
2.) Make sure ap_name is the task name and not an alias name. As with registering,
activating the task name activates all alias names as well.

e_cs_activate — Event Activate a Registered IPC User


Each time a task runs, it must activate the name by which it wants IPC to know it and must create
the number of IPC asynchronous events. You can call either c_worevent() to wait on events 1-32
or c_waitevent() to wait on events 1 to a number of specified events. This call is synchronous,
your task suspends until completion.
Configuration: For 50 Series Only, V3.1 or later.

Format: int e_cs_activate[ap_name,service,num_event]

char *ap_name;
int service;
int num_event

Where:

*ap_name The name (not an alias) of the application task that is making the IPC
calls.

service 0 = Connected Data Transfer service


1 = Connectionless Data Transfer service
If you want both, use two e_cs_activate calls

num_event Number of 32 events.


Return Codes:
CALL_COMPLETE Task activation successful
E_NOT_REG Calling task is not registered for IPC

12
2. Administrative Calls B0193BB – Rev D

E_INV_UE Unknown application task name


E_MULT_ACT This name and service already active
E_NO_RES No IPC resources (space) left; try again later
E_ILL_NAM_SZ Name size not 1 to 12 characters

NOTE
NOTES:
1.) Make a separate e_cs_activate call for each type of service (connected or con-
nectionless) that the application will be using.
2.) Make sure ap_name is the task name and not an alias name. As with registering,
activating the task name activates all alias names as well.

cs_unregister — Unregister Task With IPC


This call removes all of IPC’s information about the task for the specified service type (connected
or connectionless). This call is synchronous, your task suspends until completion.

Format: int cs_unregister[ap_name,Service]


char *ap_name
int service
Where:

ap_name The name of the application task that will no longer be making IPC calls
(the same name you registered with).

service 0 = Connected Data Transfer service.


1 = Connectionless Data Transfer service.
If you want to unregister both, use two calls.
Return Codes:
CALL_COMPLETE Unregistration successful
E_NO_ACT The task name is not active
E_NOT_REG The task is not registered
E_ONGO_IPC The task has a send or receive pending
E_SERVICE Illegal value for service
E_ILL_NAM_SZ Name size not 1 to 12 characters

13
B0193BB – Rev D 2. Administrative Calls

NOTE
NOTES:
1.) A task can only unregister itself, not other tasks.
2.) A task cannot unregister until it terminates all IPC activities (use c_disconnect
and cl_cancel).
3.) Leaving a task registered when exiting allows other tasks to awaken it by sending
it a message.
4.) Unregistering a task removes all of its alias names.

14
3. Connected Data Transfer
Services
This is one of two types of communications services: Connected and Connectionless Data Trans-
fer services. In Connected service, a task forms a connection (a channel) to another task and can
then send and receive data over the connection. Either task can break the connection.
Tasks can connect to another task in the same station or to a task in another station. The maxi-
mum is eight, regardless of who initiated the connections.
Once a connection is established, both tasks can send and receive data over it.
The Connectionless Data Transfer services are discussed in “Connectionless Data Transfer Calls”
on page 21.

cs_connect — Connect to Another Task


This call creates a data transfer connection to another task and returns a channel identification
number for future communications. This call is synchronous, your task suspends until comple-
tion.

Format: int cs_connect[d_name,service,c_opt_prt,timer]

char *d_name;
int service;
struct c_option *c_opt_prt;
unsigned long null;

Where:

d_name The destination task with which the connection is to be formed. It must
be the ap_name used to register and activate that task with IPC.

service For this call, service must equal zero for Connected Data Transfer services.

c_opt_prt This is a pointer to a c_option data structure used to locate the station.
This structure contains two parameter fields, d_loca and psap_address.

d_loca: An optional station letterbug id


psap_address: An optional station address

Set these to zero if you are not using them, or they will be used to try and
find the station.

timer This is reserved for future use. Whatever value is entered here is ignored.

15
B0193BB – Rev D 3. Connected Data Transfer Services

Return Codes:
channel_id Successful connection returns this id
E_NO_ACT The calling task is not activated
E_NO_CHANS No more channels available for this task
E_ILL_LOCA Destination station cannot be found
E_NO_RES No resource to allocate connect message
E_NO_DEST Destination task name cannot be found
E_ILL_NAM_SZ d_name is not 1 to 12 characters long

NOTE
NOTES:
1.) If the destination task name is unique within the network, then d_name is suffi-
cient; set d_loca and psap_address to zero.
2.) If the task name is not unique, specify psap_address – its station address –
(more efficient), or d_loca (its station letterbug id). Use the Object Manager’s
GLOBAL_FIND call to get the task’s station address.
3.) If you specify both d_loca and psap_address, IPC ignores d_loca and uses
psap_address. If you specify neither, IPC locates the task on its own.
4.) Upon successful completion of this call, IPC returns a channel identification. All
subsequent sending and receiving on that channel must use that channel id.

c_answer — Respond to a Connect


This call is used to respond to a connect call from another task. The c_answer call is asynchro-
nous, that is, it returns to your task as soon as it has been initiated, and you must check back to
see if the call has completed using c_chkio.

Format: int c_answer(service,info,event)

int service;
struct chk_info *info;
struct event_spec *event;

Where:

service This must be zero for connected service.

info This is a pointer to a data structure containing five fields that are returned
to the calling task upon completion of the call:

o_name The task whose call you are answering


my_name The name of your application task

r_size, eom, and dis_ind are not used with this call

16
3. Connected Data Transfer Services B0193BB – Rev D

event By assigning an event number from 1 to 32 you can use a c_worevent call
to see if the event has completed. Event number zero means the call is not
assigned any event number (use c_chkio to check for completion).
Return Codes:
IN_PROGRESS c_answer is in progress
E_NO_ACT You have not issued a cs_activate call
E_NO_CHANS No more channels available for this task
E_NO_SERV The specified service is not available
E_ILL_EFN Event flag not 0-32 or is a duplicate
E_ANS_OUT Still a c_answer pending for this task
E_NOT_CHK You did not check the last operation
E_NO_RES No IPC resources (space) left; try again later
E_INV_MY_NAME my_name is illegal or not zeroed out

c_send — Send a Message


Use this call to send data to another task over a specified channel. This call is synchronous, your
task suspends until completion.

Format: int c_send(channel_id,size,eom,buffer_ptr)

int channel_id;
long size;
int eom;
char *buffer_ptr;

Where:

channel_id You can get this value from a c_chkio issued after a c_answer or from a
cs_connect’s return code.

size The size of the message in bytes. The maximum is 1024.

eom The end-of-message flag should be set to TRUE (1) if the message is com-
plete in this call. In messages longer than 1024 bytes, this would be
FALSE (0) until the last c_send call.

buffer_ptr A pointer to the buffer containing your message.


Return Codes:
CALL_COMPLETE The call completed successfully
E_INV_CHAN Channel id invalid or still pending
E_NO_ACT You have not issued a cs_activate call
E_MAX_SIZE Specified buffer size exceeds 1024 bytes
E_DISCON You are no longer connected to a channel

17
B0193BB – Rev D 3. Connected Data Transfer Services

E_ABORT_CON The connection has been aborted


E_INV_BUFPTR Buffer pointer is null; initialize it
E_NO_RES No IPC resources (space) left; try again later

NOTE
NOTE: This call is synchronous, but it is complete when the message is in the
queue, not when it is sent. If the message cannot be sent out of the station, the com-
munications layers abort the connection and notify IPC. IPC marks the channel
disconnected.

A disconnect indication in a later attempt to use the channel means the message was not sent.
Example of the calling sequence:

result = c_send[channel_id, eom=0, buffer, 1k]


/*First 1k of data to send*/
........

efn = c_worevent[mask, timer]

result = c_send[channel_id, eom=0, buffer, 1k]


........ /*Second 20k of data to send*/

efn = c_worevent[mask, timer]

result = c_send[channel_id, eom=1, buffer, 1k]


........ /*Last 1k of data to send*/

efn = c_worevent[mask, timer]


/*Message notifies receiver of the c_send */

c_receive — Receive a Message


Use this call to receive data from another task over a specified channel. The c_receive call is asyn-
chronous, that is, it returns to your task as soon as it has been initiated, and you must check back
with c_chkio to see if the call has completed.

Format: int c_receive[channel_id,size,info,buffer_ptr,event]

int channel_id;
long size;
struct chk_info *info
char *buffer_ptr;

18
3. Connected Data Transfer Services B0193BB – Rev D

Where:

channel_id You can get this value from a c_chkio issued after a c_answer or from a
cs_connect’s return code.

size The size of the received-message buffer in bytes. The maximum is 1024.

info This is a pointer to a data structure containing five fields that are returned
to the calling task upon completion of the call.

o_name The task whose data you are receiving


my_name The name of your application task
r_size The size of the message received
eom To get all of a message, continue to use the c_receive
call until this end-of message flag comes back true (1).
dis_ind This flag indicates whether or not you have been dis-
connected (true = 1).

buffer_ptr This points to a buffer in your task’s data space for the received message.

event Pointer to the event data structure (one field), in which you can define an
event flag number (optional). The flag is set when the message arrives. Use
cl_chkio to retrieve the message.
Return Codes:
IN_PROGRESS The call is in progress (see note 2)
E_INV_CHAN Invalid channel identifier
E_NO_ACT You have not issued the c_activate call
E_MAX_SIZE Specified buffer size exceeds 1024 bytes
E_DISCON Channel disconnected, input buffer clear
E_ILL_EFN Event flag not 0-32, or is a duplicate
E_NOT_CHK Last action not checked with c_chkio
E_ABORT_CON Channel aborted by system
E_INV_BUFPTR Buffer pointer is null, initialize it
E_NO_RES No IPC resources (space) left; try again later
E_INV_MY_NAME my_name is illegal or not zeroed out

19
B0193BB – Rev D 3. Connected Data Transfer Services

NOTE
NOTES:
1.) There can be only one outstanding c_receive call per channel.
2.) Use a c_chkio call to check the results of a c_receive call in progress. If a mes-
sage has come in, c_chkio will put it in the buffer specified in the c_receive call
and fill in the fields in the chk_info structure.
3.) The size specified for the received-message buffer can be larger or smaller than
the actual amount of data sent, as long as the size specification does not exceed
1024 bytes.
If the buffer is too small for the data sent, no data is lost; the next c_receive call
retrieves the rest of the data.

c_disconnect — Disconnect Specified Channel


The c_disconnect call unconditionally terminates a connection. This call is synchronous, your
task suspends until completion.

Format: int c_disconnect[channel_id]

int channel_id;

Where:

channel_id The channel identifier that was returned in the successful cs_connect call
or from a c_chkio issued to check a c_answer call.
Return Codes:
CALL_COMPLETE The channel has been disconnected
E_INV_CHAN Invalid channel identifier
E_NO_ACT You have not issued the cs_activate call
E_NO_RES No IPC resources (space) left; try again later

NOTE
NOTES:
1.) Any outstanding messages are discarded and input buffers are cleared.
2.) All event flags associated with the specified channel are cleared.
3.) The channel identifier number is released for future assignments.
4.) Attempts to use a disconnected channel return an error.
5.) To abort a pending c_answer call use c_disconnect(0).

20
4. Connectionless Data Transfer
Calls
This section lists the calls that provide a method for transmitting data between two tasks without
setting up a connection.
The calls are:

cl_send — Send Data Without A Connection


cl_send Send a message
clu_send Unacknowledged Non-Broadcast Connectionless Send
cl_receive Receive a message
cl_cancel Cancel all pending receives
cl_bcast Send a message to many tasks of the same name

The cl_send call allows your task to send a message to another task without previously having
established a connection. A successful call returns a message identification number. The cl_send
call is asynchronous, that is, it returns to your task as soon as it has been initiated, and you must
check back with cl_chkio to see if the call has completed.

Format: int cl_send[d_name,info,size,buffer_ptr,event]

char *d_name;
struct chk_clinfo *info;
long size;
char *buffer_ptr;
struct event_spec *event;

Where:

d_name The name or alias of the task to which you are sending

info This is a data structure containing the following data fields:

o_name Not used in this call


my_name Your task’s name
d_loc The other task’s logical station (letterbug) name
r_size Not used in this call
psap_address The station address of the addressee

size The size of your message in bytes

21
B0193BB – Rev D 4. Connectionless Data Transfer Calls

*buffer_ptr A pointer to your data space for the message

*event Pointer to the event data structure (one field), in which you can define an
event flag number (optional). The flag is set upon message transmission,
whether successful or not. Use cl_chkio to determine success.
Return Codes:
id Message identification number
E_NO_ACT The calling process is not activated
E_MAX_SIZE Specified buffer size exceeds 1024 bytes
E_INV_NAM d_name, d_loca, or psap_address is bad
E_ILL_EFN Event flag not 0-32, or is a duplicate
E_INV_BUFPTR The message buffer pointer is null (00)
E_INV_INFOPTR Invalid chk_clinfo structure pointer
E_INV_DNAME Invalid d_name
E_NO_RES No IPC resources (space) left; try again later
E_INV_MY_NAME Invalid my_name
E_ILL_LOCA d_loca (letterbug name) not found or else you provided an
invalid psap_address

NOTE
NOTES:
1.) You can provide d_loca, psap_address, both, or neither. If you provide both,
IPC uses psap_address and ignores d_loca. If you provide neither, set them to
zero. IPC makes an Object Manager global_find call to locate the task.
The most efficient method for many sends is to issue a global_find to get the
psap_address, which speeds up the cl_send call.
2.) Fill in the my_name field to send from an alias name. If you leave it null, IPC
fills in your task name.
3.) If you send to another station, IPC provides a return code value indicating that
the call is in progress (a message id). When the message is sent, IPC sets the event
flag, if defined. You must issue a cl_chkio call to determine the status of the transac-
tion, using the message id as a reference.

clu_send — Unacknowledged Non-Broadcast


Connectionless Send
The clu_send() call is an unacknowledged version to the cl_send() call, however, there is no
event definition capability and the sending process needs not register or activate. The user is not
notified whether the message is successfully sent. No cl_chkio() call is needed for this call. The
clu_send() does not guarantee delivery of the message. If there is no psap_address specified in
the chk_info structure, the clu_send() globally finds the destination (type Process variable) and
then sends the message. If d_loca is specified in the chk_info structure, the clu_send() globally
finds the station (type Device variable) and the sends the message. There are no IPC resource-
related restrictions to the call except for the kernel memory of the station, therefore there are no

22
4. Connectionless Data Transfer Calls B0193BB – Rev D

restrictions on the number of times the call is made. The clu_send call returns to your task as
soon as it has been initiated.
Configuration: For 50 Series Only

Format: int clu_send(d_name,info,size,buffer)

char *d_name;
struct chk_clinfo *info;
long size;
char *buffer;

Where:

d_name The name or alias of the task to which you are sending

info This is a data structure containing the following data fields:

o_name Not used in this call


my_name Your task’s name
d_loca The other task’s logical station (letterbug) name
r_size Not used in this call
psap_address The station address of the addressee

size The size of your message in bytes

buffer A pointer to your data space containing the message


Return Codes:
CALL_COMPLETE Successful call completion
E_MAX_SIZE Specified buffer size exceeds 1024 bytes
E_INV_BUFFER The message buffer pointer is null (00)
E_INV_INFOPTR Invalid chk_clinfo structure pointer
E_NO_RES No IPC resources (space) left; try again later
E_INV_MY_NAME Invalid my_name
E_ILL_LOCA d_loca (letterbug name) not found or else you provided an
invalid psap_address
E_ILL_NAM_SZ Name size not 1 to 12 characters

23
B0193BB – Rev D 4. Connectionless Data Transfer Calls

NOTE
NOTES:
1.) You can provide d_loca, psap_address, both, or neither. If you provide both,
IPC uses psap_address and ignores d_loca. If you provide neither, set them to
zero. IPC makes an Object Manager global_find call to locate the task.
The most efficient method for many sends is to issue a global_find to get the
psap_address, which speeds up the clu_send call.
2.) Fill in the my_name field to send from an alias name. If you leave it null, IPC
fills in your task name.

cl_receive — Receive Data Without A Connection


The cl_receive call allows your task to receive a message from another task without previously
having established a connection. The cl_receive call is asynchronous, that is, it returns to your
task as soon as it has been initiated, and you must check back with cl_chkio to see if the call has
completed.

Format: int cl_receive(a_name,size,info,buffer_ptr,event)

char *a_name;
long size;
struct chk_clinfo *info;
char *buffer_ptr;
struct event_spec *event;

Where:

*a_name A pointer to the task name or alias under which you are receiving

*info Points to a structure containing these data fields:

o_name The other (sending) task’s name


my_name Not used in this call
d_loca Not used in this call
r_size The actual size of the message received
psap_address The station address of the sender

size The size of the message buffer area up to 1024 bytes

*buffer_ptr A pointer to your message buffer area

*event Pointer to the event data structure (one field), in which you can define an
event flag number (optional). The flag is set when the message arrives. Use
cl_chkio to retrieve the message.

24
4. Connectionless Data Transfer Calls B0193BB – Rev D

Return Codes:
id Message identification number
E_NO_ACT You have not issued a cs_activate call
E_MAX_SIZE Specified buffer size exceeds 1024 bytes
E_ILL_EFN Event flag not 0-32, or is a duplicate
E_MULT_RECV Receive already issued for this name
E_NOT_CHK Previous cl_receive call not checked
E_INV_BUFPTR The message buffer pointer is null (00)
E_INV_DNAME Invalid d_name (a_name, in this case)
E_NO_RES No IPC resources (space) left; try again later

NOTE
NOTES:
1.) If the message sent is larger than the message buffer in your task, the buffer is
filled and IPC holds the rest of the message. You can use additional receive calls to
retrieve the rest of the message, but you should work out a protocol with the sender
for knowing how much was sent or else receive 1024 bytes each time and avoid the
problem.
2.) The cl_chkio call is required to check the results of a cl_receive call. Use the
message id returned by cl_receive as a reference in the cl_chkio call.
3.) It is the cl_chkio call that fills in the fields in the chk_clinfo data structure and
transfers the message to buffer_ptr.
4.) Only one outstanding cl_receive is permitted per alias, but multiple async
receives if they each use a different alias.
5.) You can have only one async answer active at a time, but multiple async
receives if each is on a different channel.

cl_cancel — Cancel a cl_receive Call


Use this call to cancel a pending cl_receive and discard any messages that IPC has received for
you. Senders are not notified that their messages have been discarded. This call is synchronous,
your task suspends until completion.

Format: int cl_cancel(dname)

char *dname

Where:

dname The task or alias name of the receiving task. Specifying the task name can-
cels for all aliases.
Return Codes:
CALL_COMPLETE The cl_receive is cancelled
E_NO_ACT You have not issued a cs_activate call

25
B0193BB – Rev D 4. Connectionless Data Transfer Calls

E_NOT REG You have not issued a cs_register call


E_INV_DNAME dname is not a valid alias name

cl_bcast — Send to a Group of Stations


This broadcast call enables you to send a message to a task that is running in each of a group of
stations. This call is synchronous, your task suspends until completion.

Format: int cl_bcast[d_name,group_name,size,buffer_ptr,my_name]

char *d_name;
char *group_name;
long size;
char *buffer_ptr;
char *my_name;

Where:

*d_name The name of the destination tasks

*group_name

BROADCAST All stations


COM_SERVERS Communication processors
DEV_MONITOR CS monitor
DIAG_SUPER Diagnostic supervisor
UNIT_CONTROL Control processors
FS_GATEWAY SPECTRUM Slave Gateway
GRAPHIC_DEV Workstation Processors
HISTORIAN Historian
SM_DISPLAYER System Monitor Display Handler
SYS_MONITOR System Monitor
FILE_SERVER Application Processors

size The size of your message in bytes (1024 max)

*buffer_ptr A pointer to your message location

*my_name The name of your task


Return Codes:
CALL_COMPLETE The broadcast has been sent
E_NO_ACT You have not issued a cs_activate call
E_MAX_SIZE Specified buffer size exceeds 1024 bytes

26
4. Connectionless Data Transfer Calls B0193BB – Rev D

E_INV_BUFPTR The message buffer pointer is null (00)


E_GROUPID Illegal group identification
E_INV_DNAME Invalid d_name
E_NO_RES No IPC resources (space) left; try again later
E_INV_MY_NAME Invalid my_name

NOTE
NOTES:
1.) If the communications software cannot send the message on the first try, it
makes one retry.
2.) There is no station-to-station acknowledgment that the message was received by
the various tasks. You should set up your own protocol for this purpose.
3.) If d_name exists in the local station, it is delivered there as well.
4.) If the my_name pointer is left null, IPC will supply the name when it sends the
message.

27
B0193BB – Rev D 4. Connectionless Data Transfer Calls

28
5. Utility IPC Calls
The IPC utility calls are the ones that allow the user to check the outcome of asynchronous calls,
wait for events, and check to see what event awakened your process.
The calls are:
c_chkio Check a c_answer and pick up a channel id.
Check a c_receive and move the data to the buffer.
c_chkio_s Check on the progress of c_answer.
cl_chkio Check a cl_send to see if it was sent.
Check a cl_receive and move the data to the buffer.
c_worevent Suspend the task to monitor up to 32 events and resume processing when
one occurs.
c_waitevent Suspend task to monitor unlimited events and resume when an event
occurs.
c_selevent Marks events of the calling process for use with the system select call

c_chkio — Check on a Connection Async Call


This call enables you to check the success of the asynchronous, connected data transfer calls
c_answer and c_receive. This call is synchronous, your task suspends until completion.

Format: int c_chkio[channel_id,action,info,buffer_ptr]

int channel_id;
act action;
struct chk_info *info;
char *buffer_ptr;

Where:

channel_id If this call is issued to check a c_answer call, then this should be set to
zero and c_chkio returns the channel id as a return code
If this call is issued after a c_receive call, use the same channel_id as the
c_receive call.

action This specifies the type of call to check. This value can only be RECEIVE
(0) or ANSWER (1).

*info This is a data structure containing the following fields (filled in when the
call is successful):

29
B0193BB – Rev D 5. Utility IPC Calls

o_name The name of the sending/connecting task


my_name The name of your application task
r_size The size of the message (for c_receive calls)
eom The sender sets this flag to true (1) when the end
of this data is the end of the message (for checking
a c_receive)
dis_ind 1 = disconnection indication, 0 = you are still con-
nected (checking c_receive)
psap_address The station address of o_name

*buffer_ptr This is a pointer to the location where c_chkio places messages picked up
with a c_receive call.
Return Codes:
channel_id Channel id if c_chkio call is successful
IN_PROGRESS Action still in progress
E_INV_CHAN Invalid channel id
E_NO_ACT You have not issued a c_activate call
E_INV_ACT The specified action is not in progress
E_DISC_IND IPC received a disconnect indication
E_NO_DEST Destination task name cannot be found
E_UE_DEST Destination station cannot be found
E_ABORT_CON The connection has been aborted
E_ILL_ACT Action must be RECEIVE or ANSWER

NOTE
NOTES:
1.) Use the c_chkio call to complete the c_receive and c_answer calls.
2.) If action = RECEIVE, and a message is now available, this call moves the mes-
sage into buffer_ptr. The size of the data transfer is the size specified in the
c_receive call.

c_chkio_s — Check on a Connected Async Channel


This call enables you to check the progress of c_answer for a channel to be connected. This call
has the same functionality as c_chkio(). c_chkio_s() may be used in place of c_chkio() if an
application breaks or connects a lot of channels. This call “cleans up” the event when a connection
is broken. This call is synchronous, your task suspends until completion.
Configuration: For 50 Series only, V3.1 or later.

Format: int c_chkio_s[info,event_num]

30
5. Utility IPC Calls B0193BB – Rev D

struct chk_info *info;


int event_num;

Where:

*info This is a data structure containing the following fields (filled in when the
call is successful):

o_name The name of the sending/connecting task


my_name The name of your application task
r_size The size of the message (for c_receive calls)
eom The sender sets this flag to true (1) when the end
of this data is the end of the message (for checking
a c_receive)
dis_ind 1 = disconnection indication, 0 = you are still con-
nected (checking c_receive)
psap_address The station address of o_name

event_num Event number returned from c_worevent or c_waitevent.


Return Codes:
channel_id Channel id if c_chkio_s call is successful
IN_PROGRESS Action still in progress
E_NO_ACT You have not issued a c_activate call
E_ABORT_CON The connection has been aborted
E_ILL_ACT No c_answer has been called
E_INV_INFOPTR Not a valid info pointer

NOTE
NOTES:
1.) Use the c_chkio_s call to complete c_answer calls.
2.) If the return code is in_progress, you must re-issue the c_chkio_s call.

cl_chkio — Check on a Connectionless Async call


This call enables you to check the success of the asynchronous connectionless data transfer calls
cl_send and cl_receive. This call is synchronous, your task suspends until completion.

Format: int cl_chkio[message_id,action,cl_info,buffer_ptr]

int message_id;
act action;

31
B0193BB – Rev D 5. Utility IPC Calls

struct chk_clinfo *cl_info;


char *buffer_ptr;

Where:

message_id Use the same message id as the cl_receive or cl_send call that you are
checking.

action This specifies the type of call to check. This value can only be
CLRECEIVE (0) or CLSEND (1).

*cl_info A data structure containing the following fields:

o_name The name of the sending task


my_name The name of your application task
d_loca Station address of the destination task
r_size The actual size of the message received (if
checking a cl_receive call)
psap_address The station address of o_name (for the
cl_receive call only)

*buffer_ptr This is a pointer to the location where cl_chkio places messages picked up
with a cl_receive call.
Return Codes:
message_id Message id, if cl_chkio is successful
IN_PROGRESS Action still in progress, try again
E_NO_ACT You have not issued a cs_activate call
E_INV_ACT The specified action is not in progress
E_UE_DEST Destination station cannot be found
E_ILL_ACT Illegal action specification
E_MSG_REJECTED Message could not be sent

NOTE
NOTES:
1.) Use cl_chkio to complete the cl_receive and cl_send calls.
2.) For cl_receive, cl_chkio moves new messages into buffer_ptr. cl_receive speci-
fies the amount of data transferred.
3.) If action is CLSEND, set the buffer pointer to null.
4.) If the return code is IN_PROGRESS, you must reissue the cl_chkio call.

32
5. Utility IPC Calls B0193BB – Rev D

c_worevent — Wait for an Event


The c_worevent call allows your task to stop processing and wait for a c_answer, c_receive,
cl_send, or cl_receive to occur. Processing resumes when the specified event occurs. This call is
synchronous, your task suspends until completion of the event or optional time-out.

Format: int c_worevent[mask,timer]

unsigned long mask;


unsigned long timer;

Where:

mask The value of mask indirectly determines which event(s) to monitor. The
value of mask, in binary, sets bits 0 through 31, which correspond to
events 1 to 32. Each bit set to one corresponds to an event to monitor.
Processing continues when any one of the events occurs.
A mask example:
The bits of the unsigned long word are numbered from right to left, least
significant bit (lsb) to most significant bit (msb), 00 to 31. These bit num-
bers correspond to event numbers 1 to 32, as specified in the c_answer,
c_receive, cl_send, or cl_receive calls.
For example, to wait for events one, two, or three:
 Set the bits for those event numbers
 Convert from binary (111) to decimal (7)
 Set the mask equal to seven

msb . . . 13 12 11 10 09 08 07 06 05 04 03 02 01 00 lsb
event # 14 13 12 11 10 9 8 7 6 5 4 3 2 1
mask = 7: 00000000000111

To wait for event eight:

event # 13 12 11 10 9 8 7 6 5 4 3 2 1
mask = 128 0000010000000

timer This is the maximum length of time, in fifths of a second, that the current
task will suspend while waiting for an event to occur. If the timer is set to
zero, the task will wait forever for an event to occur.
Return Codes:

number The smallest event flag number completed


E_NO_ACT You have not issued a cs_activate or e_cs_activate call
E_TIME_OUT Timer expired before any events occurred

33
B0193BB – Rev D 5. Utility IPC Calls

E_ILL_MASK Mask not in the range 1 to 2**(32-1)


E_NO_RES No IPC resources (space) left; try again later

NOTE
NOTES:
1.) If an event has completed before you issue the c_worevent call, your task does
not suspend.
2.) If more than one event completed before you issued the call, the lowest event
number is returned.

c_waitevent — Wait for Unlimited Event


The c_waitevent call allows your task to stop processing and wait for a c_answer, c_receive,
cl_send, or cl_receive to occur. This call supports from 1 to a number of specified events. This
call is synchronous, it suspends the calling process until one of the events in the mask array has
completed or an optional time-out occurs. The length of mask and event returned depends on
the size of events specified in e_cs_activate() call. If one or more events have been completed
when the call is made, the user receives all completed events at once in the location pointed by
event_return. Since many events can be returned at one time, the user must prioritize the
returned events. the lowest bit of word[0] in the mask array or event_return array corresponds to
event number 1, the highest bit corresponds to event number 32. word[1] relates to event num-
bers 33-64, and so on.
Configuration: 50 Series only, V3.1 or later.

Format: int c_waitevent[mask,event_return,timer]

unsigned int *mask;


unsigned int *event_return;
unsigned int timer;

Where:

*mask Pointer to an array of events to wait on.

*event_return Pointer to an array of returned events which could be one or many events.
Order of event bits for mask and event_return:
bit 32.............bit 1
-------------------------------------
word[0] | 32..................1
word[1] | 64..................33
word[2] | 96.................. 65
word[3] | 128 .................. 97
word[4] | 160 ..................129
...
...

34
5. Utility IPC Calls B0193BB – Rev D

timer This is the maximum length of time, in fifths of a second, that the current
task will suspend while waiting for an event to occur. If the timer is set to
zero, the task will wait forever for an event to occur.
Return Codes:

E_NO_ACT You have not issued a cs_activate or e_cs_activate call


E_TIME_OUT Timer expired before any events occurred

c_selevent — Select Event


The c_selevent() call marks the desired events of the calling process for which it would like the
select() call to wait on. The select() call checks to see if an IPC file descriptor is ready for read-
ing. When one of the selected events has occurred, IPC will selwakeup the selected process and
notify the user. c_worevent() indicates which event has occurred. The c_selevent call is asyn-
chronous, that is, it returns to your task as soon as it has been initiated. Refer to the select system
(UNIX) calls for more information about the select() call. A user process can obtain an IPC file
descriptor by calling get_ipcfd().
Configuration: For 50 Series only.

Format: int c_selevent[mask]

u_int mask;

Where:

mask Event mask for select to sleep on


Return Codes:

CALL_COMPLETE Successful call completion


E_NOT_REG You have not issued a cs_register() call
E_NO_ACT You have not issued a cs_activate() call

Example of the calling sequence:


fd = get_ipcfd(); /*Get ipc file descriptor */
result = c_selevent(0x7); /*Select wait on event 1, 2 and 3 */
event.efn = 1; /*Event 1 to pend on receive */
mid[1] = cl_receive (NULL,1024,&info, buffer, &event);
event.efn = 2; /*Event 2 to pend on another receive */
mid[2] = cl_receive (alias,1024,&info, buffer, &event)
event.efn = 3; /*Event 3 for auto timer wakeup */
tid = start_time( 50,1,&event );
FD_SET( fd.fdread );
FD_SET( otherfd,&fdwrite );
/*
* Sleep here until at least one of the file descriptors is ready
* for read or write
*/
result = select( limit, &fdread, &fdwrite, NULL, NULL );
if(FD_ISSET(fd, &fdread))
{

35
B0193BB – Rev D 5. Utility IPC Calls

/*Select wakeup because of IPC */


result = c_worevent( 0x7,0 );
if( result == 1 || result == 2 )
{
/*Event occurred because of message in the queue*/
cl_chkio(mid[result],CLRECEIVE,&info,buffer);
...
}
else
{
/*Event occurred because timer expired*/
...
}
}

36
6. Timer Services (for 50 Series
Only)
Timer services is the portion of IPC that provides a service for a process to start and wait on mul-
tiple event timers. Each timer request has an event number associated with it. The wait on event
call is c_worevent(). User processes may start a timer and then proceed to send or receive IPC
messages while the timer is active. Detection of an overrun, or tracking the number of expirations
of a timer are not supported.
IPC provides three functions for the timer services:
 Start a one shot timer or an auto timer
 Restart a timer
 Stop a timer.
The user process must be registered and activated with either a connection service or a connec-
tionless service or both, prior to using the timer calls. The event number must be unique. The
time-out period must not be 0. The timer value is in 100 milliseconds granularity. The maximum
number of timer services per process is 2 of any kind. The maximum number of timer serviced
per station is 50.
All outstanding timer events for a user process are cancelled when the task exits.
The following user initiated calls are used when making a timer service request:
 start_timer()
 restart_timer()
 stop_timer()

start_time
The start_time() call starts a software timer and returns a timer identification. The user process is
notified via c_worevent() call when the timer expires. The user must maintain the timer id in
order to execute stop_time() or restart_time().
Configuration: For 50 Series only.

Format: int start-time[duration, type, event]

u_int duration;
u_int type;
struct event_spec *event

Where:

duration Timer delay in 100 millisecond ticks.

timer Type of timer: 2 = one shot; 1 = auto timer

37
B0193BB – Rev D 6. Timer Services (for 50 Series Only)

*event Event number


Return Codes:

timer_id Timer_id if call is successful


E_NO_ACT You have not issued a cs_activate call
E_NO_RES No timer available
E_ILL_ACT Invalid timer type
E_ILL_EFN Invalid event number
E_INV_TIME Timer value

restart_time
The restart_time() call restarts a software timer (either a one shot timer or auto timer). The
timer’s delay begins immediately and is of the same duration that was in the start_time() request.
The user process is notified via c_worevent() call when the timer expires.
Configuration: For 50 Series only.

Format: int restart_time[timer_id]


int timer_id;

Where:

timer_id Timer_id from start_time


Return Codes:

CALL_COMPLETE If call is successful


E_INV_TIMIED Invalid timer_id

Example of the restart_time sequence:


1. If the timer_id indicates an auto timer:
 IPC marks the event associated with this timer_id as a new request and discards
any previous completed event.
 IPC starts a timer of the timer_id duration and type.
2. If the timer_id indicates a one shot timer:
a. If the timer is active:
 IPC stops the timer.
 IPC starts a new timer of the timer_id duration and type.
b. If the timer is expired:
 IPC marks the event associated with this timer_id as a new request and dis-
cards any previous completed event.
 IPC starts a new timer of the timer_id duration and type.
c. If timer is already expired via c_worevent() notification:
 The timer cannot be restarted.

38
6. Timer Services (for 50 Series Only) B0193BB – Rev D

 Error is returned.

stop_time
The stop_time() call stops the associated one shot timer or auto timer. The timer may already be
expired.
Configuration: For 50 Series only.

Format: int stop_time[timer_id]

int timer_id;

Where:

timer_id Timer_id from start_time

Return Codes:

CALL_COMPLETE If call is successful


E_INV_TIMIED Invalid timer_id

Example of the stop_time sequence:


1. If the timer_id indicates an auto timer:
 IPC marks the event associated with this timer_id as free and discards any previ-
ous completed event.
 IPC stops timer.
2. If the timer_id indicates a one shot timer:
a. If the timer is active:
 IPC marks event associated with this timer_id as free.
 IPC stops the timer.
b. If the timer is expired:
 IPC marks the event associated with this timer_id as free.

39
B0193BB – Rev D 6. Timer Services (for 50 Series Only)

40
Appendix A. IPC Calls Sample
Programs

IPC Calls Connectionless “Sender” Program


#include <stdio.h>
#include <fox/ipc.h>
#include <fox/om_udef.h>
char *send_buf;
char rcv_buf[50];
struct chk_clinfo info1;
struct chk_clinfo info2;
main()
{
int result;
int msg_id;
int i;
char *malloc();
send_buf = malloc(50);
printf(“Enter a string of less than 50 lower case characters\n”);
for (i=0;(send_buff[i] = getchar()) != '\n';i++) ;
send_buff[i] = NULL;
byte_fill(&info1,0,sizeof(struct chk_clinfo));
byte_fill(&info2,0,sizeof(struct chk_clinfo));
byte_fill(rcv_buf,0,sizeof(rcv_buf));
result=cs_register(“task1”,0,NULL,CDT,0,0);
printf(“Task1 cs_register result = %d\n”,result);
result = cs_active(“task1”,CDT);
printf(“Task1 cs_active result = %d\n”,result);
result = obj_create(“task1”,PROCESS);
printf(“Task1 obj_create result = %d\n”,result);
if (result!=0 && result!=(-10)) {
cs_unregister(“task1”,CDT);
printf(“Abort task1\n”);
exit(0);
}
result = cl_send(“task2”,&info1,50L,send_buf,0);
printf(“Taks1 cl_send result = %d\n”,result);
result = cl_receive(“task1”,50L,&info2,rcv_buf,0);
printf(“Task1 cl_receive result = %d\n”,result);
msg_id = result;
result = IN_PROGRESS;
while (result == IN_PROGRESS) {
result = cl_chkio(msg_id,CLRECEIVE,&info2,rcv_buf);
}
printf(“\n TASK1 complete response = %s\n”,rcv_buf);

41
B0193BB – Rev D Appendix A. IPC Calls Sample Programs

cs_unregister(“task1”,CDT);
}
byte_fill(dest,init,count)
char *dest;
char init;
int count;
{
int i;
for (i=1;i<=count;i++)*dest++ = init;
return(0);
}

IPC Calls Connectionless “Receiver” Program


#include <stdio.h>
#include <fox/ipc.h>
#include <fox/om_udef.h>
char send_buf[50];
char rcv_buf[50];
struct chk_clinfoinfo1;
struct chk_clinfoinfo2;
main()
{
int result;
int msg_id;
int i;
char c;
byte_fill(&info1,0,sizeof(struct chk_clinfo));
byte_fill(&info2,0,sizeof(struct chk_clinfo));
byte_fill(rcv_buf,0,sizeof(rcv_buf));
result=cs_register(“task2”,0,NULL,CDT,0,0);
printf(“Task2 cs_register result = %d\n”,result);
result = cs_activate(“task2”,CDT);
printf(“Task2 cs_activate result = %d\n”,result);
result = obj_create(“task2”,PROCESS);
printf(“Task2 obj_create result = %d\n”,result);
if (result!=0 && result!=(-10)) {
cs_unregister(“task2”,CDT);
printf(“Task2 aborting\n”);
exit(0);
}
printf(“Now start task1\n”);
sleep(40);
result = cl_receive(“task2”,50L,&info2,rcv_buf,0);
printf(“Task2 cl_receive result = %d\n”,result);
msg_id = result;
result = IN_PROGRESS;
while (result == IN_PROGRESS) {
result = cl_chkio(msg_id,CLRECEIVE,&info2,rcv_buf);
}

42
Appendix A. IPC Calls Sample Programs B0193BB – Rev D

printf(“\n Receive buffer contains: %s\n”,rcv_buf);


for (i=0;rcv_buf[i] != NULL;i++)
send_buf[i] = toupper(rcv_buf[i]);
send_buf[i]=NULL;
result = cl_send(“task1”,&info1,50L,send_buf,0);
printf(“Task2 cs_ send result = %d\n”,result);
printf(“\n TASK2 complete\n “);
cs_unregister(“task2”,CDT);
}
byte_fill(dest,init,count)
char *dest;
char init;
int count;
{
int i;
for (i=1;i<=count;i++)*dest++ = init;
return(0);
}
To run this program (on a PC) type:
receiver & <return>
When prompted type:
sender <return>

IPC Calls Connected “Sender” Program


#include <stdio.h>
#include <fox/ipc.h>
#include <fox/om_udef.h>
char *buf;
struct chk_info info;
struct c_option opt;
main(argc,argv)
int argc;
char *argv[];
{
int result, channel_id, i;
char *malloc();
buf = malloc(50);
strcpy(buf,argv[1]);
byte_fill(&opt,0,sizeof(struct c_option));
byte_fill(&info,0,sizeof(struct chk_info));
result=cs_register(“task1”,0,NULL,DT,0,1);
if(result <0)
printf(“Task1 cs_register result = %d\n”,result);
result = cs_activate(“task1”,DT);
if(result <0)
printf(“Task1 cs_activate result = %d\n”,result);
result = cs_connect(“task2”,DT,&opt,0L);
if(result <0)

43
B0193BB – Rev D Appendix A. IPC Calls Sample Programs

printf(“Task1 cs_connect result = %d\n”,result);


channel_id = result;
printf(“Channel ID = %d\n”,channel_id);
result = c_send(channel_id,50L,1,buf,0L);
if(result <0)
printf(“Task1 c_send result = %d\n”,result);
byte_fill(buf,' ',i);
result = c_receive(channel_id,50L,&info,buf,0L);
if(result <0)
printf(“Task1 c_receive result = %d\n”,result);
result = IN_PROGRESS;
while (result == IN_PROGRESS) {
result = c_chkio(channel_id,RECEIVE,&info,buf);
}
printf(“\n TASK1 response = %s\n”,buf);
result = c_disconnect(channel_id);
if(result <0)
printf(“Task1 c_disconnect result = %d\n”,result);
cs_unregister(“task1”,DT);
printf(“TASK1 complete\n”);
}
byte_fill(dest,init,count)
char *dest;
char init;
int count;
{
int i;
for (i=1;i<count;i++)*dest++ = init;
return(0);
}

IPC Calls Connected “Receiver” Program


#include <stdio.h>
#include <fox/ipc.h>
#include <fox/om_udef.h>
char *buf
struct chk_info info;
main()
{
int pid, status, result, channel_id, i;
char *malloc();
byte_fill(&info,0,sizeof(struct chk_info));
printf(“Enter up to 50 characters: “);
buf=malloc(50);
for (i=0;(buf[i]=getchar())!='\n';i++);
buf[i]=NULL;

44
Appendix A. IPC Calls Sample Programs B0193BB – Rev D

result = obj_create(“task2”,PROCESS);
if (result!=0 && result!=(-10)) {
printf(“Task2 obj_create result = %d\n”,result);
printf(“Task2 aborting\n”);
exit(0);
}
result=cs_register(“task2”,0,NULL,DT,0,1);
if(result<0)
printf(“Task2 cs_register result = %d\n”,result);
result = cs_activate(“task2”,DT);
if(result<0)
printf(“Task2 cs_activate result = %d\n”,result);
pid = fork(); /* do fork */
if (pid == -1) { /* failed */
fprintf( stderr, “fork failed\n” );
exit( -1 );
}
else if (!pid) { /* child process */
execl( “task1c”, “task1c”,buf, 0 );
fprintf( stderr, “exec failed\n” );
exit( -1 );
}
byte_fill(buf,0,sizeof(buf));
c_answer(DT,&info,0L);
result = IN_PROGRESS;
while (result == IN_PROGRESS) {
result = c_chkio(0,ANSWER,&info,buf);
}
if(result<0)
printf(“Task2 c_answer result = %d\n”,result);
channel_id = result;
c_receive(channel_id,50L,&info,buf,0L);
result = IN_PROGRESS;
while (result == IN_PROGRESS) {
result = c_chkio(channel_id,RECEIVE,&info,buf);
}
if(result<0)
printf(“Task2 c_receive result = %d\n”,result);
printf(“\nTask2 receive buffer contains: %s\n”,buf);
for (i=0;buf[i] != NULL;i++)
buf[i] = toupper(buf[i]);
buf[i]=NULL;
printf(“Converted string: %s\n”,buf);
result = c_send(channel_id,(long)i,1,buf,0L);
if(result<0)
printf(“Task2 c_ send result = %d\n”,result);
wait ( &status );/* wait for child */
cs_unregister(“task2”,DT);

45
B0193BB – Rev D Appendix A. IPC Calls Sample Programs

printf(“\n TASK2 complete\n “);


}
byte_fill(dest,init,count)
char *dest;
char init;
int count;
{
int i;
for (i=1;i<=count;i++)*dest++ = init;
return(0);
}
To run this program (on a PC) type:
receiver <return>
(Receiver will start sender automatically.)

46
Appendix B. IPC Error Codes
This appendix lists the IPC error codes formerly held in the obsolete ipc.h file.
The following tables provide the IPC error codes for any of the packages which once included
/usr/include/fox/ipc.h (which is found only in I/A Series systems with software with
revisions earlier than v8.x).

NOTE
Symbolic references for IPC error codes error codes up to -999 are reserved for
GM-MAP standard error codes. Error codes less than -999 are Invensys generated.

Table B-1. llc Error Codes

Error Variable Value Definition


E_INV_CHAN -1 invalid channel id
E_NO_ACT -2 no c_activate
E_NO_CHANS -3 no channels available
E_TIME_OUT -4 time out
E_MAX_SIZE -5 maximum buffer size exceeded
E_NO_SERV -7 service not available
E_INV_ACT -9 no such action ever happened before
E_INV_NAM -11 bad station or process name
E_NOT_REG -12 process not registered
E_INV_UE -13 UE name not known
E_DISCON -15 “disconnect” command has been issued
E_ILL_EFN -16 invalid event flag number
E_TWO_DIS -18 second disconnect
E_DISC_IND -19 disconnect received
E_MULT_RCV -20 second receive call outstanding
E_ANS_OUT -21 second answer call on same channel
E_NOT_CHK -22 didn't check last operation
E_NO_DEST -23 connect destination not found
E_UE_DEST -24 destination UE does not exist
E_UE_UNACK -27 UE name unacceptable
E_ANS_ABORT -28 answer aborted
E_ABORT_CON -29 abortion of connect request
E_ILL_EOM -30 EOM out of range
E_ILL_ACT -31 invalid action

47
B0193BB – Rev D Appendix B. IPC Error Codes

Table B-1. llc Error Codes (Continued)

Error Variable Value Definition


E_MULT_ACT -40 second c_activate
E_ILL_MASK -41 invalid mask

Table B-2. Invensys Generated Error Codes

Error Variable Value Definition


IN_PROGRESS 0 in progress
FOUND 1 object found
CALL_COMPLETE 1 call has been successful
NOT_FOUND -1 object not found
CHAN_PENDING -1 operation is pending
E_UE_EXISTS -1000 UE exists
E_INV_BUFPTR -1001 invalid buffer pointer
E_NO_AL_ENT -1002 no alias entry
E_ALS_NOT_CHK -1003 didn’t check last operation on an alias
E_ONGO_IPC -1004 ongoing IPC transactions
E_GROUPID -1005 invalid groupid
E_INV_INFOPTR -1006 invalid info pointer
E_INV_ANAME -1007 invalid alias
E_INV_DNAME -1008 invalid d_name
E_MAX_CHAN -1010 illegal value for maximum channels
E_NO_RES -1012 out of resources
E_INV_MID -1013 invalid message id
E_SERVICE -1021 illegal value for service
E_MSG_REJECTED -1041 message rejected
CONN_PENDING -1050 pending connection
E_ILL_AL_VAL -1065 user exceeded max number of aliases
E_ILL_NAM_SZ -1066 illegal size for name
E_NO_DT_ALIAS -1069 no dt alias
E_INV_MY_NAME -1070 invalid my_name given in info structure
E_ILL_LOCA -1071 letterbug not found
E_INV_SEC_CODE -1080 illegal security code
E_INV_SEG_SEL -1081 illegal segment selection
E_INV_TIME -1082 illegal timer value
E_INV_TIMEID -1083 illegal timer service id
E_NO_XLATE -1084 could not translate user message

48
Appendix B. IPC Error Codes B0193BB – Rev D

Table B-3. Error Codes For User’s VENIX Library Interface

Error Variable Value Definition


E_FILE_ACCESS_ERR -2000 IPC device file access bad
E_INV_FILEDES -2001 invalid file descriptor

Table B-4. Error Codes For VENIX Signals

Error Variable Value Definition


E_SIGNAL -2002 signal occurred
E_SIG_ABORT -2003 abort signal from VENIX

49
B0193BB – Rev D Appendix B. IPC Error Codes

50
Index
A
a_name 10, 11, 24
action 29, 32
add_alias 10
administrative calls 3, 9
alias 2, 3, 4, 9, 10, 11
ap_name 9, 11, 12, 13
asynchronous calls 3

B
broadcast 1, 26
buffer 5, 23
buffer_ptr 17, 19, 22, 26, 30, 32

C
c_answer 16
c_chkio 29
c_chkio_s 30
c_opt_prt 15
c_receive 18
c_selevent 35
c_send 17
c_waitevent 34
c_worevent 5, 32
CALL_COMPLETE 10, 11, 12, 13, 17, 20, 23, 25, 26, 35, 38, 39
CDT 5, 6
CDT_PTR structure 5
channel 2
channel_id 16, 17, 19, 20, 29, 30, 31
chk_clinfo 21
cl_bcast 26
cl_cancel 25
cl_chkio 5, 31
cl_info 32
cl_receive 24
cl_send 5, 21
clu_send 21, 22
codes return 4
COM_SERVERS 26
Connected Data Transfers (DT) 1, 3, 7, 15
Connectionless Data Transfers (CDT) 2, 3, 7, 21
cs_activate 11
cs_connect 15
cs_register 9
cs_register_exit 10

51
B0193BB – Rev D Index

cs_unregister 13

D
d_loc 21
d_loca 15, 23, 32
d_name 5, 15, 21, 23, 26
del_alias 11
DIAG_SUPER 26
dis_ind 19, 30, 31
DT 6
DT_PRT 6

E
E_ABORT_CON 17, 19, 30, 31
E_ANS_OUT 17
e_cs_activate 12
E_DISC_IND 30
E_DISCON 17, 19
E_GROUPID 26
E_ILL_ACT 30, 31, 32, 38
E_ILL_AL_VAL 10, 11
E_ILL_EFN 17, 19, 22, 25, 38
E_ILL_LOCA 16, 22, 23
E_ILL_MASK 33
E_ILL_NAM_SZ 10, 11, 12, 13, 16, 23
E_INV_ACT 30, 32
E_INV_ANAME 11
E_INV_BUFFER 23
E_INV_BUFPTR 17, 19, 25, 26
E_INV_BUFPTR_E_INV_INFOPTR_E_INV_DNAME 22
E_INV_CHAN 17, 19, 20
E_INV_DNAME 25, 26
E_INV_INFOPTR 23, 31
E_INV_MY_NAME 17, 19, 22, 23, 26
E_INV_NAM 12, 22
E_INV_TIME 38
E_INV_TIMIED 38, 39
E_INV_UE 12
E_MAX_CHAN 10
E_MAX_SIZE 17, 19, 22, 23, 25, 26
E_MSG_REJECTED 32
E_MULT_ACT 12
E_MULT_RECV 25
E_NO_ACT 11, 13, 16, 17, 19, 20, 22, 25, 26, 30, 31, 32, 33, 35, 38
E_NO_CHANS 16, 17
E_NO_DEST 16, 30
E_NO_DT_ALIAS 10
E_NO_RES 10, 11, 12, 16, 17, 19, 20, 22, 23, 25, 26, 33, 38
E_NO_SERV 10, 12, 17
E_NOT_CHK 17, 19, 25

52
Index B0193BB – Rev D

E_NOT_REG 11, 12, 13, 25, 35


E_ONGO_IPC 11, 13
E_SERVICE 13
E_TIME_OUT 33, 35
E_UE_DEST 30, 32
E_UE_EXISTS 10
eom 17, 19, 30, 31
errors 4
event 5, 17, 22, 32, 35
event_num 5, 31
event_return 34
examples of calls 3

F
FS_GATEWAY 26

G
group_name 26

H
HISTORIAN 26

I
id 22, 25
IN_PROGRESS 17, 19, 31, 32
IN_PROGRESS_E_INV_CHAN 30
include file 4
info 5, 16, 19, 21, 23, 29, 31
integer values 5
IPC error codes 47
ipc_init 7

M
mask 33, 34, 35
max_chnls 10
max_insts 10
message_id 5, 32
my_name 17, 19, 21, 23, 26, 30, 31, 32

N
network traffic 1
null 15
num_event 12
numalias 9
number 33

53
B0193BB – Rev D Index

O
o_name 16, 19, 23, 30, 31, 32

P
parameters, configurable 7
pending 3
process 1
process registration tables 7
psap_address 15, 21, 23, 31, 32

R
r_size 19, 21, 23, 30, 32
restart timer 38
return codes 4

S
service 9, 11, 12, 13, 15
size 5, 17, 19, 21, 23
start_time 37
stations number 7
stop_time 39
structure connections 5
structure event_ent 6
structure ts_event 6
synchronous calls 2

T
timer 32, 34, 37, 38
timer_id 38
type_timer 37

U
uses of calls 3

V
value, integer 5

54
Index B0193BB – Rev D

55
Invensys Operations Management
5601 Granite Parkway Suite 1000
Plano, TX 75024
United States of America
http://www.iom.invensys.com

Global Customer Support


Inside U.S.: 1-866-746-6477
Outside U.S.: 1-508-549-2424 or contact your
local Invensys representative.
Email: iom.support@invensys.com
Website: http://support.ips.invensys.com

S-ar putea să vă placă și