123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- DATA_BLOCK DB 1
- FB 1
- BEGIN
- END_DATA_BLOCK
- // FB 3, embedded as multi-instance in FB 2
- FUNCTION_BLOCK FB 3
- VAR
- V1 : INT;
- END_VAR
- BEGIN
- L W#16#CAFE
- T #V1
- END_FUNCTION_BLOCK
- // FB 2, embedded as multi-instance in FB 1
- FUNCTION_BLOCK FB 2
- VAR
- TEST_STAT1 : DWORD;
- TEST_FB3 : FB 3;
- END_VAR
- VAR_INPUT
- TEST_IN1 : DINT;
- END_VAR
- VAR_OUTPUT
- TEST_OUT1 : WORD;
- END_VAR
- BEGIN
- __ASSERT== __AR 2, P#DBX 2.0 // Check multi-instance base
- // Check DB/DI registers
- L DBNO
- __ASSERT== __ACCU 1, 1
- L DINO
- __ASSERT== __ACCU 1, 1
- // Get input, add 1, store in static.
- L #TEST_IN1
- L 1
- +D
- T #TEST_STAT1
- CALL #TEST_FB3
- // Get static, add 1, store in output.
- L #TEST_STAT1
- L 1
- +D
- T #TEST_OUT1
- END_FUNCTION_BLOCK
- // FB 1, called with instance-DB. Embeds multi-instances.
- FUNCTION_BLOCK FB 1
- VAR
- GUARD0 : WORD; // Guard field
- MULTI_FB2 : FB 2; // Embedded FB 2 multi-instance
- GUARD1 : WORD; // Guard field
- MULTI_SFB0 : SFB 0; // Embedded SFB 0 multi-instance
- GUARD2 : WORD; // Guard field
- END_VAR
- VAR_TEMP
- TEMP1 : WORD;
- COUNT : INT;
- END_VAR
- BEGIN
- __ASSERT== __AR 2, P#DBX 0.0 // Check multi-instance base
- // Check DB/DI registers
- L DBNO
- __ASSERT== __ACCU 1, 0
- L DINO
- __ASSERT== __ACCU 1, 1
- // Write the guard fields to detect errors in the
- // multi instance base offset (AR2).
- L W#16#4220 // Magic value
- T #GUARD0
- L W#16#4221 // Magic value
- T #GUARD1
- L W#16#4222 // Magic value
- T #GUARD2
- // Call the multi-instance FB 2
- CALL #MULTI_FB2 (
- TEST_IN1 := L#77,
- TEST_OUT1 := #TEMP1,
- )
- L #TEMP1
- __ASSERT== __ACCU 1, 79 // result = input + 2
- // Call the multi-instance SFB 0
- CALL #MULTI_SFB0 (
- CU := FALSE,
- CV := #COUNT,
- )
- CALL #MULTI_SFB0 (
- CU := TRUE,
- CV := #COUNT,
- )
- CALL #MULTI_SFB0 (
- CU := FALSE,
- CV := #COUNT,
- )
- L #COUNT
- __ASSERT== __ACCU 1, 1
- // Check all instance-DB values.
- // Use fully qualified accesses to avoid implicit usage of AR2 base.
- L DINO // DI = DB1
- __ASSERT== __ACCU 1, 1
- L DB1.DBW 0 // DB1.GUARD0
- __ASSERT== __ACCU 1, W#16#4220
- L DB1.DBD 2 // DB1.MULTI_FB2.TEST_IN1
- __ASSERT== __ACCU 1, 77
- L DB1.DBW 6 // DB1.MULTI_FB2.TEST_OUT1
- __ASSERT== __ACCU 1, 79
- L DB1.DBD 8 // DB1.MULTI_FB2.TEST_STAT1
- __ASSERT== __ACCU 1, 78
- L DB1.DBW 12 // DB1.MULTI_FB2.TEST_FB3.V1
- __ASSERT== __ACCU 1, W#16#CAFE
- L DB1.DBW 14 // DB1.GUARD1
- __ASSERT== __ACCU 1, W#16#4221
- L DB1.DBW 16 // DB1.MULTI_SFB0.CU/R
- __ASSERT== __ACCU 1, W#16#0000
- L DB1.DBW 18 // DB1.MULTI_SFB0.PV
- __ASSERT== __ACCU 1, 0
- L DB1.DBW 20 // DB1.MULTI_SFB0.Q
- __ASSERT== __ACCU 1, W#16#0100
- L DB1.DBW 22 // DB1.MULTI_SFB0.CV
- __ASSERT== __ACCU 1, 1
- L DB1.DBW 24 // DB1.MULTI_SFB0.CUO
- __ASSERT== __ACCU 1, W#16#0000
- L DB1.DBW 26 // DB1.GUARD2
- __ASSERT== __ACCU 1, W#16#4222
- END_FUNCTION_BLOCK
- ORGANIZATION_BLOCK OB 1
- BEGIN
- CALL FB 1, DB 1
- CALL SFC 46 // STOP CPU
- END_ORGANIZATION_BLOCK
|