Some devices like the SLC500 can read single bit but cannot write. The customer is then forced to write a program that takes a numeric value and stores the single bits into this numeric. Then this numeric must be written to the plc and unpacked .

SEQUENCE PEER (PM; POINT PMLMPRMD)

- This sequence demonstrates how to use the bit-packing and bit-unpacking
- subroutines. The subroutines can be called as many times as there are
- numeric values to unpack, without the sequence pre-empting (subject to PM
- processor overruns)

EXTERNAL PMLMNUM1 -The numeric point containing packed LM flags

EXTERNALPMLMNUM2 -The numeric point containing packed PM flags

EXTERNAL!BOX - The PM box reference

## LOCAL UNPKBIT: LOGICAL ARRAY (1… 16) AT!BOX(11) - Destination for PM flap

LOCAL PACKBIT: LOGICAL ARRAY (1- 16) AT! BOX (27) - Origin for PM flags

LOCAL UNPKNUM AT NN (80) -Local variable for use in unpack subroutine

LOCAL PACKNUM AT NN (79) -Local variable for use in pack subroutine

PHASE DECODE

S1: CALL UNPACK (PMLMNUM1.PV, UNPKBIT)

CALL PACK (PMLMNUM2.PV, PACKBIT)

GOTO S1

END PEER

SUBROUTINE UNPACK(PACKEDNUM:IN NUMBER; UPBIT:OUT LOGICAL ARRAY (1… 16))

—This subroutine unpacks a PM numeric containing packed digitals

—(Probably sent or read from an LM into flags.)

—PACKEDNUM is some numeric value containing 16 packed digitals.

—UPBIT is the array of flags that will store the digitals.

—UNPKNUM is a local numeric variable.

SET UNPKNUM=ABS(PACKEDNUM) -Must remove sign

IF UNPKNUM > 32767 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 32768)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 16383 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 16384)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 8191 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 8192)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 4095 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 4096)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 2047 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 2048)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 1023 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 1024)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 511 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 512)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 255 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 256)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 127 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 128)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 63 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 64)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 31 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 32)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 15 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 16)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 7 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 8)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 3 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM- 4)

ELSE SET UPBIT(16)=OFF

IF UNPKNUM > 1 THEN (SET UPBIT (16)=ON; SET UNPKNUM=UNPKNUM -2)

ELSE SET UPBIT(16)=OFF

SET UNPKNUM = PACKNUM

END PACK.