insn_CALL_multiinstance.awl 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. DATA_BLOCK DB 1
  2. FB 1
  3. BEGIN
  4. END_DATA_BLOCK
  5. // FB 3, embedded as multi-instance in FB 2
  6. FUNCTION_BLOCK FB 3
  7. VAR
  8. V1 : INT;
  9. END_VAR
  10. BEGIN
  11. L W#16#CAFE
  12. T #V1
  13. END_FUNCTION_BLOCK
  14. // FB 2, embedded as multi-instance in FB 1
  15. FUNCTION_BLOCK FB 2
  16. VAR
  17. TEST_STAT1 : DWORD;
  18. TEST_FB3 : FB 3;
  19. END_VAR
  20. VAR_INPUT
  21. TEST_IN1 : DINT;
  22. END_VAR
  23. VAR_OUTPUT
  24. TEST_OUT1 : WORD;
  25. END_VAR
  26. BEGIN
  27. __ASSERT== __AR 2, P#DBX 2.0 // Check multi-instance base
  28. // Check DB/DI registers
  29. L DBNO
  30. __ASSERT== __ACCU 1, 1
  31. L DINO
  32. __ASSERT== __ACCU 1, 1
  33. // Get input, add 1, store in static.
  34. L #TEST_IN1
  35. L 1
  36. +D
  37. T #TEST_STAT1
  38. CALL #TEST_FB3
  39. // Get static, add 1, store in output.
  40. L #TEST_STAT1
  41. L 1
  42. +D
  43. T #TEST_OUT1
  44. END_FUNCTION_BLOCK
  45. // FB 1, called with instance-DB. Embeds multi-instances.
  46. FUNCTION_BLOCK FB 1
  47. VAR
  48. GUARD0 : WORD; // Guard field
  49. MULTI_FB2 : FB 2; // Embedded FB 2 multi-instance
  50. GUARD1 : WORD; // Guard field
  51. MULTI_SFB0 : SFB 0; // Embedded SFB 0 multi-instance
  52. GUARD2 : WORD; // Guard field
  53. END_VAR
  54. VAR_TEMP
  55. TEMP1 : WORD;
  56. COUNT : INT;
  57. END_VAR
  58. BEGIN
  59. __ASSERT== __AR 2, P#DBX 0.0 // Check multi-instance base
  60. // Check DB/DI registers
  61. L DBNO
  62. __ASSERT== __ACCU 1, 0
  63. L DINO
  64. __ASSERT== __ACCU 1, 1
  65. // Write the guard fields to detect errors in the
  66. // multi instance base offset (AR2).
  67. L W#16#4220 // Magic value
  68. T #GUARD0
  69. L W#16#4221 // Magic value
  70. T #GUARD1
  71. L W#16#4222 // Magic value
  72. T #GUARD2
  73. // Call the multi-instance FB 2
  74. CALL #MULTI_FB2 (
  75. TEST_IN1 := L#77,
  76. TEST_OUT1 := #TEMP1,
  77. )
  78. L #TEMP1
  79. __ASSERT== __ACCU 1, 79 // result = input + 2
  80. // Call the multi-instance SFB 0
  81. CALL #MULTI_SFB0 (
  82. CU := FALSE,
  83. CV := #COUNT,
  84. )
  85. CALL #MULTI_SFB0 (
  86. CU := TRUE,
  87. CV := #COUNT,
  88. )
  89. CALL #MULTI_SFB0 (
  90. CU := FALSE,
  91. CV := #COUNT,
  92. )
  93. L #COUNT
  94. __ASSERT== __ACCU 1, 1
  95. // Check all instance-DB values.
  96. // Use fully qualified accesses to avoid implicit usage of AR2 base.
  97. L DINO // DI = DB1
  98. __ASSERT== __ACCU 1, 1
  99. L DB1.DBW 0 // DB1.GUARD0
  100. __ASSERT== __ACCU 1, W#16#4220
  101. L DB1.DBD 2 // DB1.MULTI_FB2.TEST_IN1
  102. __ASSERT== __ACCU 1, 77
  103. L DB1.DBW 6 // DB1.MULTI_FB2.TEST_OUT1
  104. __ASSERT== __ACCU 1, 79
  105. L DB1.DBD 8 // DB1.MULTI_FB2.TEST_STAT1
  106. __ASSERT== __ACCU 1, 78
  107. L DB1.DBW 12 // DB1.MULTI_FB2.TEST_FB3.V1
  108. __ASSERT== __ACCU 1, W#16#CAFE
  109. L DB1.DBW 14 // DB1.GUARD1
  110. __ASSERT== __ACCU 1, W#16#4221
  111. L DB1.DBW 16 // DB1.MULTI_SFB0.CU/R
  112. __ASSERT== __ACCU 1, W#16#0000
  113. L DB1.DBW 18 // DB1.MULTI_SFB0.PV
  114. __ASSERT== __ACCU 1, 0
  115. L DB1.DBW 20 // DB1.MULTI_SFB0.Q
  116. __ASSERT== __ACCU 1, W#16#0100
  117. L DB1.DBW 22 // DB1.MULTI_SFB0.CV
  118. __ASSERT== __ACCU 1, 1
  119. L DB1.DBW 24 // DB1.MULTI_SFB0.CUO
  120. __ASSERT== __ACCU 1, W#16#0000
  121. L DB1.DBW 26 // DB1.GUARD2
  122. __ASSERT== __ACCU 1, W#16#4222
  123. END_FUNCTION_BLOCK
  124. ORGANIZATION_BLOCK OB 1
  125. BEGIN
  126. CALL FB 1, DB 1
  127. CALL SFC 46 // STOP CPU
  128. END_ORGANIZATION_BLOCK