|
The purpose of these pages are to show
how G&L Engineering can engineer your project.
A CL sequence will task break after executing 240 CLBACK
statements. This must be considered when building the array
points. If a task break is undesirable parallel sequences
should be considered, if the quantity of data makes this
impractical bit packing should be considered.
This example of controlling a redundant serial link has
been made as generic as practical, only array and tagging
information needs to be entered. This code must be read
in conjunction with the input sequence, output sequence
and watch dog timer requirements. To see how these components
work together view the overview
page.
This code is entirely original,
developed by G&L Engineering.
-- **************************************************************
-- SEQUENCE SL_INPUT (SERIAL LINK INPUT SEQUENCE)
-- **************************************************************
-- ©2000 G&L Engineering Ltd.
-- CUSTOMER:
-- PROJECT:
-- HISTORY:
-- CODED BY:
--
--
--
-- This sequence transfers data from the primary or redundant
serial links
-- to array M_ARRAY_I. -- The primary or redundant link
is selected by sequence CONTROL.
-- The selected link is indicated by Flag INSERVICE_P (primary)
or
-- INSERVICE_R (redundant) -- An internal watch dog timer
(WDT) monitors if this sequence is running.
-- If this sequence is stopped HOLD_FLAG is set ON to HOLD
all sequences
-- associated with this serial link.
--
-- This program forms part of the overall Serial Interface.
-- The HPM/CL sequences including this one are;
-- SLMASTER.cl - Controls the Primary and Redundant Serial
Links.
-- SLINPUT.cl - transfers Input information from the serial
link.
-- SLOUTPUT.cl - transfers Output information to the serial
link.
-- All associated logic and calculations are controller
by sequence SLMASTER.
-- **************************************************************
Sequence SLINPUT (HPM; POINT SL_INPUT)
-- xxxxxxxx.NO
-- **************************************************************
-- The suffix P array points contain information from the
primary serial link.
-- The suffix R array points contain information from the
redundant serial link.
-- **************************************************************
EXTERNAL AI_ARRAY1_P, DI_ARRAY1_P EXTERNAL AI_ARRAY1_R,
DI_ARRAY1_R
EXTERNAL M_ARRAY_I
EXTERNAL INSERVICE_P -- PRIMARY LINK SELECTED
EXTERNAL INSERVICE_R -- REDUNDANT LINK SELECTED
EXTERNAL HOLD_FLAG, HOLD_FLAG_REQ -- SEQUENCE COMMAND HOLD
EXTERNAL DI_READS_P -- PRIMARY LINK DIGITAL READS PER SCAN
EXTERNAL DI_READS_R -- REDUNDANT LINK DIGITAL READS PER
SCAN
EXTERNAL AI_READS_P -- PRIMARY LINK ANALOGUE READS PER SCAN
EXTERNAL AI_READS_R -- REDUNDANT LINK ANALOGUE READS PER
SCAN
EXTERNAL T_WDT_INPUT -- WDT FOR THIS SEQUENCE
LOCAL DIN_P AT NN(01) -- INTERNAL PRIMARY
DI REGISTER
LOCAL DIN_R AT NN(02) -- INTERNAL REDUNDANT DI REGISTER
LOCAL AIN_P AT NN(03) -- INTERNAL PRIMARY AI REGISTER
LOCAL AIN_R AT NN(04) -- INTERNAL REDUNDANT AI REGISTER
LOCAL A AT NN(08) -- INTERNAL ANALOGUE COUNTER
LOCAL D AT NN(09) -- INTERNAL DIGITAL COUNTER
LOCAL WDT AT NN(10) -- WDT SP. NORMALLY 4 SECONDS
PHASE INITIAL
-- -------------
-- **************************************************************
-- Phase INITIAL executes when this sequence is initially
initiated. This phase
-- reads which serial link is in service from flags INSERVICE_P
and INSERVICE_R
-- and selects the correct arrays points to read the input
data.
-- **************************************************************
STEP STARTUP
-- ------------
SET INSERVICE_P.PVFL, INSERVICE_R.PVFL = OFF
-- Set up Watch Dog Timer
A10: SET T_WDT_INPUT.COMMAND = STOP
SET T_WDT_INPUT.COMMAND = RESET
SET T_WDT_INPUT.TIMEBASE = SECONDS
IF WDT < 2 THEN SET WDT = 4 IF WDT > 6 THEN SET WDT = 4
SET T_WDT_INPUT.SP = WDT
SET T_WDT_INPUT.COMMAND = RESTSTRT
SET DI_READS_P.PV, DI_READS_R.PV=0
-- Reset scan registers
SET AI_READS_P.PV, AI_READS_R.PV=0
-- Check which link is in-service
-- This sequence will not proceed if MASTER is not running.
IF INSERVICE_P.PVFL = ON AND INSERVICE_R.PVFL = OFF THEN
& GOTO PHASE PRI_LINK
IF INSERVICE_R.PVFL = ON AND INSERVICE_P.PVFL = OFF THEN
& GOTO PHASE RED_LINK GOTO A10
PHASE PRI_LINK (HOLD LINKFAIL)
-- -----------------------------
-- **************************************************************
-- Phase PRI_LINK, reads Digital and Analogue Inputs from
the Primary Input
-- arrays and writes the data to the common input arrays.
-- **************************************************************
STEP MONITOR
-- ------------
IF DI_ARRAY1_P.BADPVFL OR AI_ARRAY1_P.BADPVFL THEN
& GOTO PHASE INITIAL
IF INSERVICE_P.PVFL = OFF THEN GOTO PHASE INITIAL
-- Set up Watch Dog Timer every programme cycle
SET T_WDT_INPUT.COMMAND = STOP
SET T_WDT_INPUT.COMMAND = RESET
SET T_WDT_INPUT.TIMEBASE = SECONDS
IF WDT < 2 THEN SET WDT = 4 IF WDT > 6 THEN SET WDT = 4
SET T_WDT_INPUT.SP = WDT
SET T_WDT_INPUT.COMMAND = RESTSTRT
-- Reset read registers
SET DI_READS_R.PV, AI_READS_R.PV = 0
SET DIN_P, DIN_R, AIN_R = 0
-- Collect Analogue Input Data
A11: LOOP FOR A IN 1 .. AI_ARRAY1_P.NNUMERIC
SET M_INPUT_ARRAY.NN(A) = AI_ARRAY1_P.NN(A)
SET AIN_P = AIN_P + 1 REPEAT
A11 SET AI_READS_P.PV = AIN_P
-- **************************************************************
-- REPEAT ABOVE FOR EACH ANALOGUE INPUT ARRAY.
-- IN STATEMENT "SET M_INPUT_ARRAY.NN(A)" ADD OFFSET EQUAL
TO PREVIOUS
-- ARRAYSIZE. IE SET M_INPUT_ARRAY.NN(A + AI_ARRAY1_P.NNUMERIC)
-- **************************************************************
-- Collect Digital Input Data
A21: LOOP FOR D IN 1 .. DI_ARRAY1_P.NFLAG
SET M_INPUT_ARRAY.FL(D) = DI_ARRAY1_P.FL(D)
SET DIN_P = DIN_P + 1
REPEAT A21
SET DI_READS_P.PV = DIN_P
-- **************************************************************
-- REPEAT ABOVE FOR EACH DIGITAL INPUT ARRAY.
-- IN STATEMENT "SET M_INPUT_ARRAY.FL(D)" ADD OFFSET EQUAL
TO PREVIOUS
-- ARRAY SIZE. IE SET M_INPUT_ARRAY.NN(D + DI_ARRAY1_P.NFLAG)
-- **************************************************************
-- **************************************************************
-- IF OVERRUNS OCCURS INSERT THESE LINES AFTER A REPEAT
STATEMENT AND
-- BEFORE THE NEXT LOOP STATEMENT. -- WAIT 1 SECS
-- Set up Watch Dog Timer every programme cycle
-- SET T_WDT_INPUT.COMMAND = STOP
-- SET T_WDT_INPUT.COMMAND = RESET
-- SET T_WDT_INPUT.TIMEBASE = SECONDS
-- IF WDT < 2 THEN SET WDT = 4
-- IF WDT > 6 THEN SET WDT = 4
-- SET T_WDT_INPUT.SP = WDT
-- SET T_WDT_INPUT.COMMAND = RESTSTRT
-- **************************************************************
GOTO STEP MONITOR
PHASE RED_LINK (HOLD LINKFAIL)
-- ------------------------------
-- **************************************************************
-- Phase RED_LINK, reads Digital and Analogue Inputs from
the Redundant Input
-- arrays and writes the data to the common input arrays.
-- **************************************************************
STEP MONITOR
-- ------------
IF DI_ARRAY1_R.BADPVFL OR AI_ARRAY1_R.BADPVFL THEN
& GOTO PHASE INITIAL
IF INSERVICE_R.PVFL = OFF THEN GOTO PHASE INITIAL
-- Set up Watch Dog Timer every programme cycle
SET T_WDT_INPUT.COMMAND = STOP SET T_WDT_INPUT.COMMAND =
RESET
SET T_WDT_INPUT.TIMEBASE = SECONDS
IF WDT < 2 THEN SET WDT = 4
IF WDT > 6 THEN SET WDT = 4
SET T_WDT_INPUT.SP = WDT
SET T_WDT_INPUT.COMMAND = RESTSTRT
-- Reset read registers
SET DI_READS_P.PV, AI_READS_P.PV = 0
SET DIN_R, DIN_P, AIN_P, AIN_R = 0
-- Collect Analogue Input Data
A11: LOOP FOR A IN 1 .. AI_ARRAY1_R.NNUMERIC
SET M_INPUT_ARRAY.NN(A) = AI_ARRAY1_R.NN(A)
SET AIN_R = AIN_R + 1
REPEAT A11
SET AI_READS_R.PV = AIN_R
-- **************************************************************
-- REPEAT ABOVE FOR EACH ANALOGUE INPUT ARRAY.
-- IN STATEMENT "SET M_INPUT_ARRAY.NN(A)" ADD OFFSET EQUAL
TO PREVIOUS
-- ARRAY SIZE. IE SET M_INPUT_ARRAY.NN(A + AI_ARRAY1_R.NNUMERIC)
-- **************************************************************
-- Collect Digital Input Data
A21: LOOP FOR D IN 1 .. DI_ARRAY1_R.NFLAG
SET M_INPUT_ARRAY.FL(D) = DI_ARRAY1_R.FL(D)
SET DIN_R = DIN_R + 1
REPEAT A21
SET DI_READS_R.PV = DIN_R
-- **************************************************************
-- REPEAT ABOVE FOR EACH DIGITAL INPUT ARRAY.
-- IN STATEMENT "SET M_INPUT_ARRAY.FL(D)" ADD OFFSET EQUAL
TO PREVIOUS
-- ARRAY SIZE. IE SET M_INPUT_ARRAY.NN(D + DI_ARRAY1_P.NFLAG)
-- **************************************************************
-- **************************************************************
-- IF OVERRUNS OCCURS INSERT THESE LINES AFTER A REPEAT
STATEMENT AND
-- BEFORE THE NEXT LOOP STATEMENT.
-- WAIT 1 SECS
-- Set up Watch Dog Timer every programme cycle
-- SET T_WDT_INPUT.COMMAND = STOP
-- SET T_WDT_INPUT.COMMAND = RESET
-- SET T_WDT_INPUT.TIMEBASE = SECONDS
-- IF WDT < 2 THEN SET WDT = 4
-- IF WDT > 6 THEN SET WDT = 4
-- SET T_WDT_INPUT.SP = WDT
-- SET T_WDT_INPUT.COMMAND = RESTSTRT
-- **************************************************************
GOTO STEP MONITOR
END SLINPUT
-- **************************************************************
-- LINKFAIL is activated from phase PRI_LINK or phase RED_LINK
when the serial
-- link currently in service fails. The Hold Handler will
wait until a usable
-- serial link is selected by sequence SLMASTER.
-- **************************************************************
-- **************************************************************
HOLD HANDLER LINKFAIL (WHEN ((AI_ARRAY1_P.BADPVFL = ON OR
& DI_ARRAY1_P.BADPVFL = ON) AND INSERVICE_P.PVFL = ON)
& OR & ((AI_ARRAY1_R.BADPVFL = ON OR
& DI_ARRAY1_R.BADPVFL = ON) AND INSERVICE_R.PVFL = ON)
& OR & HOLD_FLAG.PVFL = ON)
-- **************************************************************
SET HOLD_FLAG_REQ.PVFL = ON
-- Hold all sequences
SET INSERVICE_P.PVFL, INSERVICE_R.PVFL = OFF
-- Link not in service
-- Set up Watch Dog Timer every programme cycle
A10: SET T_WDT_INPUT.COMMAND = STOP
SET T_WDT_INPUT.COMMAND = RESET
SET T_WDT_INPUT.TIMEBASE = SECONDS
IF WDT < 2 THEN SET WDT = 4
IF WDT > 8 THEN SET WDT = 4
SET T_WDT_INPUT.SP = WDT
SET T_WDT_INPUT.COMMAND = RESTSTRT
SET DI_READS_P.PV, AI_READS_P.PV = 0
SET DI_READS_R.PV, AI_READS_R.PV = 0
IF HOLD_FLAG.PVFL = ON THEN GOTO A10
IF INSERVICE_P.PVFL = OFF AND INSERVICE_R.PVFL = OFF THEN
GOTO A10
RESTART
-- -------
IF INSERVICE_P.PVFL = ON AND INSERVICE_R.PVFL = OFF THEN
& RESUME PHASE PRI_LINK
IF INSERVICE_R.PVFL = ON AND INSERVICE_P.PVFL = OFF THEN
& RESUME PHASE RED_LINK
SET T_WDT_INPUT.COMMAND = RESTSTRT
RESUME PHASE INITIAL
END LINKFAIL
-- End of File
Goto our examples page
to see implementation examples.
This code is entirely original,
developed by G&L Engineering.
© 2000 G&L Engineering Ltd.
|