A Device Builder component, implemented by
means of a state machine, prepares the basic state
values for the Process Objects. The state function of
the Device Builder interacts with several
components in a sequential way. Starting with the
invocation of the measurement tasks, the application
program, the visualisation and the host
communication, interfaces of the respective
components are used. The Process Object
component plays a central role in the system. Every
component has to evaluate the attributes of the
handled process data objects to get information
about the intended use, the type and the specific
handling of the values.
3.2 Implementation Issues
Based on the system modelling and the demanded
requirements, a few basic conditions have to be
defined. One decision concerns the usage of an
operating system, another one the selection of the
appropriate programming language.
In order to meet economical aspects and
based on experiences from former projects, a
decision was made not to use an operating system.
Supported by the fact that the given requirement
does not need operating system support like e.g. file
system, network stack or multitasking, lower
memory requirements have been achieved. The real
time aspect in this context has already been solved in
a former project with the implementation of the
measurement tasks based on interrupt driven
transmitter routines.
The second question concerning the
programming language was solved with the
selection of the used microprocessor for
economical/technical reasons. As the development
platform of this microcontroller (Keil, 2007)
supports only the procedural language “C”, the
object oriented design has to be implemented as a
trade-off in a procedural way. Based on these
decisions the main frame of the software was
implemented as a sequential main()-procedure
supported with interrupt driven routines for
interfacing the process equipment (e.g. transmitters).
To support distributed development and reuse for
further projects, the graphical system for the LCD
was implemented as separated procedures and linked
by means of a software-interrupt (Graphic-BIOS).
One of the central points in this context was the
implementation of the Process Data Object class by
means of arrays of C-structures.
3.3 Procedural Object Class
Implementation
According to the language “C” the Process Data
Object was implemented as C-structures. As there
are a lot Process Data Objects in the system, a
constant array of such structures was defined.
Instead of instantiating objects, a constant array of
structures was defined which represents the main
definitions of the system’s behaviour. Every
structure incorporates a name, a type and behaviour
attributes for the process data. Based on the type of
data a method, implemented e.g. as a function
pointer, is responsible to access the respective value.
Based on the requirement to extend the software at
the customer site special process data objects were
introduced with the object type
OBJ-LINK, and
OBJ-LAST. Due to this definition it was possible to
connect several Process Data Object arrays in a way
which is called Linked-List. By means of this inked
object list it was possible to extend the basic
definitions of the system behaviour with customer
definitions at compile time or later in the field by
means of structures located at the mobile memory
card. A central procedure was introduced to search
for an object in this linked list.
Based on the object’s type in the structure this
procedure was able to evaluate the
OBJ-LINK type
and to connect several arrays of structures.
Depending on the start point of the search (e.g.
system memory, customer memory, PC-Card card) a
certain priority was achieved which is usable to
override (customize) basic system definition.
For instance with the introduction of new object
definitions on the memory card, new process data
readings or menu items are available in the process
data system. The following code fragments are
intended to give an impression of the structure
definition and the outlook of the object list.
typedef struct
{
NAME name;
union
{
unsigned long c_li;
NVPARA * p;
FUNC_adr funct;
unsigned long * i;
float * df;
char * str;
NAME * nstr;
} data;
char d_name[MAX_DLEN+1];
char d_unit[MAX_DLEN+1];
char d_format[MAX_DLEN+1];
char hierarchy[MAX_BRANCH+1];
unsigned char hardware_mask;
OBJECT LIST CONTROLLED PROCESS DATA SYSTEM
353