Hume provides a GEM compliant equipment simulator application, gemsim,
which is a starting point for developing GEM interfaces for real
equipment
as well as a useful tool for developing, demonstrating, and testing
host
software. An equipment manufacturer deploys a GEM interface by
revising
and extending the gemsim application using Tcl programming, or
by
using the GEM application as a background process, and controlling it
from
his own application software. Hume Integration has developed
several
libraries for different programming
environments using this technique. These libraries include the .NET
SecsPort Component which can be used from any of the .NET languages
including C#, Visual Basic, C++, and Java. In addition
there is the Java
SecsEquipLibrary, the Visual
Basic Active-X SecsEquip Control and the C++ SecsEquip
library for the Java 2 platform or the established
Visual
platforms. The C++ library is also available for POSIX platforms
such as Linux in addition to Windows.
The Tcl/Tk supervisor host application is designed to interface with equipment that conforms to the GEM standard without any custom coding. Configuration information is obtained dynamically through communication with the equipment, and managed in SQL data tables. A graphical user interface is provided for defining and managing event reports, alarm reports, initiating remote commands, and managing recipes. But not all SECS equipment is GEM compliant. The supervisor application is also designed to accommodate non-GEM equipment, often with little or no custom code needed. The basic functions such as capturing event reports and alarms, and managing recipes, will work for any equipment that supports the underlying SECS messages. When custom code is needed, whether to accommodate equipment variations, or to fulfill custom integration requirements, the GEM-EI software provides a well designed framework for organizing and accomplishing the effort. A directory is provided for user written custom Tcl logic that can replace or supplement the provided code. For host developers who prefer other programming language platforms, Hume Integration provides similar host supervisor applications for the Java 2 Platform, and also for .NET.
The GEM-EI applications can use any of the SECS connection variations supported by the Datahub SDK:
The integrator can create subscriptions to SQL data tables that are activated when new equipment events occur and the table data is changed. The subscription mechanism provides an elegant interface such that the integrator does not need to change the GEM and SECS logic that acquires the equipment data in order to use it in new ways. Some possibilities include:
| Directory | Description |
| .../gem2/host | This directory contains Tcl source code files to support the
host role of SECS. The host directory contains the supervisor application, which is used to configure and manage the startup of one or more equipment interfaces. The supervisor application has the ability to copy interface configurations. This makes it simple to integrate multiple instances of similar equipment. The directory also contains the gemhost application which by default will use the HSMS protocol and connect to the gemsim application running on the same computer. You can use command line arguments to have the gemhost connect to different equipment, but the supervisor application is more easily configured. The gemsystem command is an example of starting the gemhost application as a client of a DMH message group server. |
| .../gem2/equip | This directory contains Tcl source code files to support the
equipment role of SECS. The equip directory contains the gemsim GEM compliant equipment simulator. This application is used as a suitable target for the supervisor application for demonstration, learning, testing, and development. The application is also designed to be used as a starting point for an equipment manufacturer. The gemsim application by default offers an HSMS connection on port 5555, with device ID 0. By providing command line arguments, or configuring startup options, other connection types are possible. |
| .../gem2/lib | This directory contains Tcl files that are shared between
both the
host and equipment applications. |
| .../gem2/client | In this directory you will find the ei_client application. This application uses the DMH message system to communicate with equipment drivers that are running in background, or running on remote computers. The target application must be listening for Tcl commands in a DMH mailbox. The ei_client application is able to create local trace windows for secsport, hsms, or comm equipment interfaces. Also, the utility can launch the inspect or hubclient programs attached to the same target application. In combination, these utilities let you debug and control your equipment interfaces from any seat on your local area network! |
| .../gem2/custom | This directory is a place for you to develop and deploy your
own equipment
interfaces or custom versions of the provided application code.
The Conversations feature is able to save and automatically load custom
SECS conversation data from this directory. The custom directory is added to the auto_path variable of the supervisor application Tcl interpreter before the directories that contain the HIS distributed files. If you create custom procedures in this directory, they will be found and used instead of the HIS distributed procedures of the same name. If you are getting started with the supervisor application, and are creating a small number of equipment interfaces, this directory will be adequate to hold your custom software. If you are deploying many equipment interfaces, you will probably wish to create multiple directories similar to this one. You may wish to create your own directories for specific types of equipment interfaces. You can put your shared procedures in this directory, and put your equipment specific code in a separate directory that you create for each kind of equipment. You either need to keep the equipment specific code in separate directories, or give the equipment specific code unique procedure names. Look at the ../host/gemhost script for an example startup script that sets up the auto_path. You will want to use the auto_path variable to control which directories the Tcl interpreter uses to find procedures. If you will be using the custom directory to develop new interfaces, you need to make sure that the security permissions allow you and your co-developers to create and modify new files in this directory. |
| .../gem2/server |
This directory has files such as
SecsServer.tcl which are used to run a Tcl/Tk process as a SECS server
and interface to it using the DMH message system. The files and
this directory are used by the Hume Java, .NET, and other platform host
and equipment SECS libraries. |
| .../gem2/CVS, .../gem2/*/CVS | HIS uses the freely available cvs version management system to track changes. The CVS subdirectories are created by this tool to hold version information about the files. |
| .../gem2/tests | This directory is used for HIS or customer developed regression tests. The core Tcl/Tk distributions come with regression tests to verify proper operation of the Tcl/Tk features. This directory contains the files needed to run similar regression tests on the GEM application software. |
The SEMATECH Virtual Factory Equipment Interface Version 2.2
standard
is available through SEMATECH
as
Technology Transfer document 95113016A-TR. VFEI describes a text
message based programming interface to integrate semiconductor
manufacturing
equipment into factory information systems.
To communicate with the equipment, you have to know the connection information. For a SECS-I RS-232 cable connection, you need the baud rate, and the equipment's device ID. Use a break-out box or other RS-232 tools to make sure your cable connection is proper; you only need to connect lines 2, 3 and 7. You may need to swap lines 2 and 3. For an HSMS LAN connection, you need to know the IP address of the equipment, the TCP/IP port number, and the device ID. Always try to ping the IP address or hostname to establish that the network is functioning properly.
Equipment expects to see its own device ID in messages that are directed to it. You should know what it is or configure it to a known value. You set the device ID in the host software using the startup configuration dialog, or dynamically by setting the array element DEVID. The Hume host software has logic to automatically correct the DEVID value, if the equipment implements standard error messages.
Each data item in a SECS messages is a specific low level type such as a 2 byte unsigned integer. There are variations is the specific data types used, and the specific message formats used. Your application should readily accommodate this, by not being fussy about the type codes in received messages. You can work with received data values in your application logic, mostly ignoring the data type, and then supply the proper type code when you format messages to send.
For many command messages, SECS defines multiple replies indicating
different reasons for failure. We suggest that you avoid coding
for
different failure reasons as much as possible. It is difficult to
test intricate conditional logic. Write straightforward,
maintainable
code - the transaction either succeeds or fails. For the things
that
fail, leave log messages that can be viewed after the fact.
You can add your own messages to the SECS trace and take advantage of
the built-in file logging and saving features. Any messages you
write to the connection array element (trace) are added to the SECS
trace.
Factory developers will want to focus more on understanding the gemhost application than the equipment role. Because of the requirements of GEM, the gemsim equipment logic is a little more complex than the host side. The equipment needs to respond differently to messages depending on whether its offline, online in local control, or online in remote control. Whether your focus is the host or the equipment role, we suggest you get comfortable with the following resources.
$ gemsim "set PORT /dev/tty01" &will start the gemsim application connected to the system /dev/tty01 or COM1 serial port.
or
c:\usr\local\gem2\equip> gemsim "set PORT COM1"
If you are creating a GEM interface for your equipment using Tcl
programming, you want to
understand how to add your own alarms and events to these tables, and
then
how to initiate alarm reports and event reports from the appropriate
contexts
in your control software. According to GEM, the setting and
clearing
of an alarm are reportable events in their own right. The
simulator
design is to number alarm ID's from 1000 by two's. Even numbers
are
used for both the alarm ID (ALID) and the alarm set event ID
(CEID).
The odd numbers are used for the alarm clear event ID. Therefore
for each alarm type, there is one record in the ei_alarm
table and two records in the ei_event table.
There is a procedure, eq_alarm_add, in file eq_alarms.tcl to simplify
adding new alarm definitions. To add new event definitions,
create your own procedure similar to eq_eventtab_init in file
eq_events.tcl.
The data items that the equipment manages are configured in table ei_variable.
The data items are distinguished by class as represented in the
varclass
field. Class "SV" data items are Status Variables. From the
standpoint of the host, these are read-only variables whose values can
be reported in event reports or individually queried. They should
always have a valid value. Typical process equipment Status
Variables
are observable quantities such as temperatures and pressures.
Another
class is "ECV" is the acronym for Equipment Constant Variable.
These
variables can have their values set or queried by messages from the
host.
Each ECV type variable has a minimum, maximum, and default value, as
configured
in the fields ECMIN, ECMAX, and ECDEF. These variables are used
for
configurable operation parameters such as setpoints or processing
options.
The ECV variables are usually independent of the processing
characteristics
that are controlled from information in Process Programs
(recipes).
The remaining class is "DVVAL", representing Data Value
Variables.
These are similar to SV items except they may not always have a valid
value.
An example would be the "AlarmID" variable whose value is the current
alarm
identifier (ALID) at the time an alarm is set or cleared. The
host
interface could ask for this variable in a report to be sent with an
alarm
set or alarm clear event report. However, it makes little sense
for
the host to ask for the value of this variable whenever the process
state
change event is reported.
$ dmh85_server gem &
$ supervisor "set MB_GROUP gem" &In general, you do not need to have an external DMH server process. The same Tcl/Tk process that executes the SECS logic for one or more interfaces, either host or equipment or both, can also serve as a DMH server, and have multiple attached DMH clients.
When used with the DMH, the supervisor application and the host.tcl scripts integrate with the message system as follows. First, when starting the SECS interface of the name gemhost, the process receives using the mailbox named gemhost_SQL. Messages that are received in this mailbox will be treated as SQL commands just as if the host application is a datahub. You can use the hubclient application with the target of this mailbox and the DMH group to remotely inspect the data tables of the application. For example if the gem server was running on the host, cimdev:
$ hubclient gemhost_SQL@cimdev:gem &Next, the supervisor application will open the mailbox gemhost_RPC to process received commands as Tcl statements. This mailbox lets you use inspect for remote debugging, as in:
$ inspect gemhost_RPC@gem &The _RPC mailbox also makes it possible for an external process to control the GEM host process using DMH messages that are Tcl commands. Since DMH client software is available for many programming environments, this is a common scenario for the customer who is integrating with external applications. The GEM host logic uses the mbx_RPC command to send reply messages that contain the return code and result of executing the received Tcl code messages. There is also a Tcl procedure, secs_dmh_reply, that can be called to send a SECS primary message, and have the SECS reply forwarded as the DMH reply message. You may review the logic and details of the secs_dmh_reply procedure by examing its source code in the gem2/lib directory. This procedure and the DMH integration techniques are also useable for the Hume provided GEM Equipment software.
The new Conversations feature greatly simplifies adding custom
message handling to your application. The framework uses
asynchronous callback mechanisms that avoid complex problems of
nesting, sequencing, and re-entrant execution that occur when
synchronous send-and-reply code is deployed in this asynchronous
domain. There are times however, when the simpler
programming model of the synchronous send-and-reply are
desirable. In the Tcl source code you will find some useful
synchronous
procedures to perform specific SECS transactions such as querying a
variable value. These procedures typically use the secs_xact
procedure
that is found in ../gem2/lib/secs_xact.tcl. Usually the literal
string
TIMEOUT
is returned if there is no reply, if the transaction was aborted, if a
stream 9 error reply was obtained, or if the connection was down.
Your application code can determine the underlying reason for the last
TIMEOUT
by calling secs_xact_failure. The design of secs_xact allows for the receiving
of new primary messages from the equipment such as event reports while
waiting for a reply message.
Here is an alphabetical list of the files in the gem2/host
directory,
with a description of each file's contribution to the
application.
Important procedures that you can use in your custom code are
mentioned.
We expect you to look at the source code of a procedure and the
comments
in the source code to see the details of how to use it. Many of
the data
item names and return code values are called out by the SECS-II
standard.
| alarms.tcl | Contains code to deal with Alarm Reports. The ei_alarms_init procedure is called early in the application to setup the ei_alarm table, and to synchronize with current alarm status. The procedure ei_alarm_enable is called to enable specified or all alarm messages. The procedure ei_alarm_setup is called to setup the reporting of alarms according to the configuration information that is in table ei_alarm. When the equipment reports an alarm, the ei_alarm_report procedure in this file gets called to process it. The gemhost application tries to deduce the type code used for alarm identifiers and can usually succeed. The logic for this is in the ei_ALID_type procedure. |
| display.tcl | This file contains the ei_terminal_display procedure which is called to display a message and return the acknowledgment code (ACKC10) or TIMEOUT. An empty message is the usual way to clear the display. |
| ei_clock.tcl |
Procedures to work with clock
(time) values. There are other procedures dealing with clock
values in ../lib/secs_clock.tcl |
| ei_DATAID.tcl | When the code needs to generate a new DATAID (data item identifier) the procedure ei_dataid in this file is called. The type code used for DATAID's is configured in the ei_variable table, value_TSN field where the varID is 'DATAID'. |
| ei_defaults.tcl | The ei_defaults procedure is used to provide default values for miscellaneous data items, including the alarm, event, and variable tables. |
| ei_dvval.tcl | The ei_discrete_data procedure in this file is called to process a S6F3 discrete data report. |
| ei_multiblock_check.tcl | The procedure ei_multiblock_check in this file is called when sending a S2F39 or a S6F5. If the message would require more than one SECS-I block to transmit, the call obtains permission to send it. |
| ei_recipes.tcl | Process program manipulation. The ei_recipe_dir procedure sends S7F19 to obtain the current recipe directory. The ei_recipe_delete procedure is used to delete specified recipes or all recipes. The ei_recipe_get procedure uses S7F5 to upload a recipe, and the ei_recipe_put uses S7F3 to download a recipe. |
| ei_RPTID.tcl | The ei_RPTID_new procedure is called to create a report ID (RPTID) when defining an event report. If choosing the CEID of the event does not work for your situation, you need to copy this file and create your own version in the custom directory. The ei_RPTID_TSN procedure is also defined to provide the type code used for RPTID's. The type code for RPTID's is configured in the ei_variable table, value_TSN field, where the varID is 'RPTID'. |
| events.tcl | Code for setting up event reports and processing them when they come in. The following procedures are used to setup event reporting: ei_event_enable, ei_event_disable, ei_report_define, ei_report_link, and ei_reports_setup. The procedure ei_driver_event is called by the driver software to synthesize an event such as COM_DISABLE. When the equipment event reports are received, they are processed by the ei_event_ann_rpt or the ei_event_report procedures. |
| gemhost gemhost.cmd |
The gemhost script processes the command line and defaults, and gets the single SECS interface application started. |
| gemsystem gemsystem.cmd |
The gemsystem script is an example invocation of the gemhost application as a client of a DMH message server. |
| host.tcl | The core host side control and communication state logic is in this file. When you write your own startup scripts similar to gemhost, you can call the ei_init procedure in this file to start your interfaces. |
| host_ui.tcl | This file contains the logic to draw and manage the Host SECS User Interface window. You call the ei_ui procedure to create an instance of this window for your equipment interface. |
| initialize.tcl | This ei_initialize procedure in this file performs a
sequence
of transactions with the equipment to: establish communications, obtain the online control state, query the status of alarms and variables, synchronize the equipment clock, set any configured equipment constants, setup event reporting as you have configured it, and setup alarm reporting as you have configured it. |
| Makefile | This file is used with make or nmake to make sure the
tclIndex file
is up-to-date which is how unknown procedures are located. |
| rcmd.tcl | This file supports legacy applications. New applications can define and customize conversation items to perform Remote Commands. |
| SecsHost.tcl |
This file has procedures that
were originally created for use of the Tcl/Tk host SECS features from
.NET and Java. Some of the procedures are useful for Tcl/Tk
developers such as ei_send, ei_pp_upload, and ei_pp_download. |
| supervisor supervisor.cmd supervisor.tcl superwin.tcl |
The supervisor application. |
| *.tab |
SQL table save files that are
created only when you perform Save actions. |
| tclIndex | This is used by the Tcl interpreter auto_load mechanism so that procedures in this directory can be automatically found when used. |
| trace.tcl | The procedure ei_trace_setup is used to setup and start trace data reports or to disable them. When the reports are received, the procedure ei_trace_data processes them and creates corresponding event reports with the CEID of TRACE_REPORT. This lets you use the same software to process trace data and event reports. The data item types used to setup trace data reports cannot be detected automatically. You may need to configure the TRID, TOTSMP, and REPGSZ items in the ei_variable table to indicate the proper value_TSN type code. |
| variables.tcl |
This file has procedures related
to working with variables including the creation of configuration
records in the ei_variable table. The procedure ei_var_query is useful for obtaining
the current values of a list of variables. You can see examples
of using ei_var_query in the host_ui.tcl file. |
| vfei.tcl vfei_mach_cmd.tcl vfei_move.tcl vfei_output.tcl vfei_resource.tcl |
The use of the SEMATECH VFEI command strings is not
encouraged for new applications. Our host applications
feature the virtual naming concepts of VFEI because it is useful to
make different equipment appear alike to the factory. Using VFEI
as a command language however is cumbersome and complex compared with
using Tcl language commands. The procedure ei_vfei_cmd in the vfei.tcl file is used to execute VFEI command strings. The return value of the procedure is the VFEI formatted reply. Other procedures in this file, and the files that start with vfei_ support executing the different VFEI commands. Users of VFEI should call the ei_vfei_cmd procedure to execute VFEI commands from the driver process. VFEI commands from other processes can be directed to the DMH VFEI input mailbox for the particular equipment connection. The logic for managing asynchronous VFEI output, namely alarm reports, and event reports, is in file vfei_output.tcl. A VFEI message is added to the output by calling the ei_vfei_output procedure. The usual VFEI initialization sets up subscriptions to the ei_alarm_log and ei_event_log tables to create VFEI output messages for these events. The VFEI output gets staged in the ei_vfei_output table. The ei_vfei_send procedure gets activated by subscription, and after the VFEI output message is transferred to its DMH mailbox destination, it is deleted from the ei_vfei_output table. The VFEI output mailbox is configured by the value of the VFEI_OUTPUT_MAILBOX record in the ei_variable table. |
The row of buttons labeled "Startup Configuration" includes the following:
Now consider the options to customize the usual initialization logic. The default choice is for almost all of the custom initialization checkboxes to be selected and this works fine in most situations. You may have equipment that has a very large number of status variables, equipment constants, or alarm types. If you are connecting to this equipment through a slow SECS-I link, you may want to disable querying for the definitions of these items, or querying for their values during the initialization because it takes too much time. In these situations, we recommend that you have all of the queries enabled once, that you capture and save the table information, and thereafter startup with the queries disabled.
Modern GEM equipment uses S1F13 to initiate communications. Most of the equipment that does not use S1F13 will reject the message using Stream 9. In this case, the logic of this application will gracefully substitute using S1F1 instead. The option to disable S1F13 completely is for defective equipment that does not use S1F13 to initiate communications, and furthermore has problems if it receives S1F13.
The buttons in the row labeled "Equipment Interface Actions" are:
Last, the row of buttons labeled "Supervisor Actions" includes:
You can run dozens of equipment interfaces from a single process on
a Unix workstation without any performance problems. You can run
multiple interfaces on Windows as well, although other things being
equal,
Windows is not as efficient with context switching or exec'ing child
processes.
You will probably want to distribute your equipment interfaces across
different
processes and different computer systems from the standpoint of risk
management - the performance will be more than adequate.
You may wish to develop your own custom startup script based on the gemhost or supervisor scripts. If you choose to do so, copy the gemhost or supervisor script to the gem2/custom directory. You can execute your modified startup script from the gem2/custom directory, or from another directory that is a subdirectory of the gem directory. The logic that sets up the auto_path variable in the stock gemhost or supervisor script was written to accomodate these variations. You may want to create specific directories underneath gem that start sets of related interfaces, and contain the custom code for the particular set(s). One of the key ideas of having your own directories, or using the custom directory, is that you keep your custom code, and custom file versions separate from the files distributed by Hume Integration. It is easier for you to synchronize with newer versions of the GEM-EI - you can install the latest version in its normal place without the installation overwriting any customization that you have done. The auto_path mechanism works well with the custom directory scheme. The auto_path variable is set so that procedures which are defined in the custom directory or the startup directory are found and used instead of the stock versions supplied by Hume Integration. When you need to customize a procedure, you copy the whole file that it is defined in to your custom directory. You can then edit it to your liking. You type "make" or otherwise insure that the tclIndex file in your custom directory is up-to-date with respect to the Tcl files contained in the directory. If you fail to copy the whole file, the stock version may be sourced when one of the other procedures in the file is used.
It is common to want to customize the initialization of the
equipment
that the host performs. Here we are primarily referring to the logic
found
in the file host/initialize.tcl and in the procedure
ei_initialize.
Most of the behavior is controlled by the configuration data held in
the
SQL tables; for example setting equipment parameters, defining dynamic
reports, or selectively enabling various alarms. The data-driven
configuration
logic is satisfactory for most circumstances. There also is a call made
to the procedure name ei_custom_init occuring at the end of
initialization.
This is a procedure that does not exist unless you provide your own
procedure
definition, so the procedure call is done in a catch statement. The
procedure
is called with a single argument, the name of the equipment connection.
If you write this custom procedure, your code should return 0 to
indicate
success, or any other positive integer to signify an error result. The
intention of providing this call is to make it easy for you to add
custom
initialization and setup logic. The default configuration executes the
initialization logic every time the equipment transitions into an
online
control state.
Don't go creating a lot of custom SECS logic without understanding
what the Conversations feature can do for you. You can configure
Send items so that they execute whenever there is a transition to an
online control state. Similarly, when you define your custom
Receive items, the Hume application takes case of having your message
handling code registered to receive messages without you explicitly
adding initialization code. When you save your Conversation
items, the interface name is not saved with the items. Therefore,
you are able to load Conversation items that you have created and saved
for any other interface. There is also intelligent handling of
merging, or replacing Conversation items as you load additional items
from files.
In general, you want to run development applications in foreground
with
all of the windows usable (like we have been doing), and you want to
run
production applications disconnected from the window system, so they
are
not stopped by user logouts or window system problems. On Windows NT
you
can install the production equipment interface logic to run as a
service.
This means that the interface will be started when the system reboots,
and no one has to login. You can do this using the SRVANY
program that comes with the Microsoft Windows Resource kit. On
Unix,
you can edit your startup scripts to run the equipment interfaces upon
reboot. The -notk option should be
specified
on the command line to tell the dmh_wish interpreter not to use
X-windows. The -notk option also works on Windows where it causes
the windows to be hidden from the desktop user.
Here are the steps in constructing your custom interface(s).
You can replace an equipment variable or supplement the equipment variables by supplying your own logic. Suppose you do not like the SECS standard format of the CLOCK variable. You can update the CLOCK row in ei_variable and change the varclass field from "EQ" to "SECS_DRVR". This tells the software that the value is not obtained from the equipment, it is obtained from the SECS driver software. Update the varmethod field to "localtime 9" and whenever the CLOCK value is used in events, the value will be formatted as "YYYY-MM-DD HH:MM:SS".
You may find that a few stock application procedures need changes. Copy the affected files into your custom directory, make your changes, and then rebuild your tclIndex.
We suggest that you limit host driver software functionality to
forwarding
event and alarm messages to higher level software, and accepting
commands from higher level software. This gives you maximum
re-use
of your equipment drivers. In the higher level software you can
build
elaborate state machine configuration tools, utilization tracking,
MTTA,
MTBF reporting, business rule engines, and the like. Your drivers
can be "plugged" and "unplugged" as supported by attaching or
unattaching
to the DMH message system. Because of the way you have
partitioned
the driver level, the higher level tools can easily be applied across
all
of your equipment.
Most of the tables are loaded from the file system during the
application
startup. As the application runs, new rows may be added, or rows
may be updated. By default, there is no logic to save the table
data
before shutting down. Typically, if you make changes, you need to
explicitly press a save button on the configuration user interface to
preserve
your changes for next time. You can also save the data tables
programmatically
by using the SQL write command.
ei_alarm_log .......... Alarm Instance Data (Host Only)
ei_dataset_xfer ....... Data Set Transfer Data
ei_equipment .......... Equipment Startup Data (Equipment Only)
ei_event .............. Event Configuration Data
ei_event_log .......... Event Report Instance Data (Host Only)
ei_event_report ....... In-use Event Report Associations
ei_event_report_cfg ... Configured
Event Report Associations (Host Only)
ei_ppid ............... Upload
Process Program
Descriptions (Host Only)
ei_report ............. In-use Report Definitions
ei_report_cfg ......... Configured Report Definitions (Host Only)
ei_spool_data ......... Messages Spooled for Host Retrieval (Equipment Only)
ei_startup ............ Configuration of Equipment Interface Startups (Host Only)
ei_trace_active ....... Active Trace Data Collection (Equipment Only)
ei_trace_setup ........ Trace Data Collection Configuration (Host Only)
ei_variable ........... Data Item Configuration and Status
ei_vfei_output ........ VFEI
Output
Message Data (Host Only)
The host populates this table by asking the equipment which alarms are enabled using S5F7, and what the alarms are using S5F5. This happens in the procedure ei_alarms_init in the file .../host/alarms.tcl. The host is able to find out all of the alarm information by asking, or by saving each alarm when it is reported if S5F5 and S5F7 are not supported. You can supply your own alarm descriptions in the field ALTX for equipment that reports blank alarm descriptions.
The equipment GEM software uses this table to manage alarm
reporting.
The data in the table can be loaded at startup from a file of SQL
statements
such as created by the SQL write command.
A convenience procedure, eq_alarm_add, defined in file
gem2/equip/eq_alarms.tcl,
is also available to add new alarms using Tcl code. Equipment software
reports alarm set or clear conditions by updating the is_set
field
for the particular alarm using the SQL update statement. The GEM
equipment
software is then triggered by a table subscription, and it takes care
of
sending the alarm report and the associated GEM data collection event
to
the host. The reporting logic allows for the possibility that the alarm
or event are possibly disabled, or that the communication may be broken
and the reports need to be spooled. The reporting logic is also found
in
the gem2/equip/eq_alarms.tcl file.
| Column Name | Key | Type | Description |
| spname | PCK | varchar(32) | The secsport or hsms connection name that a particular row is associated with. |
| ALID | PCK | varchar(20) | A unique identifier for the alarm defined by the equipment. It is usually an integer, but it is saved and manipulated as a text string. |
| ID_TSN | varchar(8) | The Tcl SECS Notation type code for the ALID data item when passed in a SECS-II message. The host discovers the ID_TSN from equipment originated messages. An example would be I4, signifying a signed 4 byte integer. See the TSN reference documentation. | |
| category | int | Alarm category. The value 0 means category is not used. The GEM standard does not use the encoding of category in alarm reports. | |
| is_enabled | int | This field is used to store the current alarm setup state; whether the alarm is enabled for reporting or disabled. | |
| is_set | int | This field is used to store the current status of the alarm - whether it is set (1) or clear (0). | |
| ALTX | varchar(40) | This is the alarm description which is usually reported by the equipment when reporting an alarm. If the equipment does not report the ALTX (the reported value is blank), the host GEM-EI software will check this table for a possible description. | |
| host_managed | int | Host usage only. If this field is non-zero, it means that the host should either enable or disable the alarm when performing the equipment initizalization. | |
| host_wants_enabled | int | Host usage only. The value in this field indicates whether the alarm should be enabled (1) or disabled (0) if the host_managed field is non-zero. | |
| set_CEID | int | Equipment usage only. Per GEM, the setting of an alarm causes a data collection event. This field holds the CEID, collection event ID, which is fired when the alarm is set. | |
| clear_CEID | int | Equipment usage only. Per GEM, the clearing of an alarm causes a data collection event. This field holds the CEID, collection event ID, which is fired when the alarm is cleared. |
The host inserts a new row into this table every time an alarm report is received. The is_set value represents whether the alarm was reported as set or clear.
There is a requirement for stable operation that data rows in this
table are deleted at some point, otherwise memory use will be
unlimited. The supervisor program has logic in the user interface
that deletes rows that are a day old after enough event reports have
been received to trigger truncation of the displayed event report
history. There is also a Conversation item that is automatically
loaded if the interface is named gemhost, and which causes periodic
trimming of this table and the ei_event_log table. For your
own interfaces, you may want to delete rows in this table just after
using them, or perhaps setup a Conversation item similar to the gemhost
example but with a shorter time period.
| Column Name | Key | Type | Description |
| spname | PCK | varchar(32) | The secsport or hsms connection name that a particular row is associated with. |
| clock | PCK | varchar(16) | The time of the alarm report formatted as YYYYMMDDHHMMSScc. This value will be unique for the particular spname. |
| ALID | PCK | varchar(20) | A unique identifier for the alarm defined by the equipment. It is usually an integer, but it is saved and manipulated as a text string. |
| is_set | int | The reported status of the alarm - whether it is set (1) or clear (0). | |
| ALTX | varchar(40) | The alarm description provided by the equipment with the report, or the text from the ei_alarm record. |
The data in this table is used to manage Stream 13 data set
transfers.
There is status information in the table which is useful for monitoring
Stream 13 transfers or diagnosing problems. The data set transfer
logic is in the files gem2/lib/dataset_xfer.tcl and
gem2/lib/ei_ppid.tcl. The transfer logic uses a subdirectory of
the recipe directory for large file transfers so that replacement files
do not overwrite their destinations until they are received completely,
and so that process program files do not appear in directory listings
until they can be verified.
| Column Name | Key | Type | Description |
| spname | PCK | varchar(32) | The secsport or hsms connection name that a particular row is associated with. |
| HANDLE |
PCK | varchar(16) | The type code and handle value used by the opposite party in
the dataset open message, S13F3. |
| is_send | PCK |
int | Used as a boolean to indicate whether the data set is being
sent (1) or received (0). |
| dsname |
varchar(200) |
The data set name which is also
a Process Program ID (PPID). |
|
| pathname |
varchar(500) |
A full pathname to the file
being transfered. When sending from equipment, this will be a
temporary copy of the file in the transfer directory. When
sending from the host, this is a file in the recipe directory.
When receiving, this is a file in the transfer directory. |
|
| channel |
varchar(20) |
When sending, an open file is
used. This field value is the channel identifier from the Tcl
open command. |
|
| timer_handle |
varchar(20) |
This field holds handle values
returned from the Tcl after command for timers that are used to check
whether the opposite party has been timely with sending expected
messages. |
|
| pid |
varchar(12) |
The process identifier of the
process which opened a file for sending. In the scenario of
making this table peristent and resuming incomplete transfers, you
would want to check for your own process ID before closing a channel. |
|
| ts_begin |
varchar(26) |
A high resolution timestamp in
the local timezone (localtime format 15) when the row was
created. |
|
| ts_close |
varchar(26) |
A high resolution timestamp in
the local timezone (localtime format 15) when the transfer became
inactive either by completing successfully, or by being
cancelled. Cancellation occurs by the opposite side closing the
HANDLE using S13F7 or S13F9. Cancellation can also occur during
initialization or upon re-starting a dataset transfer which ended with
error. |
|
| readln |
int |
This is the read size either
provided by the requestor in S13F5 or figured out by the receiver when
handling S13F4. |
|
| reclen |
int |
This value is the maximum read
size returned by the sender in S13F4. |
|
| rtype |
int |
This value is the <rtype>
value returned by the sender in S13F4. |
|
| ckpnt |
int |
This value is the checkpoint
value received in the latest S13F6 reply. |
|
| status_code |
int |
This value is 0 if the transfer
is proceeding without error. A non-zero status_code usually
indicates that the transfer has ended without success. However,
status codes indicating transfer conversation timouts do not indicate a
failure end - the transfer can still succeed if the opposite party
continues. The following codes are used: 0 - normal error free progress 1 - cannot resume receive (no partial file, or no partial results) 2 - open attempt failed 3 - read attempt failed 4 - open reply had improper data 5 - open reply had ACKC13 error code 6 - open reply had a changed HANDLE value 7 - open reply had a changed DSNAME 8 - open reply had an unknown RTYPE 9 - open reply had discrete records with record length of 1 meg or larger 10 - read reply had improper data 11 - read reply had ACKC13 error code (not EOF) 12 - read reply had changed HANDLE value 13 - read reply, transfer table record missing 14 - read reply, partial file missing 15 - read reply, file open error 16 - read reply, data was not type B or A 17 - read reply, file writing error 20 - file error when preparing read reply 21 - S13F1R offer attempt failed 22 - S13F1R offer reply data error 23 - S13F1R offer reply error code reply 24 - cannot create transfer directory 25 - timeout waiting for S13F1 offer 26 - timeout waiting for S13F3 open 27 - timeout waiting for S13F5 read 28 - timeout waiting for S13F7 close 29 - cannot delete old file to receive replacement 30 - verification attempt failed 31 - downloaded dataset failed length verification |
|
| status |
varchar(80) |
A brief description of the
status code or the latest success state. |
The gemsim Tcl application uses this table to save and restore its startup configuration. During startup of the gemsim application, if there is a saved .tab file for this table in the default directory, and there is a row in the table for an inteface named gemsim, then the data of the row is used to set the properties of the interface. The included data items meet the requirements of SECS and GEM for properties that are enduser configurable and persistent. In addition, there are fields to make the preferred settings of tracing and logging persistent.
Timer values are stored as milliseconds.
| Column Name | Key | Type | Description |
| spname | PCK | varchar(32) | The secsport or hsms connection name that a particular row is associated with. |
| port | varchar(200) | The rs232 device name for serial connections or the [hostname:]port for HSMS connections. | |
| auto_start | int | Whether the interface should be started when the program is started. | |
| BAUD | int | The baud rate for serial communication. | |
| DEVID | int | The SECS device ID. | |
| MULT | int | Set to 1 to indicate when using SECS-I whether the host can handle more than one active message conversation at a time. | |
| RTY | int | The SECS-I retry count. This count establish the maximum number of send retry attempts for block transmission. | |
| T1 | int | SECS-I Receive intercharacter timeout. | |
| T2 | int | SECS-I Protocol timeout for block transfer. | |
| T3 | int | Reply timeout. | |
| T4 | int | SECS-I Inter-block timeout. | |
| T5 | int | HSMS Connect Separation timeout. Specifies the delay between connection attempts. | |
| T6 | int | HSMS Control Transaction Timeout. | |
| T7 | int | HSMS Not Selected Timeout. If a TCP/IP connection does not
transition
to an HSMS Selected connection within this interval, the TCP/IP connection is broken off. |
|
| T8 | int | HSMS Network Intercharacter Timeout. Not used in this implementation. | |
| TRACE | int | Used as a bitfield to control diagnostic output. | |
| comm_enabled | int | A boolean field to indicate whether communication is enabled at startup. | |
| controlIntentOnline | int | A boolean field to indicate whether the equipment should seek being online. | |
| controlModeRemote | int | A boolean field to indicate whether remote control is preferred to local control when online. | |
| controlStateStartup | int | An enumerated value to set the desired GEM control state at startup. Possible values are 0 for Offline Equipment, 1 for Offline and seeking to be online, 2 for Offline Host, 3 for Online local control, and 4 for Online remote control. | |
| hsms_passive | int | For an HSMS connection, whether the equipment plays the passive, TCP/IP server role. | |
| hsms_protocol | int | Set to 1995 for a standard HSMS connection type. | |
| traceMax | int | When file logging of trace data is enabled, the maximum number of day files allowed. Range 1..366. | |
| traceZipCmd | varchar(80) | This field has the configured value of the log file compression command which is used when file logging of trace data is enabled and compression of log files is enabled. | |
| traceDir | varchar(200) | This field holds the configured value of the file logging output directory. |
The host populates this table as it encounters new event reports from S6F11 or S6F13. In general there is no way for the host to deduce meaningful names or descriptions for the equipment originated events. In the case of Hume-based equipment interfaces, the status variable EventDescriptions may exist in which case the host will use the provided list of all the events and their descriptions. Otherwise, event descriptions are created by manually updating this table using information provided by the equipment vendor. When descriptions are available, the creation and maintenance of event reports is made easier. The integrator may also wish to provide virtual names for events by manually editing the table.
Some event records such as COMM_DISABLE represent events that are created by the host driver software instead of the equipment. So they can be received even when your equipment does not support event reports.
The following events are currently defined by the host GEM-EI software:
| Column Name | Key | Type | Description |
| spname | PCK | varchar(32) | The secsport or hsms connection name that a particular row is associated with. |
| eventname | PCK | varchar(32) | Equipment usage only. A revision to the toolset in January 2007 added this column to provide a means of identifying events independent of the CEID value. This change allows customization of the CEID values used by the interface.without changes to the source code. |
| CEID | (*) | varchar(32) | The identifier for the event. For equipment events the CEID is defined by the equipment, and almost always integers are used. Events that are created in the driver software can be given more descriptive identifiers such as COMM_ENABLE. The host software uses this column as part of the primary composite key for the table but the equipment does not. When a merged schema is created for both equipment and host use, this column can be declared part of the primary composite key instead of the eventname column, and the equipment logic will continue to operate properly. |
| VFEIname | varchar(32) | Host usage only. A virtual name for the event which is used for VFEI event report and event setup messages. When an event record is inserted, the VFEIname defaults to the CEID. The integrator can update the record and provide a more descriptive name. | |
| host_managed | int | Host usage only. If true, the reporting of this event is enabled or disabled during the initialization sequence. | |
| host_wants_enabled | int | Host usage only. This field indicates whether the reporting of this event should be enabled or disabled if the host_managed value is true. | |
| event_class | varchar(10) | Host usage only. The class that the event belongs to. Events that are reported by the equipment are given the event_class EQ. Events that are created by the GEM-EI and could be used without VFEI are given the class, SECS_DRVR. Events that are created and used by the VFEI level software are given the class, VFEI_DRVR. | |
| ID_TSN | varchar(4) | This is the TSN data type code for the CEID value. It is not necessarily the same for all of the events of a particular spname. | |
| is_reported | int | This field is set to reflect whether the equipment event is actually enabled for reporting. For events that are created in the Host logic, using the ei_driver_event procedure, this field determines whether the event is actually reported to higher level software by being inserted into the ei_event_log table. | |
| description | varchar(120) | If the integrator supplies a description for the event, it is seen when creating event reports using the configuration user interface. There is no GEM or SECS mechanism for the host to determine event descriptions. | |
| eqname |
|
varchar(32) |
not used - defined to manage
sub-equipment |
| eqCEID |
|
varchar(32) |
not used - defined to manage sub-equipment |
When an event report is received, the included data values are used
to update corresponding fields in the ei_variable table. Then a
new
row is added to the ei_event_log table.
There is a requirement for stable operation that data rows in this table are deleted at some point, otherwise memory use will be unlimited. The supervisor program has logic in the user interface that deletes rows that are a day old after enough event reports have been received to trigger truncation of the displayed event report history. There is also a Conversation item that is automatically loaded if the interface is named gemhost, and which causes periodic trimming of this table and the ei_alarm_log table. For your own interfaces, you may want to delete rows in this table just after using them, or perhaps setup a Conversation item similar to the gemhost example but with a shorter time period.
<>If you are using VFEI, a subscription to the ei_event_log table sees that the event has occurred and pulls together the configured VFEI report. The VFEI report may use different data items than the set provided in the event report. In any case, after the VFEI message is created, the original ei_event_log record is deleted.| Column Name | Key | Type | Description |
| spname | PCK | varchar(32) | The secsport or hsms connection name that a particular row is associated with. |
| clock | PCK | varchar(16) | The time of the event report formatted as YYYYMMDDHHMMSScc. This value will be unique for the particular spname. |
| CEID | PCK | varchar(32) | The identifier for the event. |
| data | varchar(20000) | A proper Tcl list containing {name value} pairs for the variable values received in the event report. |
This table is used to store the actual, in-use association of events
and data reports. It is used to help implement procedures that
configure
reports, and link them to data collection events.
| Column Name | Key | Type | Description |
| spname | PCK | varchar(32) | The secsport or hsms connection name that a particular row is associated with. |
| CEID | PCK | varchar(32) | The identifier for the event. |
| RPTID | PCK | varchar(32) | An identifier for a SECS level report - A report is an ordered set of variables whose values can be reported in association with an event. |