Experion HS Application Development Guide
Experion HS Application Development Guide
EHDOC-XXX5-en-500A
April 2017
Release 500
Disclaimer
This document contains Honeywell proprietary information. Information contained herein is
to be used solely for the purpose submitted, and no part of this document or its contents shall
be reproduced, published, or disclosed to a third party without the express permission of
Honeywell International Sàrl.
While this information is presented in good faith and believed to be accurate, Honeywell
disclaims the implied warranties of merchantability and fitness for a purpose and makes no
express warranties except as may be stated in its written agreement with and for its customer.
In no event is Honeywell liable to anyone for any direct, special, or consequential damages.
The information and specifications in this document are subject to change without notice.
Copyright 2017 - Honeywell International Sàrl
Contents
Contents
Contents 3
About this guide 12
Server API reference 13
Prerequisites 13
Honeywell 2017 3
Contents
Honeywell 2017 4
Contents
Development utilities 74
ADDTSK 74
CT 74
databld 75
DBG 75
DT 76
ETR 76
FILDMP 77
FILEIO 78
REMTSK 79
TAGLOG 80
USRLRN 81
Honeywell 2017 5
Contents
c_deltsk() 97
DbletoPV() 98
dsply_lrn() 100
c_ex() 100
ftocstr() 101
c_gbload() 102
c_gdbcnt() 103
c_getapp() 104
GetGDAERRcode() 105
c_geterrno() 106
c_gethstpar_..._2() 107
c_getlrn() 111
c_getlst() 112
c_getprm() 113
c_getreq() 116
c_givlst() 118
hsc_asset_get_ancestors() 119
hsc_asset_get_children() 120
hsc_asset_get_descendents() 122
hsc_asset_get_parents() 123
hsc_em_FreePointList() 124
hsc_em_GetLastPointChangeTime() 125
hsc_em_GetRootAlarmGroups() 125
hsc_em_GetRootAssets() 126
hsc_em_GetRootEntities() 128
hsc_enumlist_destroy() 129
hsc_GUIDFromString() 130
hsc_insert_attrib() 131
Attribute Names and Index Values 135
Valid Attributes for a Category 138
hsc_insert_attrib_byindex() 138
hsc_IsError() 142
hsc_IsWarning() 143
hsc_lock_file() 144
hsc_lock_record() 145
Honeywell 2017 6
Contents
hsc_notif_send() 146
hsc_param_enum_list_create() 150
hsc_param_enum_ordinal() 152
hsc_param_enum_string() 154
hsc_param_format() 154
hsc_param_limits() 156
hsc_param_subscribe() 158
hsc_param_list_create() 159
hsc_param_name() 161
hsc_param_number() 162
hsc_param_range() 163
hsc_param_type() 165
hsc_param_value() 167
hsc_param_value_of_type() 169
hsc_param_values() 170
hsc_param_value_put() 174
hsc_param_values_put() 176
hsc_param_value_save() 178
hsc_pnttyp_list_create() 180
hsc_pnttyp_name() 182
hsc_pnttyp_number() 184
hsc_point_entityname() 185
hsc_point_fullname() 186
hsc_point_get_children() 186
hsc_point_get_containment_ancestors() 188
hsc_point_get_containment_children() 189
hsc_point_get_containment_descendents() 190
hsc_point_get_containment_parents() 191
hsc_point_get_parents() 193
hsc_point_get_references() 194
hsc_point_get_referers() 195
hsc_point_guid() 196
hsc_point_name() 197
hsc_point_number() 198
hsc_point_type() 199
Honeywell 2017 7
Contents
hsc_StringFromGUID() 201
hsc_unlock_file() 202
hsc_unlock_record() 203
HsctimeToDate() 204
HsctimeToFiletime() 204
infdouble() 205
inffloat() 206
Int2toPV() 206
Int4toPV() 208
c_intchr() 209
IsGDAerror() 210
IsGDAnoerror() 211
IsGDAwarning() 212
isinfdouble() 212
isinffloat() 213
isnandouble() 214
isnanfloat() 215
Julian/Gregorian date conversion() 216
c_logmsg() 217
c_mzero() 218
nandouble() 219
nanfloat() 219
c_oprstr_...() 220
c_pps_2() 223
c_ppsw_2() 225
c_ppv_2() 226
c_ppvw_2() 227
PritoPV() 228
c_prsend_...() 229
RealtoPV() 231
c_rqtskb...() 232
c_sps_2() 235
c_spsw_2() 236
c_spv_2() 237
c_spvw_2() 238
Honeywell 2017 8
Contents
c_stcupd() 239
stn_num() 240
StrtoPV() 240
TimetoPV() 242
c_tmstop() 243
c_tmstrt_...() 244
c_trm04() 245
c_trmtsk() 246
c_tstskb() 247
c_upper() 248
c_wdon() 249
c_wdstrt() 249
c_wttskb() 250
Backward-compatible functions 251
c_badpar() 252
c_gethstpar_...() 253
c_pps() 257
c_ppsw() 258
c_ppv() 260
c_ppvw() 261
c_sps() 263
c_spsw() 264
c_spv() 265
c_spvw() 267
Examples 268
Honeywell 2017 9
Contents
Honeywell 2017 10
Contents
rgetval_hist 347
rgetpntval 350
rgetpntval_ascii 350
rhsc_param_hist_dates 351
rhsc_param_hist_offsets 352
rhsc_param_value_puts 355
rhsc_param_values 360
rhsc_param_numbers 366
rhsc_point_numbers 368
rputpntval 371
rputpntval_ascii 371
rputval_hist 372
rputval_numb 372
rputval_ascii 372
Diagnostics for Network API functions 375
Glossary 386
Notices 404
Honeywell 2017 11
About this guide
Revision history
Revision Date Description
Honeywell 2017 12
Server API reference
Attention:
An application written for the local server is only available locally to the server,
and not remotely across a network. For information about writing applications that
can access the server database across a network, see Network application
programming on page 271.
For: Go to:
Prerequisites
Before writing applications for Experion, you need to:
n Install Experion and third-party software as described in the Getting Started with
Experion Software Guide.
n Be familiar with user access and file management as described in the Server and Client
Configuration Guide.
Honeywell 2017 13
Server API reference
Prerequisite skills
This guide assumes that you are an experienced programmer with a good understanding of
either C or C++.
Attention:
An application written for the local server using the Server API must be written in
C or C++, as the Server API does not support other programming languages such
as Visual Basic or the .NET languages
It also assumes that you are familiar with the Microsoft Windows development environment
and know how to edit, compile and link applications.
Honeywell 2017 14
About the Server API development environment
Attention:
This procedure will only work with C and C++ projects. After compiling and
linking, all executable files should be copied to the run folder.
Honeywell 2017 15
About the Server API development environment
To compile and link with debugging information for C/C++ applications using Visual Studio,
select the Debug build as the active configuration. To do this, select Build > Configuration
Manager and then select the debug build.
Attention:
When using the DBG utility, make sure that no other application executes a
gbload() before your application, otherwise it will be assigned the LRN you
specified in step Run the server utility program DBG, passing it the LRN
the task is using. above.
The folder structures shown below should be used for development of C/C++ Server API
applications which will run on the server.
Honeywell 2017 16
About the Server API development environment
<data folder> is the location where Experion data is stored. For default installations, this is
C:\ProgramData.
The user/xxxx/src folder contains all source code files and make files for a particular
application. xxxx should be representative of the function of the application.
The server/data folder contains all server database files.
<install folder> server folder structure
<install folder> is the location where Experion is installed. For default installations this is
C:\Program Files (x86).
The def folder contains real time database definitions.
The include and include/src folders contain global server definitions, such as system
constants or data arrays in the form of C/C++ include files.
Honeywell 2017 17
About the Server API development environment
The run folder contains all server programs (including applications). This folder is included
in the path of any server user.
The lib folder contains libraries used for application development.
Example
// Main code segment
CRITICAL_SECTION serAPI;
/*critical section for calling the Server APIs */
InitializeCriticalSection(&serAPI);
if (c_gbload())
{
/* Could not attach to database */
exit(-1);
}
... Create threads
... Execution continues on
//End of main code segment
Honeywell 2017 18
About the Server API development environment
Attention:
Any applications that use the function c_geterrno() must include the M4_
err.hM4_err.h header file, that is, #include <src/M4_err.h>.
Example
This example shows how to check the error status:
if (c_server_api_function(arg1, arg2) == -1)
{
int errcode = c_geterrno();
if (hsc_IsError(errcode))
{
// an error has been issued
// handle error here
// or pass to your error handler
Honeywell 2017 19
About the Server API development environment
}
else
{
// a warning has been issued
// handle warning here
// or may be safe to ignore
}
}
Attention:
These functions are platform dependent (only valid for an INTEL X86 system).
Honeywell 2017 20
About the Server API development environment
(infinities and NaNs) together with a set of floating-point operations that operate on these
values.
1 2 3
Element Description
1 Sign
2 Exponent
3 Mantissa
The LSB (Least Significant Bit, the one that if changed would cause the smallest variation of
the represented value) with index 0 is positioned on the right.
Honeywell 2017 21
About the Server API development environment
NaN
The value NaN (Not a Number) is represented with an exponent of all 1s and a non-zero
mantissa. NaN's are used to represent a value that does not represent a real number, and are
designed for use in computations that may generate undefined results, so that the
computations can continue without a numeric value. The NaN value usually propogates to
the result, to help indicate that a numeric value was missing in the calculation.
There are two categories of NaN:
n QNaN (Quiet NaN) is a NaN with the most significant fraction bit set (denotes
indeterminate operations).
n SNaN (Signalling NaN) is a NaN with the most significant fraction bit clear (denotes
invalid operations).
See also
Data types on page 26
Honeywell 2017 22
Implementing a Server API application
Programming languages
The Server Application Programming Library only supports the development of C/C++
applications.
The language you choose to use will largely depend on your experience with these
languages. Alternatively, it is possible to develop an OPC Client to access server data via the
Experion OPC Server. The client can be written in C or C/++.
Type of application
There are two types of application you can develop:
n Utility. A utility runs interactively from the command line using the Experion
Command Prompt.
Utilities typically perform an administrative function or a function that is performed
occasionally.
A utility can prompt the user for more information and can display information directly
to the user via the command prompt window.
An example of a utility is an application to dump the contents of a database file to the
command prompt window, for example FILDMP on page 77.
n Task. Tasks are usually dormant, waiting for a request to perform some form of
function. When they are activated, they perform the function and then go back to sleep
to wait for the next request to come along.
An example of a task is an application that periodically fetches some point values,
performs a calculation on the values and stores the result back in the database.
Honeywell 2017 23
Implementing a Server API application
Definitions
A C/C++ application also needs to contain several include files that declare and define items
used by the application programming library routines. These include files should be
incorporated in the main source file as well as any function source files that make calls to the
application programming library routines. The include files used by this template are:
The include folder also contains many other GBxxxxxx.h include files that may be needed if
you make calls to other application programming library routines.
#include <src/defs.h>
#include <src/M4_err.h>
#include <files>
#include <parameters>
#include <src/GBtrbtbl.h>
char *progname='myapp.c';
main()
{
uint2 ierr;
char string[80];
struct prm prmblk;
Initialization
The first function you must call in any application is GBLOAD. This function makes the
global common memory available to the application, allowing it to accesses the memory-
resident part of the database. If this call fails you should terminate the program. This function
should only be called once for the whole program.
if (ierr=c_gbload())
{
//The next line number is 137
c_logmsg(progname, '137', 'Common
Load Error %d\n', ierr);
Honeywell 2017 24
Implementing a Server API application
c_deltsk(-1);
c_trmtsk(ierr);
}
Honeywell 2017 25
Implementing a Server API application
The c_getreq function will return a FALSE (0) if there is has been a request. It will
return the error M4_EOF_ERR (0x21f) if there are no requests pending. If any other
error is returned, then this should be reported and optionally handled.
Data types
In the definitions section, you may have noticed the use of the C/C++ data type uint2. This is
one of several data types that are defined in the header file defs.h. This is necessary because
different C and C++ compilers define the different sizes for: int, long, float, and double.
The following data types are used throughout the application programming library routines:
Honeywell 2017 26
Implementing a Server API application
Macro Description
These macros help to ensure that all types are properly assigned in C/C++ programs, to
provide portability between different computer architectures.
One example of the use of such macros is provided below. This example shows how a C
program would assign a floating point value to a variable, and also how a floating point value
may be stored in the database.
#include <src/defs.h>
#include <src/GBsysflg.h>
.
float fval1;
float fval2;
.
.
.
/*load the seconds since midnight into the variable fval1 */
fval1 = ldreal(GBsysflg->syssec);
.
.
/* store the value of fval2 into the seconds since midnight */
streal (&GBsysflt->syssec, fval2);
Honeywell 2017 27
Implementing a Server API application
.
.
.
The other macros mentioned above are used in a similar manner. For the definitions of these
macros, consult the defs.h file.
Instead of:
printf('Point ABSTAT001 PV out of normal range (%d)\n' abpv);
or
fprintf(stderr,'Point ABSTAT001 PV out of normal range (%d)\n',abpv);
or
std::cout <<'Point ABSTAT001 PV out of normal range' <<abpv <<std::endl;
Use:
c_logmsg ('abproc.c', '134', 'Point ABSTAT001 PV out of normal range
(%d)',abpv);
Attention:
c_logmsg handles all carriage control. There is no need to put line feed characters
in calls to c_logmsg.
If c_logmsg is used to write messages in a utility, then the message will appear in the
Command Prompt window.
Honeywell 2017 28
Implementing a Server API application
Server redundancy
If your task follows the guidelines described in this document and only accesses data from
user tables and points, you do not have to do anything special for redundancy. (Your task
doesn't need to determine which server is primary because GBload only allows the task on
the primary to run.)
On a redundant system the task is started on both servers. If the server is primary, the task
continues normal operation after GBLoad. However, if the server is backup the task waits at
GBLoad.
When the backup becomes primary, the task continues on from GBLoad. In the meantime,
what was the primary will reboot and restart as backup and the task will wait at GBLoad.
Honeywell 2017 29
Controlling the execution of a Server API application
Before you start a task, you need to identify it within Experion by selecting a unique Logical
Resource Number (LRN) for the task. The LRN range from 111 to 150 inclusive has been
allocated to the user space for this purpose.
The USRLRN utility is provided to help you quickly identify a free user application LRN
that can be allocated to your task. See the topic, 'usrlrn' in the Configuration Guide.
Attention:
All LRNs except for the user space (from 111 to 150 inclusive) are reserved by
the server for internal use and should not be used for applications.
To use USRLRN and select one of the numbers it displays, at the Windows Command
prompt, type:
usrlrn
When a task is executing, you can identify its LRN by calling the library routine GETLRN.
This LRN is needed in some other library routines and it prevents you from having to hard-
code it into your source code.
Honeywell 2017 30
Controlling the execution of a Server API application
Attention:
Configuring the task to start automatically only takes effect after you have stopped
and started the server. Also note that starting and activating a task are two separate
activities. Once the task is started, it needs to be activated before any of its
commands are executed.
Item Description
Honeywell 2017 31
Controlling the execution of a Server API application
etr lrn
Activating a task
After a task has been started it is ready to receive requests to be activated. The server can be
configured to activate your task whenever one or more of the following events occurs.
When your task is woken from its TRM04 call by one of these events you can usually obtain
more information about the event by calling GETREQ. The parameter block returned from
GETREQ can provide event specific information that can used to determine what action your
task should take. Note that if GETREQ is not called, then the request will not be flushed from
the request queue and no further requests to the task can be made.
The remainder of this section describes how to configure the server to activate your task for
each of these events and also what event specific information you can obtain from the
parameter block.
Honeywell 2017 32
Controlling the execution of a Server API application
Word Description
1 Set to 0.
2 param1 passed to TMSTRT.
3 param2 passed to TMSTRT.
4-10 Not used.
Parameter Description
Algorithm data block number. For details, see the topic, 'Algorithm blocks' in
Block No.
the Configuration Guide.
Task LRN The logical resource number of your task.
Task Request
The task request rate in seconds, (must be multiple of point scan rate).
Rate
Word 1(param1) Must be a non-zero number.
Word 2-10
Numerical parameters that will be passed to your task.
(param2-10)
Notes
n The algorithm block can also be configured from the Cyclic Task Request Algorithm
display. Using the Point Detail display, click the Algorithm number to display the
Algorithm configuration.
n This algorithm must be attached to either a Status or Analog point with no database or
hardware address (that is, Controller number only).
n Time of the last request (in seconds) is stored by the system in ALG(04).
When activated using this method, your task can call GETREQ to obtain the following
information in the parameter block:
Words 1 -10.
Honeywell 2017 33
Controlling the execution of a Server API application
Property Description
The algorithm block used by this algorithm for this point. Each algorithm
attached to each point should be assigned a unique block number. Use the
Block No. alglst utility to find a free block.
See the topic titled "Algorithm blocks" in the Server and Client
Configuration Guide for more information.
The Logical Resource Number of the task that is requested when the point
LRN of Task to changes to the specified state.
Request
You can specify a system task or a custom task.
Select the state (0 to 7) that requests the task, or select ALL for all state
Task Request State
transitions.
The numerical parameter(s) passed to the task. Note that Word 1, Word 2,
Parameter Block or Word 3 must be a non-zero number, otherwise the parameter block is not
read and all other parameter values are ignored.
Notes
n The algorithm block can also be configured from the Status Change Task Request
Algorithm display. Using the Point Detail display, double-click the Action algorithm
number to display the Algorithm configuration.
n This algorithm must be attached to a Status point.
n This algorithm does not queue requests to the task.
The task must call GETREQ to obtain the following information in the parameter
block:
Words 1–10
Honeywell 2017 34
Controlling the execution of a Server API application
Word Description
Honeywell 2017 35
Controlling the execution of a Server API application
Word Description
Attention:
The report output file will reside in the report folder of the server and will
have the name RPTnnn where nnn is the report number.
Word Description
Honeywell 2017 36
Controlling the execution of a Server API application
Action on failure
Description
setting
The tasks may then reset their watchdog timers by calling the watchdog timer pulse routine,
WDON, which resets the countdown timer to the poll interval value.
For details on the routines, see c_wdstrt() on page 249 and c_wdon() on page 249 (C and
C++).
Honeywell 2017 37
Accessing server data
Acquired Data Data that has been read from or is related to controllers.
Process History A historical store of acquired data.
Alarms and Events Details on alarm and event conditions that have occurred.
System Status Details on the state of communications with remote devices.
Configuration Data Details on how the server system has been configured to operate.
Honeywell 2017 38
Accessing server data
User Defined Data Structures to store your own application specific data.
Physical structure
The term physical structure of the server database is referring to the files that are used by the
native operating system to store data. When using the application programming library
routines you will only be referring to the logical structure of the database, but it is useful to
understand how it is physically stored.
File Description
Holds many of the smaller database tables and all of the memory-resident
data
tables.
history Contains the process history data for each history interval.
events Holds event data.
crtbkr, crtdfd,
Holds the display definition.
crtsha
points Contains all the point and parameter details.
Honeywell 2017 39
Accessing server data
Physical database
Physical Database
data
010101101
01001010010101011
00101001010010101
01010101010101010
01010101010101010
10101010101010101
0101010101010101
historyx
010101101
01001010010101011
00101001010010101
01010101010101010
01010101010101010
10101010101010101
0101010101010101
events
010101101
01001010010101011
00101001010010101
01010101010101010
01010101010101010
10101010101010101
0101010101010101
user tables
other files
Logical structure
When accessing server data, you will typically work with two types of logical files in the
server real-time database:
n Flat logical files below
These are arranged as a set of fixed size flat files, containing a fixed number of records,
with a fixed number of words per record.
n Object-based real-time database files on page 43
These are flexible data structures for which the underlying structure is hidden from the
user and can only be accessed via functions that manipulate the data.
Honeywell 2017 40
Accessing server data
An example of a logical file is CRTTBL. This table contains a single record for each Station
on the system. The records of CRTTBL define items like the type of keyboard connected, the
update rate, the current page number and so on.
Logical versus physical structure of database
Data\data
(example, C:hs\server\data\data)
and
Honeywell 2017 41
Accessing server data
Relative files
Relative files are used where data needs to be stored in a structured way, with each record
representing a single, one off entity. An example of a relative file is the CRTTBL where each
record represents a single Station. The majority of flat logical files in the server are relative
files.
Access to a relative file is achieved using specific functions like hsc_param_value or using a
generic read and write function of DATAIO. If you use DATAIO you will need to provide a
record number which is relative to the beginning of the logical file. The record number acts
like an index to identify the data—that is, to access data regarding the third Station you would
access record three of the logical file CRTTBL.
Relative file structure
Record 1
Record 2
Record 3
read record 3
...
...
Record n
Circular files
Circular files are used where data needs to be recorded on a regular basis, but there is a limit
on the amount of disk space that is to be used. When the circular file is full, and a new record
is written to it, the oldest record will be overwritten. An example of a circular file is a
HISTORY file where each record represents a set of point parameter values at a given time.
Access to a circular file is achieved using specific functions like c_gethstpar_date_2 or using
the generic functions of DATAIO.
Honeywell 2017 42
Accessing server data
Only fixed length strings can be stored in the logical file system, because the logical file
system uses fixed file record lengths. In addition, the string format in the logical file system is
not the same as that in memory representation.
Routines that operate directly against single strings do not need to worry about this detail, as
the routines automatically perform the appropriate conversions. However, routines that
operate on entire records, such as c_dataio_...() on page 87, need to be concerned with the
format of these strings.
To convert an ANSI string to a fixed length string in a buffer containing a record, you can use
the routine c_chrint() on page 85.
To convert to an ANSI string from a fixed length string contained in a buffer representing a
record, you can use the routine c_intchr() on page 209.
Honeywell 2017 43
Accessing server data
For example, consider the situation where two tasks are simultaneously accessing the same
record in a logical file. They both read the record into a buffer in memory and proceed to
modify its contents. The first task completes its modification and writes the buffer back to the
record in the logical file. A moment later the second task does the same, but it will overwrite
the changes made by the first task.
There are two ways to overcome this problem. The first method is to design your tasks so that
only one task is responsible for changing the record contents. Because this task is the only
one changing records, it can safely read and write as necessary.
The second method is to use file locking. Before performing a read, modify, write sequence
your task can call hsc_lock_file to request permission to change the file. If another task has
the file already locked you will be denied access. If the file is not locked, it will be locked on
your behalf and you will be able to read, modify and write the record. After you are complete
you should call hsc_unlock_file to allow other tasks to access the file.
Object-based real-time database files do not require such locking. Instead the methods of the
file will ensure database consistency.
In most cases you will not need to lock and unlock files or records in your application as the
server will perform the necessary locking on your behalf. The exception to this rule is when
you are using user tables (see Accessing user-defined data on page 50) with more than one
task reading and writing to their records. In this case you will need to use the file locking
functions of hsc_lock_file or hsc_lock_record.
Identifying a point
Before you can access the data from a particular point you need to determine its internal point
number. This internal point number is used by several of the application programming library
routines to quickly identify the point.
An application will normally determine the internal point number of several points during
initialization. To do this the application passes the Point Name in ASCII to the library routine
hsc_point_number. If the point exists in the database, this function will return its
corresponding internal point number.
Identifying a parameter
A point comprises many individual point parameters, for example, SP, OP, PV and so on.
When you want to refer to one of these parameters in your application you need to use hsc_
param_number to resolve the parameter name to its appropriate number. This routine
accepts an ASCII string for the parameter name and the point number and if the parameter
Honeywell 2017 44
Accessing server data
exists for this point then its corresponding number will be returned. Parameter numbers may
vary from point to point (even within the same point type), so parameter names need to be
resolved to parameter numbers on a point by point basis.
Attention:
Application point lists only support scan task points.
After you have created the point list, your application can use the library routine GETLST to
read the set of point parameters, and GIVLST to write the set of point parameters.
For details on the routines, see c_getlst() on page 112 and c_givlst() on page 118 (C and
C++).
Honeywell 2017 45
Accessing server data
Routine Description
The routine SPSW will demand a point parameter to be scanned from the field. If the value
scanned has changed then the point parameter will be processed (that is, checked for alarm
conditions, execute algorithms where necessary, and so on), store the value in the point
record, and then return.
The routine SPVW is used when there is no source address for the point parameter. This
allows you to point process a calculated value from your application just as if it were scanned
from the field, that is, store the value in the PV, and process algorithms, alarms etc.
The routines SPS and SPV are exactly the same as SPSW and SPVW respectively but they
return immediately and do not wait for the processing to complete. These are typically used to
improve performance if you have several point parameters on the same Controller to demand
scan. Call SPS to quickly queue all the point parameters except the last one. Then call SPSW
to queue the last point parameter and wait for all to be processed.
Honeywell 2017 46
Accessing server data
The routines PPSW, PPVW, PPS and PPV are again very similar to the previous routines
mentioned except that they will always force the processing of the point parameter even if it
has not changed. For performance reasons, we do not recommend you to use these routines
unless absolutely necessary.
The routine SPV may also effect the performance of the server adversely if used heavily. If
you need to perform a lot of point processing of application values you may consider using
the user scan task instead.
An application can also access the historical data stored in the server database using the
library routine c_gethstpar_..._2. This routine allows you to retrieve a block of historical
values for certain point parameters.
When referencing what history to retrieve you may specify it by either a date and time or by
an offset of sample periods from the current time.
Honeywell 2017 47
Accessing server data
Attention:
Accessing other data in this way requires knowledge of the internal structures
used by the server. Although these are described in the definition files, Honeywell
does not guarantee that these formats will not change from release to release of the
server.
The library routine DATAIO is a generic means of reading and writing to any of the 400 or
so logical files in the server database. It allows you to read or write one or more records (in
blocks or one at a time) to or from one or more int2 buffers (one buffer for each record).
You need to refer to the relevant definition file of the record (to determine the internal
structure or layout of the record), to access the individual record fields.
When accessing record fields:
n 16 bit integer data can simply be assigned to other variables.
n 32 bit integer data can be equivalenced or accessed via the macros ldint4() and stint4()
in C/C++.
n floating point data can be equivalenced or accessed via the macros ldreal() and streal()
in C/C++.
n double precision floating point data can be equivalenced or accessed via the macros
lddbl() and stdbl() in C/C++.
n strings can be retrieved from the buffer using INTCHR.
n strings can be stored into the buffer using CHRINT.
n strings can be converted to upper case before storing using UPPER.
n dates stored in Julian days can be converted to day, month and year using GREGOR
and back again using JULIAN.
Honeywell 2017 48
Accessing server data
Caution:
Accessing other data using shared memory not only requires knowledge of the
internal structures but also requires care. It is very easy to accidentally alter
database values just by setting these global variables.
Values are read from the memory-resident file simply by assigning the global variable to
another variable. Values are written to the memory-resident file simply by setting the value of
the global variable. The set value will be written back to disk automatically when the server
performs its next checkpoint if the value is stored in a checkpoint file.
In C the variables for the memory-resident files are defined in separate include files called
GBxxxtbl.h, wherexxx is the name of the logical file. The global variables are arrays of
structures (one structure per record) that have a name of GBxxxtlb[]. For example:
#include 'src/GBtrbtbl.h'
Honeywell 2017 49
Accessing server data
1 DIRECT 20 128
2 DIRECT 20 128
3 DIRECT 20 128
If you want to configure or modify any of the 150 user tables, you can use the user table
builder utility, UTBBLD.
Honeywell 2017 50
Accessing server data
UTBBLD example
This example shows a session that uses utbbld to carry out its full range of
actions, namely:
n Display the existing user table configurations
n Add user table 21, with the configuration: CIRCULAR file type, 64 records,
18 words per record
n Delete user table 4
Honeywell 2017 51
Accessing server data
Honeywell 2017 52
Accessing server data
Honeywell 2017 53
Accessing server data
Honeywell 2017 54
Accessing server data
Honeywell 2017 55
Accessing server data
(Y/N)
y
Table has been deleted.
Honeywell 2017 56
Accessing server data
Honeywell 2017 57
Accessing server data
utbbld -force
Attention:
This option is not recommended because it may disrupt applications that are
running, and changes may not be able to be made to files that are in use.
Honeywell 2017 58
Working from a Station
Each of these methods of task activation, and the parameters passed in the parameter block,
are described in the section titled "Activating a task."
Honeywell 2017 59
Working from a Station
This routine enables your task to display the following types of messages:
n Information messages that remain in the Message Zone until another message appears.
n Indicator messages that are automatically cleared after a certain period of time.
n Prompt messages that ask the operator to type some information in the Command
Zone. When the operator types a response in the Command Zone and presses ENTER,
Station activates the task enabling you to retrieve the operator's response by calling
OPRSTR in C/C++.
Honeywell 2017 60
Developing user scan tasks
Controller
Server
User Tables
The option works by using channels defined as 'User Scan Task' type channels. These
channels operate in exactly the same manner as a conventional channel. They interact,
however, with 'User Scan Task' controllers rather than physical controllers.
Point parameters are sourced from these database controllers by specifying the word address
within the specific record.
For details about defining a user scan task controller, and its associated channel and points,
see the topic 'Creating a user scan task controller' in Quick Builder's help.
Honeywell 2017 61
Developing user scan tasks
C/C++ version
The C version of the example User Scan Task is included here. For more information
regarding any of the functions called in this program, see 'Application Library for C and
C++.'
Honeywell 2017 62
Developing user scan tasks
/************************************************************/
/********* COPYRIGHT © 1996 - 2012 HONEYWELL PACIFIC ********/
/************************************************************/
#include "src/defs.h"
#include "src/environ.h"
#include "src/M4_err.h"
#include "src/dataio.h"
#include "files"
#include "src/trbtbl_def"
#ifndef lint
static char *ident="@(#)c_dbuser.c,v 720.3";
#endif
static char *progname="c_dbuser.c,v";
/*
BEGIN_DOC
-------------------------------------------------------------
C_DBUSER - user scan task for use with DBSCAN
-------------------------------------------------------------
SUMMARY:
Example user scan task
*/
main ()
{
/*
DESCRIPTION:
Honeywell 2017 63
Developing user scan tasks
-------------------------------------------------------------
NOTES -
-------------------------------------------------------------
RETURN VALUES:
FUNCTIONS CALLED:
RELATED FUNCTIONS:
DIAGNOSTICS:
EXAMPLES:
END_DOC
*/
Honeywell 2017 64
Developing user scan tasks
if (c_gbload() == -1)
{
// GBLOAD FAILED!
Honeywell 2017 65
Developing user scan tasks
&cntrec,
&cntwrd,
&cntbit,
&cntwid,
&cntval
)== -1)
{
// GDBCNT FAILED!
// Only process task requests when
// there are no control requests
Honeywell 2017 66
Developing user scan tasks
case 1:
// Start periodic
requests
// Perform data
gathering
// (read data from
some device or file)
// Retrieve latest
error number
errcode =
c_geterrno();
Honeywell 2017 67
Developing user scan tasks
recnum = RECORD;
if (c_dataio_read_
newest(
FILE,
&recnum,
LOC_MEMORY,
buffer,
BUFSZ
)==-1)
{
// DATAIO
READ NEWEST
FAILED!
// Retrieve
latest error
number
errcode =
c_geterrno();
// Log the
result
c_logmsg(
progname,
"262",
"DBUSER:
file %d
record %d
read error
0x%x",
FILE,
recnum,
errcode);
// END DATAIO
READ NEWEST
FAILED!
}
else
Honeywell 2017 68
Developing user scan tasks
{
//DATAIO
READ NEWEST
SUCCESS!
Honeywell 2017 69
Developing user scan tasks
errcode);
// END DATAIO WRITE FAILED!
}
else
{
// DATAIO WRITE SUCCESS!
// Update sample time counter
if (c_stcupd(RTU,65) == -1)
{
// STCUPD FAILED!
// must be >60
Honeywell 2017 70
Developing user scan tasks
default:
Honeywell 2017 71
Developing user scan tasks
c_logmsg(
progname,
"319",
"DBUSER: has control request for %d %d %d %d %d %f",
cntfil,
cntrec,
cntwrd,
cntbit,
cntwid,
cntval);
Honeywell 2017 72
Developing user scan tasks
return (0);
// END MAIN
}
Honeywell 2017 73
Development utilities
Development utilities
Tip
Honeywell will supply detailed information and instructions on how to use this
command when required.
ADDTSK
Add application task.
Synopsis
addtsk namelrn [priority]
Part Description
lrn The LRN you have chosen for the task, see 'Selecting an LRN for a task.'
priority The priority of task execution (use 0 as a default).
name The executable file name of your task.
Description
This utility loads the executable program identified by name and prepares it for execution.
Once loaded the executable becomes a task with the given LRN and priority ready to be
activated.
This utility only works with application LRNs, preventing you from accidentally overwriting
a server system task. Use CT below if you need to use a reserved LRN for your task.
Example
addtsk usrapp 111 0
CT
Create task.
Synopsis
ct lrnpriority -efn name
Honeywell 2017 74
Development utilities
Part Description
lrn The LRN you have chosen for the task, see 'Selecting an LRN for a task.'
priority The priority of task execution (use 0 as a default).
name The executable file name of your task.
Description
This utility loads the executable program identified by name and prepares it for execution.
Once loaded the executable becomes a task with the given lrn and priority ready to be
activated.
Only use this utility if you have run out of application LRNs and you need to use a reserved
LRN for your task. It is preferable to use the ADDTSK on the previous page utility because it
will check that you are not overwriting server system tasks.
Example
ct 111 0 -efn usrapp
databld
Description
The databld command is used to import and export server configuration data in XML format.
databld is described in detail in the "Server database configuration utility (databld)" section
of the Server and Client Configuration Guide.
DBG
Configure Experion so that the next task started from the command line or Visual Studio that
calls gbload() will automatically be assigned the specified LRN.
Synopsis
dbg lrn
Part Description
lrn The LRN you have chosen for the task, see 'Selecting an LRN for a task.'
Honeywell 2017 75
Development utilities
Description
This utility sets up Experion so that the next manually started task will run with a specified
LRN. This is useful for debugging purposes, as it allows a task to be run from within Visual
Studio.
Example
dbg 111
DT
Delete task.
Synopsis
dt lrn
Part Description
lrn The LRN you have chosen for the task, see 'Selecting an LRN for a task.'
Description
This utility marks the specified task for deletion. When the task next calls either TRM04 or
TRMTSK, the task will be deleted.
Only use this utility if you have run out of application LRNs and you needed to use a
reserved LRN for your task. It is preferable to use the remtsk utility because it will check that
you are not removing server system tasks.
Example
dt 111
ETR
Enter task request
Synopsis
etr lrn [-wait] [-arg arg1]
Honeywell 2017 76
Development utilities
Part Description
lrn The LRN you have chosen for the task, see 'Selecting an LRN for a task.'
-wait Wait for the task to become dormant
Additional argument passed to the task via rqstsk
-arg arg1
Note: The task is requested via rqstsk—the additional argument can only be an int2.
Description
This utility requests the specified task to be activated.
Example
etr 111 -arg 5
FILDMP
Dump/restore the contents of a logical file.
Synopsis
fildmp
Description
This interactive utility is used to dump, restore or compare the contents of server logical files
with standard text files.
When dumping the contents of a logical file to an ASCII operating system file you will need
to provide the operating system file name to dump to, the server file number, the range of
records to dump, and the data format to dump. Note that the logical file can be dumped to the
screen by not specifying an operating system file.
The data format to dump defines how the logical file data will be written to the ASCII
operating system file. You can specify INT for integer data, HEX for hexadecimal data, ASC
for ASCII data, and FP for floating point data.
When restoring from an operating system file you will only need to provide the operating
system file name. The utility will overwrite the current contents of the logical file with what is
defined in the operating system file.
Attention:
Honeywell 2017 77
Development utilities
Where possible, use the databld command instead of fildmp. databld processes server
configuration files in an easier to read format and performs additional validation of the data.
However, it is only available for specific server configuration types. For more information,
refer to the "Server database configuration utility (databld)" section of the Server and Client
Configuration Guide.
Example
System status is OFF-LINE
Reading from disc. Writing to memory,disc,link.
FILEIO
Modify contents of a logical file.
Synopsis
fileio
Description
This interactive utility is used to modify the contents of individual fields in a logical file.
Honeywell 2017 78
Development utilities
You will need to provide the file number, whether to modify memory/disk/both, the record
number and the word number of the field to modify and the new value.
Example
Database contains 400 files
File number (=0 to exit) ? 251
Use memory image [YES|NO|BOTH(default)] ?
File 1 contains 400 records of size 16 words
Record number (=0 to back up) ? 1
Word offset (=0 to back up) ? 1
Mode =0 to back up
=1 for INTEGER (int2)
=2 for HEX (int2)
=3 for ASCII
=4 for F.P. (real)
=5 for SET bit
=6 for CLR bit
=7 for LONG INTEGER (int4)
=8 for LONG F.P. (dble) ? 1
INTEGER VALUE = -32768 NEW VALUE = 100
Save value [YES|NO(default)] ? YES
Word offset (=0 to back up) ?
Record number (=0 to back up) ?
File number (=0 to exit) ?
REMTSK
Remove application task.
Honeywell 2017 79
Development utilities
Synopsis
remtsk lrn
Part Description
lrn The LRN you have chosen for the task, see 'Selecting an LRN for a task.'
Description
This utility marks the specified task for deletion. When the task next calls either TRM04 or
TRMTSK, the task will be deleted.
This utility only works with application LRNs, preventing you from accidentally removing a
server system task. Use DT on page 76 if you need to use a reserved LRN for your task.
Example
remtsk 111
TAGLOG
List point information
Synopsis
taglog
Description
This utility lists information associated with the specified points in the server database. This
utility is useful to find out if a point exists and to determine its internal point number.
Example
An example of output from the utility:
Point IPCSTA1 Type 0 Number 1 STALOG PERFORM
TEST 1
Honeywell 2017 80
Development utilities
CNT file 0000 0000 0005 0030 0000 FF00 FFFF 0000 FF00 FFFF
.....0.......
FF00 FFFF 0000 FF00 FFFF FF00 FFFF FF10 0000 .............
DES file 4950 4353 5441 3120 2020 2020 2020 2020 5354 414C IPCSTA1
STAL
4F47 2050 4552 464F 524D 2054 4553 5420 3120 2020 OG PERFORM
TEST 1
2020 2020 2020 0000 0000 0000 0018 3000 0000 0000
......0.....
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
..............
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
..............
0000 0000 0000 0000 0000 0000
............
USRLRN
Lists LRNs. For details about this utility, see the topic, 'usrlrn', in the .
Honeywell 2017 81
Application Library for C and C++
c_almmsg_...()
Sends a general message for an alarm or event by type.
Note that hsc_notif_send() on page 146 and hsc_insert_attrib() on page 131 supersede c_
almmsg_...().
C/C++ synopsis
#include <src/defs.h>
#include <src/almmsg.h>
Honeywell 2017 82
Application Library for C and C++
char* id,
char* level,
char* descr,
char* value,
char* units
);
Arguments
Argument Description
text (in) pointer to a null-terminated string of text to be sent to the alarm system.
priority (in) Message priority (see Description).
(in) pointer to a null-terminated string containing the alarm name (40 characters in
name
length (alarm source)).
(in) pointer to a null-terminated string containing the alarm identifier (for example,
id
PVHI, SVCHG: 20 characters in length (condition)).
(in) pointer to a null-terminated string containing the alarm level (for example, U, L,
level
H, STN01).
(in) pointer to a null-terminated string containing the alarm descriptor (132 characters
descr
in length).
(in) pointer to a null-terminated string containing the alarm value (24 characters in
value
length).
(in) pointer to a null-terminated string containing the alarm units (10 characters in
units
length).
area (in) pointer to a null-terminated string containing the desired of the alarm/event.
Description
Sends the structured text message string to the alarm system for storage into the alarm or event
file, and for printing on all printers.
c_almmsg_event will send the message to all printers and log the text to the event file.
c_almmsg_alarm will send the message to all printers and log the message to the alarm list or
event file. It also sets the first character of the level field of the alarm to either 'L', 'H' or 'U'
depending on the value of priority.
The priority of the alarm is defined as follows:
Honeywell 2017 83
Application Library for C and C++
c_almmsg_format2_malloc will format a message given all the relevant fields. It returns a
pointer to a null-terminated string that can then be passed onto c_almmsg_event or c_
almmsg_alarm.
For an example of the use of this routine, see example 2in <data
folder>\Honeywell\Experion HS\Server\user\examples\src. Where <data folder> is the
location where Experion data is stored. For default installations, this is C:\ProgramData
See also
c_prsend_...() on page 229
AssignLrn()
Assigns an LRN to the current thread.
C/C++ Synopsis
#include <src/defs.h>
#include <src/trbtbl_def>
int2 AssignLrn(
int2* pLrn // (in/out) lrn to be allocated
Honeywell 2017 84
Application Library for C and C++
Arguments
Argument Description
Description
This function is designed to assign a particular LRN to the current thread. You may choose
your own free LRN to use, or you may ask the system to select one for you.
Diagnostics
This function returns 0 if successful, and pLrn will then contain the newly assigned LRN.
See also
DeassignLrn() on page 96
c_getlrn() on page 111
c_chrint()
Copies character buffer to integer buffer.
C/C++ synopsis
#include <src/defs.h>
void __stdcall c_chrint(
char* chrbuf,
int chrbuflen,
int2* intbuf,
int intbuflen
);
Honeywell 2017 85
Application Library for C and C++
Arguments
Argument Description
Description
Copies characters from a character buffer into an integer buffer. It will either space fill or
truncate so as to ensure that intbuflen characters are copied into the integer buffer.
If the system stores words with the least significant byte first, then byte swapping will be
performed with the copy.
See also
c_intchr() on page 209
ctofstr()
Converts a C string to a FORTRAN string.
C/C++ synopsis
#include <src/defs.h>
void ctofstr(
char* Cstr,
char* Fstr,
int Flen
);
Arguments
Argument Description
Honeywell 2017 86
Application Library for C and C++
Description
Given a null terminated C string and the length of the string, this routine will convert it into a
FORTRAN string, space padding it if necessary.
If the Cstr does not fit, it will be truncated.
See also
c_intchr() on page 209
c_chrint() on page 85
ftocstr() on page 101
c_dataio_...()
Routines for accessing the server database logical files.
Tip:
For information about logical files, see 'Logical Structure' and 'Accessing logical
files.'
The library routine DATAIO is a generic means of reading and writing to any of the 400 or
so logical files in the server database. It allows you to read or write one or more records (in
blocks or one at a time) to or from an int2 type buffer.
You need to refer to the relevant definition file of the record (to determine the internal
structure or layout of the record), to access the individual record fields.
The following library of DATAIO routines are provided to suit most file record access
situations.
When accessing individual records in a flat logical file, the record number of each record
remains the same in a relative file (starting with the first record as record 1). However, the
record number does not remain the same within a circular file.
If you need to access a particular record in a circular file, you will need to keep track of its
physical record number. The READ_NEWEST and READ_OLDEST routines are designed
to assist in this regard, as they both write the actual record number to a variable provided for
the purpose.
The queueing routines are designed to work with circular files, for quickly adding and
deleting records to the file. Each use of the QUEUE routine will add a new record unless the
file is full, in which case it will overwrite the oldest record with the new record. Each use of
the DEQUEUE routine will read and delete the oldest record. In practice, dequeue is not
necessary in a circular file because it will automatically overwrite the oldest record when full.
Honeywell 2017 87
Application Library for C and C++
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/dataio.h>
Honeywell 2017 88
Application Library for C and C++
Honeywell 2017 89
Application Library for C and C++
Arguments
Argument Description
byreclen (out) Pointer to the number of bytes in each record. The variable referenced in the
Honeywell 2017 90
Application Library for C and C++
Argument Description
Description
Performs data transactions between an application and the server database logical files. Used
to read and write server database logical files, records and fields.
Tip:
For an explanation of relative and circular server database logical files, see 'Flat
logical files.'
c_ Retrieves the size of a server file by writing both the number of records and the
dataio_ number of bytes per record to the memory variables referenced by the variable pointers
size passed-in as arguments.
c_
Reads a single record from a server file into the buffer, by writing the record data to
dataio_
the memory variable referenced by the variable pointer passed-in as an argument.
read
c_
dataio_ Writes a single record from the buffer to a server file.
write
c_
Reads a number of contiguous records from a server file into the buffer, by writing the
dataio_
record data to the memory variable referenced by the variable pointer passed-in as an
read_
argument.
blk
Honeywell 2017 91
Application Library for C and C++
c_
dataio_
Writes a number of contiguous records from the buffer to a server file.
write_
blk
Appends and writes a new single record in the CIRCULAR file by appending to the
c_
position above the previous newest record. Writes this new record, and if the file is
dataio_
full, overwrites the oldest record with this new record. Changes the number of records,
queue
unless the file is full, in which case it does not change the number of records.
Reads and deletes the oldest record in the CIRCULAR file. Changes the number of
c_
records. The previously second oldest record then becomes the oldest record. Writes
dataio_
the record data to the memory variable referenced by the variable pointer passed-in as
dequeue
an argument.
c_ Reads any single record in the CIRCULAR file by referencing the records counting
dataio_ from the newest record. Does not change the record data or the number of records.
read_ Writes both the record data and the actual record number to the memory variables
newest referenced by the variable pointers passed-in as arguments.
c_ Reads any single record in the file by referencing the records counting from the oldest
dataio_ record. Does not change the record data or the number of records. Writes both the
read_ record data and the actual record number to the memory variables referenced by the
oldest variable pointers passed-in as arguments.
Location options
The recommended configuration to use is LOC_ALL for most situations, and especially for
applications running on a redundant system.
LOC_ALL operates in the most efficient manner possible, first to memory, then to local disk,
and finally to the backup server (memory and disk).
LOC_MEMORY and LOC_DISK are only for accessing a file in those specific locations,
and that if used, additional file handling must be provided in the custom application to prevent
inconsistencies between files in memory, on disk, and on the backup server.
Only ever use LOC_MEMORY or LOC_DISK under specific situations in a custom app
where system performance slowdown is occurring, and file access to the local disk or backup
server has been identified as the cause of the slowdown.
The location options are listed in the following table:
Read/write from/to memory, local disk, and backup server. Does not require any
LOC_ALL
additional file handling to ensure file consistency.
LOC_ Read/write from memory only. Requires additional file handling to ensure file
MEMORY consistency.
LOC_ Read/write from the local disk only. Requires additional file handling to ensure file
Honeywell 2017 92
Application Library for C and C++
DISK consistency.
Diagnostics
Returns 0 if successful, otherwise, returns -1 if failed and writes an error code to the system
error status. Subsequently calling c_geterrno() on page 106 will return one of the following
error codes:
Explanation example
Say, for example, that there was a circular file that contained 10 records
numbered 1 to 10 from oldest to youngest with record number 1 being the oldest
through to record number 10 being the youngest.
In this example scenario, a call to READ_OLDEST with a record number
argument of "1", would result in the reading of the oldest record, which in this
example is actual record number 1. The variable for the record number argument
would have had to be holding the value of "1" before the call, and will be holding
the value of "1" after the call.
Similarly, a call to READ_OLDEST with a record number argument of "3", would
result in the reading of the third oldest record, which in this example is actual
record number 3. The variable for the record number argument would have had
to be holding the value of "3" before the call, and will be holding the value of "3"
after the call.
Honeywell 2017 93
Application Library for C and C++
Code example
The following example demonstrates how to read and write a record in a User
table. It first determines the size of a User table, sizes the buffer appropriately,
reads the record, allows for record data manipulation, and finally writes the
record back to the User table.
#include 'files' /* for UTBL01's file number */
#include 'applications' /* for UTBL01's record size */
#include 'src/defs.h'
#include 'src/M4_err.h'
#include 'src/dataio.h'
// ...
// The other code in your application may go here
// ...
Honeywell 2017 94
Application Library for C and C++
{
// Failed to determine size of user table
// Retrieve latest error number
errcode = c_geterrno();
// Display error message
printf('c_dataio_size error 0x%x', errcode);
// Exit the program and return the error code
exit(errcode);
}
else
{
// Success determining table size
// This data is now stored in the variables:
// 'user_table1_records' and 'user_table1_recordsize'
// Read one record from the disk resident user table UTBL01
if (c_dataio_read( UTBL01_F,
rec,
LOC_ALL,
buffer,
user_table1_recordsize) == -1)
{
// Failed to read record
// Retrieve latest error number
errcode = c_geterrno();
// Display error message
printf('c_dataio_read error 0x%x', errcode);
// Exit the program and return the error code
exit(errcode);
}
else
{
// Success reading record into local buffer
// This data is now stored in the variable 'buffer'
Honeywell 2017 95
Application Library for C and C++
// ...
// Perform data manipulation with 'buffer' here
// ...
// When finished, and if necessary
// Write data back to database
if (c_dataio_write( UTBL01_F,
rec,
LOC_ALL,
buffer,
user_table1_recordsize) == -1)
{
// Failed to write record
// Retrieve latest error number
errcode = c_geterrno();
// Display error message
printf('c_dataio_write error 0x%x', errcode);
}
}
}
// END SERVER FILE ACCESS
// ...
// Do more things in your application here
// ...
See also
hsc_param_values() on page 170
hsc_param_value_put() on page 174
c_getlst() on page 112
c_givlst() on page 118
DeassignLrn()
Removes the current LRN assignment for a thread.
Honeywell 2017 96
Application Library for C and C++
C/C++ Synopsis
#include <src/defs.h>
#include <src/trbtbl_def>
int2 DeassignLrn();
Description
Removes the association between the thread and its LRN.
Diagnostics
Upon successful completion, a value of 0 is returned. Otherwise, -1 is returned, and calling c_
geterrno() on page 106 will retrieve the error code.
See also
AssignLrn() on page 84
c_getlrn() on page 111
c_deltsk()
Marks a task for deletion.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
(in) Logical resource number of the task to mark for deletion or -1 for the calling
lrn
task.
Description
Marks a task for deletion. After the marked task terminates (by calling c_trmtsk() on page 246
or c_trm04() on page 245) it will be deleted from the system.
Honeywell 2017 97
Application Library for C and C++
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned, and calling c_
geterrno() on page 106 will return the following error code:
Example
#include <lrns> /* for task lrns */
#include <src/M4_err.h>
#include <src/defs.h>
...
int errcode;
...
/* mark the first user task for deletion on next termination */
if (c_deltsk(USR1LRN) == -1)
{
errcode = c_geterrno();
c_logmsg(progname,'123','c_deltsk error 0x%x', errcode);
exit(errcode);
}
See also
c_trmtsk() on page 246
c_trm04() on page 245
DbletoPV()
Inserts a double value into a PARvalue union.
C/C++ synopsis
#include <src/defs.h>
#include <src/almmsg.h>
PARvalue* DbletoPV(
double dble_val,
Honeywell 2017 98
Application Library for C and C++
PARvalue* pvvalue
);
Arguments
Argument Description
Description
Inserts a double value into a PARvalue, and then returns a pointer to the PARvalue passed
in. This function allows you to set attributes into a notification structure using calls to hsc_
insert_attrib() on page 131 and hsc_insert_attrib_byindex() on page 138 functions in a single
line of code.
Diagnostics
If this function is successful, the return value is a pointer back to the PARvalue passed in,
otherwise, the return value is NULL and calling hsc_insert_attrib() on page 131 will retrieve
the error code.
Possible errors returned are:
Example
See the examples in hsc_insert_attrib() on page 131 and hsc_insert_attrib_
byindex() on page 138.
See also
hsc_insert_attrib() on page 131
hsc_insert_attrib_byindex() on page 138
Int2toPV() on page 206
Int4toPV() on page 208
PritoPV() on page 228
RealtoPV() on page 231
Honeywell 2017 99
Application Library for C and C++
dsply_lrn()
Determines the LRN of the display task for a Station, based on the Station number.
C/C++ Synopsis
#include <src/defs.h>
int2 dsply_lrn(
int2* pStationNumber // pointer to the Station number
);
Arguments
Argument Description
pStationNumber (in) pointer to the Station number that will be used to find the LRN.
Description
Quickly determines the LRN of a particular Station's display task.
Diagnostics
This function returns the LRN (>0) if successful. Otherwise it returns -1.
See also
stn_num() on page 240
c_ex()
Executes the command line.
C/C++ synopsis
#include <src/defs.h>
Arguments
Argument Description
command (in) pointer to a null-terminated string containing the command line to execute.
Description
Passes a command line string as input to the command line interpreter and executes it as if the
command line was entered in from a Console Window.
Diagnostics
If successful completion a value of 0 is returned. Otherwise, -1 is returned, and calling c_
geterrno() on page 106 will retrieve the error code relevant to the command line that was
executed.
ftocstr()
Converts a FORTRAN string to a C string.
C/C++ synopsis
#include <src/defs.h>
char* ftocstr(
char* from_str,
int from_len,
char* to_str,
int to_len
);
Arguments
Argument Description
Description
Given a FORTRAN string and the length of the string, this routine will convert it into a null
terminated C string. The string is returned in data buffer supplied.
A pointer to the string is returned if the conversion was successful and NULL pointer is
returned if the string passed in (minus trailing blanks) is longer than the output buffer length.
In this case a truncated string is returned in the output data buffer.
Danger:
This routine searches from the end of the string for the last non space character. Thus if the
string contains something other than spaces on the end of the string, the routine will not work.
If the name to convert is coming from C, then the strlen should be passed to this routine
rather than the size of the memory allocated for the name.
See also
c_intchr() on page 209
c_chrint() on page 85
ctofstr() on page 86
c_gbload()
Loads the global common server database files.
C/C++ synopsis
#include <src/defs.h>
Description
Makes the server database accessible to the calling task.
The memory-resident sections of the database are attached to the calling task. This allows the
calling task to reference the database directly.
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, the application should report
an error and terminate. The error code can be subsequently retrieved by calling c_geterrno()
on page 106.
Warnings
Should only be called once per execution of a task, before any other application routines are
called.
Example
#include <src/defs.h>
#include <src/M4_err.h>
int errcode;
c_gdbcnt()
Gets a database control request.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Used to fetch and decode a control request from the database scan task. See 'Developing user
scan tasks.'
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned, and calling c_
geterrno() will return one of the following error codes:
c_getapp()
Gets the application record for a task.
C/C++ synopsis
#include <src/defs.h>
#include <src/apptbl_def>
uint2 task_lrn,
struct apptbl appbuf
);
Arguments
Argument Description
task_name (in) character string containing the name of the task to find
task_lrn (in) logical resource number of the task to find. If -1 then not checked
appbuf (out) application record buffer as defined in APPTBL_DEF
Description
Finds the corresponding application table record that contains a reference to the specified task.
If successful, it will load the record into the supplied appbuf and return.
GetGDAERRcode()
Returns the error code from a GDAERR status structure.
C/C++ synopsis
#include <src/defs.h>
#include <src/gdamacro.h>
DWORD GetGDAERRcode(
GDAERR* pGdaError
);
Arguments
Argument Description
Description
Returns the error code associated with the GDAERR structure.
See also
IsGDAwarning() on page 212
IsGDAerror() on page 210
c_geterrno()
Returns the error code from an Experion Server API function.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
int c_geterrno();
Arguments
None.
Returns
Returns the meaningful error code when aExperion Server API function has been called and
has returned TRUE. This function needs to be called as the first function immediately after a
failed Server API call.
Description
Returns the most recent error code of the Server API function calls. Note that this may not be
associated with the most recent Server API function call, but from an earlier call, whichever
last returned an error.
You should only ever retrieve the latest Server API error code immediately after testing each
Server API function return value for its error status.
Attention:
Any applications that use the function c_geterrno() must include the M4_err.h
header file, that is, #include <src/M4_err.h>.
Example
#include <src/defs.h>
#include <src/M4_err.h>
int errcode;
c_gethstpar_..._2()
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/gethst.h>
int numhst,
PNTNUM points,
PRMNUM params,
int numpnt,
char* archive,
float* values
);
Arguments
Argument Description
Description
Used to retrieve a particular type of history values for specified Points and time in history.
History will be retrieved from a specified time or Offset going backwards in time numhst
intervals for each Point specified.
c_gethstpar_date_
retrieves history values from a specified date and time.
2
c_gethstpar_ofst_ retrieves history values from a specified number of history intervals in the
2 past.
The history values are stored in sequence in the values array. values[x][y] represents the yth
history value for the xth point.
The history type is specified by using one of the following values:
Value Description
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned, and calling c_
geterrno() will return one of the following error codes:
Example
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/gethst.h>
#include "parameters"
#define NHST 50
#define NPNT 3
exit(errcode);
}
See also
hsc_param_values() on page 170
c_getlrn()
Gets a logical resource number.
C/C++ synopsis
#include <src/defs.h>
Arguments
None.
Description
Fetches the calling task's Logical Resource Number (LRN). Each LRN is unique for the
thread of each process. Each thread can only be associated with one LRN and each LRN can
only be associated with one thread.
Diagnostics
Upon successful completion, the task's LRN is returned. Otherwise, -1 is returned indicating
that the task has not been created as a server task.
See also
AssignLrn() on page 84
DeassignLrn() on page 96
c_getlst()
Gets values for a list of points.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/lstfil_def>
Arguments
Argument Description
Description
Used to retrieve values for a list of points and parameters. These point lists can be viewed and
modified using the Application Point Lists display.
The arrays values and errors must be large enough to hold the number of items in a list as
declared in the parameter GGLNM in the file def/src/listfil_def.
Diagnostics
Upon successful completion zeros will be returned in all elements of the errors array.
Otherwise one of the following error codes will be returned in the corresponding element of
the errors array:
See also
c_givlst() on page 118
c_dataio_...() on page 87
hsc_param_values() on page 170
hsc_param_value_put() on page 174
c_getprm()
Gets parameters from a queued task request. (Requested via Action Algorithm 92).
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
paramc (in) Parameter count. For standard use this value must be set to 3.
par1 (out) Parameter 1 value.
rqstblk (out) Pointer to request block buffer.
rqstblk_sz (in) Size of request block buffer in bytes.
Description
Gets parameters from a queued task request. The routine retrieves a parameter block from the
request queue. The words in the parameter block are copied to the argument rqstblk. If the
task is expecting data and the request queue is empty, a value of M4_EOF_ERR (0x21F) is
returned and the task should terminate and wait for the next request. If the parameter block is
larger than the size of rqstblk, a value of M4_RECORD_LENGTH_ERR (0x21A) is
returned to indicate the data has been truncated. This routine enables a task to be requested
via a point build with Algorithm 92.
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned, and calling c_
geterrno() on page 106 will return the following error code: M4_ILLEGAL_LRN (0x802).
The calling process has not been created as an Experion task.
Example
#include 'src/defs.h'
#include 'src/M4_err.h'
#define BUFSZ 20
#define FOREVER 1
main()
{
int2 paramc = 3;
int2 par1 = 0;
int2 rqstblk[BUFSZ];
int2 rqstblk_sz;
int2 rqst_status;
int2 status;
while(FOREVER)
{
/* get the parameter block for this request */
rqst_status = c_getprm(¶mc, &par1, (int2 *)rqstblk, &rqstblk_sz);
if ( rqst_status == M4_EOF_ERR )
{
/*terminate and wait for next request*/
c_trm04(status);
continue;
}
/********************************/
/* Main processing loop */
/* */
/********************************/
}
}
In addition the requesting point's point number will be passed in the request buffer:
rqstblk[3] = Point number of requesting point.
See also
c_rqtskb...() on page 232
c_getreq() below
c_getreq()
Gets parameters from task request block.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/trbtbl_def>
Arguments
Argument Description
Description
Retrieves a ten word parameter block from the TRBTBL of the calling task. If no requests
are pending, returns TRUE (-1) and calling c_geterrno() on page 106 will retrieve the error
code M4_EOF_ERR (0x21F), otherwise, the ten word parameter block is copied into the
argument prmblk. The parameter block in the TRBTBL of the calling task is then cleared
and the function returns FALSE (0).
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned, and calling c_
geterrno() on page 106 will return one of the following error codes:
[M4_ILLEGAL_LRN] The calling process has not been created as a server task.
[M4_EOF_ERROR] There are no requests pending.
Example
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/trbtbl_def>
main()
{
int errcode; /* Error number*/
struct prm prmblk;
if (c_gbload() == -1)
errcode = c_geterrno();
exit(errcode);
while (1)
{
if (c_getreq((int2 *) &prmblk))
{
errcode = c_geterrno();
if (errcode != M4_EOF_ERR)
{
/* Report an error */
}
/* Now terminate and wait for the */
/* next request */
c_trm04(ZERO_STATUS);
}
else
{
/* Perform some function */
/* Perhaps switch on the first */
/* Parameter */
switch(prmblk.param1)
{
case 1:
...
break;
case 2:
...
break;
} /* end switch */
} /* if */
} /* end while */
}
See also
c_rqtskb...() on page 232
c_trm04() on page 245
c_givlst()
Gives values to a list of points.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/lstfil_def>
Arguments
Argument Description
Description
Used to store values into a list of points and parameters and controls those parameters if they
have a destination address. Note that each individual parameter control is performed
sequentially using a separate scan packet.
These point lists can be viewed and modified using the Application Point Lists display.
The arrays values and errors must be large enough to hold the number of items in a list as
declared in the parameter GGLNM in the file lstfil_def.
Diagnostics
Upon successful completion zeros will be returned in all elements of the errors array.
Otherwise one of the following error codes will be returned in the corresponding element of
the errors array:
[M4_INVALID_NO_
An invalid number of parameters was passed to the subroutine.
ARGS]
[M4_INV_POINT] An invalid point type/number has been specified.
[M4_INV_
An invalid parameter has been specified.
PARAMETER]
[M4_ILLEGAL_TYPE] A parameter with an illegal type has been specified.
It is illegal to store the PV parameter of a point that is currently on
[M4_PNT_ON_SCAN]
scan.
See also
c_getlst() on page 112
c_dataio_...() on page 87
hsc_param_values() on page 170
hsc_param_value_put() on page 174
hsc_asset_get_ancestors()
Gets the asset ancestors for an asset.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_asset_get_ancestors(
PNTNUM ,
int* piNumAncestors,
PNTNUM** ppAncestors
);
Arguments
Argument Description
Description
This functions returns the asset ancestors for the specified asset.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned, and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumAncestors = 0;
PNTNUM *pAncestors = NULL;
hsc_asset_get_children()
Gets the children of an asset.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_asset_get_children(
PNTNUM ,
int* piNumChildren,
PNTNUM** ppChildren
);
Arguments
Argument Description
Description
Returns the asset children for the specified asset.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned, and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumChildren = 0;
PNTNUM *pChildren = NULL;
.
.
hsc_em_FreePointList (pAncestors);
hsc_asset_get_descendents()
Gets the descendents of an asset.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_asset_get_descendents(
PNTNUM ,
int* piNumDescendents,
PNTNUM** ppDescendents
);
Arguments
Argument Description
Description
Returns the asset descendents for the specified asset.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned, and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumDescendents = 0;
PNTNUM *pDescendents = NULL;
if (hsc_asset_get_descendents (point, &iNumDescendents, &pDescendents)
! = 0)
return -1
.
.
.
hsc_em_FreePointList (pDescendents);
hsc_asset_get_parents()
Gets the parent asset of an asset.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_asset_get_parents(
PNTNUM ,
int* piNumParents,
PNTNUM** ppParents
);
Arguments
Argument Description
Description
Returns the asset parents for the specified asset.
The array must be cleared by calling hsc_em_FreePointList() below.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned, and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumParents = 0;
PNTNUM *pParents = NULL;
hsc_em_FreePointList()
Frees the memory used to hold a list of points.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_em_FreePointList(
PNTNUM* pPointList
);
Arguments
Argument Description
Description
Frees the memory used to hold a list of points.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned, and calling c_geterrno() on page 106 will
retrieve the error code.
hsc_em_GetLastPointChangeTime()
Gets the last time a point was changed.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
void hsc_em_GetLastPointChangeTime(
HSCTIME* pTime
);
Description
Returns the last time that a point was changed on the server due to a Quick Builder or
Enterprise Model Builder download.
hsc_em_GetRootAlarmGroups()
Gets the point numbers of the root Alarm Groups.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_em_GetRootAlarmGroups(
int* pCount,
PNTNUM** ppRootAlarmGroups
);
Arguments
Argument Description
Description
Returns the point numbers for all of the root Alarm Groups.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned, and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumRootAlarmGroups = 0;
PNTNUM *pRootAlarmGroups = NULL;
if (hsc_em_GetRootAlarmGroups (&iNumRootAlarmGroups,
&pRootAlarmGroups) ! = 0)
return -1
.
.
.
hsc_em_FreePointList (pRootAlarmGroups);
hsc_em_GetRootAssets()
Gets the point numbers for root assets.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_em_GetRootAssets(
int* pCount,
PNTNUM** ppRoot
);
Arguments
Argument Description
Description
Returns the point numbers for all of the root assets.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned, and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumRoot = 0;
PNTNUM *pRoot = NULL;
if (hsc_em_GetRoot (&iNumRoot, &pRoot) ! = 0)
return -1;
.
.
.
hsc_em_FreePointList (pRoot);
hsc_em_GetRootEntities()
Gets the point numbers for all root entities.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_em_GetRootEntities;(
int* pCount,
PNTNUM** ppRootEntities
);
Arguments
Argument Description
Description
Returns the point numbers for all of the root entities in the enterprise model.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned, and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumRootEntities = 0;
PNTNUM *pRootEntities = NULL;
if (hsc_em_GetRootEntities (&iNumRootEntities, &pRootEntities) ! = 0)
return -1
.
.
.
hsc_em_FreePointList (pRootEntities);
hsc_enumlist_destroy()
Safely destroys an enumlist.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_enumlist_destroy(
enumlist** list
);
Arguments
Argument Description
Description
Deallocates all strings in an enumeration list along with the array itself.
Diagnostic
The return value will be 0 if successful, otherwise -1 is returned, and calling c_geterrno() on
page 106 will retrieve the error code.
Example
Retrieve the enumerated list of values for Pntana1's MD parameter and output
this list.
#include <src/defs.h>
#include <src/points.h>
PNTNUM point;
PRMNUM param;
enumlist* list;
int i,n;
point = hsc_point_number('Pntana1');
param = hsc_param_number(point,'MD');
n = hsc_param_enum_list_create(point,param, &list);
for(i=0;i<n;i++)
c_logmsg('example','enum_listcall', '%10s\t%d',list[i].text,list[i].-
value);
/*process enumlist*/
hsc_enumlist_destroy (&list);
hsc_GUIDFromString()
Converts a GUID from string format to binary format.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_GUIDFromString;(
char* szGUID,
GUID* pGUID
);
Arguments
Argument Description
Description
This function converts a GUID from string format to binary format.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned, and calling c_geterrno() on page 106 will
retrieve the error code.
hsc_insert_attrib()
Sets an attribute value (identified by name) of a notification structure.
Note that this same functionality can be achieved by using index values instead of named
attributes through the use of the hsc_insert_attrib_byindex() on page 138 function.
C/C++ synopsis
#include <src/defs.h>
#include <src/almmsg.h>
int hsc_insert_attrib(
NOTIF_STRUCT* notification,
char* attribute_name,
PARvalue* value,
int2 type
);
Arguments
Argument Description
Argument Description
Description
Sets an attribute in the notification structure for use with the hsc_notif_send() on page 146
function to raise or normalize an alarm, event, or message, as appropriate.
The category attribute must be the first attribute set and can only be set once within a
notification structure. If you do not set category as the first attribute, INV_CATEGORY is
the return error and the specified attribute is not set. Once you have set the category attribute,
you can set other attributes.
This function will attempt to convert the attribute value type from the specified type to the
default type for that attribute. If this function cannot convert the specified type to the default
type, VALUE_COULD_NOT_BE_CONVERTED is the return error. If this function does
not know the specified type, ILLEGAL_TYPE is the return error.
This function validates the attribute values for asset and category. If the asset attribute value is
invalid, INV_AREA is the return error, and if the category value is invalid, INV_
CATEGORY is the return error. This function also validates the attribute values for station
and priority. If these attribute values are invalid, BAD_VALUE is the return error.
Diagnostics
If the function is successful, the return value is HSC_OK, otherwise the return value is HSC_
ERROR and calling c_geterrno() on page 106 will retrieve one of the following error codes:
BAD_VALUE The specified attribute value is not valid for this attribute.
BUFFER_TOO_
The pointer to the notification structure buffer is invalid, that is, null.
SMALL
The specified attribute name does not exist, or you do not have access to
INV_ATTRIBUTE
manipulate it.
ILLEGAL_TYPE The specified type does not exist.
INV_AREA The specified asset attribute is not a valid asset.
VALUE_COULD_ The type could not be converted from the specified type to the default
NOT_BE_ type for that attribute.
CONVERTED
The specified attribute does not belong to this category. For a list of valid
ATTR_NOT_IN_
attributes for a category, see Valid Attributes for a Category on
CAT
page 138.
The category for this notification has not been set or the passed category
INV_CATEGORY
value is not a valid category.
CAT_ALREADY_ The category for this notification has already been set and cannot be
ASSIGNED reset.
Example
The following example creates a notification structure for a system alarm, setting
the description to 'Server API Alarm,' the priority to ALMMSG_LOW, the sub-
priority to 0, and the value to 4.
#include <src/defs.h>
#include "src/almmsg.h"
#include 'src/M4_err.h'
// PARvalue Buffer
PARvalue pvTmp;
c_logmsg ("example",
"hsc_insert_attrib call",
"Unable to insert description attribute [%s],
error code = 0x%x",
pvTmp.text,
c_geterrno());
See also
hsc_insert_attrib_byindex() on page 138
hsc_notif_send() on page 146
DbletoPV() on page 98
Int2toPV() on page 206
Int4toPV() on page 208
PritoPV() on page 228
Date
Attribute Name Index Value Description
Type
Flexible attribute
ALMEVTFLEXBASEIDX + Flexible values. As the data
Attribute name, <Flexible Attribute Number>
description, and DT_ type is DT_VAR, the
number defined in the For example, VAR optional type argument must
SysCfgSum System ALMEVTFLEXBASE IDX+5 be set.
Attributes display.
DT_ The maximum size is
Action ALMEVTACTIDX
CHAR ALMACTUNT_SZ.
The actor, for example, an
DT_
Actor ALMEVTACTORIDX operator. The maximum size
CHAR
is ALMEVTACTOR_SZ.
If you specify DT_CHAR,
you must specify the asset
name. If you specify DT_
DT_ INT2, you must specify the
INT2 asset number.
Area code ALMEVTACDIDX or Must be a valid asset. If no
DT_ area code attribute is created
CHAR within the notification, the
hsc_notif_send function
assigns the system asset to
the notification.
DT_
Asset ALMEVTASTIDX
CHAR
DT_ If you specify DT_CHAR,
INT4 you must specify the category
Category ALMEVTCATIDX or name. If you specify DT_
DT_ INT4, you must specify the
CHAR category index.
Date
Attribute Name Index Value Description
Type
DT_
Changed Time ALMEVTCHANGETIMEIDX
TIME
DT_ The maximum size is
Comment ALMEVTCOMMENTIDX
CHAR ALMEVTCOMMENT_SZ.
DT_ The maximum size is
Condition ALMEVTCONIDX
CHAR ALMEVTCON_SZ.
DT_
Connection ALMEVTCONNECTIDX
INT2
DT_ A description. The maximum
Description ALMEVTDESIDX
CHAR size is ALMEVTDES_SZ.
DT_
Field Time ALMEVTETIMEIDX
TIME
Field Time Bias ALMEVTFIELDBIASIDX
DT_
Flags ALMEVTFLAGSIDX
INT2
DT_
Limit ALMEVTLIMIDX The alarm limit.
DBLE
A navigation link.
DT_
Link 1 ALMEVTLINK1IDX The maximum size is
CHAR
ALMEVTLINK_SZ.
Set to the default value when
DT_
Link 1 Type ALMEVTLINK1TYPEIDX Link 1 is set. Link types are
INT2
defined in the almmsg.h file.
A navigation link. The
DT_
Link 2 ALMEVTLINK2IDX maximum size is
CHAR
ALMEVTLINK_SZ.
Set to the default value when
DT_
Link 2 Type ALMEVTLINK2TYPEIDX Link 2 is set. Link types are
INT2
defined in the almmsg.h file.
A navigation link. The
DT_
Link 3 ALMEVTLINK3IDX maximum size is
CHAR
ALMEVTLINK_SZ.
Set to the default value when
DT_
Link 3 Type ALMEVTLINK3TYPEIDX Link 3 is set. Link types are
INT2
defined in the almmsg.h file.
Date
Attribute Name Index Value Description
Type
DT_
Location Full Name ALMEVTLOCFULLNAMEIDX
CHAR
DT_
Location Tag Name ALMEVTLOCTAGNAMEIDX
CHAR
DT_
Prev Value ALMEVTPREVVALIDX
VAR
DT_
Prev Value Type ALMEVTPREVVALTYPEIDX
INT2
Includes both the priority and
sub-priority value. Use the
DT_ PritoPV function to set this
Priority ALMEVTPRIIDX
INT2 attribute. Both the priority
and sub-priority values must
be set.
DT_ OPC Quality value. Default
Quality ALMEVTQUALIDX
INT2 value set to c0 if not set.
DT_
Severity ALMEVTSEVIDX The OPC severity.
INT4
The maximum size is
DT_
Signature Meaning 1 ALMEVTSIGNMEANIDX ALMEVTSIGMEAN_SZ.
CHAR
Pharma license only.
The point name.
DT_
Source ALMEVTSRCIDX The maximum size is
CHAR
ALMEVTSRC_SZ.
DT_ If you specify DT_INT2,
INT2 the string will be formatted.
Station ALMEVTSTNIDX or Otherwise, DT_CHAR is
DT_ assumed. Must be a valid
CHAR station.
DT_ The maximum size is
Subcondition ALMEVTSUBCONIDX
CHAR ALMEVTCON_SZ.
DT_
Time ALMEVTTIMEIDX
TIME
Time Bias ALMEVTTIMEBIASIDX
DT_ The maximum size is
Units ALMEVTUNTIDX
CHAR ALMEVTUNT_SZ.
Date
Attribute Name Index Value Description
Type
DT_
Value ALMEVTVALIDX
VAR
Value Type ALMEVTVALTYPEIDX
The following table shows default association of attributes available in categories. Only
attribute names indicated with an X can be set for each category.
You can view the categories, and the attributes available in that category, in the
syscfgsumsystemcategories system display.
hsc_insert_attrib_byindex()
Sets an attribute (identified by its index value) of a notification structure.
Note that this same functionality can be achieved by using named attributes instead of index
values through the use of the hsc_insert_attrib() on page 131 function.
C/C++ synopsis
#include <src/defs.h>
#include <src/almmsg.h>
int hsc_insert_attrib_byindex(
NOTIF_STRUCT* notification,
int2 attribute_index,
PARvalue* value,
int2 type
);
Arguments
Argument Description
Argument Description
typedef union
{
GDAVARIANT var;
char text[PARAM_MAX_STRING_LEN+1];
short int2;
long int4;
int8 int8;
float real;
double dble;
struct {
long ord;
char text[PARAM_MAX_STRING_LEN+1];
} en;
struct {
ULONG cSize; /* size of serialized variant */
BYTE *pData; /* pointer to serialized variant */
} servar;
HSCTIME time;
} PARvalue;
Description
Sets an attribute in the notification structure for use with the hsc_notif_send() on page 146
function to raise or normalize an alarm, event, or message, as appropriate.
The ALMEVTCATIDX (category) attribute must be the first attribute set and can only be
set once within a notification structure. If you do not set ALMEVTCATIDX as the first
attribute, INV_CATEGORY is the return error and the specified attribute is not set. Once
you have set the ALMEVTCATIDX attribute, you can set other attributes.
This function will attempt to convert the attribute value type from the specified type to the
default type for that attribute. If this function cannot convert the specified type to the default
type, VALUE_COULD_NOT_BE_CONVERTED is the return error. If this function does
not know the specified type, ILLEGAL_TYPE is the return error.
This function validates the attribute values for asset and category. If the asset attribute value is
invalid, INV_AREA is the return error, and if the category value is invalid, INV_
CATEGORY is the return error. This function also validates the attribute values for station
and priority. If these attribute values are invalid, BAD_VALUE is the return error.
Diagnostics
If the function is successful, the return value is HSC_OK, otherwise the return value is HSC_
ERROR and calling c_geterrno() on page 106 will retrieve the error code.
The possible errors returned are:
BAD_VALUE The specified attribute value is not valid for this attribute.
BUFFER_TOO_
The pointer to the notification structure buffer is invalid, that is, null.
SMALL
The specified attribute name does not exist, or you do not have access to
INV_ATTRIBUTE
manipulate it.
ILLEGAL_TYPE The specified type does not exist.
INV_AREA The specified asset attribute is not a valid asset.
VALUE_COULD_
The type could not be converted from the specified type to the default
NOT_BE_
type for that attribute.
CONVERTED
The specified attribute does not belong to this category. For a list of valid
ATTR_NOT_IN_
attributes for a category, see Valid Attributes for a Category on
CAT
page 138.
The category for this notification has not been set or the passed category
INV_CATEGORY
value is not a valid category.
CAT_ALREADY_ The category for this notification has already been set and cannot be
ASSIGNED reset.
Example
The following example creates a notification structure for a system alarm, setting
the description to 'Server API Alarm,' the priority to ALMMSG_LOW, the sub-
priority to 0, and the value to 4.
#include <src/defs.h>
#include "src/almmsg.h"
// PARvalue Buffer
PARvalue pvTmp;
c_logmsg ("example",
"hsc_insert_attrib call",
"Unable to insert value attribute [%d],
error code = 0x%x",
pvTmp.int4,
c_geterrno());
See also
DbletoPV() on page 98
hsc_insert_attrib() on page 131
hsc_notif_send() on page 146
Int2toPV() on page 206
Int4toPV() on page 208
PritoPV() on page 228
RealtoPV() on page 231
StrtoPV() on page 240
TimetoPV() on page 242
hsc_IsError()
Determines whether a returned status value is an error.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err_def>
int hsc_IsError(
int code
);
Arguments
Argument Description
Description
Determines whether a particular status code is an error. Most C functions indicate success by
returning a 0 in the return value. If a function returns a non-zero value, calling c_geterrno()
on page 106 will retrieve the error code. This value can then be checked to see if it indicates
an error or warning.
Status values can indicate an error, a warning, or success. Some functions return a GDAERR
structure instead. Use the macro IsGDAerror() on page 210 to check this value for an error.
Diagnostics
This routine returns TRUE (-1) if code indicates an error condition, otherwise it returns
FALSE (0).
See also
hsc_IsWarning() below
IsGDAerror() on page 210
hsc_IsWarning()
Determines whether a returned status value is a warning.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
int hsc_IsWarning(
int code
);
Arguments
Argument Description
Description
Determines whether a particular status code is warning. Most C functions indicate success by
returning a 0 in the return value. If a function returns a non-zero value, calling c_geterrno()
on page 106 will retrieve the error code. This value can then be checked to see if it indicates
an error or warning.
Status values can indicate an error, a warning, or success. Some functions return a GDAERR
structure instead. Use the macro IsGDAerror() on page 210 to check this value for an error.
Diagnostics
This routine returns TRUE (-1) code indicates a warning condition, otherwise it returns
FALSE (0).
See also
hsc_IsError() on page 142
IsGDAwarning() on page 212
hsc_lock_file()
Locks a database file.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
int hsc_lock_file(
int file,
int delay
);
Arguments
Argument Description
Description
Performs advisory locking of database files. Advisory locking means the tasks which use the
file must take responsibility for setting and removing locks as required.
For more information regarding database locking see Ensuring database consistency on
page 43.
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
hsc_lock_record() below
hsc_unlock_file() on page 202
hsc_unlock_record() on page 203
hsc_lock_record()
Locks a record of a database file.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
int hsc_lock_record(
int file,
int record,
int delay
);
Arguments
Argument Description
Description
Performs advisory locking of database record. Advisory locking means the tasks which use
the record must take responsibility for setting and removing locks as required.
For more information regarding database locking see 'Ensuring database consistency.'
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
hsc_lock_file() on page 144
hsc_unlock_file() on page 202
hsc_unlock_record() on page 203
hsc_notif_send()
Sends a notification structure to raise or normalize an alarm, event, or message.
C/C++ synopsis
#include <src/defs.h>
#include <src/almmsg.h>
int hsc_notif_send(
NOTIF_STRUCT* notification,
NOTIF_SEND_MODE mode
);
Arguments
Argument Description
Description
Sends a notification (as created using the hsc_insert_attrib() on page 131 and hsc_insert_
attrib_byindex() on page 138 functions), for storing in the alarm file, or event file, or message
directory, as appropriate to the category set in the notification structure.
Note that if a Station printer has been configured to print alarms, events, or messages, this
notification will also be printed as appropriate.
This function validates the attribute values of the notification structure for asset, tagname, and
Station. If not explicitly set, this function sets default values.
Diagnostics
If the function is successful, the return value is HSC_OK, otherwise the return value is HSC_
ERROR and calling c_geterrno() on page 106 will retrieve one of the following errors:
BUFFER_TOO_
The pointer to the notification is invalid, that is, null.
SMALL
INV_CATEGORY The notification does not have a valid category set.
The file could not be queued to the printer because the printer queue has
M4_QEMPTY
no free records.
Example
This example sends an unacknowledged and off-normal alarm and then returns
that alarm to normal.
#include <src/defs.h>
#include <src/almmsg.h>
// PARvalue Buffer
PARvalue pvTmp;
pvTmp.int2,
c_geterrno());
See also
hsc_insert_attrib() on page 131
hsc_insert_attrib_byindex() on page 138
DbletoPV() on page 98
Int2toPV() on page 206
Int4toPV() on page 208
PritoPV() on page 228
RealtoPV() on page 231
StrtoPV() on page 240
TimetoPV() on page 242
hsc_param_enum_list_create()
Get an enumerated list of parameter values.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_enum_list_create
(
PNTNUM point,
PRMNUM param,
enumlist** list
);
Arguments
Argument Description
Description
Returns a list of enumeration strings for the point parameter value, where applicable.
Diagnostics
The return value will be the number of entries in the list, otherwise -1 if an error was
encountered and calling c_geterrno() will retrieve the error code.
In all cases the enumlist structure is created by hsc_param_enum_list_create() on the
previous page with enough space for the text field in each enumlist element in the enumlist
array. Because this memory is allocated by the function, your user code needs to free this
space when you finish using the structure. As these functions always allocate the memory
required for the text field, make sure that you free all memory before calling the routines a
second time with the same enumlist** pointer, otherwise there will be a memory leak. To
facilitate freeing this memory, hsc_enumlist_destroy() on page 129 has been added to the
API.
Example
Retrieve the enumerated list of values for Pntana1's MD parameter and output
this list.
#include <src/defs.h>
#include <src/points.h>
PNTNUM point;
PRMNUM param;
enumlist* list;
int i,n;
point = hsc_point_number('Pntana1');
param = hsc_param_number(point,'MD');
n = hsc_param_enum_list_create(point,param, &list);
for(i=0;i<n;i++)
c_logmsg('example',
'enum_listcall',
'%10s\t%d',
list[i].text,
list[i].value);
/*process enumlist*/
hsc_enumlist_destroy (&list);
See also
hsc_param_enum_ordinal() below
hsc_enumlist_destroy() on page 129
hsc_param_enum_ordinal()
Get an enumeration's ordinal value.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_enum_ordinal(
PNTNUM point,
PRMNUM param,
char* string
);
Arguments
Argument Description
Description
Returns the ordinal value that corresponds to the enumeration string for the point parameter.
Diagnostics
Returns the ordinal number on success and -1 if an error was encountered. The error code can
be retrieved by calling c_geterrno() on page 106.
Example
Determine the ordinal number of the enumeration 'AUTO' for 'MD' parameter for
point 'Pntana1.'
#include <src/defs.h>
#include <src/points.h>
#include <src/M4_err.h>
PNTNUM point;
PRMNUM param;
int4 ordinal;
point = hsc_point_number('Pntana1');
param = hsc_param_number(point,'MD');
if((ordinal=hsc_param_enum_ordinal (point,param,'AUTO'))<0)
c_logmsg('example', 'ord call',
'call to hsc_param_enum_ordinal failed,
error code = %d',
c_geterrno());
else
c_logmsg('example','ord call',
'Ordinal value for AUTO is %d.',ordinal);
hsc_param_enum_string()
Gets an enumeration string.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
char* hsc_param_enum_string(
PNTNUM point,
PRMNUM param,
int4 ordinal
);
Arguments
Argument Description
Description
Returns the enumeration string that corresponds to the ordinal value for the point parameter.
Diagnostic
Returns the enumeration string, or NULL and calling c_geterrno() on page 106 will retrieve
the error code.
The enumeration string must be freed by the caller using the system call free().
hsc_param_format()
Gets a parameter's format.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_format (
PNTNUM point,
PRMNUM param
);
Arguments
Argument Description
Description
This routine will return the format of the specified point parameter, and will be one of the
following, or negative if invalid:
DF_CHAR, /* character */
DF_NUM, /* numeric */
DF_POINT, /* point name */
DF_PARAM, /* parameter name */
DF_ENG, /* engineering units */
DF_PCT, /* percent */
DF_ENUM, /* enumerated */
DF_MODE, /* enumerated mode */
DF_BIT, /* TRUE/FALSE */
DF_STATE, /* state descriptor */
DF_PNTTYPE, /* point type */
DF_TIME, /* time */
DF_DATE, /* date */
DF_DATE_TIME, /* time stamp */
DF_GETVAL /* format as pnt-param */
Example
Determines the data format of the parameter PointDetailDisplayDefault of point
'pntana1' and outputs this format's value.
#include <src/defs.h>
#include <src/points.h>
PRMNUM param;
PNTNUM point;
int paramFormat;
point = hsc_point_number("pntana1");
param = hsc_param_number(point, "PointDetailDisplayDefault");
if((paramFormat = hsc_param_format(point, param)) < 0)
c_logmsg ("example","param_format call",
"Error getting param format for point %d,
param %d",
point,
param);
else
c_logmsg ("example",
"param_format call",
"Param format of point %d,
parameter %d is %d",
point,
param,
paramFormat);
See also
hsc_param_type() on page 165
hsc_param_limits()
Get parameter data entry limits.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_limits (
PNTNUM point,
PRMNUM param,
double* min,
double* max
);
Arguments
Argument Description
Description
Returns the minimum and maximum data entry limits of the specified point parameter.
Diagnostics
This function always returns 0. If an error occurs, min will be set to 0.0 and max to 100.0.
Example
Find the parameter limits for point 'pntana1' and parameter 'SP' and output them.
#include <src/defs.h>
#include <src/points.h>
PRMNUM param;
PNTNUM point;
double limitMin, limitMax;
point = hsc_point_number("pntana1");
param = hsc_param_number(point, "SP");
if(hsc_param_limits(point, param, &limitMin, &limit Max) != 0)
c_logmsg ("example",
"param_limits call",
"Error getting param limits for point %d,
param %d",
point,
param);
else
c_logmsg ("example",
"param_limits call",
"Param limits of point %d,
parameter %d are %f -> %f ",
point,
param,
limitMin,
limitMax);
See also
hsc_param_type() on page 165
hsc_param_subscribe()
Subscribe to a list of point parameters.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_subscribe(
int number,
PNTNUM* points,
PRMNUM* param,
int period
);
Arguments
Argument Description
Description
Declares interest in point parameters so that data will be available in the point record, without
the need to fetch it from the appropriate location.
Diagnostics
This function will return 0 if successful, otherwise the relevant status code will be returned.
See also
hsc_param_values() on page 170
hsc_param_list_create()
Gets a list of parameters.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_list_create(
PNTNUM point,
enumlist** list
);
Arguments
Argument Description
point (in) point number, specify 0 for all parameters of all point types
(in/out) pointer to an enumeration list of parameters enumlist is defined as (definition
from include/src/dictionary.h):
typedef struct
{
int value;
list char* text;
} enumlist;
n value is the parameter number if the parameter is currently stored in the server
database. A zero value may indicate a parameter has not previously been
accessed. To obtain the parameter number use hsc_param_number.
n text is the null terminated string containing the parameter name
Description
Returns pointer to a list of names and numbers for the point's parameters.
Diagnostics
The return value of this function indicates the number of parameters stored in the list structure.
In all cases the enumlist structure is created by hsc_param_list_create() on the previous page
with enough space for the text field in each enumlist element in the enumlist array. Because
this memory is allocated by the function, your user code needs to free this space when you
finish using the structure. As these functions always allocate the memory required for the text
field, make sure that you free all memory before calling the routines a second time with the
same enumlist** pointer, otherwise there will be a memory leak. To facilitate freeing this
memory, hsc_enumlist_destroy() on page 129 is included in the API.
Example
Retrieves all the parameters for point 'pntana1', and print out the name.
#include <src/defs.h>
#include <src/points.h>
#define LISTSZ 1000
enumlist* list;
int n,i;
PNTNUM point;
point = hsc_point_number('pntana1');
n = hsc_param_list_create(point, &list);
for (i=0; i<n; i++)
c_logmsg ('example',
'param_list call',
'parameter _s is %5d',
list[i].text,
list[i].value);
See also
hsc_enumlist_destroy() on page 129
hsc_param_number() on page 162
hsc_param_name()
Get a parameter name.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_name(
PNTNUM point,
PRMNUM param,
char* name,
int namelen
);
Arguments
Argument Description
Description
The parameter name is returned for the parameter number of the point specified. Note that the
char buffer needs to be big enough to store the parameter name in it, and that this length (of
the buffer) must be passed in the function.
Example
The parameter name for the parameter numbered 16 is returned for point
'pntana1', and prints it out.
#include <src/defs.h>
#include <src/points.h>
PNTNUM point;
PRMNUM param;
char paramName[MAX_PARAM_NAME_LEN+1];
point = hsc_point_number("pntana1");
param = 16;
hsc_param_name(point,param,paramName,MAX_PARAM_NAME_LEN+1);
c_logmsg ("example",
"param_list call",
"Parameter %s is parameter number %d for point %s.",
paramName,
param,
point);
See also
hsc_param_number() below
hsc_param_number()
Gets the parameter's number.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
PRMNUM hsc_param_number(
PNTNUM point,
char* name
);
Arguments
Argument Description
Description
Returns the number of the named point parameter. If the point number is zero, then ALL
point types will be searched.
Diagnostics
If the parameter cannot be found or an error occurs 0 will be returned, and calling c_geterrno
() on page 106 will retrieve the error code.
If the point number is zero then all points are searched for the corresponding parameter name.
This will then return the first match to any fixed parameters of points in the system. It will not,
however, resolve a flexible parameter name to a number, as this parameter number is specific
to a point not all points.
Example
The parameter number for the parameter PointDetailDisplayDefault is returned
for point 'pntana1,' and is output.
#include <src/defs.h>
#include <src/points.h>
PNTNUM point;
PRMNUM param;
char *paramName = "PointDetailDisplayDefault";
point = hsc_point_number("pntana1");
param = hsc_param_number(point, paramName);
c_logmsg ("example",
"param_number call",
"Parameter %s is parameter number %d for point number %d.",
paramName,
param,
point);
See also
hsc_param_name() on page 161
hsc_param_range()
Get parameter data range.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_range(
PNTNUM point,
PRMNUM param,
double* min,
double* max
);
Arguments
Argument Description
Description
Returns the minimum and maximum range of the specified point parameter.
Diagnostics
This function always returns 0. If an error occurs, min will be set to 0.0 and max to 100.0.
Example
Find the parameter ranges for point 'pntana1' and parameter 'SP' and output
them.
#include <src/defs.h>
#include <src/points.h>
PRMNUM param;
PNTNUM point;
double rangeMin, rangeMax;
point = hsc_point_number("pntana1");
param = hsc_param_number(point, "SP");
if(hsc_param_range(point, param, &rangeMin, &rangeMax) != 0)
c_logmsg ("example",
"param_range call",
"Error getting param range for point %d,
param %d",
point,
param);
else
c_logmsg ("example",
"param_range call",
"Param range of point %d,
parameter %d is %f -> %f",
point,
param,
rangeMin,
rangeMax);
See also
hsc_param_limits() on page 156
hsc_param_type()
Get a parameter's data type.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_type(
PNTNUM point,
PRMNUM param
);
Arguments
Argument Description
Description
This routine will return the data type of the specified point parameter, and will be one of the
following, or negative if invalid:
DT_CHAR /* character string */
DT_INT2 /* 1 to 16 bit short integer */
DT_INT4 /* 1 to 32 bit long integer */
DT_REAL /* short float */
DT_DBLE /* long float */
DT_HIST /* history (-0 => large float) */
DT_VAR /* variant */
DT_ENUM /* enumeration ' */
DT_DATE_TIME /* timestamp (integer*2 day, double sec) */
DT_TIME /* date and time (HSCTIME format) */
DT_INT8 /* 64-bit integer */
DT_SRCADDR /* source address */
DT_DSTADDR /* destination address */
Example
Determine the data type of the parameter PointDetailDisplayDefault of point
'pntana1' and output this type's value.
#include <src/defs.h>
#include <src/points.h>
PRMNUM param;
PNTNUM point;
int paramType;
point = hsc_point_number("pntana1");
param = hsc_param_number(point, "PointDetailDisplayDefault");
if((paramType = hsc_param_type(point, param)) < 0)
c_logmsg ("example",
"param_type call",
"Error getting param type for point %d,
param %d",
point,
param);
else
c_logmsg ("example",
"param_type call",
"Parameter type of point %d,
parameter %d is %d",
point,
param,
paramType);
See also
hsc_param_format() on page 154
hsc_param_value()
Get a point parameter value.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_value(
PNTNUM point,
PRMNUM param,
int* offset,
PARvalue* value,
uint2* type
);
Arguments
Argument Description
Argument Description
Description
The parameter's definition is located and used to access the point record using a common
routine which returns the pointer to the data. The top level routine then extracts the value by
type.
It is recommended that hsc_param_values() on page 170 be used in preference to this
function, as it allows the subscription period to be specified.
If your system uses dynamic scanning, hsc_param_value() calls from the Server API do not
trigger dynamic scanning.
Diagnostics
0 will be returned if successful, otherwise -1 will be returned, and calling c_geterrno() will
retrieve the error code. The value returned in type will be one of the following constants
defined in the parameter file:
DT_CHAR /* character string */
DT_INT2 /* 1 to 16 bit short integer */
DT_INT4 /* 1 to 32 bit long integer */
See also
hsc_param_values() on the next page
hsc_param_number() on page 162
hsc_point_number() on page 198
hsc_param_value_of_type()
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_value_of_type(
PNTNUM point,
PRMNUM param,
int* offset,
PARvalue* value,
uint2* type
);
Arguments
Argument Description
Argument Description
Description
The parameter's definition is located and used to access the point record using a common
routine which returns the pointer to the data. The top level routine then extracts the value by
type.
If your system uses dynamic scanning, hsc_param_value_of_type() calls from the Server API
do not trigger dynamic scanning.
See also
hsc_param_values() below
hsc_param_number() on page 162
hsc_point_number() on page 198
hsc_param_values()
Get multiple point parameter values.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_values(
int count, // (in) #point-parameters
int period, // (in) subscription period
PNTNUM* points, // (in) point numbers
PRMNUM* params, // (in) point parameter numbers
int* offsets, // (in) point parameter offset
PARvalue* values, // (out) values
uint2* types, // (out) value types
int* statuses // (out) return statuses
);
Arguments
Argument Description
Argument Description
Description
Retrieves the values for a list of point parameters and stores the values in the values union
array and returns the data types in types.
If your system uses dynamic scanning, hsc_param_values() calls from the Server API do not
trigger dynamic scanning.
Diagnostics
0 will be returned from this function upon successful completion, otherwise -1 will be
returned, and calling c_geterrno() will retrieve the error code. The values returned in types
will be one of the following constants defined in include\parameters:
DT_CHAR /* character string */
DT_INT2 /* 1 to 16 bit short integer */
DT_INT4 /* 1 to 32 bit long integer */
DT_REAL /* short float */
DT_DBLE /* long float */
DT_HIST /* history (-0 => large float) */
DT_VAR /* variant */
DT_ENUM /* enumeration ' */
DT_DATE_TIME /* timestamp (integer*2 day, double sec) */
DT_TIME /* date and time (HSCTIME format) */
DT_INT8 /* 64-bit integer */
DT_SRCADDR /* source address */
DT_DSTADDR /* destination address */
Example
Find the values of the Description and PV of 'pntana1' and output them.
#include <src/defs.h>
#include <src/points.h>
PNTNUM points[2];
PRMNUM params[2];
int offsets[2];
PARvalue values[2];
uint2 types[2];
int statuses[2];
int n;
points[1]=points[0];
offsets[0] = offsets[1] = 0;
geterrno());
}
else
{
for(n=0;n<2;n++)
{
if(types[n]==DT_CHAR)
{
printf("Point %d param %d is DT_CHAR and the value %s\n", points
[n],params[n],values[n].text);
}
else if(types[n]==DT_REAL)
{
printf("Point %d param %d is DT_REAL and has value %d\n", points
[n],params[n],values[n].real);
}
else
{
printf("Unexpected return type %d \n", types[n]);
}
}
}
See also
hsc_param_value() on page 167
hsc_param_number() on page 162
hsc_point_number() on page 198
hsc_param_value_put()
Control a point parameter value.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/points.h>
int hsc_param_value_put(
PNTNUM point,
PRMNUM param,
int offset,
PARvalue* value,
uint2* type
);
Arguments
Argument Description
Description
Sets a value for a point parameter in the server database and performs any control required by
setting/changing the parameter's value.
Diagnostics
On successful write 0 is returned, else an error code is returned. If CTLOK (0x8220) is
returned this is not actually an error but an indication that some control was executed
successfully as a result of setting the parameter value.
Example
Change Pntana1's SP value to 42.0 and perform any required control.
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/points.h>
PNTNUM point;
PRMNUM param;
PARvalue value;
uint2 type;
point = hsc_point_number("Pntana1");
param = hsc_param_number(point,"SP");
value.real = (float)42.0;
type = DT_REAL;
if (hsc_param_value_put(point,param,0,&value,&type) == 0)
c_logmsg ("example",
"param_value_put call",
"Pntana1.SP was written and controlled successfully");
else
c_logmsg ("example",
"param_value_put call",
"Unable to write and/or control Pntana1.SP,
error code = 0x%x",
c_geterrno());
See also
hsc_param_number() on page 162
hsc_point_number() on page 198
hsc_param_values_put() below
hsc_param_values_put()
Control a list of point parameter values.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/points.h>
int hsc_param_values_put(
int count, // (in) number of parameter requests
PNTNUM* points, // (in) point numbers
PRMNUM* params, // (in) point parameter numbers
int* offsets, // (in) point parameter offsets
PARvalue* values, // (in) values
uint2* types, // (in) value types
GDAERR* statuses, // (out) return statuses
GDASECURITY* security // (in) security descriptor
);
Arguments
Argument Description
Argument Description
Description
Sets a value for an array of point parameters in the server database and performs any control
required by setting/changing the parameter's value.
Diagnostics
On successful write 0 is returned, else an error code is returned.
The status of each control will be contained in the respective GDAERR structure. If
CTLOK (0x8220) is returned this is not actually an error but an indication that some control
was executed successfully as a result of setting the parameter value.
See also
hsc_param_number() on page 162
hsc_point_number() on page 198
hsc_param_value_put() on page 174
hsc_param_value_save()
Save a point parameter value.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_param_value_save(
PNTNUM point,
PRMNUM param,
int offset,
PARvalue* value,
uint2* type
);
Arguments
Argument Description
Description
Sets a value for a point parameter in the server database and does not perform any control
which may be required by setting/changing the parameter's value.
Diagnostics
If the value was written to the parameter correctly then 0 is returned, else -1 is returned, and
calling c_geterrno() on page 106 will retrieve the error code.
Example
Change Pntana1's SP value to 42.0.
#include <src/defs.h>
#include <src/points.h>
PNTNUM point;
PRMNUM param;
PARvalue value;
uint2 type;
point = hsc_point_number("Pntana1");
param = hsc_param_number(point,"SP");
value.real = (float)42.0;
type = DT_REAL;
if (hsc_param_value_save(point,param,0,&value,&type) == 0)
c_logmsg ("example",
"param_value_save call",
"Pntana1.SP was written to successfully");
else
c_logmsg ("example",
"param_value_save call",
"Unable to write to Pntana1.SP,
error code = 0x%x",
c_geterrno());
See also
hsc_param_value_put() on page 174
hsc_param_values_put() on page 176
hsc_pnttyp_list_create()
List all point types.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_pnttyp_list_create(
enumlist** list
);
Arguments
Argument Description
Description
Sets list to contain the point types by name and number in the server.
Diagnostic
The return value of this function will be the number of values in list or -1 if an error occurred.
Calling c_geterrno() on page 106 will retrieve the error code.
In all cases the enumlist structure is created with enough space for the text field in each
enumlist element in the enumlist array. Because this memory has been allocated by the
function, your user code needs to free this space when you finish using the structure. As this
function always allocates the memory required for the text field, make sure that you free all
memory before calling the routine a second time with the same enumlist** pointer, otherwise
there will be a memory leak. To facilitate freeing this memory, hsc_enumlist_destroy() on
page 129 is included in the API.
Example
This code segment uses a list size of 10 and retrieves all point types and outputs
their names and numbers, or outputs an error message if the hsc_pnttyp_list_
create() call was unsuccessful.
#include <src/defs.h>
#include <src/points.h>
enumlist* list;
int i;
int n;
if((i=hsc_pnttyp_list_create
(&list)) != -1)
{
c_logmsg ("example",
"pnttyp_list call",
"The point types available are:");
for(n=0;n<i;n++)
c_logmsg ("example",
"pnttyp_list call",
"%d\t%s",
list[n].value,
list[n].text);
}
else
c_logmsg ("example",
"pnttyp_list call",
"An error occurred getting point type list,
error code = 0x%x",
c_geterrno());
See also
hsc_point_type() on page 199
hsc_param_type() on page 165
hsc_enumlist_destroy() on page 129
hsc_pnttyp_name()
Get a point type name.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_pnttyp_name(
int number,
char* name,
int namelen
);
Arguments
Argument Description
Description
Returns, in the name char buffer, the name of the specified point type.
Diagnostics
If the call is successful 0 is returned else -1 is returned and calling c_geterrno() on page 106
will retrieve the error code.
Example
This code segment will retrieve all the point type names with each having their
name and number output.
#include <src/defs.h>
#include <src/points.h>
int pnttyp;
char szPnttyp[10];
pnttyp=1;
while (hsc_pnttyp_name(pnttyp,szPnttyp,10)
}
c_logmsg ('example','pnttyp_name call',
'the name of pnttyp %d is %s',
pnttyp,szPnttyp);
pnttypp++;
}
See also
hsc_pnttyp_number() below
hsc_pnttyp_number()
Get a point type number.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_pnttyp_number(
char* name
);
Arguments
Argument Description
Description
Returns the number of the named point type, or if the point type does not exist or an error
occurs, -1 will be returned and calling c_geterrno() on page 106 will retrieve the error code.
Example
This code segment should return the point type number for the STA point type
and output it, otherwise an error message is output.
#include <src/defs.h>
#include <src/points.h>
int pnttyp;
if((pnttyp = hsc_pnttyp_number('STA'))
!= -1)
c_logmsg ('example',
'pnttyp_number call',
See also
hsc_point_name() on page 197
hsc_point_entityname()
Returns the entity name of a point.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_entityname(
PNTNUM point,
char* name,
int namelen
);
Arguments
Argument Description
Description
Takes a point number and returns the point's entity name in the char buffer provided.
Diagnostic
If successful, 0 is returned. If the point does not exist or some other error occurs, the char
buffer is not set and -1 is returned and calling c_geterrno() on page 106 will retrieve the error
code.
hsc_point_fullname()
Returns the full name of the point.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_fullname(
PNTNUM point,
char* name,
int namelen
);
Arguments
Argument Description
Description
This function takes a point number and return the point's full name in the char buffer
provided.
Diagnostic
If successful, 0 is returned. If the point does not exist or some other error occurs, the char
buffer is not set and -1 is returned and calling c_geterrno() on page 106 will retrieve the error
code.
hsc_point_get_children()
Returns all children.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_get_children(
PNTNUM point,
int* count,
PNTNUM** children
);
Arguments
Argument Description
Description
This function returns all children, both containment and reference.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int count = 0;
PNTNUM *Children = NULL;
if (hsc_point_get_children (point, &count, &Children) ! = 0)
return -1
.
.
.
hsc_em_FreePointList (Children);
hsc_point_get_containment_ancestors()
Returns all containment ancestors above a specified point.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_get_containment_ancestors(
PNTNUM point,
int* piNumAncestors,
PNTNUM** ppAncestors
);
Arguments
Argument Description
Description
This function returns all of the containment ancestors in the tree above the specified point.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumAncestors = 0;
PNTNUM *pAncestors = NULL
if (hsc_point_get_containment_ancestors (point, &iNumAncestors,
&pAncestors) ! = 0)
return -1
.
.
.
hsc_em_FreePointList (pAncestors);
hsc_point_get_containment_children()
Returns all containment children for a specified point.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_get_containment_children(
PNTNUM parent,
int* piNumChildren,
PNTNUM** ppChildren
);
Arguments
Argument Description
Description
Returns a list of contained children for a specified point.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumChildren = 0;
PNTNUM *pChildren = NULL
if (hsc_point_get_containment_children (point, &iNumChildren, &pChil-
dren) ! = 0)
return -1
.
.
.
hsc_em_FreePointList (pChildren);
hsc_point_get_containment_descendents()
Returns all containment descendents below a specified point.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_get_containment_descendents(
PNTNUM point,
int* piNumDescendents,
PNTNUM** ppDescendents
);
Arguments
Argument Description
Description
Returns a list of containment descendents in the tree below a specified point.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumDescendents = 0;
PNTNUM *pDescendents = NULL;
if (hsc_point_get_containment_descendents (point, &iNumDescendents,
&pDescendents) ! = 0)
return -1
.
.
.
hsc_em_FreePointList (pDescendents);
hsc_point_get_containment_parents()
Returns all containment parents above a specified point.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_get_containment_parents(
PNTNUM child,
int* piNumParents,
PNTNUM** ppParents
);
Arguments
Argument Description
Description
Returns a list of containment parents for a specified point.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumParents = 0;
PNTNUM *pParents = NULL;
if (hsc_point_get_containment_parents (point, &iNumParents, &pParents)
! = 0)
return -1
.
.
.
hsc_em_FreePointList (pParents);
hsc_point_get_parents()
Returns all parents.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_get_parents(
PNTNUM point,
int* count,
PNTNUM** parents
);
Arguments
Argument Description
Description
Returns all parents, both containment and reference.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int count = 0;
PNTNUM *Parents = NULL
if (hsc_point_get_parents (point, &count, &Parents) ! = 0)
return -1
.
.
.
hsc_em_FreePointList (Parents);
hsc_point_get_references()
Returns a list of points to which the specified point refers.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_get_references(
PNTNUM point,
int* piNumRefItems,
PNTNUM** ppRefItems
);
Arguments
Argument Description
Description
Returns a list of points to which the specified point refers.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumRefItems = 0;
PNTNUM *pRefItems = NULL
if (hsc_point_get_references (point, &iNumRefItems, &pRefItems) ! = 0)
return -1
.
.
.
hsc_em_FreePointList (pRefItems);
hsc_point_get_referers()
Returns a list of points that refer to the specified point.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_get_referers(
PNTNUM point,
int* piNumRefItems,
PNTNUM** ppRefItems
);
Arguments
Argument Description
Argument Description
Description
Returns a list of points that refer to the specified point.
The array must be cleared by calling hsc_em_FreePointList() on page 124.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
int iNumRefItems = 0;
PNTNUM *pRefItems = NULL;
if (hsc_point_get_referers (point, &iNumRefItems, &pRefItems) ! = 0)
return -1
.
.
.
hsc_em_FreePointList (pRefItems);
hsc_point_guid()
Returns the GUID for the specified point.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_guid(
PNTNUM point,
GUID* pGUID
);
Arguments
Argument Description
Description
Returns the GUID for the specified point in binary format.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned and calling c_geterrno() on page 106 will
retrieve the error code.
hsc_point_name()
Gets a point's name.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_point_name (
PNTNUM point,
char* name,
int namelen
);
Arguments
Argument Description
Description
This routine will take a point number and return the point's name in the char buffer provided
and have a return value of 0.
Diagnostic
If the point does not exist or some other error occurs then the char buffer will not be set and -1
will be returned. The error code can be retrieved by calling c_geterrno() on page 106.
Example
Retrieves the point name for the point and outputs it. The char buffer is 41
characters long, which is bigger than the maximum length of a point name (40
characters).
#include <src/defs.h>
#include <src/points.h>
PNTNUM point;
char szName[MAX_POINT_NAME_LEN+1];
if(hsc_point_name(point,szName,MAX_POINT_NAME_LEN+1) == 0)
c_logmsg ('example',
'point_name call',
'Point %d is named %s',
point,
szName);
else
c_logmsg ('example',
'point_name call',
'An error occurred getting point name. 0x%x',
c_geterrno());
See also
hsc_point_number() below
hsc_point_number()
Gets a point's number.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
PNTNUM hsc_point_number(
char* name
);
Arguments
Argument Description
Description
This function returns the point number of the given point name if the point exists else 0 is
returned.
Example
The point number is retrieved for the point and output, if the point exists then a
message is output.
#include <src/defs.h>
#include <src/points.h>
PNTNUM point;
See also
hsc_point_name() on page 197
hsc_point_type()
Gets a point's type.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
PNTTYP hsc_point_type(
PNTNUM point
);
Argument
Argument Description
Description
This routine returns the point type of the point and will be one of the following values (as
defined in include\parameters) or -1 if invalid:
#define STA 1
#define ANA 2
#define ACC 3
#define ACS 4
#define CON 5
#define CDA 6
#define RDA 7
#define PSA 8
Example
Calculates the point number from the point name and then uses this value to
determine the point type. The point number and type are then output.
#include <src/defs.h>
#include <src/points.h>
PNTNUM point;
PNTTYP pnttyp;
point = hsc_point_number('PNTANA1');
if (point != 0)
{
pnttyp = hsc_point_type(point);
c_logmsg ('example','point_type call',
'PNTANA1 is point number %d has point type %d.',
point,pnttyp);
}
hsc_StringFromGUID()
Converts a GUID from binary format to string format.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
int hsc_StringFromGUID(
GUID* pGUID,
char* pszGUID
);
Arguments
Argument Description
Description
This function converts a GUID from binary format to string format.
Diagnostics
If successful, 0 is returned, otherwise -1 is returned and calling c_geterrno() on page 106 will
retrieve the error code.
Example
#include <src/defs.h>
#include <src/points.h>
GUID guid;
char szGUID[MAX_GUID_STRING_SZ+1];
hsc_StringFromGUID (&guid, szGUID);
if (point == 0)
return -1;
hsc_unlock_file()
Unlocks a database file.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
int hsc_unlock_file(
int file
);
Arguments
Argument Description
Description
Performs advisory unlocking of database files. Advisory locking means that the tasks that use
the file take responsibility for setting and removing locks as needed.
For more information regarding database locking see 'Ensuring database consistency.'
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
hsc_lock_record() on page 145
hsc_unlock_file() on the previous page
hsc_unlock_record() below
hsc_unlock_record()
Unlocks a record of a database file.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
int hsc_unlock_record(
int file,
int record
);
Arguments
Argument Description
Description
This routine is used to perform advisory unlocking of database files and records. Advisory
locking means that the tasks that use the record take responsibility for setting and removing
locks as needed.
For more information regarding database locking see 'Ensuring database consistency.'
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
hsc_lock_file() on page 144
hsc_unlock_file() on page 202
hsc_unlock_record() on the previous page
HsctimeToDate()
Converts date/time stored in HSCTIME format to VARIANT DATE format.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
void HsctimeToDate(
HSCTIME*,
DATE*
);
Description
Converts a date/time value stored in HSCTIME format to VARIANT DATE format.
HsctimeToFiletime()
Converts date/time stored in HSCTIME format to FILETIME format.
C/C++ synopsis
#include <src/defs.h>
#include <src/points.h>
void HsctimeToFiletime(
HSCTIME*,
FILETIME*
);
Description
Converts a date/time value stored in HSCTIME format to FILETIME format.
infdouble()
Returns the (IEEE 754) Infinity value as a Double data type.
C/C++ Synopsis
double infdouble();
Arguments
No arguments are passed with this function.
Returns
Returns the (IEEE 754) positive Infinity value as a Double (double-precision floating-point)
data type.
Description
This function is useful for creating a valid (IEEE 754) Infinity value for comparison purposes
with Double data type variables.
Attention:
This function is platform dependent (only valid for an INTEL X86 system).
See also
Validating IEEE 754 special values on page 20
isinfdouble() on page 212
inffloat() below
isinffloat() on page 213
Data types on page 26
inffloat()
Returns the (IEEE 754) Infinity value as a Float data type.
C/C++ Synopsis
float inffloat();
Arguments
No arguments are passed with this function.
Returns
Returns the (IEEE 754) positive Infinity value as a Float (single-precision floating-point)
data type.
Description
This function is useful for creating a valid (IEEE 754) Infinity value for comparison purposes
with Float data type variables.
Attention:
This function is platform dependent (only valid for an INTEL X86 system).
See also
Validating IEEE 754 special values on page 20
isinffloat() on page 213
infdouble() on the previous page
isinfdouble() on page 212
Data types on page 26
Int2toPV()
Inserts an int2 value into a PARvalue union.
C/C++ synopsis
#include <src/defs.h>
#include <src/almmsg.h>
PARvalue* Int2toPV(
int2 int2_val,
PARvalue* pvvalue
);
Arguments
Argument Description
Description
This function inserts an int2 value into a PARvalue, and then returns a pointer to the
PARvalue passed in. This function allows you to set attributes into a notification structure
using calls to hsc_insert_attrib() on page 131 and hsc_insert_attrib_byindex() on page 138
functions in a single line of code.
Diagnostics
If this function is successful, the return value is a pointer back to the PARvalue passed in,
otherwise, the return value is NULL and calling c_geterrno() on page 106 will retrieve the
following error code:
Example
See the examples in hsc_insert_attrib() on page 131 and hsc_insert_attrib_
byindex() on page 138.
See also
DbletoPV() on page 98
hsc_insert_attrib() on page 131
Int4toPV()
Inserts an int4 value into a PARvalue union.
C/C++ synopsis
#include <src/defs.h>
#include <src/almmsg.h>
PARvalue* Int4toPV(
int4 int4_val,
PARvalue* pvvalue
);
Arguments
Argument Description
Description
This function inserts an int4 value into a PARvalue, and then returns a pointer to the
PARvalue passed in. This function allows you to set attributes into a notification structure
using calls to hsc_insert_attrib() on page 131 and hsc_insert_attrib_byindex() on page 138
functions in a single line of code.
Diagnostics
If this function is successful, the return value is a pointer back to the PARvalue passed in,
otherwise, the return value is NULL and calling c_geterrno() on page 106 will retrieve the
following error code:
Example
See the examples in hsc_insert_attrib() on page 131 and hsc_insert_attrib_
byindex() on page 138.
See also
DbletoPV() on page 98
hsc_insert_attrib() on page 131
hsc_insert_attrib_byindex() on page 138
Int2toPV() on page 206
PritoPV() on page 228
RealtoPV() on page 231
StrtoPV() on page 240
TimetoPV() on page 242
c_intchr()
Copies an integer array to a character string.
C/C++ synopsis
#include <src/defs.h>
Arguments
Argument Description
Argument Description
Description
Copies characters from an integer buffer into a character buffer. It will either space fill or
truncate so as to ensure that chrbuflen characters are copied into the character buffer. If the
system stores words with the least significant byte first then byte swapping will be performed
with the move.
See also
c_chrint() on page 85
IsGDAerror()
Determines whether a returned GDA status value is an error.
C/C++ synopsis
#include <src/defs.h>
#include <src/gdamacro.h>
bool IsGDAerror
(
GDAERR* pGdaError
);
Arguments
Argument Description
Description
Determines whether a particular GDA status code is an error by returning a 0 in the return
value. If the function returns a non zero value, calling c_geterrno() on page 106 will retrieve
the error code.
Diagnostics
Returns TRUE if pGdaError indicates an error condition, otherwise it returns FALSE.
See also
IsGDAwarning() on the next page
IsGDAnoerror() below
hsc_IsError() on page 142
c_geterrno() on page 106
IsGDAnoerror()
Determines whether a returned GDA status value is neither an error nor a warning.
C/C++ synopsis
#include <src/defs.h>
#include <src/gdamacro.h>
bool IsGDAnoerror(
GDAERR* pGdaError
);
Arguments
Argument Description
Description
This macro determines whether a particular GDA status code is an error by returning a 0 in
the return value. If the function returns a non zero value, calling c_geterrno() on page 106
will retrieve the error code.
Diagnostics
This routine returns TRUE if pGdaError indicates neither an error condition nor a warning
condition, otherwise it returns FALSE.
See also
IsGDAwarning() on the next page
IsGDAerror() on the previous page
c_geterrno() on page 106
IsGDAwarning()
Determines whether a returned GDA status value is a warning.
C/C++ synopsis
#include <src/defs.h>
#include <src/gdamacro.h>
bool IsGDAwarning(
GDAERR* pGdaError
);
Arguments
Argument Description
Description
This macro determines whether a particular GDA status code is an error by returning a 0 in
the return value. If the function returns a non zero value, calling c_geterrno() on page 106
will retrieve the error code.
Diagnostics
This routine returns TRUE if pGdaError indicates a warning condition, otherwise it returns
FALSE.
See also
IsGDAerror() on page 210
IsGDAnoerror() on the previous page
hsc_IsWarning() on page 143
c_geterrno() on page 106
isinfdouble()
Validates the Double data type argument as an (IEEE 754) Infinity value.
C/C++ Synopsis
int isinfdouble(double ieee);
Arguments
Argument Description
Returns
Returns TRUE (-1) if it is a valid (IEEE 754) Infinity value; otherwise FALSE (0).
Description
This function is useful for checking that the argument is, or is not, a valid (IEEE 754) Infinity
value.
Attention:
This function is platform dependent (only valid for an INTEL X86 system).
See also
Validating IEEE 754 special values on page 20
infdouble() on page 205
inffloat() on page 206
isinffloat() below
Data types on page 26
isinffloat()
Validates the Float data type argument as an (IEEE 754) Infinity value.
C/C++ Synopsis
int isinffloat(float ieee);
Arguments
Argument Description
Returns
Returns TRUE (-1) if it is a valid (IEEE 754) Infinity value; otherwise FALSE (0).
Description
This function is useful for checking that the argument is, or is not, a valid (IEEE 754) Infinity
value.
Attention:
Note that this function is platform dependent (only valid for an INTEL X86
system).
See also
Validating IEEE 754 special values on page 20
inffloat() on page 206
infdouble() on page 205
isinfdouble() on page 212
Data types on page 26
isnandouble()
Validates the Double data type argument as an (IEEE 754) NaN (Not a Number) value.
C/C++ Synopsis
int isnandouble(double ieee);
Arguments
Argument Description
Returns
Returns TRUE (-1) if it is a valid (IEEE 754) NaN value; otherwise FALSE (0).
Description
This function is useful for checking that the argument is, or is not, a valid (IEEE 754) NaN
value. For example, a controller can send an IEEE 754 NaN value in response to a data
request, which should be tested for.
Attention:
This function is platform dependent (only valid for an INTEL X86 system).
See also
Validating IEEE 754 special values on page 20
nandouble() on page 219
nanfloat() on page 219
isnanfloat() below
Data types on page 26
isnanfloat()
Validates the Float data type argument as an (IEEE 754) NaN (Not a Number) value.
C/C++ Synopsis
int isnanfloat(float ieee);
Arguments
Argument Description
Returns
Returns TRUE (-1) if it is a valid (IEEE 754) NaN value; otherwise FALSE (0).
Description
This function is useful for checking that the argument is, or is not, a valid (IEEE 754) NaN
value. For example, a controller can send an IEEE 754 NaN value in response to a data
request, which should be tested for.
Attention:
This function is platform dependent (only valid for an INTEL X86 system).
See also
Validating IEEE 754 special values on page 20
nanfloat() on page 219
nandouble() on page 219
isnandouble() on page 214
Data types on page 26
C/C++ synopsis
#include <src/defs.h>
Arguments
Argument Description
Argument Description
Description
Converts between Julian days (used by the History subsystem) and a Gregorian date (day,
month, year format).
Diagnostics
Upon successful completion c_gtoj returns the number of Julian days. c_jtog returns the
values in the addresses pointed to by the year, month and day parameters.
See also
c_gethstpar_..._2() on page 107
c_logmsg()
Writes a message to the log file.
C/C++ synopsis
#include <src/defs.h>
Arguments
Argument Description
Argument Description
Description
c_logmsg should be used instead of printf to write messages to the log file. This is typically
used for debugging purposes.
This routine writes the message to standard error. If the application is a task (with its own
LRN) then the message will be captured and written to the log file.
If the program is a utility then the message will appear in the command prompt window.
Diagnostics
This routine has no return value. If it is called incorrectly it will write its own message to
standard error indicating the source of the problem.
Example
c_logmsg('abproc.c','134' 'Point ABSTAT001 PV out of normal range
(%d)', abpv);
c_logmsg handles all carriage control. There is no need to put a line feed
characters in calls to c_logmsg.
c_mzero()
Tests a real value for -0.0.
C/C++ synopsis
#include <src/defs.h>
Arguments
Argument Description
Description
Returns TRUE if the specified value is equal to minus zero. Otherwise, FALSE is returned.
Minus zero is used to represent bad data in history data.
nandouble()
Returns the (IEEE 754) QNaN (Quiet Not a Number) value as a Double data type.
C/C++ Synopsis
double nandouble();
Arguments
No arguments are passed with this function.
Returns
Returns the (IEEE 754) QNaN value as a Double (double-precision floating-point) data type.
Description
This function is useful for creating a valid (IEEE 754) QNaN value for storage.
Attention:
This function is platform dependent (only valid for an INTEL X86 system).
See also
Validating IEEE 754 special values on page 20
isnandouble() on page 214
nanfloat() below
isnanfloat() on page 215
Data types on page 26
nanfloat()
Returns the (IEEE 754) QNaN (Quiet Not a Number) value as a Float data type.
C/C++ Synopsis
float nanfloat();
Arguments
No arguments are passed with this function.
Returns
Returns the (IEEE 754) QNaN value as a Float (single-precision floating-point) data type.
Description
This function is useful for creating a valid (IEEE 754) QNaN value for storage.
Attention:
This function is platform dependent (only valid for an INTEL X86 system).
See also
Validating IEEE 754 special values on page 20
isnanfloat() on page 215
nandouble() on the previous page
isnandouble() on page 214
Data types on page 26
c_oprstr_...()
C/C++ synopsis
#include <system>
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/trbtbl_def>
Arguments
Argument Description
Description
Outputs a specified message to the Operator zone of a Station.
c_
oprstr_ outputs information only messages.
info
c_ outputs an invalid request message that is cleared after a TIME_RQUEST seconds.
oprstr_
This constant is defined in 'server/src/system'.
message
outputs an operator prompt and sets the ENTER key to notify the calling task with the
specified parameter 1. After calling this routine the task should branch back to its
c_
GETREQ call to service its next request, and if none exists, then terminate with a
oprstr_
TRM04. When the operator types a response and presses ENTER, the task is
prompt
requested with the specified parameter 1, and should branch to code that calls c_
oprstr_response to fetch the response.
c_
oprstr_ reads the entered data and clears the prompt.
response
Diagnostics
Upon successful completion c_oprstr_response will return a pointer to a null-terminated
string containing the response from the operator. Upon successful completion c_oprstr_info,
c_oprstr_message and c_oprstr_prompt will return zero. Otherwise, a NULL pointer or -1
will be returned, and calling c_geterrno() on page 106 will retrieve the following error code:
Warnings
c_oprstr_prompt requires that the calling task c_trm04() on page 245 until the ENTER key
is pressed. This means that the calling task must be a server task and not a utility task.
If the operator changes displays or presses the ESC key after a c_oprstr_prompt call, no
operator input will be saved, and the task will not be requested. If you do not want the
operator to avoid entering data, you will need to set a flag internal to your program that
indicates whether a response has been received and start a task timer with the c_tmstrt_...() on
page 244 function. If a response has not been received from the operator after an interval
(specified by you in the c_tmstrt_...() on page 244 function), you will need to repeat the c_
oprstr_prompt call. If a response from the operator is received you will need to stop the
timer using c_tmstop() on page 243.
Example
#include <stdio.h> /* for NULL */
#include "src/defs.h"
#include "src/M4_err.h"
#include "src/trbtbl_def"
static progname="%M%";
main ()
{
struct prm prmblk;
int crt=1;
char *reply;
uint2 point;
...
...
...
if (c_getreq(&prmblk) == 0)
{
switch (prmblk.param1)
{
case 1:
/* request a point name from the operator */
if (c_oprstr_prompt(crt,"ENTER POINT NAME?",2))
c_logmsg (progname,"123","c_oprstr_prompt %x",c_geterrno());
break;
case 2:
reply=c_oprstr_response(crt,&prmblk);
if (reply==NULL)
c_logmsg(progname,"132",
"c_oprstr_response error %x",c_geterrno());
else
{
if (c_getpnt(reply,point) == -1)
c_oprstr_message(crt,"ILLEGAL POINT NAME");
else
{
/* we have a valid point type/number */
}
}
break;
} /* end switch */
}
}
c_pps_2()
C/C++ synopsis
#include <src/defs.h>
#include <scr/M4_err.h>
Arguments
Argument Description
Description
Requests a demand scan of the specified point.
The point is always processed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion, a value of 0 is returned in status. Otherwise, one of the
following error codes is returned:
See also
c_ppsw_2() on the next page
c_ppsw_2()
C/C++ synopsis
#include <src/defs.h>
#include <scr/M4_err.h>
Arguments
Argument Description
Description
Requests a demand scan of the specified point and wait for the scan to complete. If, after 10
seconds, the scan has not replied, a timeout will be indicated.
The point is always processed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion, a value of 0 is returned in status. Otherwise, one of the
following error codes is returned:
See also
c_pps_2() on page 223
c_ppv_2()
C/C++ synopsis
#include <src/defs.h>
#include <scr/M4_err.h>
Arguments
Argument Description
Description
Requests a Demand scan of the specified Point.
The point is always processed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
c_ppvw_2() below
c_ppvw_2()
C/C++ synopsis
#include <src/defs.h>
#include <scr/M4_err.h>
Arguments
Argument Description
Description
Requests a Demand scan of the specified Point and waits for the scan to complete. If after 10
seconds the scan has not replied, then a timeout will be indicated. The point is always
processed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
c_ppv_2() on page 226
PritoPV()
Inserts a priority and sub-priority value into a PARvalue union.
C/C++ synopsis
#include <src/defs.h>
#include <src/almmsg.h>
PARvalue* PritoPV(
int2 priority,
int2 subpriority,
PARvalue* pvvalue
);
Arguments
Argument Description
Description
Inserts a priority and sub-priority value into a PARvalue, and then returns a pointer to the
PARvalue passed in. This allows you to set attributes into a notification structure using calls
to hsc_insert_attrib() on page 131 and hsc_insert_attrib_byindex() on page 138 functions in a
single line of code.
Diagnostics
If this function is successful, the return value is a pointer back to the PARvalue passed in,
otherwise, the return value is NULL and calling c_geterrno() on page 106 will retrieve the
following error code:
Example
See the examples in hsc_insert_attrib() on page 131 and hsc_insert_attrib_
byindex() on page 138.
See also
DbletoPV() on page 98
hsc_insert_attrib() on page 131
hsc_insert_attrib_byindex() on page 138
Int2toPV() on page 206
Int4toPV() on page 208
RealtoPV() on page 231
StrtoPV() on page 240
TimetoPV() on page 242
c_prsend_...()
Queue file to print system for printing.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Requests the print system to print the specified file.
c_prsend_crt
will send the file to the demand report printer that is associated with the specified CRT.
c_prsend_printer
will send the file to the specified printer.
Diagnostics
Upon successful completion, a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve the following error code:
[M4_ The file could not be queued to the printer because the printer queue had no free
QEMPTY] records.
Example
#define PRINTER_NO 1
#define SAMPLE_FILENAME '...\user\sample.dat'
static char *progname='sample.c';
RealtoPV()
Inserts a real value into a PARvalue union.
C/C++ synopsis
#include <src/defs.h>
#include <src/almmsg.h>
PARvalue* RealtoPV(
float real_val,
PARvalue* pvvalue
);
Arguments
Argument Description
Description
Inserts a real value into a PARvalue, and then returns a pointer to the PARvalue passed in.
This function allows you to set attributes into a notification structure using calls to hsc_insert_
attrib() on page 131 and hsc_insert_attrib_byindex() on page 138 functions in a single line of
code.
Diagnostics
If this function is successful, the return value is a pointer back to the PARvalue passed in,
otherwise, the return value is NULL and calling c_geterrno() on page 106 will retrieve the
following error code:
Example
See the examples in hsc_insert_attrib() on page 131 and hsc_insert_attrib_
byindex() on page 138.
See also
DbletoPV() on page 98
hsc_insert_attrib() on page 131
hsc_insert_attrib_byindex() on page 138
Int2toPV() on page 206
Int4toPV() on page 208
PritoPV() on page 228
StrtoPV() on page 240
TimetoPV() on page 242
c_rqtskb...()
Requests a task if not busy.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/sn90_err.h>
#include <src/trbtbl_def>
int2 c_rqtskb(
int lrn
);
int2 c_rqtskb_prm(
int lrn,
int2* prmblk
);
Arguments
Argument Description
Description
c_ requests the specified queued task without any parameters. If the task is already
rqtskb running, no action is taken.
requests the specified queued task and passes a parameter block. If the task is not
executing, or the parameter block is zero, then the request is passed to the task. If the
task is already executing and the parameter block is not zero, then the request is
queued. If a request is already queued, the task is considered busy and an error code is
returned.
Most of the system's tasks take in parameters in the form of the prm structure. Note that
the prm structure is defined in the file trbtbl_def in the src folder. It is recommended
that developers make use of this parameter block structure. To do so, first instantiate
and initialize the structure with relevant data, then cast a pointer to it to an int2* in
order to call this function:
prm my_pblk;
c_
rqtskb_ int myLrn;
prm myLRN = 111; //user application LRN
...
return_val = c_rqtskb_prm(myLrn, (int2*) &my_pblk);
Note that the some LRNs listed in the def/src/lrns file (for example, the Keyboard
Service program (LRN 1) and Server Display program (LRN 21)), actually use multiple
LRNs. The most important example of this is the Server Display program. Each Station
is associated with its own Server Display and Keyboard Service programs. Each of
these tasks use its own LRN. The Server Display programs of the first 20 Stations are
assigned LRNs 21 through to 40. For example, to request the Server Display program
for Station 3, you would request LRN 23.
Stations 21-40, if assigned, use other LRNs. These can be displayed using the utility
usrlrn with the options -p -a.
Notes
To call up a named display in Station you need to:
1. Memset to 0 the Parameter Request Block structure.
2. Ensure the prmblk.pathlen is set to 0. This pathlen is only used for the new HMI
protocol.
3. Use c_chrint to the full size of the path.
For example:
memset(&prmblk, 0, sizeof(prmblk));
prmblk.crt = Station Number (in this test case it is 1)
prmblk.param1 = 1;
prmblk.param2 = 0;
prmblk.path is set via c_chrint("testdisplay",11,prmblk.path,sizeof
(prmblk.path));
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
[M4_ILLEGAL_LRN] An illegal LRN has been specified or the task does not exist.
[M4_BUSY_TRB] The requested tasks request block is busy, could not pass parameters.
[INVALID_SEMVAL] The requested task has too many outstanding requests.
See also
c_getreq() on page 116
c_tstskb() on page 247
c_sps_2()
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
SPS is used to request a Demand scan of the specified Point.
The point is only processed if the scanned value has changed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
c_spsw_2() below
c_spsw_2()
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Requests a Demand scan of the specified Point and wait for the Scan to complete. If after 10
seconds the Scan has not replied, then a timeout will be indicated. The point is only processed
if the scanned value has changed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
c_sps_2() on page 235
c_spv_2()
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Passes the value to the point processor for storage into the point parameter.
The point is processed only if the scanned value has changed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion, a value of 0 is returned. Otherwise, one of the following error
codes is returned:
See also
c_spvw_2() below
c_spvw_2()
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Passes the value to the point processor for storage into the point parameter.
The point is processed only if the scanned value has changed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion, a value of 0 is returned. Otherwise, one of the following error
codes is returned:
See also
c_spv_2() on page 237
c_stcupd()
Updates Controller's sample time counter.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Sets the sample time counter of a Controller. The scan task counts down this counter, and if it
reaches zero the controller will be failed. A time of greater than 60 seconds must be used if
automatic recovery via the diagnostic scan is required.
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() will retrieve one of the following error codes:
stn_num()
Finds out the Station number of a display task given the task's LRN.
C/C++ synopsis
#include <src/defs.h>
int2 stn_num(
int2* pLrn // (in) A pointer to the LRN
);
Arguments
Argument Description
Description
Quickly determines the Station number of a particular Station's display task given its LRN.
Diagnostics
Returns the Station number (>0) if successful. Otherwise it returns -1.
See also
dsply_lrn() on page 100
StrtoPV()
Inserts a character string into a PARvalue union.
C/C++ synopsis
#include <src/defs.h>
#include <src/almmsg.h>
#include <src/M4_err.h>
PARvalue* StrtoPV(
const char* string_val,
PARvalue* pvvalue
);
Arguments
Argument Description
Description
Inserts a character string into a PARvalue, and then returns a pointer to the PARvalue
passed in. This function allows you to set attributes into a notification structure using calls to
hsc_insert_attrib() on page 131 and hsc_insert_attrib_byindex() on page 138 functions in a
single line of code.
Diagnostics
If this function is successful, the return value is a pointer back to the PARvalue passed in,
otherwise, the return value is NULL and calling c_geterrno() on page 106 will retrieve one
of the following error codes:
Example
See the examples in hsc_insert_attrib() on page 131 and hsc_insert_attrib_
byindex() on page 138.
See also
DbletoPV() on page 98
hsc_insert_attrib() on page 131
TimetoPV()
Inserts a time value into a PARvalue union.
C/C++ synopsis
#include <src/defs.h>
#include <src/almmsg.h>
#include <src/M4_err.h>
PARvalue* TimetoPV(
HSCTIME time_val,
PARvalue* pvvalue
);
Arguments
Argument Description
Description
Inserts a time value into a PARvalue, and then returns a pointer to the PARvalue passed in.
This function allows you to set attributes into a notification structure using calls to hsc_
insert_attrib() on page 131 and hsc_insert_attrib_byindex() on page 138 functions in a single
line of code.
Diagnostics
If this function is successful, the return value is a pointer back to the PARvalue passed in,
otherwise, the return value is NULL and calling c_geterrno() on page 106 will retrieve one
of the following error codes:
Example
See the examples in hsc_insert_attrib() on page 131 and hsc_insert_attrib_
byindex() on page 138.
See also
DbletoPV() on page 98
hsc_insert_attrib() on page 131
hsc_insert_attrib_byindex() on page 138
Int2toPV() on page 206
Int4toPV() on page 208
PritoPV() on page 228
RealtoPV() on page 231
StrtoPV() on page 240
c_tmstop()
Stops a timer for the calling task.
C/C++ synopsis
#include <src/defs.h>
Arguments
Argument Description
Description
Stops the timer specified by the argument tmridx. This index must correspond to the return
value of c_tmstrt_...() below.
See also
c_tmstrt_...() below
c_trmtsk() on page 246
c_tmstrt_...()
Starts a timer for the calling task.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Starts a timer to request the calling task every cycle seconds. This is equivalent to calling c_
rqtskb...() on page 232 every interval. A timer is stopped by calling c_tmstop() on page 243.
The arguments param1 and param2 are passed as words two and three of the ten word
parameter block, to the task each interval. These parameters can be accessed by calling c_
getreq() on page 116.
Diagnostics
Upon successful completion the timer index is returned. Otherwise, -1 is returned and calling
c_geterrno() will retrieve the following error code:
See also
c_tmstop() on page 243
c_getreq() on page 116
c_trm04()
Terminate task with error status and modify restart address.
C/C++ synopsis
#include <src/defs.h>
Arguments
Argument Description
Description
Terminates the calling task and changes the restart address to the address immediately
following the call to c_trm04() on the previous page. The task is not terminated if it was
requested while it was active. The termination error status is posted in the task request block
for any c_wttskb() on page 250 calls.
If the task has been marked for deletion via a c_deltsk() on page 97 call then the task will be
removed from the system.
See also
c_rqtskb...() on page 232
c_tstskb() on the next page
c_wttskb() on page 250
c_deltsk() on page 97
c_trmtsk()
Terminates a task with error status.
C/C++ synopsis
#include <src/defs.h>
Arguments
Argument Description
Description
Terminates the calling task and changes the restart address to the program start address. The
termination error status is posted in the task request block for any c_wttskb() on page 250
calls.
If the task has been marked for deletion via a c_deltsk() on page 97 call then the task will be
removed from the system.
See also
c_trm04() on page 245
c_deltsk() on page 97
c_tstskb()
Tests a task's status.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Tests the completion status of a specified task.
Diagnostics
Upon successful completion a value of 0 is returned indicating that the specified task is
dormant. Otherwise, -1 is returned and calling c_geterrno() on page 106 will retrieve one of
the following error codes:
Example
#include 'src/lrns' /* for user tasks LRN */
...
...
...
/* test to see if the first user task is dormant */
if (c_tstskb(USR1LRN) == 0)
c_logmsg(progname,'123','user
task 1 is dormant');
See also
c_wttskb() on page 250
c_rqtskb...() on page 232
c_trm04() on page 245
c_trmtsk() on page 246
c_upper()
Converts a character string to upper case.
C/C++ synopsis
#include <src/defs.h>
Arguments
Argument Description
Description
Converts a character string to upper case (7 bit ASCII). Control characters are converted to a
'.' character.
See also
c_chrint() on page 85
c_intchr() on page 209
c_wdon()
Pulses the watchdog timer for a task.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Prevents the watchdog timer from timing-out the calling task.
Should only be called with a valid watchdog timer index returned from c_wdstrt() below.
For more information regarding watchdog timers, see 'Modifying the activity of a task.'
Diagnostics
Does not return a value and no diagnostic errors are returned if wdtidx is invalid.
See also
c_wdstrt() below
c_wdstrt()
Starts a watchdog timer for the calling task.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/wdstrt.h>
int timeout,
int mode
);
Arguments
Argument Description
timeout (in) time interval before watchdog timer takes action indicated by mode.
(in) mode of action to be taken by the watchdog timer:
n WDT_MONITOR monitor timer entry only.
Description
Enables a watchdog timer for the calling task.
Calling this routine allocates an entry in the WDTTBL. Each second, WDT decrements the
timer entry. If the timer becomes zero then the action defined by the mode will be taken.
To prevent the timeout occurring, the calling task should periodically call c_wdon() on the
previous page to pulse reset the timer.
For more information, see 'Modifying the activity of a task.'
Diagnostics
Upon successful completion the watchdog timer index is returned. If c_wdstrt() on the
previous page is unable to create a timer, it returns a 0.
See also
c_wdon() on the previous page
c_wdstrt() on the previous page
c_wttskb()
Wait for a task to become dormant.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Waits for the specified task to complete processing.
Diagnostics
Upon successful completion the specified tasks termination error status is returned. Otherwise,
the following error code is returned:
See also
c_tstskb() on page 247
c_rqtskb...() on page 232
c_trm04() on page 245
c_trmtsk() on page 246
Backward-compatible functions
c_badpar()
Attention:
c_badpar() is deprecated and may be removed in a future release. It is provided
for backward compatibility purposes only. When used with an Experion HS
server release R400 or later c_badpar() will only be able to access points in the
range: 1<= point number <= 65,000. Checking the return value of hsc_param_
value() provides the same functionality as c_badpar().
C/C++ synopsis
#include <src/defs.h>
Arguments
Argument Description
Description
Returns TRUE if the system is not running, if the specified point is not implemented, or if the
parameter value is in error; otherwise FALSE is returned.
See also
c_mzero() on page 218
hsc_param_value() on page 167
c_gethstpar_...()
Attention:
c_gethstpar() is deprecated and may be removed in a future release. It is provided
for backward compatibility purposes only. When used with an Experion HS
server release R400 or later c_gethstpar() will only be able to access points in the
range: 1<= point number <= 65,000. The replacement function c_gethstpar_2()
should be used instead.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/gethst.h>
Arguments
Argument Description
Description
Used to retrieve a particular type of history values for specified Points and time in history.
History will be retrieved from a specified time or Offset going backwards in time numhst
intervals for each Point specified.
c_gethstpar_
retrieves history values from a specified date and time.
date
retrieves history values from a specified number of history intervals in the
c_gethstpar_ofst
past.
The history values are stored in sequence in the values array. values[x][y] represents the yth
history value for the xth point.
The history type is specified by using one of the following values:
Value Description
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned, and calling c_
geterrno() will return one of the following error codes:
Example
#include <src/defs.h>
#include <src/M4_err.h>
#include <src/gethst.h>
#include 'parameters'
#define NHST 50
#define NPNT 3
See also
hsc_param_values() on page 170
c_pps()
Attention:
c_pps() is deprecated and may be removed in a future release. It is provided for
backward compatibility purposes only. When used with an Experion HS server
release R400 or later c_pps() will only be able to access points in the range: 1<=
point number <= 65,000. The replacement function c_pps_2() should be used
instead.
C/C++ synopsis
#include <src/defs.h>
#include <scr/M4_err.h>
Arguments
Argument Description
Description
Requests a demand scan of the specified point.
The point is always processed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion, a value of 0 is returned in status. Otherwise, one of the
following error codes is returned:
See also
c_ppsw() below
c_pps_2() on page 223
c_ppsw()
Attention:
c_ppsw() is deprecated and may be removed in a future release. It is provided for
backward compatibility purposes only. When used with an Experion HS server
release R400 or later c_ppsw() will only be able to access points in the range: 1<=
point number <= 65,000. The replacement function c_ppsw_2() should be used
instead.
C/C++ synopsis
#include <src/defs.h>
#include <scr/M4_err.h>
Arguments
Argument Description
Description
Requests a demand scan of the specified point and wait for the scan to complete. If, after 10
seconds, the scan has not replied, a timeout will be indicated.
The point is always processed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion, a value of 0 is returned in status. Otherwise, one of the
following error codes is returned:
See also
c_pps() on page 257
c_ppsw_2() on page 225
c_ppv()
Attention:
c_ppv() is deprecated and may be removed in a future release. It is provided for
backward compatibility purposes only. When used with an Experion HS server
release R400 or later c_ppv() will only be able to access points in the range: 1<=
point number <= 65,000. The replacement function c_ppv_2() should be used
instead.
C/C++ synopsis
#include <src/defs.h>
#include <scr/M4_err.h>
Arguments
Argument Description
Description
Requests a Demand scan of the specified Point.
The point is always processed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
c_ppvw() below
c_ppv_2() on page 226
c_ppvw()
Attention:
C/C++ synopsis
#include <src/defs.h>
#include <scr/M4_err.h>
Arguments
Argument Description
Description
Requests a Demand scan of the specified Point and waits for the scan to complete. If after 10
seconds the scan has not replied, then a timeout will be indicated. The point is always
processed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
c_ppv() on page 260
c_ppvw_2() on page 227
c_sps()
Attention:
c_sps() is deprecated and may be removed in a future release. It is provided for
backward compatibility purposes only. When used with an Experion HS server
release R400 or later c_sps() will only be able to access points in the range: 1<=
point number <= 65,000. The replacement function c_sps_2() should be used
instead.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
SPS is used to request a Demand scan of the specified Point.
The point is only processed if the scanned value has changed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
c_spsw() below
c_sps_2() on page 235
c_spsw()
Attention:
c_spsw() is deprecated and may be removed in a future release. It is provided for
backward compatibility purposes only. When used with an Experion HS server
release R400 or later c_spsw() will only be able to access points in the range: 1<=
point number <= 65,000. The replacement function c_spsw_2() should be used
instead.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Requests a Demand scan of the specified Point and wait for the Scan to complete. If after 10
seconds the Scan has not replied, then a timeout will be indicated. The point is only processed
if the scanned value has changed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion a value of 0 is returned. Otherwise, -1 is returned and calling c_
geterrno() on page 106 will retrieve one of the following error codes:
See also
c_sps() on page 263
c_spsw_2() on page 236
c_spv()
Attention:
c_spv() is deprecated and may be removed in a future release. It is provided for
backward compatibility purposes only. When used with an Experion HS server
release R400 or later c_spv() will only be able to access points in the range: 1<=
point number <= 65,000. The replacement function c_spv_2() should be used
instead.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Passes the value to the point processor for storage into the point parameter.
The point is processed only if the scanned value has changed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion, a value of 0 is returned. Otherwise, one of the following error
codes is returned:
See also
c_spvw() below
c_spv_2() on page 237
c_spvw()
Attention:
c_spvw() is deprecated and may be removed in a future release. It is provided for
backward compatibility purposes only. When used with an Experion HS server
release R400 or later c_spvw() will only be able to access points in the range: 1<=
point number <= 65,000. The replacement function c_spvw_2() should be used
instead.
C/C++ synopsis
#include <src/defs.h>
#include <src/M4_err.h>
Arguments
Argument Description
Description
Passes the value to the point processor for storage into the point parameter.
The point is processed only if the scanned value has changed.
This function is not applicable to Honeywell Process Controller points, Remote points,
Container points or System Interface Points (PSA).
Diagnostics
Upon successful completion, a value of 0 is returned. Otherwise, one of the following error
codes is returned:
See also
c_spv() on page 265
c_spvw_2() on page 238
Examples
There are several examples located in <data folder>\Honeywell\Experion
HS\Server\user\examples\src. These can be used as a basis for your own programs.
The examples are:
Example Description
test1.c a very simple task which prints 'Hello World' every time it is requested.
test2.c a simple task that generates 3 alarms when requested.
test3.c a task that demonstrates dealing with points.
test4.c a simple task that demonstrates the use of user tables.
test5.c a more completed task that demonstrates the use of user tables.
test6.c a utility that demonstrates dealing with points.
test7.c a complicated task demonstrating the use of watchdog timers, scan point special, hsc_
param_values and hsc_param_value_put.
a simple task that shows the information passed on the prmblk when the task is
test8.c
requested.
Prerequisites
Before writing network applications for Experion, you need to:
n Install Experion and third-party software as described in the Installation Guide.
n Review the current security settings for Network API on the Security tab of the Server
Wide Settings display and ensure that Disable writes via Network API is enabled if
you do not want data written to the server via the Network API. For more information,
see the topic 'Security tab, server wide settings' in the chapter 'Customizing Stations' in
the .
n Be familiar with user access and file management as described in the .
Prerequisite skills
This guide assumes that you are an experienced programmer with a good understanding of
either C, C++, or Visual Basic.
It also assumes that you are familiar with the Microsoft Windows development environment
and know how to edit, compile and link applications.
Attention:
If you do not want data to be written to the server via the Network API,
select Disable writes via Network API. For more information, see
“Security tab, server wide settings” in the Server and Client Configuration
Guide. Note that during a clean installation of Experion, writes via the
Network API will be disabled by default.
n Files. Allow your program to interact with the Network Server Option. These files are
comprised of C/C++ libraries, header files, VB files, Dynamic Link Libraries,
documentation, and sample source programs which are all designed to help you easily
create a network application.
The network applications you develop can only run on 32-bit Windows environments.
Network applications act as clients to the Network Server Option and can read and
write values in the Experion server database via the network.
Network server
Network Server
Network Request
Server System
Network Reply
Remote System
On any of the redundant/dual-network configurations above do not add the basename (server)
to the hosts file.
Support for redundancy with the Network API is limited to Windows.
Function Description
Function Description
Guide.
Point Parameter Access
rhsc_
param_ Similar to rhsc_param_values_2 but provides a simpler calling interface but is less
value_ efficient.
bynames
Similar to rhsc_param_value_puts_2 but provides a simpler calling interface but is
rhsc_
less efficient.An error will be returned by this function if writes via the Network
param_
API have been disabled. For more information, see Disable writes via Network
value_put_
API in “Security tab, server wide settings” in the Server and Client Configuration
bynames
Guide.
Historical Information Access
rhsc_
Read a block of history data from the database starting from a specified date and
param_hist_
time.
dates_2
rhsc_
Read a block of history data from the database starting from a specified offset in
param_hist_
the history database.
offsets_2
rhsc_
Read a block of history data from the database using point and parameter names
param_hist_
starting from a specified date and time. Similar to rhsc_param_hist_dates_2 but
date_
provides a simpler calling interface but is less efficient.
bynames
rhsc_
Read a block of history data from the database using point and parameter names
param_hist_
starting from a specified offset in the history database. Similar to rhsc_param_hist_
offset_
offsets_2 but provides a simpler calling interface but is less efficient.
bynames
User File Information Access
rgetdat Read a list of fields from the user files of the database.
Write a list of fields to the user files of the database.An error will be returned by
this function if writes via the Network API have been disabled. For more
rputdat
information, see Disable writes via Network API in “Security tab, server wide
settings” in the Server and Client Configuration Guide.
Error String Lookup
Visual Basic only. Look up the error string for an error number. (Preferred
hsc_
command in place of hsc_napierrstr which has been retained only for backward
napierrstr2
compatibility.)
hsc_ Look up the error string for an error number.
Function Description
napierrstr
To: Go to:
the function return value. If any individual request for a point number failed, the return value
will be a warning that indicates a partial function fail has occurred. To find out which request
failed and why, check the fStatus field of the data structure for each point number returned.
Check the return value for any warning that a partial function fail has occurred. To find out
which request failed and why, check the fStatus field of the data structure for each parameter
number returned.
Attention:
The maximum number of points that can be processed with one call to rhsc_
param_hist_x is 20.
When defining the record layout of a user table, list the fields in consecutive order with their
data type, description and calculate their word offset from the beginning of the record.
An example of using rgetdat and rputdat for C can be located in the \<install
folder>\Honeywell\Experion PKS\Client\Netapi\Samples\C\Napitst project.
An example of using rgetdat_xxxx and rputdat_xxxx for VB can be located in
the \<install
folder>\Honeywell\Experion PKS\Client\Netapi\Samples\Vb\Vbnetapitst
project.
Therefore, one rgetdat call could retrieve multiple records which could improve efficiency
and program execution time. The function above could be easily changed to do this.
int ierr;
int i;
return 0;
}
'declare data
Dim ustbl07_def(7) As rgetdat_float_data_str
'setup data
For cnt = 0 To 7
ustbl07_def(cnt).file = UTBL07_F
ustbl07_def(cnt).rec = recno
ustbl07_def(cnt).word = (cnt * 2) + 1
Next
rec.dout = ustbl07_def(2).value
rec.bmax = ustbl07_def(3).value
rec.cmin = ustbl07_def(4).value
rec.bav = ustbl07_def(5).value
rec.cav = ustbl07_def(6).value
rec.idq = ustbl07_def(7).value
End Function
This method could quite easily be applied for writing a whole record of a user
table as well by using the rputdat function.
Attention:
The hexidecimal return value '839A' (NADS_PARTIAL_FUNC_FAIL)
indicates that a partial function fail has occurred and is only a warning. This
warning indicates that at least one request, and possibly all requests, made to a list-
based function has failed. If this value is received, the fstatus Field of the data
structure for each request should be checked for errors.
Example
An example of using hsc_napierrstr for C can be located in the \<install
folder>\Honeywell\Experion PKS\Client\Netapi\Samples\C\Napitst project.
You should use hsc_napierrstr2 for VB. hsc_napierrstr is provided for
backward compatibility only.
An example of using hsc_napierrstr2 for VB can be located in the \<install
folder>\Honeywell\Experion PKS\Client\Netapi\Samples\Vb\Vbnetapitst
project.
There is a special condition for error numbers. If the lower four digits of the hexadecimal
error number is '8150', then the top four digits gives an Experion Process Controller error. In
this case, hsc_napierrstr cannot be called to resolve the error number. Instead, you can look at
the file M4_err_def in the include folder for the error string corresponding to the top four-
digit Experion Process Controller error code.
Example
Consider the return value: 0x01068150. The lower four digits (8150) indicates
that this is an Experion Process Control Software error. The entry for 0106 in
M4_err_def indicates that the error is due to a 'timeout waiting for response'.
Attention:
Optimum performance can only be achieved by using the functions rhsc_point_
numbers_2 and rhsc_param_numbers_2 to resolve point names and parameter
names. The names are resolved just once, at the start of the program. The
equivalent point numbers and parameters numbers are returned by these functions
and should be stored locally so that all subsequent requests to parameter and
history values use the locally stored numbers.
The folder structures shown below should be used for development of C/C++ Server API
applications which will run on the server.
<data folder> server folder structure
<data folder> is the location where Experion data is stored. For default installations, this is
C:\ProgramData.
The user/xxxx/src folder contains all source code files and make files for a particular
application. xxxx should be representative of the function of the application.
The server/data folder contains all server database files.
<install folder> server folder structure
<install folder> is the location where Experion is installed. For default installations this is
C:\Program Files (x86).
The def folder contains real time database definitions.
The include and include/src folders contain global server definitions, such as system
constants or data arrays in the form of C/C++ include files.
The run folder contains all server programs (including applications). This folder is included
in the path of any server user.
The lib folder contains libraries used for application development.
Network writes may fail if Disable writes via Network API has been selected. For more
information, see “Security tab, server wide settings” in the Server and Client Configuration
Guide. Note that during a clean installation of Experion, writes via the Network API will be
disabled by default.
Functions
This section contains Network API functions.
See also
Backward-compatibility Functions on page 341
Diagnostics for Network API functions on page 375
hsc_bad_value
Checks whether the parameter value is bad.
C/C++ Synopsis
int hsc_bad_value (float nValue)
VB Synopsis
hsc_bad_value (ByVal nValue as Single) As Boolean
Arguments
Argument Description
Description
This function is really only useful for the history functions, which do return bad values.
Returns TRUE (-1) if the parameter value is BAD; otherwise FALSE (0).
hsc_napierrstr
Lookup an error string from an error number. This function is provided for backward
compatibility.
C/C++ Synopsis
void hsc_napierrstr(UINT err, LPSTR texterr);
VB Synopsis
hsc_napierrstr(ByVal err As Integer) As String
Arguments
Argument Description
Diagnostics
This function will always return a usable string value.
rgetdat
Retrieve a list of fields from a user file.
C/C++ Synopsis
int rgetdat(char *server,
int num_points,
rgetdat_data* getdat_data);
VB Synopsis
rgetdat_int(ByVal server As String,
ByVal num_points As Integer,
getdat_int_data() As rgetdat_int_data_str) As Integer
rgetdat_bits(ByVal server As String,
ByVal num_points As Integer,
getdat_bits_data() As rgetdat_bits_data_str) As Integer
rgetdat_long(ByVal server As String,
ByVal num_points As Integer,
getdat_long_data() As rgetdat_long_data_str) As Integer
rgetdat_float(ByVal server As String,
ByVal num_points As Integer,
getdat_float_data() As rgetdat_float_data_str) As Integer
rgetdat_double(ByVal server As String,
ByVal num_points As Integer,
getdat_double_data()
As rgetdat_double_data_str) As Integer
rgetdat_str(ByVal server As String,
ByVal num_points As Integer,
getdat_str_data()
As rgetdat_str_data_str) As Integer
Arguments
Argument Description
Description
This function call enables fields from a user table to be accessed. The fields to be accessed are
referenced by the members of the rgetdat_data structure (see below). The function accepts an
array of rgetdat_data structures thus providing the flexibility to obtain multiple fields with
one call. Note that for the C interface only (not the VB interface), the fields can be of different
types and from different user tables.
Note that a successful return status from the rgetdat call indicates that no network errors were
encountered (that is, the request was received, processed and responded to). The status field
in each call structure needs to be verified on return to determine the result of the individual
remote calls.
The program using this function call must ensure that the size of the network packets
generated do not exceed the maximum packet size permitted on the network. To meet this
requirement, adhere to the following guideline:
(22 * number of fields) + sum of all string value lengths in bytes <4000
The structure of the rgetdat_data structure is defined in nif_types.h. This structure and its
members are defined as follows:
(in) Defines the type of data to be retrieved/stored, this will be one of the standard
server data types. Namely using one of the following defines:
int2 type
RGETDAT_TYPE_INT2, RGETDAT_TYPE_INT4, RGETDAT_TYPE_REAL4,
RGETDAT_TYPE_REAL8, RGETDAT_TYPE_STR, RGETDAT_TYPE_BITS
int2 file (in) Absolute database file number to retrieve/store field.
int2 rec (in) Record number in above file to retrieve/store field.
int2
(in) Word offset in above record to retrieve/store field.
word
(in) Start bit offset into the above word for the first bit of a bit sequence to be
int2
retrieved/stored. (That is, the bit sequence starts at: word + start_bit, where start_bit=0
start_bit
is the first bit in the field.) Ignored if type is not a bit sequence.
int2 (in) Length of bit sequence or string to retrieve/store, in characters for a string, in bits
length for a bit sequence. Ignored if type is not a string or bit sequence.
int2 (in) Specifies the direction to read/write for circular files. (0: newest record, 1: oldest
flags record)
(in/out) Value of field retrieved or value to be stored. When storing strings they must
rgetdat_ be of the length given above. When strings are retrieved, they become NULL
value terminated, hence the length allocated to receive the string must be one more than the
value length specified above. Bit sequences will start at bit zero and be length bits long. See
below a description of the union types.
Diagnostics
See Diagnostics for Network API functions on page 375.
rhsc_notifications
Insert an alarm or event into the event log.
C/C++ Synopsis
int rhsc_notifications(char *szHostname,
int cjrnd,
NOTIFICATION_DATA* notd);
VB Synopsis
RHSC_notifications(ByVal hostname As String,
ByVal num_requests As Long,
notification_data_array()
As notification_data) As Long
Arguments
Argument Description
szHostname (in) Name of server that the data resides on (that is, server hostname)
cprmbd (in) Number of notifications requested
(in/out) Pointer to an array of NOTIFICATION_DATA structures (one array
notd
element for each request)
Description
The structure of the NOTIFICATION_DATA structure is defined in netapi_types.h. This
structure and its members are defined as follows:
RHSC_NOTIFICATIONS can be used to remotely generate alarms and events. The various
text fields are the raw data that can be specified. Not all the fields are applicable to every type
of notification. The data in these fields are formatted for you into a standard event log line on
the server. The nPriority field is used to define the behavior on the server. The following
constants are defined in nads_def.h:
NTFN_ALARM_URGENT generates an urgent
level alarm
NTFN_ALARM_HIGH generates a high level alarm
NTFN_ALARM_LOW generates a low level alarm
NTFN_ALARM_JNL generates a journal level
alarm
A number of predefined strings have been provided for use in the szEvent, szAction and
szLevel fields. Although there is no requirement to use these strings, their use will promote
consistency. They can be found in nads_def.h.
static char* EventStrings[] =
{
// should be an alarm type, an event type from
// one of the following strings, blank, or user defined
'CHANGE', // local operator change
'ACHANGE', // application (non-Station) change
'LOGIN', // operator login
'ALOGIN', // application (non-Station) login
'WDT', // watch dog timer event
'FAILED' // operation failed
};
static char* ActionStrings[] =
{
// should be blank (new alarm), an event type from
// one of the following strings or user defined
'OK', // alarm returned to normal
'ACK', // alarm acknowledged
'CNF' // message confirmed
};
static char* LevelStrings[] =
{
// should be an alarm level, one of the
// following strings indicating where the event
// was generated from, blank, or user defined
'CB', // Control Builder
'MSEDE', // Microsoft Excel Data Exchange
'NAPI', // Network API application
'API' // API application
};
A successful return status from the rhsc_notifications call indicates that no network errors
were encountered (that is, the request was received, processed, and responded to). If the
returned value is NADS_PARTIAL_FUNC_FAIL, then at least one request (and possibly all
requests) failed. The status field of each array element should be checked to find which
request failed.
It is the responsibility of the program using this function call to ensure that the size of the
network packets generated do not exceed the maximum packet size permitted on the network.
To meet this requirement, adhere to the following guideline:
n For ALL request packets:
(15 * number of notifications) + sum of all string lengths < 4000
Note that the sum of the string lengths does not include nulls, which is the convention for
C/C++.
Example
Create an event log entry indicating that a remote control has just occurred.
#include <sys/timeb.h>
int status;
int i;
/* Set the point names, parameter names and parameter offsets to appro-
priate values */
PARAM_DATA rgprmbd[] = {{'pntana1','DESC', 1}};
#define cprmbd (sizeof(rgprmbd)/sizeof(PARAM_DATA))
/* Setup parameters for the call to rhsc_notifications */
NOTIFICATION_DATA rgnotd[cprmbd];
/* Allocate space and set the value and type to control pntana1.SP to
42.0 */
rgprmbd[0].pupvValue = (PARvalue *)malloc(sizeof (PARvalue));
strcpy(rgprmbd[0].pupvValue->text, 'FunkyDescription');
rgprmbd[0].nType = DT_CHAR;
Diagnostics
See Diagnostics for Network API functions on page 375.
See also
hsc_notif_send() on page 146
rhsc_param_hist_date_bynames
Retrieve history values for Parameters referenced by name from a start date.
This function's synopsis and description is identical to that of 'rhsc_param_hist_offset_
bynames.'
rhsc_param_hist_offset_bynames
Retrieve history values for parameters referenced by name from an offset.
C Synopsis
int rhsc_param_hist_date_bynames(char
*szHostName,
int cHstRequests,
HIST_BYNAME_DATA* rghstbd);
int cHstRequests,
HIST_BYNAME_DATA* rghstbd);
VB Synopsis
RHSC_param_hst_date_bynames(ByVal
Server As String,
ByVal num_requests As Long,
hist_byname_data_array()
As hist_byname_data) As Long
RHSC_param_hst_offset_bynames(ByVal
Server As String,
ByVal num_requests As Long,
hist_byname_data_array()
As hist_byname_data) As Long
Arguments
Argument Description
Description
The structure of the HIST_BYNAMES_DATA structure is defined in netapi_types.h. This
structure and its members are defined as follows:
(in) The start date of history to retrieve in Julian days (number of days since
n_long
1 Jan 1981). If the function called is rhsc_param_hist_offset_bynames then
dtStartDate
this value is ignored.
(in) The start time of history to retrieve in seconds since midnight. If the
n_float
function called is rhsc_param_hist_offset_bynames then this value is
tmStartTime,
ignored.
(in) Offset from latest history value in history intervals (where offset=1 is
n_long
the most recent history value). If the function called is rhsc_param_hist_
nHstOffset,
date_bynames then this value is ignored.
n_long
(out) The status returned by the gethstpar function.
fGetHstParStatus,
n_short
(in) The type of history to retrieve (See Description).
nHstType,
n_ushort
(in) The number of point / parameter pairs requested.
cPntPrmNames,
(in) The number of history values to be returned per point / parameter pair.
n_ushort
This value must not be negative: the error message 'Message being built too
cHstValues
large' is returned if it is.
n_char* This member is no longer in use and is only retained for backwards
szArchivePath, compatibility. Instead, pass a zero length string.
n_char**
(in) An array of point names to process.
rgszPointNames,
n_char** (in) An array of parameter names to process. Each parameter is associated
rgszParamNames with the corresponding entry in the rgszPointNames array.
n_long* (out) The status returned by the Server when calling hsc_point_number and
rgfPntPrmStatus hsc_param_number for each point parameter pair.
(out) A pointer to the list of returned history values. The history values are
n_float* stored in rHstValuessized blocks for each point parameter pair. If there is
rgnHstValues no history for the requested time or if the data was bad, then the value -0.0
is stored in the array.
These functions request a number of blocks of history data from a remote server. For each
block, a history type is specified using one of the following values:
Value Description
Depending upon which function is called, history will be retrieved from a specified date and
time or offset going backwards in time. The number of history values to be retrieved per point
is specified by cHstValues. cHstValues must not be negative. Point parameters are specified
by name only and all name to number resolutions are performed by the server.
Before making a request you must allocate sufficient memory for each list pointed to by
rgnHstValues. You must also free this memory before exiting your network application. The
number of bytes required for each request is 4*cHstValues*cPntPrmNames.
A successful return status from the rhsc_param_hist_xxxx_bynames call indicates that no
network errors were encountered (that is, the request was received, processed, and responded
to). If the returned value is NADS_PARTIAL_FUNC_FAIL, then at least one request (and
possibly all requests) failed. The status fields of each array element should be checked to find
which request failed.
The program using this function call must ensure that the size of the network packets
generated do not exceed the maximum packet size permitted on the network.
To meet the program requirement not to exceed the maximum packet size permitted, adhere to
the following guidelines:
n For request packets for rhsc_param_hist_date_bynames:
Diagnostics
See Diagnostics for Network API functions on page 375.
Example
For rhsc_param_hist_date_bynames
int status;
int i;
n_long ConvertToDays(n_long year, n_long month, n_long day)
{
n_long nConvertedDays = 0;
n_long leap = 0;
nConvertedDays = (year - 1981) * 365 + (year - 1981) / 4 + day - 1;
leap = ((year % 400) == 0) || (((year % 100) != 0) && ((year % 4) ==
0));
switch(month)
{
case 12:
nConvertedDays += 30;
case 11:
nConvertedDays += 31;
case 10:
nConvertedDays += 30;
case 9:
nConvertedDays += 31;
case 8:
nConvertedDays += 31;
case 7:
nConvertedDays += 30;
case 6:
nConvertedDays += 31;
case 5:
nConvertedDays += 30;
case 4:
nConvertedDays += 31;
case 3:
nConvertedDays += 28 + leap;
case 2:
nConvertedDays += 31;
case 1:
break;
default:
printf("Invalid month\n");
return 0;
}
return nConvertedDays;
}
int main()
{
HIST_BYNAME_DATA rghstbd[2];
int chstbd = 2;
/* Set up date and time for 7 November 2001 at 1:00 pm */
n_long year = 2001;
n_long month = 11;
n_long day = 7;
int hour = 13;
int minute = 0;
int second = 0;
switch (status)
{
case 0:
printf("rhsc_param_hist_date_bynames successful\n");
/* Now print the 4th history value returned for AnalogPoint's op */
printf("Value = %f\n",
rghstbd[0].rgnHstValues[3 + rghstbd[0].cHstValues * 2]);
break;
case NADS_PARTIAL_FUNC_FAIL:
printf("rhsc_param_hist_date_bynames partially failed");
/* Check fStatus flags to find out which one(s) failed. */
break;
default:
printf("rhsc_param_hist_date_bynames failed (c_geterrno() = 0x%x)",
status);
break;
}
For rhsc_param_hist_offset_bynames
int status;
int i;
int main()
{
HIST_BYNAME_DATA rghstbd[2];
int chstbd = 2;
n_long nOffset = 1; /* Most recent history value */
/* Allocate memory and set up rghstbd */
for (i=0; i<chstbd; i++)
{
rghstbd[i].nHstOffset = nOffset;
rghstbd[i].nHstType = HST_5SECF;
rghstbd[i].cPntPrmNames = 3;
/* Two point parameter pairs */
rghstbd[i].cHstValues = 10;
/* Ten history values each */
rghstbd[i].szArchivePath = "ay2001m11d01h13r001";
rghstbd[i].rgszPointNames = (char **)malloc(sizeof(char *) * 3);
rghstbd[i].rgszPointNames[0]="AnalogPoint";
rghstbd[i].rgszPointNames[1]="AnalogPoint";
rghstbd[i].rgszPointNames[2]="AnalogPoint";
rghstbd[i].rgszParamNames = (char **)malloc(sizeof(char *) * 3);
rghstbd[i].rgszParamNames[0]="pv";
rghstbd[i].rgszParamNames[1]="sp";
rghstbd[i].rgszParamNames[2]="op";
rghstbd[i].rgfPntPrmStatus = (n_long *)malloc(sizeof(n_long) * 3);
rghstbd[i].rgnHstValues = (n_float *)malloc(sizeof(n_float) * 30);
}
switch (status)
{
case 0:
printf("rhsc_param_hist_offset_bynames successful\n");
/* Now print the 4th history value returned for AnalogPoint's op */
printf("Value = %f\n",
rhsc_param_hist_dates_2
rhsc_param_hist_offsets_2
C/C++ Synopsis
int rhsc_param_hist_dates_2
(
char* server,
int num_gethsts,
rgethstpar_date_data_2* gethstpar_date_data2
);
int rhsc_param_hist_offsets_2
(
char* server,
int num_gethsts,
rgethstpar_ofst_data_2* gethstpar_ofst_data2
);
VB Synopsis
rHsc_Param_Hist_Dates_2(ByVal Server As String,
num_requests As Long,
gethstpar_date_data_array()
As Hist_Value_Data_2) As Long
rHsc_Param_Hist_Offsets_2(ByVal Server As String,
num_requests As Long,
gethstpar_ofst_data_array()
As Hist_Value_Data_2) As Long
Arguments
Argument Description
Description
rhsc_param_hist_x_2 functions are the replacements for the now deprecated rhsc_param_
hist_x functions.
Attention:
rhsc_param_hist_x functions can only access points in the range: 1 <= point
number <= 65,000.
Use this function to retrieve history values for points. The two types of history (based on time
or offset) are retrieved using the corresponding function variation. History will be retrieved
from a specified time or offset going backwards in time. The history values to be accessed are
n_ (in) Defines the type of history to retrieve, this will be one of the standard server
ushort history types. Namely using one of the following:
hist_ HST_1MIN, HST_6MIN, HST_1HOUR, HST_8HOUR, HST_24HOUR, HST_
type 5SECF, HST_1HOURE, HST_8HOURE, HST_24HOURE
n_ulong
hist_ (in) Start date of history to receive in Julian days (number of days since 1st January
start_ 1981).
date
n_ufloat
hist_
(in) Start time of history to retrieve in seconds since midnight.
start_
time
n_
ushort
(in) Number of history values per point to be retrieved.
num_
hist
n_
ushort
(in) Number of points to be processed. MAXIMUM value allowed is 20.
num_
points
n_
ulong*
(in) Array (of size num_points) containing the point type/numbers of the point history
point_
values to retrieve.
type_
nums
n_
ushort* (in) Array of (of size num_points) containing the parameter numbers of the history
point_ values to retrive.
params
n_char* (in) Pointer to the NULL terminated string containing the archive path name of the
archive archive file. A NULL pointer implies that the system will use current history and any
path archive files which correspond to the value of the date and time parameters.
n_
ufloat* (out) Array (of size num_points * num_hist) to provide storage for the returned
hist_ history values.
values
n_
ushort
(out) Return value of the actual remote hsc_history call.
gethst_
status
n_ (in) Defines the type of history to retrieve, this will be one of the standard server
ushort history types. Namely using one of the following defines:
hist_ HST_1MIN, HST_6MIN, HST_1HOUR, HST_8HOUR, HST_24HOUR, HST_
type 5SECF, HST_1HOURE, HST_8HOURE, HST_24HOURE
n_
ushort (in) Offset from latest history value in history intervals where offset=1 is the most
hist_ recent history value).
offset
n_
ushort
(in) Number of history values per point to be retrieved.
num_
hist
n_
ushort
(in) Number of points to be processed. MAXIMUM value allowed is 20.
num_
points
n_
ulong*
(in) Array (of size num_points) containing the point type/numbers of the point history
point_
values to retrieve.
type_
nums
n_
ushort* (in) Array (of size num_points) containing the parameter numbers of the history
point_ values to retrieve.
params
n_char* (in) Pointer to the NULL terminated string containing the archive path name of the
archive archive file. A NULL pointer implies that the system will use current history and any
path archive files which correspond to the value of the date and time parameters.
n_float*
(out) Array (of size num_points * num_hist) to provide storage for the returned
hist_
history values.
values
n_
ushort
(out) Return value of the actual remote hsc_history call.
gethst_
status
The program using this function call must ensure that the size of the network packets
generated does not exceed the maximum packet size permitted on the network. To meet this
requirement, adhere to the following guideline:
n For request packets for rhsc_param_hist_dates_2:
Attention:
Combined point / parameter pair count across all rgethstpar_x_data_2 structs may
vary. For example, an rhsc_param_hist_x_2 call is made with 3 rgethstpar_x_
data_2 data structures, each referencing 2, 5 and 4 point / parameter pairs. This
results in 6*2 + 6*5 + 6*4 = 66, so: (16 * 3) + (6 * (2 + 5 + 4)) + (strings ?) <
4000
Attention:
Combined point / parameter pair count across all rgethstpar_x_data_2 structs may
vary. For example, an rhsc_param_hist_x_2 call is made with 3 rgethstpar_x_
data_2 data structures, each referencing 2, 5 and 4 point / parameter pairs. This
results in 6*2 + 6*5 + 6*4 = 66, so: (16 * 3) + (6 * (2 + 5 + 4)) + (strings ?) <
4000
Diagnostics
See Diagnostics for Network API functions on page 375.
rhsc_param_numbers_2
C Synopsis
int rhsc_param_numbers_2
(
char* szHostname,
int cprmnd,
PARAM_NUMBER_DATA_2* rgprmnd2
);
VB Synopsis
rhsc_param_numbers_2(ByVal
hostname As String,
ByVal num_requests As Long,
param_number_data_array()
As
param_number_data_2)
As Long
Arguments
Argument Description
Description
rhsc_param_numbers_2 is the replacement for the now deprecated rhsc_param_numbers.
Attention:
rhsc_param_numbers can only access points in the range: 1 <= point number <=
65,000.
Example
Resolve the parameter names 'pntana1.SP' and 'pntana1.DESC'.
int status;
int i;
POINT_NUMBER_DATA_2 rgpntnd2[] = {{"pntana1"}};
status = rhsc_point_numbers_2("server1",
cpntnd, rgpntnd2);
/* Check for error status. */
status = rhsc_param_numbers_2("server1",
cprmnd, rgprmnd2);
switch (status)
{
case 0:
printf("rhsc_param_numbers_2
successful\n");
for (i=0; i<cprmnd; i++)
{
printf("%s.%s has the parameter number %d\n",
rgpntnd2[0].szPntName,
rgprmnd2[i].szPrmName,
rgprmnd2[i].nPrm);
}
case NADS_PARTIAL_FUNC_FAIL:
printf("rhsc_param_numbers_2 partially failed\n");
/* Check fStatus flags to find out which ones failed. */
break;
default:
printf("rhsc_param_numbers_2 failed (c_geterrno() = 0x%x)\n",
status);
break;
}
Diagnostics
See Diagnostics for Network API functions on page 375.
See also
rhsc_point_numbers_2 on page 336
rhsc_param_value_bynames
Reads a list of point parameter values referenced by name.
C/C++ Synopsis
int rhsc_param_value_bynames
(
char* szHostname,
int nPeriod,
int cprmbd,
PARAM_BYNAME_DATA* rgprmbd
);
VB Synopsis
RHSC_param_value_bynames(ByVal hostname As String,
ByVal period As Long,
ByVal num_requests As Long,
param_byname_data_array() As
param_byname_data) As Long
Arguments
Argument Description
Description
The structure of the PARAM_BYNAME_DATA structure is defined in nif_types.h. This
structure and its members are defined as follows:
If your system uses dynamic scanning, rhsc_param_value_bynames calls from the Network
API do not trigger dynamic scanning.
RHSC_PARAM_VALUE_BYNAMES requests a list of point parameter values from the
specified remote server. Point parameters are requested by name only, and all name to number
resolutions are performed by the server.
You can read a list of parameter values with different types using a single request. Each point
parameter value is placed into a union (of type PARvalue). Before making the request, you
must allocate sufficient memory for each value union. You must free this memory before
exiting your network application.
A successful return status from the rhsc_param_value_bynames call indicates that no
network errors were encountered (that is, the request was received, processed, and responded
to). If the returned value is NADS_PARTIAL_FUNC_FAIL, then at least one request (and
possibly all requests) failed. The status field of each array element should be checked to find
which request failed.
The program using this function call must ensure that the size of the network packets
generated do not exceed the maximum packet size permitted on the network.
Due to the ability to acquire a list of parameters of mixed data type, it is difficult to give
generic limits. To meet the program requirement not to exceed the maximum packet size
permitted, adhere to the following guidelines given for a number of specific cases:
n For all request packets:
(6 * number of point parameters) + sum of string lengths of point
names + sum of string lengths of parameter names < 4000
Example
Read the value of pntana1.SP and pntana1.DESC.
int status;
int i;
PARAM_BYNAME_DATA rgprmbd[] = {{'pntana1','SP', 1},{'pntana1', 'DESC',
1}};
#define cprmbd (sizeof(rgprmbd)/sizeof(PARAM_BYNAME_DATA))
/* Allocate sufficient memory for each value union. See sample code
for rhsc_param_values for more details */
for (i=0; i<cprmbd; i++)
{
rgprmbd[i].pupvValue = (PARvalue *)malloc(sizeof(PARvalue);}
switch (status)
{
case 0:
printf('rhsc_param_value_bynames successful\n');
for (i=0; i<cprmbd; i++)
{
switch (rgprmbd[i].nType)
{
case DT_CHAR:
printf('%s.%s has the value %s\n',
rgprmbd[i].szPntName,
rgprmbd[i].szPrmName,
rgprmbd[i].pupvValue->text);
break;
case DT_INT2:
printf('%s.%s has the value %d\n',
rgprmbd[i].szPntName,
rgprmbd[i].szPrmName,
rgprmbd[i].pupvValue->int2);
break;
case DT_INT4:
printf('%s.%s has the value %d\n',
rgprmbd[i].szPntName,
rgprmbd[i].szPrmName,
rgprmbd[i].pupvValue->int4);
break;
case DT_REAL:
printf('%s.%s has the value %f\n',
rgprmbd[i].szPntName,
rgprmbd[i].szPrmName,
rgprmbd[i].pupvValue->real);
break;
case DT_DBLE:
printf('%s.%s has the value %f\n',
rgprmbd[].szPntName,
rgprmbd[i].szPrmName,
rgprmbd[i].pupvValue->dble);
break;
case DT_ENUM:
printf('%s.%s has the ordinal value %d
Diagnostics
See Diagnostics for Network API functions on page 375.
See also
rhsc_param_value_puts_2 on page 325
rhsc_param_value_put_bynames below
rhsc_param_value_put_bynames
Control a list of point parameter values referenced by name.
C/C++ Synopsis
int rhsc_param_put_bynames
(
char* szHostname,
int cprmbd,
PARAM_BYNAME_DATA*
rgprmbd
);
VB Synopsis
RHSC_param_value_put_bynames(ByVal hostname As String,
ByVal num_requests As Long,
param_byname_data_array()
As param_byname_data) As Long
Arguments
Argument Description
Description
The structure of the PARAM_BYNAME_DATA structure is defined in nif_types.h. This
structure and its members are defined as follows:
Example
Control the SP value of 'pntana1' to 42.0 and change its DESC to say
'FunkyDescription.'
int status;
int i;
/* Set the point names, parameter names and parameter offsets to appro-
priate values */
PARAM_BYNAME_DATA rgprmbd[] = {{'pntana1','SP', 1},{'pntana1', 'DESC',
1}};
#define cprmbd (sizeof(rgprmbd)/sizeof(PARAM_BYNAME_DATA))
/* Allocate space and set the value and type to control pntana1.SP to
42.0 */
rgprmbd[0].pupvValue = (PARvalue *)malloc(sizeof(DT_REAL));
rgprmbd[0].pupvValue->real = (float)42.0;
rgprmbd[0].nType = DT_REAL;
/* Allocate space and set the value and type to control pntana1.DESC
to 'FunkyDescription' */
rgprmbd[1].pupvValue = (PARvalue *)malloc(strlen('FunkyDe-
scription')+1);
strcpy(rgprmbd[1].pupvValue->text, 'FunkyDescription');
rgprmbd[1].nType = DT_CHAR;
switch (status)
{
case 0:
printf('rhsc_param_value_put_bynames successful\n');
break;
case NADS_PARTIAL_FUNC_FAIL:
printf('rhsc_param_value_put_bynames partially failed');
/* Check fStatus flags to find out which one(s) failed. */
break;
default:
printf('rhsc_param_value_bynames failed (c_geterrno() = 0x%x)',
status);
break;
Diagnostics
See Diagnostics for Network API functions on page 375.
See also
rhsc_param_values_2 on page 330
rhsc_param_value_put_bynames on page 318
rhsc_param_value_put_sec_bynames
C/C++ Synopsis
int rhsc_param_put_sec_bynames
(
char* szHostname,
int cprmbd,
PARAM_BYNAME_DATA* rgprmbd,
unsigned short nStn
);
VB Synopsis
RHSC_param_value_put_sec_bynames(ByVal hostname As String,
ByVal num_requests As Long,
param_byname_data_array() As param_byname_data,
Station As short) As Long
Arguments
Argument Description
Description
Unlike most Network API functions, events raised by this function are associated with the
specified Station. (Events raised by other functions are associated with 'Network Server'.) If
you want to control what events are logged by an application, see "Controlling what events
are logged by an external application".
Diagnostics
See Diagnostics for Network API functions on page 375.
Bit Bit Log all events from an external Log only events with security
14 15 application information
0 0 No No
1 0 No Yes
Bit Bit Log all events from an external Log only events with security
14 15 application information
0 1 Yes Yes
1 1 Yes Yes
The events that are logged by an external application that uses Network Server or OPC
Server are determined by two check boxes on the Alarm/Event Options tab of the Server
Wide Settings display:
n Log Network Server and OPC Server changes to the database as events
n Log Network Server changes with security information to the database as events
There are three possible scenarios:
n If you do not want events logged, clear both check boxes
n If you only want events that have been raised via rhsc_param_value_puts_sec or rhsc_
param_value_put_sec_bynames, then:
l Clear the Log Network Server and OPC Server changes to the database as
events check box
l Select the Log Network Server changes with security information to the
database as events check box
n If you want all events logged, then select the Log Network Server and OPC Server
changes to the database as events check box.
rhsc_param_value_puts_2
C Synopsis
int rhsc_param_value_puts_2
(
char* szHostname,
int cprmvd,
PARAM_VALUE_DATA_2* rgprmvd2
);
VB Synopsis
rhsc_param_value_puts_2
(ByVal hostname As String,
Arguments
Argument Description
Description
rhsc_param_value_puts_2 is the replacement for the now deprecated rhsc_param_value_
puts.
Attention:
rhsc_param_value_puts can only access points in the range: 1 <= point number
<= 65,000
You can write a list of parameter values with different types using a single request. The value
is placed into a union (of type PARvalue). Before storing the value to be written to a point
parameter in the PARAM_VALUE_DATA_2 structure, you must allocate sufficient memory
for the union. You must free this memory before exiting your network application.
Although this is a list based function, there is no implication that it should be used as a
sequential write function. If any individual put fails, the function will not prevent the
remaining writes from occurring. The function will instead continue to write values to the
remaining point parameters in the list.
Be careful when using rhsc_param_value_puts_2() and rhsc_param_value_put_bynames()
with more than one point/parameter pair. Each put causes a control to be executed on the
server and each control takes a small amount of time. If more than one pair is put, the total
time for each of these controls may exceed the default TCP/IP timeout. This will cause the
Network API to report the error RCV_TIMEOUT, even though all puts may have been
successful. In addition, the Network API will be unavailable until the list of puts has been
processed. This could cause subsequent calls to the network API to fail until the list is
processed.
To simplify the handling of enumerations, two data types have been included for use with this
function only. The data types are DT_ENUM_ORD, and DT_ENUM_STR. When writing a
value to an enumeration point parameter, supply the ordinal part of the enumeration only and
use the DT_ENUM_ORD data type. Alternatively, if you don't know the ordinal value,
supply only the text component of the enumeration and use the DT_ENUM_STR data type.
If the DT_ENUM data type is specified, only the ordinal value is used by this function
(similar to DT_ENUM_ORD).
A successful return status from the rhsc_param_value_puts_2 call indicates that no network
errors were encountered (that is, the request was received, processed, and responded to).
If the returned value is NADS_PARTIAL_FUNC_FAIL, then at least one request (and
possibly all requests) failed. The status field of each array element should be checked to find
which request failed. For each array element, a value of CTLOK (See Diagnostics for
Network API functions) or 0 in the status field indicates that the control was successful.
The program using this function call must ensure that the size of the network packets
generated do not exceed the maximum packet size permitted on the network.
Due to the ability to control a list of parameters of mixed data type, it is difficult to give
generic limits. To meet the program requirement not to exceed the maximum packet size
permitted, adhere to the following guidelines given for a number of specific cases:
n For request packets when writing DT_INT2 data only:
Example
Control pntana1's SP value to 42.0 and change its DESC to say 'Funky
description.'
int status;
int i;
PARAM_VALUE_DATA_2 rgprmvd2[cprmvd];
rgprmnd2[0].nPnt = rgpntnd2[0].nPnt;
rgprmnd2[1].nPnt = rgpntnd2[0].nPnt;
status = rhsc_param_numbers_2("Server1", cprmnd, rgprmnd2);
/* Set the point number, parameter number and offset for the point
parameter. Allocate space, assign a value, and set the type for
pntana1.PV */
Rgprmvd2[0].nPnt = rgprmnd2[0].nPnt;
Rgprmvd2[0].nPrm = rgprmnd2[0].nPrm;
Rgprmvd2[0].nPrmoffset = 1 /* Set
parameter offset to default value*/
Rgprmvd2[0].pupvValue = (PARvalue *)malloc(sizeof(DT_REAL));
Rgprmvd2[0].pupvValue->real = (float)42.0;
Rgprmvd2[0].nType = DT_REAL;
/* Set the point number, parameter number and offset for the point
parameter. Allocate space, assign a value, and set the type for
pntana1.DESC */
Rgprmvd2[1].nPnt = rgprmnd2[1].nPnt;
Rgprmvd2[1].nPrm = rgprmnd2[1].nPrm;
Rgprmvd2[1].nPrmoffset = 1 /* Set
parameter offset to default value*/
Rgprmvd2[1].pupvValue =
(PARvalue *)malloc(strlen("Funky description") + 1);
strcpy(rgprmvd2[1].pupvValue->text, "Funky description");
rgprmvd2[1].nType = DT_CHAR;
Diagnostics
See Diagnostics for Network API functions on page 375.
See also
rhsc_param_values_2 below
rhsc_param_value_put_bynames on page 318
rhsc_param_values_2
Read a list of point parameter values.
C Synopsis
int rhsc_param_values_2
(
char* szHostname,
int nPeriod,
int cprmvd,
PARAM_VALUE_DATA_2* rgprmvd2
);
VB Synopsis
rhsc_param_values_2(ByVal hostname As String,
ByVal period as Long,
ByVal num_requests as Long,
param_value_data_array()
As param_value_data_2) As Long
Arguments
Argument Description
Description
rhsc_param_values_2 is the replacement for the now deprecated rhsc_param_values.
Attention:
rhsc_param_values can only access points in the range: 1 <= point number <=
65,000.
If your system uses dynamic scanning, rhsc_param_values_2 calls from the Network API do
not trigger dynamic scanning.
Example
Read the value of pntana1.SP and pntana1.DESC.
int status;
int i;
POINT_NUMBER_DATA_2 rgpntnd2[] = {{'pntana1'}};
PARAM_NUMBER_DATA_2 rgprmnd2[] = {{0, 'SP'}, {0, 'DESC'}};
PARAM_VALUE_DATA_2 rgprmvd2[cprmvd];
/*
ALLOCATING MEMORY:
Sufficient memory must be allocated for each value union. If the
value type is not known, allocate memory for the largest possible
size of a PARvalue union. See below for an example of how to allocate
this memory.
If the data type is known, then allocate the exact amount of memory
to save space.
For example for DT_REAL values:
rgprmvd2[0].pupvValue = (PARvalue *) malloc(sizeof(DT_REAL));
*/
for (i=0; i<cprmvd; i++)
{
rgprmvd2[i].pupvValue = (PARvalue *)malloc(sizeof(PARvalue);}
status = rhsc_param_values_2('server1',
NADS_READ_CACHE, cprmvd, rgprmvd2);
switch (status)
{
case 0:
printf('rhsc_param_values_2 successful\n');
for (i=0; i<cprmvd; i++)
{
switch (rgprmvd2[i].nType)
{
case DT_CHAR:
printf('%s.%s has the value %s\n',
rgpntnd2[0].szPntName,
rgprmnd2[i].szPrmName,
rgprmvd2[i].pupvValue->text);
break;
case DT_INT2:
printf('%s.%s has the value %d\n',
rgpntnd2[0].szPntName,
rgprmnd2[i].szPrmName,
rgprmvd2[i].pupvValue->int2);
break;
case DT_INT4:
printf('%s.%s has the value %d\n',
rgpntnd2[0].szPntName,
rgprmnd2[i].szPrmName,
rgprmvd2[i].pupvValue->int4);
break;
case DT_REAL:
printf('%s.%s has the value %f\n',
rgpntnd2[0].szPntName,
rgprmnd2[i].szPrmName,
rgprmvd2[i].pupvValue->real);
break;
case DT_DBLE:
printf('%s.%s has the value %f\n',
rgpntnd2[0].szPntName,
rgprmnd2[i].szPrmName,
rgprmvd2[i].pupvValue->dble);
break;
case DT_ENUM:
printf('%s.%s has the ordinal value
%d and enum string %s\n',
rgpntnd2[0].szPntName,
rgprmnd2[i].szPrmName,
rgprmvd2[i].pupvValue->en.ord,
rgprmvd2[i].pupvValue->en.text);
break;
default:
printf('Illegal type found\n');
break;
}
}
break;
case NADS_PARTIAL_FUNC_FAIL:
printf('rhsc_param_values_2 partially failed\n');
/* Check fStatus flags to find out which ones failed. */
break;
default:
printf('rhsc_param_values_2 failed (c_geterrno() = 0x%x)\n',
status);
break;
}
free(rgprmvd2[i].pupvValue);
}
Diagnostics
See Diagnostics for Network API functions on page 375.
See also
rhsc_param_value_puts_2 on page 325
rhsc_param_value_put_bynames on page 318
rhsc_point_numbers_2
C/C++ Synopsis
int rhsc_point_numbers_2
(
char* szHostname,
int cpntnd,
POINT_NUMBER_DATA_2* rgpntnd2
);
VB Synopsis
rhsc_point_numbers_2(ByVal hostname As String,
ByVal num_requests As Long,
point_number_data_array()
As Point_Number_Data_2) As Long
Arguments
Argument Description
Argument Description
Description
rhsc_point_numbers_2 is the replacement for the now deprecated rhsc_point_numbers.
Attention:
rhsc_point_numbers can only access points in the range: 1 <= point number <=
65,000.
Example
Resolve the point names 'pntana1' and 'pntana2.'
int status;
int i;
POINT_NUMBER_DATA_2 rgpntnd2[] = {{'pntana1'},{'pntana2'}};
#define cpntnd sizeof(rgpntnd2)/sizeof(POINT_NUMBER_DATA_2)
switch (status)
{
case 0:
printf('rhsc_point_numbers_2 successful\n');
for (i=0; i<cpntnd; i++)
{
printf('%s has the point number %d\n',
rgpntnd2[i].szPntName,
rgpntnd2[i].nPnt);
}
break;
case NADS_PARTIAL_FUNC_FAIL:
printf('rhsc_point_numbers_2 partially failed\n');
/* Check fStatus flags to find out which ones failed. */
break;
default:
printf('rhsc_point_numbers_2 failed (c_geterrno() = 0x%x)\n',
status);
break;
}
Diagnostics
See Diagnostics for Network API functions on page 375.
rputdat
Store a list of fields to a user file.
C Synopsis
int rputdat(char *server,
int num_points,
rgetdat_data getdat_data[])
VB Synopsis
rputdat_int(ByVal server As String,
ByVal num_points As Integer,
getdat_int_data() As rgetdat_int_data_str) As Integer
rputdat_bits(ByVal server As String,
ByVal num_points As Integer,
putdat_bits_data() As rgetdat_bits_data_str) As Integer
rputdat_long(ByVal server As String,
ByVal num_points As Integer,
getdat_long_data() As rgetdat_long_data_str) As Integer
rputdat_float(ByVal server As String,
ByVal num_points As Integer,
getdat_float_data()
As rgetdat_float_data_str) As Integer
rputdat_double(ByVal server As String,
ByVal num_points As Integer,
getdat_double_data()
As rgetdat_double_data_str) As Integer
rputdat_str(ByVal server As String,
ByVal num_points As Integer,
getdat_str_data()
As rgetdat_str_data_str) As Integer
Arguments
Argument Description
Description
This function call enables fields from a user table to be changed. The fields to be accessed are
referenced by the members of the rgetdat_data structure (see below). The function accepts an
array of rgetdat_data structures thus providing the flexibility to set multiple fields with one
call. Note that the fields can be of different types and from different database files.
A successful return status from the rputdat call indicates that no network error were
encountered (that is, the request was received, processed and responded to). The status field
in each call structure must still be checked on return to determine the result of the individual
remote calls.
The structure of the rgetdat_data structure is defined in nif_types.h. This structure and its
members are defined as follows:
(in) Defines the type of data to be retrieved/stored, this will be one of the standard server
int2 data types. Namely using one of the following defines:
type RGETDAT_TYPE_INT2, RGETDAT_TYPE_INT4, RGETDAT_TYPE_REAL4,
RGETDAT_TYPE_REAL8, RGETDAT_TYPE_STR, RGETDAT_TYPE_BITS
int2
(in) Absolute database file number to retrieve/store field.
file
int2
(in) Record number in above file to retrieve/store field.
rec
int2
(in) Word offset in above record to retrieve/store field.
word
int2 (in) Start bit offset into the above word for the first bit of a bit sequence to be
start_ retrieved/stored. (that is, The bit sequence starts at: word + start_bit, start_bit=0 is the
bit first bit in the field.). Ignored if type not a bit sequence.
int2 (in) Length of bit sequence or string to retrieve/store, in characters for a string, in bits for
length a bit sequence. Ignored if type not a string or bit sequence.
int2 (in) Bit zero specifies the direction to read/write for circular files. (0 = newest record, 1
flags = oldest record)
(in/out) Value of field retrieved or value to be stored. When storing strings they must be
of the length given above. When strings are retrieved they become NULL terminated,
union
hence the length allocated to receive the string must be one more than the length
value
specified above. Bit sequences will start at bit zero and be length bits long. See below for
a description of the union types.
int2
(out) Return value of actual remote putdat/putdat call.
status
The union structure of the value member used in the rgetdat_data structure is defined in nif_
types.h. This structure and its members is defined as follows:
short
Two byte signed integer.
int2
long int4 Four byte signed integer.
float
Four byte IEEE floating point number.
real4
double
Eight byte (double precision) IEEE floating point number.
real8
Pointer to string to be stored. Note this string need not be NULL terminated, but must
char* str
be of the length specified by length (see rgetdat_data structure description above).
unsigned Two byte unsigned integer to be used to for bit sequences (partial integer). (Note the
short bits maximum length of a bit sequence is limited to 16.)
The program using this function must ensure that the size of the network packets generated do
not exceed the maximum packet size permitted on the network. To meet this requirement,
adhere to the following guideline:
(22 * number of fields) + sum of all string value lengths in bytes <4000
Diagnostics
See Diagnostics for Network API functions on page 375.
Backward-compatibility Functions
The following functions are available for backwards compatibility.
hsc_napierrstr
Lookup an error string from an error number. This function is provided for backward
compatibility.
C/C++ Synopsis
void hsc_napierrstr(UINT err, LPSTR texterr);
VB Synopsis
hsc_napierrstr(ByVal err As Integer) As String
Arguments
Argument Description
Diagnostics
This function will always return a usable string value.
rgethstpar_date
Retrieve history values for a Point based on date.
This function's synopsis and description are identical to that of 'rgethstpar_ofst.'
rgethstpar_ofst
Retrieve history values for a point based on offset.
C synopsis
int rgethstpar_date
(
char* server,
int num_gethsts,
rgethstpar_date_data* gethstpar_date_data
);
int rgethstpar_ofst
(
char* server,
int num_gethsts,
rgethstpar_ofst_data* gethstpar_ofst_data
);
VB synopsis
rgethstpar_date(ByVal server As String,
gethstpar_date_data
As rgethstpar_date_data_str) As Integer
rgethstpar_ofst(ByVal server As String,
gethstpar_ofst_data
As rgethstpar_ofst_data_str) As Integer
Arguments
Argument Description
Description
This function is provided for backwards compatibility. These functions can only access points
in the range: 1 <= point number <=65,000.
The functions rhsc_param_hist_dates_2 and rhsc_param_hist_offsets_2 should be used
instead.
Use this function to retrieve history values for points. The two types of history (based on time
or offset) are retrieved using the corresponding function variation. History will be retrieved
from a specified time or offset going backwards in time. The history values to be accessed are
referenced by the rgethst_date_data and rgethst_ofst_data structures (see below). The
functions accept an array of these structures, thus providing access to multiple point history
values with one function call.
Note that a successful return status from the rgethst call indicates that no network errors were
encountered (that is, the request was received, processed and responded to). The status field
in each call structure needs to be verified on return to determine the result of the individual
remote calls.
The structure of the rgethst_date_data structure is defined in nif_types.h. This structure and
its members are defined as follows:
(in) Defines the type of history to retrieve, this will be one of the standard server
uint2 hist_ history types. Namely using one of the following:
type HST_1MIN, HST_6MIN, HST_1HOUR, HST_8HOUR, HST_24HOUR, HST_
5SECF, HST_1HOURE, HST_8HOURE, HST_24HOURE
uint4 hist_ (in) Start date of history to receive in Julian days (number of days since 1st
start_date January 1981).
ureal4 hist_
(in) Start time of history to retrieve in seconds since midnight.
start_time
uint2 num_
(in) Number of history values per point to be retrieved.
hist
uint2 num_
(in) Number of points to be processed. MAXIMUM value allowed is 20.
points
uint2* point_ (in) Array (of dimension num_points) containing the point type/numbers of the
type_nums point history values to retrieve.
uint2* point_ (in) Array of (dimension num_points) containing the parameter numbers of the
params history values to retrive.
uchar* This member is no longer in use and is only retained for backwards compatibility.
archive path Instead, pass a zero length string.
real4* hist_ (out) Array (of dimension num_points * num_hist) to provide storage for the
values returned history values.
uint2 gethst_
(out) Return value of the actual remote gethst_date call.
status
The structure of the rgethst_ofst_data structure is defined in nif_types.h. This structure and its
members are defined as follows:
(in) Defines the type of history to retrieve, this will be one of the standard server history
uint2
types. Namely using one of the following defines: HST_1MIN, HST_6MIN, HST_
hist_
1HOUR, HST_8HOUR, HST_24HOUR, HST_5SECF, HST_1HOURE, HST_
type
8HOURE, HST_24HOURE
uint4
(in) Offset from latest history value in history intervals where offset=1 is the most
hist_
recent history value).
offset
uint2
num_ (in) Number of history values per point to be retrieved.
hist
uint2
num_ (in) Number of points to be processed. MAXIMUM value allowed is 20.
points
uint2*
point_ (in) Array (of dimension num_points) containing the point type/numbers of the point
type_ history values to retrieve.
nums
uint2*
(in) Array of (dimension num_points) containing the parameter numbers of the history
point_
values to retrive.
params
uchar*
This member is no longer in use and is only retained for backwards compatibility.
archive
Instead, pass a zero length string.
path
real4*
(out) Array (of dimension num_points * num_hist) to provide storage for the returned
hist_
history values.
values
uint2
gethst_ (out) Return value of the actual remote gethst_ofst call.
status
The program using this function call must ensure that the size of the network packets
generated does not exceed the maximum packet size permitted on the network. To meet this
requirement, adhere to the following guideline:
n For request packets for rgethst_date:
Diagnostics
See Diagnostics for Network API functions on page 375.
rgetpnt
Get point type/number by point name string.
C Synopsis
int rgetpnt
(
char* server,
int num_points,
rgetpnt_data* getpnt_data
);
VB Synopsis
rgetpnt (ByVal server As String,
ByVal num_points As Integer,
getpnt_data() As rgetpnt_data_str) As Integer
Arguments
Argument Description
Description
This function is provided for backwards compatibility. It cannot be used to access point
information for points on Process Controllers. This function can only access points in the
range: 1 <= point number <=65,000.
The rhsc_point_numbers_2 function should be used instead.
This function enables the point type/number to be resolved from the point name. Each point
name to be resolved is stored in a rgetpnt_data structure. The function accepts an array of
structures, thus enabling multiple point names to be resolved with one function call.
The structure of rgetpnt_data is defined in nif_types.h. This structure and its members are
defined as follows:
char* point_ (in) Pointer to a null terminated string containing the point name to be
name resolved into a point number.
uint2 point_
(out) Return value of the point type/number for the point named above.
type_num
uint2 getpnt_
(out) Return value of the actual remote getpnt call.
status
Note that a successful return status from the rgetpnt call indicates that no network errors,
were encountered (that is, the request was received, processed and responded to). The status
field in each call structure needs to be verified on return to determine the result of the
individual remote calls.
The program using this function call must ensure that the size of the network packets
generated does not exceed the maximum packet size permitted on the network. To meet this
requirement, adhere to the following guideline:
Diagnostics
See Diagnostics for Network API functions on page 375.
See also
rhsc_point_numbers_2 on page 336
rgetval_numb
Retrieve the value of a numeric point parameter.
This function's synopsis and description are identical to that of 'rgetval_hist.'
rgetval_ascii
Retrieve the value of an ASCII point parameter.
This function's synopsis and description are identical to that of 'rgetval_hist.'
rgetval_hist
Retrieve the value of a history point parameter.
C Synopsis
int rgetval_numb
(
char* server,
int num_points,
rgetval_numb_data* getval_numb_data
);
int rgetval_ascii
(
char* server,
int num_points,
rgetval_ascii_data* getval_ascii_data
);
int rgetval_hist
(
char* server,
int num_points,
rgetval_hist_data* getval_hist_data
);
VB Synopsis
rgetval_numb(ByVal server As String,
ByVal num_points As Integer,
getval_numb_data() As rgetval_numb_data_str)
As Integer
rgetval_ascii(ByVal server As String,
ByVal num_points As Integer,
getval_ascii_data() As rgetval_ascii_data_str)
As Integer
rgetval_hist(ByVal server As String,
ByVal num_points As Integer,
getval_hist_data() As rgetval_hist_data_str)
As Integer
Arguments
Argument Description
Description
This function is provided for backwards compatibility. It cannot be used to access point
information for points on Process Controllers. This function can only access points in the
range: 1 <= point number <=65,000.
The rhsc_param_values_2 function should be used instead.
This function call enables access to point parameter values. The three types of parameters
(numerical, ASCII and history) are accessed using the corresponding function variations. The
point parameters to be accessed are referenced in the rgetval_numb_data, rgetval_ascii_data
and rgetval_hist_data structures (see below). The functions accept an array of structures, thus
providing access to multiple point parameter values with one call.
The structure of rgetval_numb_data is defined in nif_types.h. This structure and its members
are defined as follows:
uint2
point_
(in) Defines the point type/number to be accessed.
type_
num
uint2 (in) Defines the point parameter to be accessed. (for example, process variable (PV),
point_ Mode (MD), Output (OP) or Set Point (SP). The definitions for all parameters are
param located in the parameters file.
real4
param_ (out) Value of the point parameter retrieved.
value
uint2
getval_ (out) The return value of the actual remote getval call.
status
The structure of rgetval_ascii_data is defined in nif_types.h. This structure and its members
are defined as follows:
uint2
point_
(in) Defines the point type/number to be accessed.
type_
num
uint2
(in) Defines the point parameter to be accessed (for example, description (DESC)). The
point_
definitions for all parameter types are located in the parameters file.
param
char* (out) NULL terminated string value of the point parameter. Note that this string can
param_ have a length of NIF_MAX_ASCII_PARAM_LEN +1 (for the termination), and that
value this amount of space must be allocated by the calling program.
uint2
param_ (out) Useful length of above param_value retrieved (in bytes).
len
uint2
getval_ (out) The return value of the actual remote getval call.
status
The structure of the rgetval_hist_data structure is defined in nif_types.h. This structure and its
members are defined as follows:
uint2
point_ (in) Defines the point type/number to be accessed.
type_num
uint2 (in) Defines the point parameter to be accessed (for example, 1 minute history,
point_ HST_1MIN). The definitions for all parameters are located in the parameters file.
param
uint2 hist_ (in) Offset from latest history value in history intervals to retrieve value, where hist_
offset offset=1 is the most recent history value.
real4
param_ (out) Value of the point parameter retrieved.
value
uint2
getval_ (out) The return value of the actual remote getval call.
status
Note that a successful return status from the rgetval call indicates that no network errors were
encountered (that is, the request was received, processed and responded to). The status field
in each call structure must still be checked on return to determine the result of the individual
remote calls.
The program using these function calls must ensure that the size of the network packets
generated does not exceed the maximum packet size permitted on the network. This
requirement can be met by adhering to the following guideline:
(12 * number of points) + sum of all string value lengths in bytes <4000
Diagnostics
See Diagnostics for Network API functions on page 375.
See also
rhsc_param_values_2 on page 330
rhsc_param_value_puts_2 on page 325
rgetpntval
Get the numeric parameter value.
This function's synopsis and description are identical to that of 'rgetpntval_ascii.'
rgetpntval_ascii
Get the ASCII parameter value.
VB Synopsis
rgetpntval(ByVal server As String,
ByVal point As String,
ByVal param As Integer,
Arguments
Argument Description
Description
This function is provided for backwards compatibility. It cannot be used to access point
information for points on Process Controllers. This function can only access points in the
range: 1 <= point number <=65,000.
The rhsc_param_values_2 function should be used instead.
RGETPNTVAL and RGETPNTVAL_ASCII provide VB interfaces to request a single
parameter value that has the data types Single and String respectively. These functions can
only be used to read one parameter value at a time. A function return of 0 is given if the
parameter value was successfully read; else an error code is returned.
Diagnostics
See Diagnostics for Network API functions on page 375.
rhsc_param_hist_dates
Attention:
rhsc_param_hist_offsets
Attention:
rhsc_param_hist_offsets is deprecated and may be removed in a future release. It
is provided compatibility purposes only. When used with an Experion server
release R400 or later rhsc_param_hist_offsets will only be able to access points
in the range: 1<= point number <= 65,000. The replacement function rhsc_
param_hist_offsets_2 should be used instead.
C/C++ Synopsis
int rhsc_param_hist_dates
(
char* server,
int num_gethsts,
rgethstpar_date_data* gethstpar_date_data
);
int rhsc_param_hist_offsets
(
char* server,
int num_gethsts,
rgethstpar_ofst_data* gethstpar_ofst_data
);
VB Synopsis
rhsc_param_hist_dates(ByVal server As String,
num_requests As Long,
gethstpar_date_data_array()
As gethstpar_date_data) As Long
rhsc_param_hist_offsets(ByVal server As String,
num_requests As Long,
gethstpar_ofst_data_array()
As gethstpar_ofst_data) As Long
Arguments
Argument Description
Description
Use this function to retrieve history values for points. The two types of history (based on time
or offset) are retrieved using the corresponding function variation. History will be retrieved
from a specified time or offset going backwards in time. The history values to be accessed are
referenced by the rgethst_date_data and rgethst_ofst_data structures (see below). The
functions accept an array of these structures, thus providing access to multiple point history
values with one function call.
Note that a successful return status from the rgethst call indicates that no network errors were
encountered (that is, the request was received, processed and responded to). The status field
in each call structure needs to be verified on return to determine the result of the individual
remote calls.
The structure of the rgethst_date_data structure is defined in nif_types.h. This structure and
its members are defined as follows:
(in) Defines the type of history to retrieve, this will be one of the standard server
uint2 hist_ history types. Namely using one of the following:
type HST_1MIN, HST_6MIN, HST_1HOUR, HST_8HOUR, HST_24HOUR, HST_
5SECF, HST_1HOURE, HST_8HOURE, HST_24HOURE
uint4 hist_ (in) Start date of history to receive in Julian days (number of days since 1st
start_date January 1981).
ureal4 hist_
(in) Start time of history to retrieve in seconds since midnight.
start_time
uint2 num_
(in) Number of history values per point to be retrieved.
hist
uint2 num_
(in) Number of points to be processed. MAXIMUM value allowed is 20.
points
uint2* point_ (in) Array (of dimension num_points) containing the point type/numbers of the
type_nums point history values to retrieve.
uint2* point_ (in) Array of (dimension num_points) containing the parameter numbers of the
params history values to retrive.
uchar* This member is no longer in use and is only retained for backwards compatibility.
archive path Instead, pass a zero length string.
real4* hist_ (out) Array (of dimension num_points * num_hist) to provide storage for the
values returned history values.
uint2 gethst_
(out) Return value of the actual remote gethst_date call.
status
The structure of the rgethst_ofst_data structure is defined in nif_types.h. This structure and its
members are defined as follows:
(in) Defines the type of history to retrieve, this will be one of the standard server
uint2 hist_ history types. Namely using one of the following defines:
type HST_1MIN, HST_6MIN, HST_1HOUR, HST_8HOUR, HST_24HOUR, HST_
5SECF, HST_1HOURE, HST_8HOURE, HST_24HOURE
uint4 hist_ (in) Offset from latest history value in history intervals where offset=1 is the most
offset recent history value).
uint2 num_
(in) Number of history values per point to be retrieved.
hist
uint2 num_
(in) Number of points to be processed. MAXIMUM value allowed is 20.
points
uint2* point_ (in) Array (of dimension num_points) containing the point type/numbers of the
type_nums point history values to retrieve.
uint2* point_ (in) Array of (dimension num_points) containing the parameter numbers of the
params history values to retrieve.
uchar* This member is no longer in use and is only retained for backwards compatibility.
archive path Instead, pass a zero length string.
real4* hist_ (out) Array (of dimension num_points * num_hist) to provide storage for the
values returned history values.
uint2 gethst_
(out) Return value of the actual remote gethst_date call.
status
The program using this function call must ensure that the size of the network packets
generated does not exceed the maximum packet size permitted on the network. To meet this
requirement, adhere to the following guideline:
n For request packets for rhsc_param_hist_dates:
(15 * number of history requests) + (2 * number of points requested)
+ string lengths of archive paths < 4000.
Diagnostics
See Diagnostics for Network API functions on page 375.
rhsc_param_value_puts
Attention:
rhsc_param_value_puts is deprecated and may be removed in a future release. It
is provided compatibility purposes only. When used with an Experion server
release R400 or later rhsc_param_value_puts will only be able to access points
in the range: 1<= point number <= 65,000. The replacement function rhsc_
param_value_puts_2 should be used instead.
C Synopsis
int rhsc_param_value_puts
(
char* szHostname,
int cprmvd,
PARAM_VALUE_DATA* rgprmvd
);
VB Synopsis
rhsc_param_value_puts (ByVal hostname As String,
ByVal num_requests As Long,
Param_value_data_array ()
As param_value_data) As Long
Arguments
Argument Description
Description
The structure of the PARAM_VALUE_DATA structure is defined in nif_types.h. This
structure and its members are defined as follows:
Example
Control pntana1's SP value to 42.0 and change its DESC to say 'Funky description.'
int status;
int i;
POINT_NUMBER_DATA rgpntnd[] = {{'pntana1'}};
PARAM_NUMBER_DATA rgprmnd[] = {{0, 'SP'},{0, 'DESC'}};
PARAM_VALUE_DATA rgprmvd[cprmvd];
rgprmnd[0].nPnt = rgpntnd[0].nPnt;
rgprmnd[1].nPnt = rgpntnd[0].nPnt;
status = rhsc_param_numbers("Server1", cprmnd, rgprmnd);
/* Set the point number, parameter number and offset for the point para-
meter. Allocate space, assign a value, and set the type for pntana1.PV */
rgprmvd[0].nPnt = rgprmnd[0].nPnt;
rgprmvd[0].nPrm = rgprmnd[0].nPrm;
rgprmvd[0].nPrmoffset = 1 /* Set
parameter offset to default value*/
/* Set the point number, parameter number and offset for the point para-
meter. Allocate space, assign a value, and set the type for pntana1.DESC
*/
rgprmvd[1].nPnt = rgprmnd[1].nPnt;
rgprmvd[1].nPrm = rgprmnd[1].nPrm;
rgprmvd[1].nPrmoffset = 1 /* Set
parameter offset to default value*/
rgprmvd[1].pupvValue =
(PARvalue *)malloc(strlen('Funky description') + 1); strcpy(rgprmvd
[1].pupvValue->text, 'Funky description');
rgprmvd[1].nType = DT_CHAR;
Diagnostics
See Diagnostics for Network API functions on page 375.
See also
rhsc_param_values below
rhsc_param_value_put_bynames on page 318
rhsc_param_values
Attention:
rhsc_param_values is deprecated and may be removed in a future release. It is
provided compatibility purposes only. When used with an Experion server release
R400 or later rhsc_param_values will only be able to access points in the range:
1<= point number <= 65,000. The replacement function rhsc_param_values_2
should be used instead.
C Synopsis
int rhsc_param_values
(
char* szHostname,
int nPeriod,
int cprmvd,
PARAM_VALUE_DATA* rgprmvd
);
VB Synopsis
rhsc_param_values (ByVal hostname As String,
ByVal period as Long,
ByVal num_requests as Long,
param_value_data_array()
As param_value_data) As Long
Arguments
Argument Description
Argument Description
Experion cache, then that value will be returned. Otherwise the controller will be
polled for the latest value. Use the constant NADS_READ_DEVICE if you want
to force Experion to re-poll the controller. The subscription period will not be
applied to standard point types.
cprmvd (in) The number of parameter values requested.
(in/out) Pointer to an array of PARAM_VALUE_DATA structures (one array
rgprmvd
element for each request).
Description
The structure of the PARAM_VALUE_DATA structure is defined in nif_types.h. This
structure and its members are defined as follows:
If your system uses dynamic scanning, rhsc_param_values calls from the Network API do
not trigger dynamic scanning.
RHSC_PARM_VALUES requests a list of point parameter values from the specified remote
server. A function return of 0 is given if the parameter values were successfully read else an
error code is returned.
You can read a list of parameter values with different types using a single request. Each point
parameter value is placed into a union (of type PARvalue). Before making the request, you
must allocate sufficient memory for each value union. You must free this memory before
exiting your Network application.
A successful return status from the rhsc_param_values call indicates that no network errors
were encountered (that is, the request was received, processed, and responded to). If the
returned value is NADS_PARTIAL_FUNC_FAIL, then at least one request (and possibly all
requests) failed. The status field of each array element should be checked to find which
request failed.
The program using this function call must ensure that the size of the network packets
generated do not exceed the maximum packet size permitted on the network.
Due to the ability to acquire a list of parameters of mixed data type, it is difficult to give
generic limits. To meet the program requirement not to exceed the maximum packet size
permitted, adhere to the following guidelines given for a number of specific cases:
n For ALL request packets:
(8 * number of point parameters) < 4000
Example
Read the value of pntana1.SP and pntana1.DESC.
int status;
int i;
POINT_NUMBER_DATA rgpntnd[] = {{'pntana1'}};
PARAM_NUMBER_DATA rgprmnd[] = {{0, 'SP'}, {0, 'DESC'}};
PARAM_VALUE_DATA rgprmvd[cprmvd];
/*
ALLOCATING MEMORY:
Sufficient memory must be allocated for each value union. If the
value type is not known, allocate memory for the largest possible
size of a PARvalue union. See below for an example of how to allocate
this memory.
If the data type is known, then allocate the exact amount of memory
to save space.
For example for DT_REAL values:
rgprmvd[0].pupvValue = (PARvalue *) malloc(sizeof(DT_REAL));
*/
for (i=0; i<cprmvd; i++)
{
rgprmvd[i].pupvValue = (PARvalue *)malloc(sizeof(PARvalue);
}
status = rhsc_param_values('server1',
NADS_READ_CACHE, cprmvd, rgprmvd);
switch (status)
{
case 0:
printf('rhsc_param_values successful\n');
for (i=0; i<cprmvd; i++)
{
switch (rgprmvd[i].nType)
{
case DT_CHAR:
printf('%s.%s has the value %s\n',
rgpntnd[0].szPntName,
rgprmnd[i].szPrmName,
rgprmvd[i].pupvValue->text);
break;
case DT_INT2:
printf('%s.%s has the value %d\n',
rgpntnd[0].szPntName,
rgprmnd[i].szPrmName,
rgprmvd[i].pupvValue->int2);
break;
case DT_INT4:
printf('%s.%s has the value %d\n',
rgpntnd[0].szPntName,
rgprmnd[i].szPrmName,
rgprmvd[i].pupvValue->int4);
break;
case DT_REAL:
printf('%s.%s has the value %f\n',
rgpntnd[0].szPntName,
rgprmnd[i].szPrmName,
rgprmvd[i].pupvValue->real);
break;
case DT_DBLE:
printf('%s.%s has the value %f\n',
rgpntnd[0].szPntName,
rgprmnd[i].szPrmName,
rgprmvd[i].pupvValue->dble);
break;
case DT_ENUM:
printf('%s.%s has the ordinal value
%d and enum string %s\n',
rgpntnd[0].szPntName,
rgprmnd[i].szPrmName,
rgprmvd[i].pupvValue->en.ord,
rgprmvd[i].pupvValue->en.text);
break;
default:
printf('Illegal type found\n');
break;
}
}
break;
case NADS_PARTIAL_FUNC_FAIL:
printf('rhsc_param_values partially failed\n');
/* Check fStatus flags to find out which ones failed. */
break;
default:
printf('rhsc_param_values failed (c_geterrno() = 0x%x)\n', status);
break;
}
Diagnostics
See Diagnostics for Network API functions on page 375.
See also
rhsc_param_value_puts on page 355
rhsc_param_value_put_bynames on page 318
rhsc_param_numbers
Attention:
rhsc_param_numbers is deprecated and may be removed in a future release. It is
provided compatibility purposes only. When used with an Experion server release
R400 or later rhsc_param_numbers will only be able to access points in the
range: 1<= point number <= 65,000. The replacement function rhsc_param_
numbers_2 should be used instead.
C Synopsis
int rhsc_param_numbers(char* szHostname,
int cprmnd,
PARAM_NUMBER_DATA* rgprmnd);
VB Synopsis
rhsc_param_numbers(ByVal hostname As String,
ByVal num_requests As Long,
param_number_data_array() As
param_number_data) As Long
Arguments
Argument Description
Description
The structure of the PARAM_NUMBER_DATA structure is defined in nif_types.h. This
structure and its members are defined as follows:
Example
Resolve the parameter names 'pntana1.SP' and 'pntana1.DESC.'
int status;
int i;
POINT_NUMBER_DATA rgpntnd[] = {{'pntana1'}};
PARAM_NUMBER_DATA rgprmnd[] = {{0, 'SP'},{0, 'DESC'}};
Diagnostics
See Diagnostics for Network API functions on page 375.
See also
rhsc_point_numbers below
rhsc_point_numbers
Attention:
rhsc_point_numbers is deprecated and may be removed in a future release. It is
provided compatibility purposes only. When used with an Experion server release
C/C++ Synopsis
int rhsc_point_numbers
(
char* szHostname,
int cpntnd,
POINT_NUMBER_DATA* rgpntnd
);
VB Synopsis
rhsc_point_numbers(ByVal hostname As String,
ByVal num_requests As Long,
POINT_NUMBER_DATA_array()
As POINT_NUMBER_DATA) As Long
Arguments
Argument Description
Description
The structure of the POINT_NUMBER_DATA structure is defined in nif_types.h. This
structure and its members are defined as follows:
Example
Resolve the point names 'pntana1' and 'pntana2'.
int status;
int i;
POINT_NUMBER_DATA rgpntnd[] = {{'pntana1'},{'pntana2'}};
#define cpntnd sizeof(rgpntnd)/sizeof(POINT_NUMBER_DATA)
switch (status)
{
case 0:
printf('rhsc_point_numbers successful\n');
for (i=0; i<cpntnd; i++)
{
printf('%s has the point number %d\n',
rgpntnd[i].szPntName,
rgpntnd[i].nPnt);
}
break;
case NADS_PARTIAL_FUNC_FAIL:
printf('rhsc_point_numbers partially failed\n');
/* Check fStatus flags to find out which ones failed. */
break;
default:
printf('rhsc_point_numbers failed (c_geterrno() = 0x%x)\n', status);
break;
}
Diagnostics
See Diagnostics for Network API functions on page 375.
rputpntval
Set the numeric parameter value.
This function's synopsis and description are identical to that of 'rputpntval_ascii.'
rputpntval_ascii
Set the ASCII parameter value.
VB Synopsis
rputpntval(ByVal server As String,
ByVal point As String,
ByVal param As Integer,
value As Single) As Integer
rputpntval_ascii(ByVal server As String,
ByVal point As String,
ByVal param As Integer,
value As String) As Integer
Arguments
Argument Description
Argument Description
Description
This function is provided for backwards compatibility. It cannot be used to access point
information for points on Process Controllers. This function can only access points in the
range: 1 <= point number <=65,000.
Diagnostics
See Diagnostics for Network API functions on page 375.
rputval_hist
Store history values.
This function's synopsis and description are identical to that of 'rputval_ascii.'
rputval_numb
Store the value of numeric point parameters.
This function's synopsis and description are identical to that of 'rputval_ascii.'
rputval_ascii
Store the value of ASCII point parameters.
C/C++ Synopsis
int rputval_numb
(
char* server,
int num_points,
rputval_numb_data* putval_numb_data
);
int rputval_ascii
(
char* server,
int num_points,
rputval_ascii_data* putval_ascii_data
);
int rputval_hist
(
char* server,
int num_points,
rputval_hist_data* putval_hist_data
);
VB Synopsis
rputval_numb(ByVal server As String,
ByVal num_points As Integer,
putval_numb_data() As rputval_numb_data_str)
As Integer
rputval_ascii(ByVal server As String,
ByVal num_points As Integer,
putval_ascii_data() As rputval_ascii_data_str)
As Integer
rputval_hist (ByVal server As String,
ByVal num_points As Integer
putval_hist_data() As rputval_hist_str)
As Integer
Arguments
Argument Description
Description
This function is provided for backwards compatibility. It cannot be used to access point
information for points on Process Controllers. This function can only access points in the
range: 1 <= point number <=65,000.
The rhsc_param_value_puts_2 function should be used instead.
This function call enables access to point parameter values. The three types of parameters
(numerical, ASCII, and history) are accessed using the corresponding function variations. The
point parameters to be accessed are referenced by the members of the rputval_numb_data,
rputval_ascii_data, and rputval_hist_data structures (see below). The functions accept an
array of structures, thus providing access to multiple point parameter values with one call.
The structure of the rputval_numb_data structure is defined in nif_types.h. This structure and
its members are defined as follows:
n_ushort
point_ (in) Defines the point type/number to be accessed.
type_num
n_ushort (in) Defines the point parameter to be accessed (for example, process variable (PV),
point_ Mode (MD), output (OP) or set point (SP)). The definitions for parameter type are
param located in the parameters file.
n_float
param_ (out) Value of point parameter to be stored.
value
n_short
putval_ (out) The return value of the actual remote putval call.
status
The structure of the rputval_ascii_data structure is defined in nif_types.h. This structure and
its members is defined as follows:
n_ushort
point_type_ (in) Defines the point type/number to be accessed.
num
n_ushort (in) Defines the point parameter to be accessed (for example, description
point_param (DESC)). The definitions for parameter type are located in the parameters file.
n_char* (in) ASCII string value of point parameter to be stored (Note this does not need to
param_value be null terminated).
uint2
(in) Length of above param_value to be stored (in bytes).
param_len
n_ushort
(out) The return value of the actual remote putval call.
putval_status
The structure of the rputval_hist_data structure is defined in nif_types.h. This structure and its
members is defined as follows:
uint2
point_ (in) Defines the point type/number to be accessed.
type_num
uint2
(in) Defines the point parameter to be accessed (for example, 1 minute history
point_
(HST_1MIN)). The definitions for parameter type are located in the parameters file.
param
uint2 hist_ (in) Offset from latest history value in history intervals to store value (Where hist_
Note that a successful return status from the rputval call indicates that no network error was
encountered (that is, the request was received, processed, and responded to). The status field
in each call structure needs to be verified on return to determine the result of the individual
remote calls.
The program using these function calls must ensure that the size of the network packets
generated do not exceed the maximum packet size permitted on the network. This
requirement can be met by adhering to the following guideline:
(12 * number of points) + sum of all string value lengths in bytes <4000
Diagnostics
See Diagnostics for Network API functions below.
attempting to read from a process point parameter if the CDA service has been stopped on the
primary server. It may also occur if a field device fails to respond at all, or before the timeout
period, when performing a control.
M4_GDA_COMMS_ERROR (0x8153)
There has been a communications error. See the log file for further details. This may occur
when accessing a remote point if the remote server is offline or failing over. You may also see
this error when accessing a flexible point.
M4_GDA_COMMS_WARNING (0x8154)
There has been a communications warning.
M4_GDA_ERROR (0x8150)
There has been an error reported by the data access subsystem. See the log file for further
details. This may occur when accessing a remote point (on another server) or a flexible point.
M4_INV_PARAMETER (0x8232)
There was an attempt to access a parameter either by name or by parameter number, but the
point does not have a parameter by that name or number.
M4_INV_POINT (0x8231)
There was an attempt to access a point either by name or by point number, but that point
name or number does not exist.
M4_PNT_ON_SCAN (0x8212)
There was an attempt to write to a read-only parameter of a non-process point while it was on
scan.
M4_SYSTEM_OFFLINE (0x83fc)
The system is offline.
NADS_ARRAY_DIM_ERROR (0x83A0)
A VB array has been dimensioned with an incorrect number of dimensions. The API expects
all arrays to be single dimensioned.
NADS_ARRAY_INVALID_ELEMENT_SIZE (0x83A1)
There is a mismatch between the size of the elements passed to the API and the size of
elements expected by the API. Ensure that you have not modified any byte-alignment settings
in Visual Basic.
NADS_ARRAY_OVERFLOW (0x839F)
A VB array passed to the API is not large enough to contain the information requested.
NADS_AUTHORIZATION_FAIL (0x83A6)
The user who is logged in has insufficient scope of responsibility to perform the request.
NADS_BAD_POINT_PAR (0x838C)
A bad point parameter value was sent or received.
NADS_CLOSE_ERR (0x8394)
A network error occurred. The network socket could not be closed correctly.
NADS_GLOBAL_ALLOC_FAIL (0x8396)
The system was unable to allocate enough memory to perform the requested operation. Close
any unnecessary running application to free more memory.
NADS_GLOBAL_LOCK_FAIL (0x8395)
An internal error occurred. The system was unable to access internal memory.
NADS_HOST_ER (0x8392)
The server name specified was not recognized. Check the hosts file and DNS settings.
NADS_HOST_MISMATCH (0x8388)
Retries exhausted and last reply was from the wrong host.
NADS_HOST_NOT_PRIMARY (0x8398)
The host is in redundant backup mode.
NADS_INCOMPLETE_HEADER (0x8387)
Retries exhausted and last reply was a runt packet.
NADS_INIT_ER (0x8390)
An internal error occurred. The system was unable to initialize correctly. Restart your
application.
NADS_INVALID_LIST_SIZE (0x839B)
The number of requests specified when calling the function was less than 1 and is invalid.
NADS_INVALID_PROT (0x838E)
An internal error occurred. An unknown network protocol was specified.
NADS_INVALID_STATUS (0x8397)
An internal error occurred. The server returned an invalid status.
NADS_NO_DLL (0x838D)
An internal error occurred. No network dll could be found.
NADS_NO_SUCH_FUNC (0x8384)
The remote server being contacted does not support the requested function.
NADS_NO_SUCH_VERS (0x8383)
The remote server being contacted does not support the requested version for the function
concerned.
NADS_PARTIAL_FUNC_FAIL (0x839A)
Warning that at least one request (and possibly all requests) in the list has returned its status in
error.
NADS_PORT_MISMATCH (0x8389)
Retries exhausted and last reply was from the wrong protocol port.
NADS_RCV_TIMEOUT (0x8386)
The request timed out while waiting for the reply. Check network connections and that the
server is running.
NADS_REQ_COUNT_MISMATCH (0x839C)
An internal error occurred. The number of requests sent by the Client and received by the
Server do not match.
NADS_RX_BUFFER_EMPTY (0x8382)
An internal error occurred. A pull primitive has failed due to the NADS Stream receive buffer
being empty.
NADS_RX_ERROR (0x8393)
An internal error occurred. A message was not received.
NADS_SOCK_ER (0x8391)
An internal error occurred. The socket count could not be opened.
NADS_TRANS_ID_MISMATCH (0x838A)
Retries exhausted and last reply was from an obsolete request.
NADS_TX_BUFFER_FULL (0x8381)
A push primitive has failed due to the NADS Stream transmit buffer being full.
NADS_TX_ER (0x838F)
The API failed to transmit a message.
NADS_VAR_TYPE_MISMATCH (0x839D)
The VARIANT data type used in VB does not match the requested type of the PARvalue
union in C.
NADS_WRITES_DISABLED (0x83a4)
Writes via the Network API have been disabled. For more information, see Disable writes
via Network API in “Security tab, server wide settings” in the Server and Client
Configuration Guide.
NADS_WRONG_PROGRAM (0x8385)
The remote server being contacted has a NADS program number assignment other than that
specified in the request.
NADS_WRONG_PORT (0x83A5)
A write request was received on the read port, or a read request was received on the write
port.
Notes
n In Visual Basic, choose ProjectReferences, and select HSC Server Automation
Model 1.0 from the list.
n The Server object is the only object that can be directly created with the Visual Basic
CreateObject function or the 'New' keyword.
n You must only create one Server object and cache its existence, although you can make
copies of it.
n The Server object can only be created on a server if the database is loaded.
n An application that uses the Server Automation model can be run as:
l An application with an allocated LRN. This is subject to the same security measures
as any other application.
l A utility on the server. This requires physical access to the server.
Applicable documentation
See the Server Scripting Reference.
Example
This example shows how to create the Server object.
Set objServer = CreateObject("HSCAutomationServer.Server")
Notes
n The Application object is the only object that can be directly created with the Visual
Basic CreateObject function or the 'New' keyword.
n DSP displays are represented by the Station Object Model on page 384.
Applicable documentation
See the HMIWeb Display Building Guide.
Example
This example shows how to create the top-level object (Application) of the HMIWeb Object
Model.
Set objStationApp = CreateObject("Station.Application")
Once created, the application can then control Station through the object variable
objStationApp. For example, to instruct Station to call up a display called
'CompressorStatus', the application would use the following code.
objStationApp.CurrentPage = CompressorStatus
Notes
n The sample Visual Basic project for an SSO.vbp provides the framework for
implementing an SSO. (The project and associated components are zipped into SSO_
Sample.zip. This file is located in Station\Samples.)
n Every SSO must implement a detach method. See 'Implementing a Detach method.'
Applicable documentation
See the HMIWeb Display Building Guide.
Creating an SSO
To create an SSO
1. Open the sample SSO project in Visual Basic.
2. Change the Project name to something appropriate, which is unique.
When you change the name, the ProgID also changes (The ProgID is of the form
ProjectName.ClassName.) For example, if you change the project name to
OperStations, the ProgId will change to OperStations.clsSSO.
3. Write your scripts.
The sample SSO contains some simple code that adds entries to the Dictionary object,
and displays a message box when Station connects to the server.
4. Compile the SSO by choosing FileMake SSO.dll. If there are any errors, you must fix
them before moving onto the next step.
5. For each Station that needs the SSO:
a. Copy the SSO to the Station computer and register it. See Registering an SSO on
the next page. (You can skip this step if you compiled the SSO on the computer
because it automatically registers itself if the compilation is successful.)
b. Choose StationConnection Properties.
The Connection Properties dialog box opens.
c. Click the Scripting tab.
d. Click Add to add a new entry in the Station scripting objects list and type the
Registering an SSO
You must register an SSO on each Station computer that needs to use it. (Unless you have
compiled it on the computer.)
To register an SSO
1. Copy the SSO to the computer.
2. Open a Command Prompt window.
3. Type regsvr32 SsoName .dll , where SsoName is the name of the SSO (including its
path).
You may use this method to initialize a global variable in your SSO that it references to
Station's Application object.
Notes
n Except for DSP displays and earlier versions of Station, the Station Object Model has
been superseded by the HMIWeb Object Model on page 380.
n In order to control DSP displays, you must first create Station using the Application
object of the HMIWeb Object Model on page 380 (see HMIWeb Object Model on
page 380). After creating the Application object, you can then control DSP displays
using the Station Object Model.
Applicable documentation
See the Display Building Guide.
Example
This example shows how to call up the Alarm Summary, a DSP display whose display
number is 5. (The variable, objStationApp, represents Station, which has already been
created using the Application object of the HMIWeb Object Model.)
objStationApp.CurrentPage = 5
Glossary
accumulator point
A point type used to represent counters. Information contained in the accumulator point can
include: the raw value, a process value, a rollover value, a scale factor, and a meter factor.
acronym
An acronym is a text string that is used to represent a state or value of a point in a display.
From an operator's point of view, it much easier to understand the significance of an acronym
such as 'Stopped', compared with an abstract value such as '0'.
action algorithm
One of two types of algorithm you can assign to a point in order to perform additional
processing to change point parameter values. An action algorithm performs an action when
the value of the PV changes. Contrast with PV algorithm.
ActiveX
COM-based technology for creating objects and components.
ActiveX component
An ActiveX component is a type of program designed to be called up from other applications,
rather than being executed independently. An example of an ActiveX component is a custom
dialog box, which works in conjunction with scripts, to facilitate operator input into Station.
Activity
A series of actions (with a start time and an end time) that occur in a plant. The term provides
a market-neutral entity that can represent products such as batches, movement automation,
and procedural operations.
Activity Entity
An object from which an activity can be created (e.g., RCM or SCM for batch/procedure
activities). Also known as Recipe.
ADO
Active Data Object.
alarm
An indication (visual and/or audible) that alerts an operator at a Station of an abnormal or
critical condition. Each alarm has a type and a priority. Alarms can be assigned either to
individual points or for system-wide conditions, such as a controller communications failure.
Alarms can be viewed on a Station display and included in reports. Experion classifies alarms
into the following types:
n PV Limit
n Unreasonable High and Unreasonable Low
n Control Failure
n External Change
alarm/event journal
A file that records all alarms and events. It is accessed to generate reports and can also be
archived to off-line media.
alarm priority
One of four levels of severity specified for the alarm. The alarm priorities from least to most
severe are:
n Journal
n Low
n High
n Urgent
Note that if critical alarm support has been enabled, urgent priority alarms with a sub priority
of 15 will be shown as critical priority alarms on the Alarm Summary and other displays but
the priority and subpriority will remain as configured for Experion APIs.
algorithm
See point algorithm.
analog point
A point type that is used to represent continuous values that are either real or integer.
Continuous values in a process could be: pressure, flow, fill levels, or temperature.
ANSI
American National Standards Institute
API
Application Programming Interface
application program
A user-written program integrated into Experion using the Application Programming
Interface (API).
asset
A logical sub-section of your plant or process. Custom displays, points, and access
configuration may be associated with an asset. Operators and Stations can be assigned access
to particular assets only.
automatic checkpointing
In a redundant server system, automatic checkpoint is the automatic transfer of database
updates from the primary server to the backup server.
auxiliary parameter
An analog point parameter in addition to PV, SP, OP, and MD. Up to four auxiliary
parameters can be used to read and write four related values without having to build extra
points.
bad value
A parameter value, (for example, PV), that is indeterminate, and is the result of conditions
such as unavailable input.
Client software
An umbrella term covering Experion Quick Builder, Station, and Display Builder software.
channel
The communications port used by the server to connect to as controller. Channels are defined
using the Quick Builder tool.
CIM
Communications Interface Module
collection
A collection is a set of named values or display objects that are used in scripts.
COM
Component Object Model
control failure alarm
For analog and status points, an alarm configured to trigger when an OP, SP, MD, or a
parameter control is issued and a demand scan on the source address, performed by the
server, finds their value does not match the controlled value.
control level
A security designation assigned to a point that has a destination address configured (for
analog or status points only). A control level can be any number from 0 to 255. An operator
will be able to control the point only if they have been assigned a control level equal to, or
higher than, the point control level.
control parameters
Point parameters defined to be used as a control. A control parameter has both a source and a
destination address. The destination for the parameter value is usually an address within the
controller. Control parameters can be defined as automatic (server can change) or manual
(operator can change).
controller
A device that is used to control and monitor one or more processes in field equipment.
Controllers include Programmable Logic Controllers (PLCs), loop controllers, bar code
readers, and scientific analyzers.
Controllers can be defined using the Quick Builder tool. Some controllers can be configured
using Station displays.
database controller
See User Scan Task controller.
database point
Any point that has one or more parameters with database addresses.
DCD
Data Carry Detect
DCS
Digital Control System
DDE
Dynamic Data Exchange
default
The value that an application automatically selects if the user does not explicitly select another
value.
deleted items
In Quick Builder, an item that has been flagged for deletion from the server database and
appears in the Deleted grouping. When a download is performed, the item is deleted from
both the server database and the Quick Builder project database.
demand scan
A one-time-only scan of a point parameter that can be requested either by an operator, a
report, or an application.
DHCP
Dynamic Host Configuration Protocol
display
Station uses displays to present Experion information to operators in a manner that they can
understand. The style and complexity of displays varies according to the type of information
being presented.
Displays are created in Display Builder.
Display Builder
The Honeywell tool for building customized graphical displays representing process data.
display object
A display object is a graphic element, such as an alphanumeric, a pushbutton or a rectangle,
in a display.
Display objects that represent point information (such as an alphanumeric) or issue commands
(such as a pushbutton) are called 'dynamic' display objects.
Distributed System Architecture (DSA)
An option that enables multiple Experion servers to share data, alarms, and history without
the need for duplicate configuration on any server.
DNS
Domain Name System
DSR
Data Signal Ready
DTE
Data Terminal Equipment
DTR
Data Terminal Ready
dual-bit status point
A status point that reads two bits. Status points can read one, two or three bits.
EIM
Ethernet Interface Module
ELPM
Ethernet Loop Processor Module
EMI
Electromagnetic Interference
event
A significant change in the status of an element of the system such as a point or piece of
hardware. Some events have a low, high, or urgent priority, in which case they are further
classified as alarms. Events can be viewed in Station and included in reports.
Within the context of scripts (created in Display Builder and used in Station), an event is a
change in system status or an operator-initiated action that causes a script to run.
Event Archiving
Event Archiving allows you to archive events to disk or tape, where they may be retrieved if
needed.
EXE
Executable.
exception scan
A scan that takes place only when a change occurs at a controller address configured for a
point parameter. Some controllers can notify the server when a change occurs within the
controller. The server uses exception polling to interrogate the controller for these changes.
This type of scan can be used to reduce the scanning load when a fast periodic scan is not
required.
export
In relation to Station displays, this refers to the process of registering a display with the server
so that it can be called up in Station.
In relation to Quick Builder, this refers to the process of converting the configuration data in a
project file into text files for use with other applications.
Extended history
A type of history collection that provides snapshots of a point at a designated time interval
that can be:
n 1-hour snapshots
n 8-hour snapshots
n 24-hour snapshots
Fast history
An type of history that provides a 5-second snapshot history for points.
field address
The address within the controller that contains stored information from a field device being
monitored by the controller.
free format report
An optional report type that enables users to generate their own report.
FTP
File Transfer Protocol
group
A group of up to eight related points whose main parameter values appear in the same group
display. Sometimes called 'operating group'.
history
Point values stored to enable tracking and observation of long-term trends. Analog, status,
and accumulator point PVs can be defined to have history collected for them. Three types of
history collection are available:
n Standard
n Extended
n Fast
history gate
A status point parameter that is used to control the collection of history for an analog or status
point. The history is only collected if the gate state value of the nominated parameter is in the
nominated state.
host server
In a DSA system, the server on which a remote point's definition is stored and from which
alarms form the point originate.
HTTP
Hypertext Transfer Protocol
IDE
Integrated Development Environment.
IEEE
Institute of Electrical and Electronic Engineers
input value
Values that are usually scanned from the controller registers but can be from other server
addresses. Input values can represent eight discrete states. Up to three values can be read from
an address in order to determine a state.
IRQ
Interrupt Request
item
In Quick Builder, the elements necessary for data acquisition and control that comprise the
Experion server data and are defined in the project file. These are:
n Channels
n Controllers
n Stations
n Points
n Printers
item grouping
A collection of items grouped by a common property.
item list
In Quick Builder, a listing of the items defined in the project file that displays in every Project
View. The item list can be used to find an item and then display its properties.
item number
Item numbers are used in the server database to identify items. In Quick Builder, the number
is assigned to an item internally. The item numbers for channels, controllers, Stations and
printers can be overwritten in Quick Builder to match an existing system database.
local display object
A dynamic display object that displays information or issues a command, but which is not
linked to the server. Such display objects are used in conjunction with scripts.
local server
The server to which the Station is connected.
MCI
Media Control Interface
MD
Experion abbreviation for mode.
method
A programmatic means of controlling or interrogating the Station Automation object model. A
method is equivalent to the terms 'function' or 'command' used in some programming
languages.
Microsoft Excel Data Exchange
A network option that can be used to capture the most recent point and history information in
the server and display it in Microsoft Excel spreadsheets, primarily for reporting.
Mode
A point parameter which determines whether or not the operator can control the point value.
For example, in a status point, the mode determines whether the operator can control the
output value, and in an analog point the mode determines the control of the set point. If the
mode is set to manual, the operator can change the value.
Network Node controller
A server running the system software defined as a controller to another server running the
system software. The local server can scan and control points that have been defined in the
remote Network Node controller as long as those points have also been defined in the local
server. The Network Node option is provided for backward compatibility.
ODBC
See Open Database Connectivity.
ODBC driver
A driver that processes ODBC (Open Database Connectivity) calls, queries the database, and
returns the results. See also Open Database Connectivity.
OP
Experion abbreviation for output.
OPC
OPC stands for OLE (Object Linking & Embedding) for Process Control. It is a set of
standards to facilitate interoperability between applications within the Process Control
Industry. These include automation/control applications, field systems/devices or
business/office applications.
OPC specifies a standard interface to be used between two types of applications called OPC
clients and OPC servers. An OPC server is an application which collects data, generally
directly from a physical device, and makes it accessible through the OPC interface. An OPC
client requests and uses the data provided by an OPC Server. By having a standard interface
OPC clients and servers written by different vendors can communicate.
Open Database Connectivity
A standard set of function calls for accessing data in a database. These calls include the
facility to make SQL (Structured Query Language) queries on the database. To use ODBC
you must have support from the client application (for example, Microsoft Access) which will
generate the ODBC calls and from some database-specific software called an ODBC driver.
operator ID
A unique identification assigned to each operator. If Operator-Based security is enabled, the
operator must use this ID and a password to sign on to a Station.
operator password
A character string (not echoed on screen) used with the operator ID to sign on to a Station.
operator security level
See security level.
Operator-based security
Operator-based security comprises an operator ID and password, which must be entered at a
Station in order to access Experion functions.
output
A point parameter used to issue control values. The output (OP) is often related to the mode
(MD) parameter and can be changed by an operator only if the mode is manual.
parameter
The different types of values accessed by points are known in Experion as 'point parameters.'
Experion can store and manage multiple values in the one point. You can therefore use a
single point to monitor and control a complete loop.
The names of the parameters reflect their most common usage. They can, however, be used to
hold any controller values.
periodic scan
A defined regular interval in which the server acquires information from the controller and
processes the value as a point parameter. The scan period must be defined in Quick Builder
for each point source parameter value.
PIN
Plant Information Network
PLC
Programmable logic controller
point
A data structure in the server database, usually containing information about a field entity. A
point can contain one or more parameters.
point algorithm
A prescribed set of well-defined rules used to enhance a point's functionality. The point
algorithm accomplishes this by operating on the point data either before or after normal point
processing.
There are two types of point algorithms, PV (processed every time the point parameter is
scanned) and Action (processed only when a point parameter value changes).
point detail display
A display that shows the current point information. Each point has a Point Detail display.
primary server
This is the PC that normally runs the database software, performs processing tasks, and
allocates resources to client PCs. If the primary server is unavailable, the secondary server
takes over until it is available again.
process variable
An actual value in a process: a temperature, flow, pressure, and so on. Process variables may
be sourced from another parameter and may also be calculated from two or more measured or
calculated variables using algorithms.
programmable logic controller (PLC)
A control and monitoring unit that connects to a field device and controls low-level plant
processes with very high-speed responses. A PLC usually has an internal program that scans
the PLC input registers and sets the output registers to the values determined by the program.
When connected to the server, the input and output values stored in the PLC registers can be
referenced, and the server can read and write to these memory addresses.
project
In Quick Builder, a working database file that enables you to make changes to the server
database without affecting the configuration data that is currently being used to run the
system.
project view
In Quick Builder, a window in which you can view, add, and modify any items in the current
project file.
property
An attribute or characteristic of an object within the Station Automation object model. For
example, a display object has properties that define its height, width and color.
property tab
In Quick Builder, a tab in the Project View window that displays information about the
currently selected item or items. Most of the information displayed can be modified.
PV
Experion abbreviation for process variable.
PV algorithm
One of two types of algorithm you can assign to a point in order to perform additional
processing to change point parameter values. A PV algorithm changes the value of the point
process value (PV) input only. Contrast with Action algorithm.
PV clamp
For an analog point, a configuration that will immobilize the process value (PV) at 0% if it
falls below the entry low limit value or at 100% if it goes above the entry high limit value.
PV period
An amount of time specified for the scanning of the point process value (PV) parameter. The
PV period determines the frequency with which the scan will be performed by the server. The
server groups point addresses into scan packets by PV period and controller.
Quick Builder
Quick Builder is a graphical tool that is used to define the hardware items and some point
types in a Experion system. Quick Builder can run either on an Experion server, on another
computer in your system, or on a laptop.
After defining hardware and points with Quick Builder, you download these definitions from
Quick Builder to the Experion server database.
RCM
Recipe Control Module.
recipe
A set of points used in a process. The Recipe Manager option enables point parameters for
sets of points to be downloaded with pre-configured working values. The individual point
parameters are the recipe 'ingredients.' Also known as Activity Entity.
recordset
An ADO object which contains data organized in fields and records.
redundant server
A second server used as a backup system. In a redundant server system the 'redundant' server
is actively linked to the 'primary' server. Active linking ensures that data in the second server
is constantly updated to mirror the primary server.
remote server
A server that supplies data to a local server via either a local area network (LAN) or a wide
area network (WAN).
report
Information collected by the server database that is formatted for viewing. There are several
pre-formatted reports, or the user can customize a report. Reports may be generated on
demand or at scheduled intervals. Reports can be printed or displayed on a Station.
REX
Request to exit.
RFI
Radio Frequency Interference
RLSD
Receive Line Signal Detect
RTS/CTS
Request to send/clear to send
RTU
See controller.
S88/S95
A set of standards and terminology for batch control. For more information about the
standard, go to www.isa.org.
SafeBrowse object
A SafeBrowse object is a Web browser specifically designed for use with Station.
SafeBrowse includes appropriate security features that prevent users from displaying
set point
The desired value of a process variable. Set point is a point parameter, whose value may be
entered by the operator. The set point can be changed any number of times during a single
process. The set point is represented in engineering units.
shape
A shape is a special type of display object that can be used in numerous displays.
Shapes can be used as 'clip-art' or as shape sequences.
shapelink
A shapelink is, in effect, a 'window' which always displays one shape of a shape sequence.
For example, a shapelink representing a point's status displays the shape that corresponds to
the current status.
shape sequence
A shape sequence is a set of related shapes that are used in conjunction with shapelinks. A
shape sequences can be used to:
n Represent the status of a point (Each shape represents a particular status).
n Create an animation (Each shape is one 'frame' in the animation.)
SLC
Small Logic Controllers
SOE
Sequence of events
softkey
A softkey is a function key which, when pressed, performs an action specified in the
configuration details for the current display.
SOR
Scope of responsibility.
SP
Experion abbreviation for set point.
SQL
Structured Query Language
Standard history
A type of history collection for a point that provides one-minute snapshots and the following
Station
The main operator interface to Experion. Stations can run either on a remote computer
through a serial or LAN link, or on the server computer.
When Station is running on the Experion server computer, it is often referred to as a server
Station.
Station Automation object model
The Station Automation object model provides the programming interface through which
scripts control Station and its displays.
status point
A point type used to represent discrete or digital field values. The point can have input,
output, and mode values. Input values can represent eight discrete states and cannot be
changed by an operator. Up to three values can be read from up to three consecutive, discrete
locations in the controller and thus can represent up to 8 states.
Output values can be used to control up to two consecutive discrete locations in a controller.
Output values can be automatic or operator-defined.
Mode values apply to output values and determine whether or not the output value is
operator-defined or automatic.
supervisory control
The action of writing information to a controller. Experion enables both automatic and
manual supervisory control. See Mode.
task
A task is any of the standard server programs or an application program that can be invoked
from a display.
TCP/IP
Transmission Control Protocol/Internet Protocol. A standard network protocol.
terminal server
A device on the local area network (LAN) that connects to a controller by way of a serial
connection and enables the controller to 'talk to' the Experion server on the LAN.
timer
A timer is a programming mechanism for running scripts at regular intervals in Station.
trend
A display in which changes in value over time of one or more point parameters are presented
in a graphical manner.
UCM
Unit Control Module.
Unreasonable High and Unreasonable Low alarms
Alarms configured for an unreasonably high value and an unreasonably low value for the PV
of an analog point.
User Scan Task controller
A server software option used to configure a server database table (called a 'user file') to act as
a controller. The server interfaces with the user file rather than the actual device.
In this way you can write software to interface with the server and to communicate with
devices that are connected to, but not supported by, the Experion server. The Experion server
can then scan data from the user files into points configured on the User Scan Task controller
and, for control, the Experion server can write point control data to the user file or a control
queue.
USKB
Universal Station keyboard
USR
Unit Start Request
utility
Experion programs run from a command line to perform configuration and maintenance
functions; for example, the lisscn utility.
virtual controller
See User Scan Task controller.
WCF
Windows Communication Foundation.
WINS
Windows Internet Name Service.
WWW
World Wide Web.
zone
A defined space either inside or outside that has at least one entry.
Notices
Trademarks
Experion®, PlantScape®, and SafeBrowse® are registered trademarks of Honeywell
International, Inc.
Other trademarks
Microsoft and SQL Server are either registered trademarks or trademarks of Microsoft
Corporation in the United States and/or other countries.
Trademarks that appear in this document are used only to the benefit of the trademark owner,
with no intention of trademark infringement.
Third-party licenses
This product may contain or be derived from materials, including software, of third parties.
The third party materials may be subject to licenses, notices, restrictions and obligations
imposed by the licensor. The licenses, notices, restrictions and obligations, if any, may be
found in the materials accompanying the product, in the documents or files accompanying
such third party materials, in a file named third_party_licenses on the media containing the
product, or at http://www.honeywell.com/ps/thirdpartylicenses.
Documentation feedback
You can find the most up-to-date documents on the Honeywell Process Solutions support
website at:
http://www.honeywellprocess.com/support
If you have comments about Honeywell Process Solutions documentation, send your
feedback to:
hpsdocs@honeywell.com
Use this email address to provide feedback, or to report errors and omissions in the
documentation. For immediate help with a technical problem, contact your local Honeywell
Technical Assistance Center (TAC).
To report a potential security vulnerability against any Honeywell product, please follow the
instructions at:
https://honeywell.com/pages/vulnerabilityreporting.aspx
Submit the requested information to Honeywell using one of the following methods:
n Send an email to security@honeywell.com.
or
n Contact your local Honeywell Technical Assistance Center (TAC) listed in the
“Support” section of this document.
Support
For support, contact your local Honeywell Process Solutions Customer Contact Center
(CCC). To find your local CCC visit the website, https://www.honeywellprocess.com/en-
US/contact-us/customer-support-contacts/Pages/default.aspx.
Training classes
Honeywell holds technical training classes that are taught by process control systems experts.
For more information about these classes, contact your Honeywell representative, or see
http://www.automationcollege.com.