SET
= #REQ
//---------- Check DevCnt (>= 1 and <= 16)
L #IN_DEVICE_COUNT
+ -1
AW 16#FFF0
JN ErrP
//---------- Presence Bit for each of the device
L #IN_DEVICE_COUNT
L WORD#16#FFFF
SLW
INVI
CAW //Device 1 => Bit 8 ... Device 9 => Bit 0
T #DevMask
//---------- Initializations
L BYTE#16#00
T #OUT_DIAG.Codedef
T #MODE
T #Sts.ActReq
T #Sts.DeaReq
L #DevMask
//---------- First Cycle Deactivation Request
ON #IN_SYSFROID
ON #OUT_DEACTIVATED
JC x0
T #Sts.DeaReq //for each of the device
T #Sts.Act //Activated
JU x2
//---------- Activation Request
x0: AN #IN_ACT_REQ
AN #PILOT.HmiActReq
JC x1
T #Sts.ActReq //for each of the device
//---------- Deactivation Request
x1: AN #IN_DEA_REQ
AN #PILOT.HmiDeaReq
JC x2
T #Sts.DeaReq //for each of the device
//---------- Deactivation
x2: L #Sts.ActMod //Activation in progress
L #Sts.Act //Activated
OW
L #Sts.DeaReq //Deactivation Request
AW
L #Sts.DeaMod //Deactivation in progress
OW
L #Sts.EndMod //End
INVI
AW
L #DevMask
AW
T #Sts.DeaMod //Deactivation
A <>0
= #Deactivating //Deactivation in progress
//---------- Activation
L #Sts.Dea //Deactivated
L #Sts.ActReq //Activation Request
AW
L #Sts.ActMod //Activation in progress
OW
L #Sts.EndMod //End
INVI
AW
L #Sts.DeaMod //Deactivation in progress
INVI
AW
L #DevMask
AW
T #Sts.ActMod //Activation
A <>0
= #Activating //Activation in progress
//----------
O #Activating
O #Deactivating
= #OUT_BUSY //Activation or Deactivation in progress
//---------- Loop Initialization
L #IN_FIRST_DEVNUM //Initialize DevNum
T #DevNum
LAR1 AR2 //Initialize address register (AR1)
L P##Sts
+AR1
L #IN_DEVICE_COUNT //Initialize LoopCnt
Loop: T #LoopCnt
//---------- Get Logic Address
L 2
T #GeoADDR.HWTYPE //HW type out of DTI_type of the HW object
L 1
T #GeoADDR.AREA //Format and area: 0=central, 1= PNIO, 2= DP, 3= AS-i
L 100
T #GeoADDR.IOSYSTEM //Master system ID
L #DevNum
T #GeoADDR.STATION //Station number,
L 0
T #GeoADDR.SLOT //Slot Number
L 0
T #GeoADDR.SUBSLOT //Subslot number, 0= no subslot
CALL GEO2LOG // Get Logic Address of the device
GEOADDR :=#GeoADDR
RET_VAL :=#RET
LADDR :=#LADDR
L #RET
L BYTE#16#00
<>D
= DIX [ AR1 , P#14.0 ] //Sts.Err[]
JC Err
//----------
A DIX [ AR1 , P#4.0 ] //Sts.ActMod[]
= %L0.0 //Mode.X0 -> Mode = 1 (Activation)
A DIX [ AR1 , P#6.0 ] //Sts.DeaMod[]
= %L0.1 //Mode.X1 -> Mode = 2 (Deactivation)
//----------
T #_Accu1Safe
TAK
T #_Accu2Safe
CALL D_ACT_DP
REQ :=#REQ
MODE :=#MODE
LADDR :=#LADDR
RET_VAL :=#RET
BUSY :=#BUS
L #_Accu2Safe
L #_Accu1Safe
// ---------- Evaluate result
L #RET
L BYTE#16#00 //Request completed without errors
==D
= DIX [ AR1 , P#8.0 ] //EndMod[]
// ---------- Evaluate result
POP //RET
L BYTE#16#01 //IO device is active (and Mode = 0)
==D
= DIX [ AR1 , P#10.0 ] //Sts.Act[]
// ---------- Evaluate result
POP //RET
L BYTE#16#02 //IO device is deactivated (and Mode = 0)
==D
= DIX [ AR1 , P#12.0 ] //Sts.Dea[]
// ---------- Evaluate result
POP //RET
L WORD#16#80C3 //Temporary resource error
<>D
// ----------Evaluate result
POP //RET
L WORD#16#8000 //Other error
AW
A <>0
= DIX [ AR1 , P#14.0 ] //Sts.Err[]
JCN NErr
Err: L #OUT_DIAG.Codedef
L BYTE#16#00
<>D
JC NErr
L #RET
T #OUT_DIAG.Codedef
// ---------- Next Device
NErr: +AR1 P#0.1
L #DevNum
+ 1
T #DevNum
L #LoopCnt
LOOP Loop
//---------- All devices activated
L #DevMask
L #Sts.Act
AW
==D
= #OUT_ACTIVATED
//---------- All devices deactivated
POP //DevMask
L #Sts.Dea
AW
==D
= #OUT_DEACTIVATED
//---------- Time mesurement
A #Activating
FN #XAct
AN #Deactivating
JCN T
L #TONAct.ET
L #TONAct.PT
==D
JC T
POP //TONAct.ET
T #TAct
L #TActMax
>D
JCN Min
POP //TONAct.ET
T #TActMax
Min: L #TAct
L #TActMin
<D
JCN T
POP //TONAct.ET
T #TActMin
T: CALL #TONAct
time_type:=Time
IN :=#Activating
PT :=T#30S
Q :=
ET :=
//---------- Error
Def: L #OUT_DIAG.Codedef
L BYTE#16#00
<>D
= #OUT_DEFAULT
= #OUT_DIAG.Def
L BYTE#16#01 //Error
JC TSts
A #OUT_DEACTIVATED
L BYTE#16#02 //All devices of the group deactivated
JC TSts
A #OUT_ACTIVATED
L BYTE#16#03 //All devices of the group activated
JC TSts
A #Deactivating
L BYTE#16#04 //Activation in progress
JC TSts
L BYTE#16#05 //Deactivation in progress
TSts: T #OUT_DIAG.HmiSts
BEU
ErrP: L WORD#16#827F //DevCnt < 1 or DevCnt > 16
T #OUT_DIAG.Codedef
JU Def
以上是整个STL程序段,有以下几个疑问:
1、T #_Accu1Safe和T #_Accu2Safe这两个变量被赋值成什么,是由赋值的;
2、POP //RET
L BYTE#16#01 //IO device is active (and Mode = 0)
==D
= DIX [ AR1 , P#10.0 ] //Sts.Act[]
Sts.Act[]监控的时候发现值是16#0300,此处只给一个位,为什么能出现16#0300呢?另外这个16#0300的值是从哪来的呢?
希望各位大神不吝赐教,谢谢!附件是接口变量
新建 XLS 工作表 (3).xls