# 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