# Open
a connection to the tool
open
socket_client name=tool proto=hsms logging=2 host=172.19.9.14 service=5000
options="hsms_logging=off t3=60 t6=10 t7=10 t8=10 hsms_logging=on
timeout_msg=TIMEOUT"
#
Initialize all the data variables
gosub
init
gosub
Initialize # Debugging only
#gosub
ProceedWithCarrier # Debugging only
break
#
Events from the tool
after
tool
let sxfy = get_tmp_var(SXFY)
goto $sxfy
#Initialize
command
label
Initialize
gosub report.clear
let report.name = "Command"
let report.value = "Initialize"
gosub report.add
send name=tool S1F13 0 W
<L>.
# Add to the reply report
let report.name = "MDLN"
let report.value =
get_tmp_var(S1F14.1.2.1)
gosub report.add
let report.name = "SOFTREV"
let report.value =
get_tmp_var(S1F14.1.2.2)
gosub report.add
send name=tool S1F17 0 W .
print "ONLACK is <" .
get_tmp_var(S1F18.1) . ">"
send name=tool S1F3 0 W
<L
<$SVID $vid[ControlState]>
>.
#print "ControlState is <" .
get_tmp_var(S1F4.1.1) . ">"
let report.name = "ControlState"
let report.value = get_tmp_var(S1F4.1.1)
gosub report.add
# Reset spooling
send name=tool S2F43 0 W .
print "RSPACK is <" .
get_tmp_var(S2F44.1.1) . ">"
send name=tool S1F1 0 W .
print "MDLN is <" . get_tmp_var(S1F2.1.1) . ">"
print "SOFTREV is <" .
get_tmp_var(S1F2.1.2) . ">"
# Request spooled data
send name=tool S6F23 0 W
<$RSDC 1>.
print "RSDA is <" .
get_tmp_var(S6F24.1) . ">"
# Disable alarms
send name=tool S5F3 0 W
<L
<$ALED 0>
<$ALID>
>.
print "ACKC5 is <" .
get_tmp_var(S5F4.1) . ">"
# Enable selected alarms
for init.i = 1 to $alarm[0]
send name=tool S5F3 0 W
<L
<$ALED 80>
<$ALID
$alarm[$alarm[$init.i]]>
>.
print "ERACK is <" .
get_tmp_var(S2F38.1) . ">"
next init.i
# Disable all events
send name=tool S2F37 0 W
<L
<$CEED FALSE>
<L>
>.
print "ERACK is <" .
get_tmp_var(S2F38.1) . ">"
# Delete all reports
send name=tool S2F33 0 W
<L
<$DATAID FALSE>
<L>
>.
print "DRACK is <" .
get_tmp_var(S2F34.1) . ">"
# Set equipment constants
for init.i = 1 to $ecid[0]
parse($ecid[$ecid[$init.i]],
",", t)
let t_id[$init.i] = $t[1]
let t_fmt[$init.i] = $t[2]
let t_val[$init.i] = $t[3]
next init.i
# Set the equipment constants
send name=tool S2F15 0 W
<L
for init.i = 1 to $ecid[0]
<L
<$ECID $t_id[$init.i]>
<$t_fmt[$init.i]
$t_val[$init.i]>
>
next init.i
>.
print "EAC is <" .
get_tmp_var(S1F16.1) . ">"
# Define all the reports
for init.i=1 to $rpts[0]
let rpt_name = $rpts[$init.i]
print "Creating report <"
. $rpt_name . ">"
send name=tool S2F33 0 W
<L
<$DATAID 1>
<L
<L
<$RPTID
$rpt[$rpt_name]>
<L
for init.j=1 to
$rpt[$rpt_name][0]
<$VID
$vid[$rpt[$rpt_name][$init.j]]>
next init.j
>
>
>
>.
next init.i
print "DRACK is <" .
get_tmp_var(S2F34.1) . ">"
# Link event to reports
for init.i=1 to $events[0]
let event_name = $events[$init.i]
if (is_var(link[$event_name][0]))
print "Linking event
<" . $event_name . ">"
send name=tool S2F35 0 W
<L
<$DATAID 1>
<L
<L
<$CEID
$event[$event_name]>
<L
for init.j=1 to
$link[$event_name][0]
<$RPTID $rpt[$link[$event_name][$init.j]]>
next init.j
>
>
>
>.
end_if
print "LRACK is <" .
get_tmp_var(S2F36.1) . ">"
next init.i
# Enable events
send name=tool S2F37 0 W
<L
<$CEED TRUE>
<L
for i=1 to $events[0]
<$CEID $event[$events[$i]]>
next i
>
>.
print "ERACK is <" .
get_tmp_var(S2F38.1) . ">"
# Equipment status
send name=tool S1F3 0 W
<L
for init.i=1 to
$EquipmentStatusData[0]
<$VID
$vid[$EquipmentStatusData[$init.i]]>
next init.i
>.
for item = 1 to get_tmp_var(S1F4.1)
let idx = "S1F4.1." . $item
let name = $EquipmentStatusData[$item]
if (is_label($name))
gosub $name
else
let value = get_tmp_var($idx)
let $name = $value
let report.name = $name
let report.value = $value
gosub report.add
end_if
next item
gosub report.dump
#return
# End of Initialize
#
Proceed with carrier
label
ProceedWithCarrier
gosub report.clear
let report.name = "Command"
let report.value =
"ProceedWithCarrier"
gosub report.add
# Get the recipe list from the tool
send name=tool S7F19 0 W .
let num_recipes = get_tmp_var(S7F20.1)
print "Recipes on tool:"
for pwc.i=1 to $num_recipes
let idx = "S7F20.1." .
$pwc.i
let recipe = get_tmp_var($idx)
let report.name = ToolRecipe[$pwc.i]
let report.value = $recipe
gosub report.add
#print "
<" . $recipe . ">"
next pwc.i
# Dummy ProceedWithCarrier data
for pwc.i=1 to 25
let SlotMap[$pwc.i] = 3
let LotID[$pwc.i] = Lot$i
let SubstrateID[$pwc.i] = S$i
next pwc.i
send name=tool S3F17 0 W
<L
<$DATAID 1>
<$CARRIERACTION
ProceedWithCarrier>
<$CARRIERID $CarrierID>
<$PTN $PortID>
<L
<L
<L
<$CATTRID Capacity>
<U1 25>
>
<L
<$CATTRID Usage>
<A PRODUCT>
>
<L
<$CATTRID
SubstrateCount>
<U1 25>
>
<L
<$CATTRID SubstrateCount>
<L
for pwc.i=1 to 25
<U1 $SlotMap[$pwc.i]>
next pwc.i
>
>
<L
<$CATTRID ContentMap>
<L
for pwc.i=1 to 25
<L
<A $LotID[$pwc.i]>
<A
$SubstrateID[$pwc.i]>
>
next pwc.i
>
>
>
>
>.
gosub report.dump
#return
# End of ProceedWithCarrier
#
CreateEAJob
label
CreateEAJob
# PrJobID is Tool name plus time
let ts = time()
let PrJobID = $TOOL_NAME . $ts
send name=tool S16F21 0 W .
print "PrJobSpace is <" .
get_tmp_var(S16F22.1) . ">"
send name=tool S1F3 0 W
<L
<$VID $vid[QueueAvailSpace]>
>.
print "QueueAvailSpace is <"
. get_tmp_var(S1F4.1.1) . ">"
send name=tool S16F15 0 W
<L
<$DATAID 1>
<L
<L
<$PRJOBID $PrJobID>
<$MF 0D>
<L
<L
<$CARRIERID
$CarrierID>
<L
for ceaj.i=1 to 4
<$SLOTID $ceaj.i>
next ceaj.i
>
>
>
<L
<$PRRECIPEMETHOD 1>
<$RCPSPEC MECH_ALL_CHAMBER>
<L>
>
<$PRPROCESSSTART TRUE>
<L>
>
>
>.
send name=tool S14F9 0 W
<L
<$OBJSPEC "">
<$OBJTYPE ControlJob>
<L
<L
<$ATTRID ObjID>
<$ATTRDATA $PrJobID>
>
<L
<$ATTRID CarrierInputSpec>
<L
<$ATTRDATA $PrJobID>
>
>
<L
<$ATTRID
ProcessingCtrlSpec>
<L>
>
<L
<$ATTRID MtrlOutSpec>
<L>
>
<L
<$ATTRID ProcessOrderMgmt>
<U1 3>
>
<L
<$ATTRID StartMethod>
<BOOLEAN TRUE>
>
>
>.
# End of CreateEAJob
# Event
handling
label
S6F11
# Handle the s6f11. Build a report from the data received.
let ceid
= get_tmp_var("S6F11.1.2")
let rpt_num = get_tmp_var("S6F11.1.3.1.1")
let event = $event[$ceid]
#print "Ceid <" . $ceid .
">"
#print "Rpt_num <" . $rpt_num
. ">"
#print "Event <" . $event .
">"
gosub report.clear
let report.name = Event
let report.value = $event
gosub report.add
let report.name = Report
let report.value = $rpt[$rpt_num]
gosub report.add
let num_items =
get_tmp_var("S6F11.1.3.1.2")
for item = 1 to $num_items
let idx = "S6F11.1.3.1.2." .
$item
let name = $rpt[$rpt[$rpt_num]][$item]
#print "!!!!! name <" .
$name . ">"
if (is_label($name)) # See if this has a list data type
gosub $name # Use the custom list definition
else
let $name = $value
let report.name = $name
let report.value =
get_tmp_var($idx)
gosub report.add
end_if
next item
gosub report.dump
# Send the reply
send_reply name=tool S6F12 0
<B 00>.
# Init
the driver with all the data definitions
label
init
# General
define TOOL_NAME = Generic_01
# SECS data type
define ALED = BINARY
define ALID = U4
define ATTRID = A
define ATTRDATA = A
define CARRIERACTION = A
define CARRIERID = A
define CATTRID = A
define CEED = BOOLEAN
define CEID = U4
define DATAID = U4
define ECID = U4
define MF = BINARY
define OBJSPEC = A
define OBJTYPE = A
define PRJOBID = A
define PRPROCESSSTART = BOOLEAN
define PRRECIPEMETHOD = U1
define RCPSPEC = A
define RPTID = U4
define RSDC = U1
define SVID = U4
define SLOTID = U1
define PTN = U1
define VID = U4
# Define an array of report names to be
created
define_array rpts = E40, E87_1, E87_2,
E87_4, E90_2, E94, Recipe
# Define a report number for each report
define_xref rpt = 1, E40
define_xref rpt = 2, E87_1
define_xref rpt = 3, E87_2
define_xref rpt = 5, E87_4
define_xref rpt = 8, E90_2
define_xref rpt = 9, E94
define_xref rpt = 10, Recipe
# Define the reports with their vids
define_array rpt[E40] = PrJobID, PrJobState
define_array rpt[E87_1] = PortID, CarrierID
define_array rpt[E87_2] = PortID, CarrierID, SlotMap, Reason
define_array rpt[E87_4] = CarrierID, LocationID
define_array rpt[E90_2] = SubstDestination, SubstID, SubstLocID, \
SubstLotID,
SubstProcState, SubstSource, \
SubstState,
SubstType, SubstUsage, SubstHistory
define_array rpt[E94] = CtrlJobID
define_array rpt[Recipe] = PPChangeName,
PPChangeStatus, PPExecName
# Link reports to events, ex:
link[<event>] = <rpt>, <rpt>, ...
define_array link[PrJobQueued] = E40
define_array link[PrJobSetUp] = E40
define_array
link[CID_WaitForHost2VerificationOK] = E87_1
define_array link[SM_NotRead2WaitForHost] = E87_2
define_array
link[OperatorCommandIssued] =
E40, E87_1
# Define equipment constants, id, format,
default value (no spaces)
define ecid[GemTimeFormat] = "4000016,U1,1"
define ecid[SecsMsgLogging] = "9987,U4,3"
define ecid[xxx] = "90000,A,Hello"
# Define constants to set at
initialization time
define_array ecid = GemTimeFormat,
SecsMsgLogging, xxx
# Define alarms
define alarm[Alarm1] = 101
define alarm[Alarm2] = 102
define alarm[Alarm3] = 103
define alarm[Alarm4] = 104
define alarm[Alarm5] = 105
# Define alarms to turn on at
initialization time
define_array alarm = Alarm1, Alarm3
# Define status variables
define vid[AccessMode1] = 1511
define vid[AccessMode2] = 1512
define vid[AccessMode3] = 1513
define vid[AccessMode4] = 1514
define vid[CarrierID] = 1550
define vid[CarrierLocationMatrix] = 1589
define vid[CarrierID1] = 1551
define vid[CarrierID2] = 1552
define vid[CarrierID3] = 1553
define vid[CarrierID4] = 1554
define vid[ControlState] = 952
define vid[CtrlJobID] = 1673
define vid[LocationID] = 1570
define vid[PortTransferStateList] = 1539
define vid[PortAssociationStateList] =
1529
define vid[PortID] = 1500
define vid[PPChangeName] = 965
define vid[PPChangeStatus] = 967
define vid[PPExecName] = 962
define vid[PrJobID] = 1670
define vid[PrJobState] = 1671
define vid[QueueAvailSpace] = 920
define vid[Reason] = 1590
define vid[SlotMap] = 1598
define vid[SubstDestination] = 1681
define vid[SubstID] = 1683
define vid[SubstLocID] = 1684
define vid[SubstLotID] = 1680
define vid[SubstProcState] = 1687
define vid[SubstSource] = 1688
define vid[SubstState] = 1689
define vid[SubstType] = 1690
define vid[SubstUsage] = 1691
define vid[SubstHistory] = 1682
# Define equipment events
define_xref event = MaterialReceived, 14
define_xref event = MaterialRemoved, 15
define_xref event =
CID_NoState2WaitForHost, 3030003
define_xref event =
CID_WaitForHost2VerificationOK, 3030304
define_xref event = CASM_InAccess, 3031011
define_xref event = CASM_Complete, 3031112
define_xref event =
COSM_CarrierDestroyed,
3030100
define_xref event =
LPCASM_NotAssociated2Associated, 3090102
define_xref event =
LPCASM_Associated2NotAssociated, 3090201
define_xref event =
CarrierLocationChange, 73
define_xref event = CtrlJobQueued, 3250001
define_xref event = CtrlJobSelected, 3250103
define_xref event =
CtrlJobSelected2Executing,
3250305
define_xref event = CtrlJobCompleted, 3250507
define_xref event = CtrlJobDestroy, 3250700
define_xref event =
OperatorCommandIssued, 12
define_xref event = PrJobQueued, 3240001
define_xref event = PrJobSetUp, 3240102
define_xref event =
PrJobSetUp2Processing,
3240204
define_xref event =
PrJobProcessComplete,
3240405
define_xref event = PrJobCompleted, 3240500
define_xref event =
SM_NotRead2WaitForHost, 3030607
define_xref event =
SM_WaitForHost2VerificationFAIL, 3030709
define_xref event =
SM_NotRead2VerificationOK, 3030608
define_xref event = ProcessProgramChanged, 1
define_xref event =
SubstProc_InProcess2ProcessingComplete, 3270203
# Events to link to reports and enable
define_array events = \
CID_WaitForHost2VerificationOK, \
SM_NotRead2WaitForHost, \
PrJobQueued, \
PrJobSetUp, \
MaterialReceived, \
OperatorCommandIssued, \
MaterialRemoved
# Define the EquipmentStatusData item used
in the initialize
define_array EquipmentStatusData = \
AccessMode1, \
AccessMode1, \
AccessMode1, \
CarrierID1 , \
CarrierID1 , \
CarrierID1 , \
PortTransferStateList, \
PortAssociationStateList, \
CarrierLocationMatrix
return
# Handling
for list data types
label
SlotMap
let name = SlotMap
gosub list_1
return
label
PortTransferStateList
let name = PortTransferState
gosub list_1
return
label
PortAssociationStateList
let name = SlotMap
gosub list_1
return
label
CarrierLocationMatrix
let name1 = LocationID
let name2 = CarrierID
gosub list_2
return
label
SubstHistory
# <L
#
<L
#
<A SubstLoc>
#
<A TimeIn>
#
<A TimeOut>
# >
#
....
#
>
let tmp_idx = $idx
let num_items = get_tmp_var($tmp_idx)
for substhistory.i=1 to $num_items
let report.name =
"SubstLoc[" . $substhistory.i . "]"
let tmp_idx = $idx . "." .
$substhistory.i . ".1"
let report.value =
get_tmp_var($tmp_idx)
gosub report.add
let report.name = "TimeIn["
. $substhistory.i . "]"
let tmp_idx = $idx . "." .
$substhistory.i . ".2"
let report.value =
get_tmp_var($tmp_idx)
gosub report.add
let report.name = "TimeOut["
. $substhistory.i . "]"
let tmp_idx = $idx . "." .
$substhistory.i . ".3"
let report.value =
get_tmp_var($tmp_idx)
gosub report.add
next substhistory.i
return
#
Generic list
label
list_1
# <L
#
<x y>
#
.....
# >
let tmp_idx = $idx
let num_items = get_tmp_var($tmp_idx)
for list_1.i=1 to $num_items
let report.name = $name .
"[" . $list_1.i . "]"
let tmp_idx = $idx . "." .
$list_1.i
let report.value =
get_tmp_var($tmp_idx)
gosub report.add
next list_1.i
return
#
Generic list
label
list_2
# <L
#
<L
#
<x1 y1>
#
<x1 y2>
#
>
#
....
#
>
let tmp_idx = $idx
let num_items = get_tmp_var($tmp_idx)
for list_2.i=1 to $num_items
let report.name = $name1 .
"[" . $list_2.i . "]"
let tmp_idx = $idx . "." .
$list_2.i . ".1"
let report.value = get_tmp_var($tmp_idx)
gosub report.add
let report.name = $name2 .
"[" . $list_2.i . "]"
let tmp_idx = $idx . "." .
$list_2.i . ".2"
let report.value =
get_tmp_var($tmp_idx)
gosub report.add
next list_2.i
return
# Reply
report handling
label
report.clear
let report.num_elements = 0
return
label
report.add
let report.num_elements =
$report.num_elements + 1
let report.name[$report.num_elements] =
$report.name
let report.value[$report.num_elements] =
$report.value
return
label
report.dump
print
"----------------------------------------------"
print " Report contents:"
for report.i =1 to $report.num_elements
print " <" . $report.name[$report.i] . "> =
<" . $report.value[$report.i] . ">"
next report.i
print
"----------------------------------------------"
return