// Tank Demo Soft Logic ProgramThis program is used to drive the HMI tank simulation.
// 20-Jul-2009

NETWORK 1
// Map the push buttons to the pilot lights.
// PB1 and PL1
STR X1
OUT Y1

NETWORK 2
// PB2 and PL2
STR X2
OUT Y2

NETWORK 3
// PB3 and PL3
STR X3
OUT Y3

NETWORK 4
// Copy PB4 to PL4
STR SC1
COPY XD1 YD1

NETWORK 5
// Simulate the tank.
// Call the tank sim subroutine once per second.
STRPD SC7
CALL TankSim

NETWORK 6
// Tank 2 is just the inverse of tank 1.
STR SC1
MATHDEC DS11 0 100 - DS10

NETWORK 7
// Output the tank levels.
STR SC1
COPY DS10 YS10
COPY DS11 YS11

NETWORK 8
// Calculate the strip chart.
STR SC1
CALL StripChart

NETWORK 9
// Copy the pump speed command to the pump speed reading.
STR SC1
COPY DS1 YS12

NETWORK 10
// Check the events.
STR SC1
CALL Events

NETWORK 11
// Check the alarms.
STR SC1
CALL Alarms

NETWORK 12
// Test extended data types.
STR SC1
CALL ExtData

NETWORK 13
// Demonstrate ladder representation. This subroutine doesn't actually do anything useful.
STR SC1
CALL LadderDemo

NETWORK 14
// Animate the pick and place.
STR SC1
CALL PickAndPlace

NETWORK 15
// This demonstrates a conditional end.
STRN SC1
ENDC

NETWORK 16
// This demonstrates an unconditional end.
END
// The main program ends here.


SBR PickAndPlace
// Control the pick and place.

NETWORK 1
// Vertical axis.
STR X10
OUT Y10

NETWORK 2
// Horizontal axis.
STR X11
OUT Y11

NETWORK 3
// Grippers.
STR X12
OUT Y12

NETWORK 4
RT




SBR StripChart
// Strip charts.
NETWORK 1
// Strip chart 1
STR SC1
COPY SD9 DH100
COPY SD10 DH101

NETWORK 2
// Calculate strip chart 1
STR SC1
MATHHEX DH102 0 ((DH100 AND DH101) AND 3Fh) + (DH100 AND 1Fh)

NETWORK 3
// Output strip chart 1.
STR SC1
COPY DH102 DS101
MATHDEC DS102 0 DS101 - 50
COPY DS102 YS20

NETWORK 4
// Calculate strip chart 2
STR SC1
COPY YS20 DS100
MATHDEC DS112 0 SIN(DS100) * 100

NETWORK 5
// Output strip chart 2.
STR SC1
COPY DS112 YS21
RT


SBR ExtData
// Test extended data types.

NETWORK 1
// 32 bit integer.
STR SC1
COPY DD10 DD11
COPY DD10 DD12

NETWORK 2
// Single precision floating point.
STR SC1
COPY DF10 DF11
COPY DF10 DF12

NETWORK 3
// Double precision floating point.
STR SC1
COPY DF13 DF14
COPY DF13 DF15

NETWORK 4
// Packed String - 2 characters per register.
STR SC1
CPYBLK TXT10 TXT25 TXT50

NETWORK 5
// Sparse String - 1 character per register.
STR SC1
CPYBLK TXT100 TXT115 TXT150

RT




SBR LadderDemo
// Demonstrate different ladder instructions.This subroutine doesn't actually do anything useful.
NETWORK 1
// A simple rung. 
STR C1
OR T1
ANDN CT5
OUT C100

NETWORK 2
// More complex rungs are also possible.
STRN T5
ORN C1
AND C2
STRE DS100 50
ANDGT DS112 YS20
ORPD C100
ANDSTR
SET C101

NETWORK 3
// When a rung cannot be represented as ladder, it defaults to IL.
// This is valid logic, but has no ladder equivalent.
STR T5
OUT C102
AND C101
OUT C103

NETWORK 4
// Incorrect instruction combinations will also default to IL, 
// as they also can't be represented in ladder. 
STRN SC1
ORSTR
SET C47

NETWORK 5
// Boolean input and output instructions.
STR C10
AND C11
OR C12
STRN C13
ANDN C14
ORN C15
ANDSTR
STR C16
OR C17
AND C18
ORSTR
OUT C104
OUT C105 C108
SET C109
SET C110 C112
RST C113
RST C114 C115

NETWORK 6
// Edge contact instructions.
STRPD C1
ANDPD C2
ORPD C5
STRND C3
ANDND C4
ORND C6
ANDSTR
PD C116
PD C117 C119

NETWORK 7
// Boolean compare.
STRE CTD5 5
ANDE CTD5 15
ORE CTD5 25
STRNE 5 CTD5
ANDNE 15 CTD5
ORNE 25 CTD5
ANDSTR
STRGT CTD5 5
ANDGT CTD5 15
ORGT CTD5 25
STRLT CTD5 5
ANDLT CTD5 15
ORLT CTD5 25
ANDSTR
ORSTR
STRLE CTD5 5
ANDLE CTD5 15
ORLE CTD5 25
STRGE CTD5 5
ANDGE CTD5 15
ORGE CTD5 25
ANDSTR
ORSTR
OUT C120

NETWORK 8
// Up counters.
STR T8
STR SC7
CNTU CT5 55

NETWORK 9
STR CT5
TMR T8 5000 ms

NETWORK 10
// Down counters.
STRPD T9
STR SC6
ANDGE CTD6 10
CNTD CT6 10

NETWORK 11
STR T9
ORLE CTD6 5
COPY 60 CTD6

NETWORK 12
STR CT6
TMR T9 9 sec

NETWORK 13
// Up / down counters.
STR T10
STR SC7
STR SC6
UDC CT7 25

NETWORK 14
STR CT7
TMR T10 9 sec

NETWORK 15
// On and off delay timers.
STRN T5
TMR T5 100 ms
TMROFF T7 3 day

NETWORK 16
// On delay accumulating timers.
STR C1
STR C2
ANDN C3
TMRA T6 1000 sec

NETWORK 17
// Copy data.
STR C30
COPY 1000 DS1000
CPYBLK DS1000 DS1005 DS1010
FILL 999 DS1020 DS1025
UNPACK DH200 C40 C46
PACK C40 C46 DH200

NETWORK 18
// Search.
STR C50
FINDEQ 1 DS2100 DS2110 DS2111 C111
FINDGE DD112 DD100 DD110 DS2113 C112
FINDGT "c" TXT100 TXT110 DS2115 C113
FINDLT 15 DS2100 DS2110 DS2117 C115 1
FINDLE 15 DS2100 DS2110 DS2119 C115 1
FINDNE 15 DS2100 DS2110 DS2121 C115 1

NETWORK 19
// Incremental search.
STR C50
FINDIEQ "cde" TXT100 TXT110 DS2112 C114
FINDIGE 1 DS2100 DS2110 DS2114 C111
FINDIGT DD112 DD100 DD110 DS2116 C112
FINDILT 15 DS2100 DS2110 DS2118 C115 1
FINDILE 15 DS2100 DS2110 DS2120 C115 1
FINDINE 15 DS2100 DS2110 DS2122 C115 1

NETWORK 20
// Shift register
STR C3
STR SC6
STR SC5
SHFRG C130 C139

NETWORK 21
STR C139
OUT C25

NETWORK 22
// Decimal and hex math.
STR SC7
OR T100
COPY 2 DS2125
MATHDEC DF1 0 (1 + DS2125) ^ 2 + SQRT(PI)
COPY 4 DH200
MATHHEX DH201 0 (LSH(DH200, 2h) + 1h) * 2h

NETWORK 23
// SUM is an extra instruction.
STR SC1
SUM DS9000 DS9010 DS10000 1

NETWORK 24
// For/next.
STR SC2
FOR 100
OUT C130
NEXT

NETWORK 25
// Conditional return.
STR SC7
RTC

NETWORK 26
// Unconditional return.
RT


SBR Alarms
// Check the alarms.

NETWORK 1
// PB1 was pushed.
STR X1
OUT Y30

NETWORK 2
// PB2 was pushed.
STR X2
OUT Y31

NETWORK 3
// PB3 was pushed.
STR X3
OUT Y32

NETWORK 4
// Return to the main program.
RT




SBR TankSim
// Simulate tank 1.

NETWORK 1
// Copy the pump speed to a signed integer address.
STR SC1
COPY XS10 DS1

NETWORK 2
// Increment Tank 1 by the command speed.
STR SC1
MATHDEC DS10 0 DS10 - DS1

NETWORK 3
// If the tank level is outside the limits, correct it.
STRGT DS10 95
COPY 95 DS10
COPY 0 DS1

NETWORK 4
// If the tank level is outside the limits, correct it.
STRLT DS10 5
COPY 5 DS10
COPY 0 DS1

NETWORK 5
STRLT DS10 0
COPY 0 DS10
COPY 0 DS1

NETWORK 6
// Return to the main program.
RT




SBR Events
// Check the events.
NETWORK 1
// Pump is running.
STRNE DS1 0
OUT Y20

NETWORK 2
// Pump is stopped.
STRE DS1 0
OUT Y21

NETWORK 3
// Tank 1 is empty.
STRLE DS10 5
OUT Y22

NETWORK 4
// Tank 1 is full.
STRGE DS10 95
OUT Y23

NETWORK 5
// Tank 2 is empty.
STRLE DS11 5
OUT Y24

NETWORK 6
// Tank 2 is full.
STRGE DS11 95
OUT Y25

NETWORK 7
// Return to the main program.
RT


