CO_OD.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /*
  2. * Copyright (c) 2019 Vestas Wind Systems A/S
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "CO_driver.h"
  7. #include "CO_OD.h"
  8. #include "CO_SDOserver.h"
  9. /***** DEFINITION AND INITIALIZATION OF OBJECT DICTIONARY VARIABLES ********/
  10. /***** Definition for ROM variables ********************************************/
  11. struct sCO_OD_ROM CO_OD_ROM = {
  12. CO_OD_FIRST_LAST_WORD,
  13. /*1000*/ 0x0000L,
  14. /*1005*/ 0x0080L,
  15. /*1006*/ 0x0000L,
  16. /*1007*/ 0x0000L,
  17. /*1008*/ { 'H', 'P', 'M', 'I', 'C', 'R', 'O', 'C', 'A', 'N', 'o', 'p', 'e', 'n', 'N', 'o', 'd', 'e' },
  18. /*1009*/ { '3', '.', '0', '0' },
  19. /*100a*/ { '3', '.', '0', '0' },
  20. /*1012*/ 0xC0000100L,
  21. /*1014*/ 0x0080L,
  22. /*1015*/ 0x64,
  23. /*1016*/ { 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
  24. /*1017*/ 0x3e8,
  25. /*1018*/ { 0x4L, 0x0000L, 0x0000L, 0x0000L, 0x0000L },
  26. /*1019*/ 0x0L,
  27. /*1029*/ { 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 },
  28. /*1200*/ { { 0x2L, 0x0600L, 0x0580L } },
  29. /*1400*/ { { 0x2L, 0x0200L, 0x0L },
  30. /*1401*/ { 0x2L, 0x0300L, 0xfeL },
  31. /*1402*/ { 0x2L, 0x0400L, 0xfeL },
  32. /*1403*/ { 0x2L, 0x0500L, 0xfeL } },
  33. /*1600*/ { { 0x1L, 0x21020108L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L },
  34. /*1601*/ { 0x0L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L },
  35. /*1602*/ { 0x0L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L },
  36. /*1603*/ { 0x0L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L } },
  37. /*1800*/ { { 0x6L, 0x0180L, 0xfeL, 0x1F40, 0x0L, 0x1F40, 0x0 },
  38. /*1801*/ { 0x6L, 0x0280L, 0xfeL, 0x00, 0x0L, 0x00, 0x0L },
  39. /*1802*/ { 0x6L, 0x0380L, 0xfeL, 0x00, 0x0L, 0x00, 0x0L },
  40. /*1803*/ { 0x6L, 0x0480L, 0xfeL, 0x00, 0x0L, 0x00, 0x0L } },
  41. /*1a00*/ { { 0x1L, 0x21020108L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L },
  42. /*1a01*/ { 0x0L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L },
  43. /*1a02*/ { 0x0L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L },
  44. /*1a03*/ { 0x0L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L } },
  45. /*1f80*/ 0x0000L,
  46. CO_OD_FIRST_LAST_WORD,
  47. };
  48. /***** Definition for RAM variables ********************************************/
  49. struct sCO_OD_RAM CO_OD_RAM = {
  50. CO_OD_FIRST_LAST_WORD,
  51. /*1001*/ 0x0L,
  52. /*1002*/ 0x0000L,
  53. /*1003*/ { 0, 0, 0, 0, 0, 0, 0, 0 },
  54. /*1010*/ { 0x00000003 },
  55. /*1011*/ { 0x00000001 },
  56. /*1f50*/ { 0 },
  57. /*1f51*/ { 0x0L },
  58. /*1f56*/ { 0x0000L },
  59. /*1f57*/ { 0x0000L },
  60. /*2100*/ { 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L },
  61. /*2102*/ 0xAAL,
  62. CO_OD_FIRST_LAST_WORD,
  63. };
  64. /***** Definition for EEPROM variables ********************************************/
  65. struct sCO_OD_EEPROM CO_OD_EEPROM = {
  66. CO_OD_FIRST_LAST_WORD,
  67. /*2101*/ 0x0000L,
  68. CO_OD_FIRST_LAST_WORD,
  69. };
  70. /* STRUCTURES FOR RECORD TYPE OBJECTS */
  71. /*0x1018*/ const CO_OD_entryRecord_t OD_record1018[5] = {
  72. { (void *)&CO_OD_ROM.identity.maxSubIndex, 0x05, 0x1 },
  73. { (void *)&CO_OD_ROM.identity.vendorID, 0x85, 0x4 },
  74. { (void *)&CO_OD_ROM.identity.productCode, 0x85, 0x4 },
  75. { (void *)&CO_OD_ROM.identity.revisionNumber, 0x85, 0x4 },
  76. { (void *)&CO_OD_ROM.identity.serialNumber, 0x85, 0x4 },
  77. };
  78. /*0x1200*/ const CO_OD_entryRecord_t OD_record1200[3] = {
  79. { (void *)&CO_OD_ROM.SDOServerParameter[0].maxSubIndex, 0x05, 0x1 },
  80. { (void *)&CO_OD_ROM.SDOServerParameter[0].COB_IDClientToServer, 0x85, 0x4 },
  81. { (void *)&CO_OD_ROM.SDOServerParameter[0].COB_IDServerToClient, 0x85, 0x4 },
  82. };
  83. /*0x1400*/ const CO_OD_entryRecord_t OD_record1400[3] = {
  84. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[0].maxSubIndex, 0x05, 0x1 },
  85. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[0].COB_IDUsedByRPDO, 0x8d, 0x4 },
  86. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[0].transmissionType, 0x0d, 0x1 },
  87. };
  88. /*0x1401*/ const CO_OD_entryRecord_t OD_record1401[3] = {
  89. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[1].maxSubIndex, 0x05, 0x1 },
  90. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[1].COB_IDUsedByRPDO, 0x8d, 0x4 },
  91. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[1].transmissionType, 0x0d, 0x1 },
  92. };
  93. /*0x1402*/ const CO_OD_entryRecord_t OD_record1402[3] = {
  94. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[2].maxSubIndex, 0x05, 0x1 },
  95. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[2].COB_IDUsedByRPDO, 0x8d, 0x4 },
  96. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[2].transmissionType, 0x0d, 0x1 },
  97. };
  98. /*0x1403*/ const CO_OD_entryRecord_t OD_record1403[3] = {
  99. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[3].maxSubIndex, 0x05, 0x1 },
  100. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[3].COB_IDUsedByRPDO, 0x8d, 0x4 },
  101. { (void *)&CO_OD_ROM.RPDOCommunicationParameter[3].transmissionType, 0x0d, 0x1 },
  102. };
  103. /*0x1600*/ const CO_OD_entryRecord_t OD_record1600[9] = {
  104. { (void *)&CO_OD_ROM.RPDOMappingParameter[0].numberOfMappedObjects, 0x0d, 0x1 },
  105. { (void *)&CO_OD_ROM.RPDOMappingParameter[0].mappedObject1, 0x8d, 0x4 },
  106. { (void *)&CO_OD_ROM.RPDOMappingParameter[0].mappedObject2, 0x8d, 0x4 },
  107. { (void *)&CO_OD_ROM.RPDOMappingParameter[0].mappedObject3, 0x8d, 0x4 },
  108. { (void *)&CO_OD_ROM.RPDOMappingParameter[0].mappedObject4, 0x8d, 0x4 },
  109. { (void *)&CO_OD_ROM.RPDOMappingParameter[0].mappedObject5, 0x8d, 0x4 },
  110. { (void *)&CO_OD_ROM.RPDOMappingParameter[0].mappedObject6, 0x8d, 0x4 },
  111. { (void *)&CO_OD_ROM.RPDOMappingParameter[0].mappedObject7, 0x8d, 0x4 },
  112. { (void *)&CO_OD_ROM.RPDOMappingParameter[0].mappedObject8, 0x8d, 0x4 },
  113. };
  114. /*0x1601*/ const CO_OD_entryRecord_t OD_record1601[9] = {
  115. { (void *)&CO_OD_ROM.RPDOMappingParameter[1].numberOfMappedObjects, 0x0d, 0x1 },
  116. { (void *)&CO_OD_ROM.RPDOMappingParameter[1].mappedObject1, 0x8d, 0x4 },
  117. { (void *)&CO_OD_ROM.RPDOMappingParameter[1].mappedObject2, 0x8d, 0x4 },
  118. { (void *)&CO_OD_ROM.RPDOMappingParameter[1].mappedObject3, 0x8d, 0x4 },
  119. { (void *)&CO_OD_ROM.RPDOMappingParameter[1].mappedObject4, 0x8d, 0x4 },
  120. { (void *)&CO_OD_ROM.RPDOMappingParameter[1].mappedObject5, 0x8d, 0x4 },
  121. { (void *)&CO_OD_ROM.RPDOMappingParameter[1].mappedObject6, 0x8d, 0x4 },
  122. { (void *)&CO_OD_ROM.RPDOMappingParameter[1].mappedObject7, 0x8d, 0x4 },
  123. { (void *)&CO_OD_ROM.RPDOMappingParameter[1].mappedObject8, 0x8d, 0x4 },
  124. };
  125. /*0x1602*/ const CO_OD_entryRecord_t OD_record1602[9] = {
  126. { (void *)&CO_OD_ROM.RPDOMappingParameter[2].numberOfMappedObjects, 0x0d, 0x1 },
  127. { (void *)&CO_OD_ROM.RPDOMappingParameter[2].mappedObject1, 0x8d, 0x4 },
  128. { (void *)&CO_OD_ROM.RPDOMappingParameter[2].mappedObject2, 0x8d, 0x4 },
  129. { (void *)&CO_OD_ROM.RPDOMappingParameter[2].mappedObject3, 0x8d, 0x4 },
  130. { (void *)&CO_OD_ROM.RPDOMappingParameter[2].mappedObject4, 0x8d, 0x4 },
  131. { (void *)&CO_OD_ROM.RPDOMappingParameter[2].mappedObject5, 0x8d, 0x4 },
  132. { (void *)&CO_OD_ROM.RPDOMappingParameter[2].mappedObject6, 0x8d, 0x4 },
  133. { (void *)&CO_OD_ROM.RPDOMappingParameter[2].mappedObject7, 0x8d, 0x4 },
  134. { (void *)&CO_OD_ROM.RPDOMappingParameter[2].mappedObject8, 0x8d, 0x4 },
  135. };
  136. /*0x1603*/ const CO_OD_entryRecord_t OD_record1603[9] = {
  137. { (void *)&CO_OD_ROM.RPDOMappingParameter[3].numberOfMappedObjects, 0x0d, 0x1 },
  138. { (void *)&CO_OD_ROM.RPDOMappingParameter[3].mappedObject1, 0x8d, 0x4 },
  139. { (void *)&CO_OD_ROM.RPDOMappingParameter[3].mappedObject2, 0x8d, 0x4 },
  140. { (void *)&CO_OD_ROM.RPDOMappingParameter[3].mappedObject3, 0x8d, 0x4 },
  141. { (void *)&CO_OD_ROM.RPDOMappingParameter[3].mappedObject4, 0x8d, 0x4 },
  142. { (void *)&CO_OD_ROM.RPDOMappingParameter[3].mappedObject5, 0x8d, 0x4 },
  143. { (void *)&CO_OD_ROM.RPDOMappingParameter[3].mappedObject6, 0x8d, 0x4 },
  144. { (void *)&CO_OD_ROM.RPDOMappingParameter[3].mappedObject7, 0x8d, 0x4 },
  145. { (void *)&CO_OD_ROM.RPDOMappingParameter[3].mappedObject8, 0x8d, 0x4 },
  146. };
  147. /*0x1800*/ const CO_OD_entryRecord_t OD_record1800[7] = {
  148. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[0].maxSubIndex, 0x05, 0x1 },
  149. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[0].COB_IDUsedByTPDO, 0x8d, 0x4 },
  150. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[0].transmissionType, 0x0d, 0x1 },
  151. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[0].inhibitTime, 0x8d, 0x2 },
  152. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[0].compatibilityEntry, 0x05, 0x1 },
  153. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[0].eventTimer, 0x8d, 0x2 },
  154. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[0].SYNCStartValue, 0x0d, 0x1 },
  155. };
  156. /*0x1801*/ const CO_OD_entryRecord_t OD_record1801[7] = {
  157. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[1].maxSubIndex, 0x05, 0x1 },
  158. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[1].COB_IDUsedByTPDO, 0x8d, 0x4 },
  159. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[1].transmissionType, 0x0d, 0x1 },
  160. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[1].inhibitTime, 0x8d, 0x2 },
  161. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[1].compatibilityEntry, 0x05, 0x1 },
  162. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[1].eventTimer, 0x8d, 0x2 },
  163. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[1].SYNCStartValue, 0x0d, 0x1 },
  164. };
  165. /*0x1802*/ const CO_OD_entryRecord_t OD_record1802[7] = {
  166. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[2].maxSubIndex, 0x05, 0x1 },
  167. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[2].COB_IDUsedByTPDO, 0x8d, 0x4 },
  168. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[2].transmissionType, 0x0d, 0x1 },
  169. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[2].inhibitTime, 0x8d, 0x2 },
  170. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[2].compatibilityEntry, 0x05, 0x1 },
  171. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[2].eventTimer, 0x8d, 0x2 },
  172. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[2].SYNCStartValue, 0x0d, 0x1 },
  173. };
  174. /*0x1803*/ const CO_OD_entryRecord_t OD_record1803[7] = {
  175. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[3].maxSubIndex, 0x05, 0x1 },
  176. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[3].COB_IDUsedByTPDO, 0x8d, 0x4 },
  177. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[3].transmissionType, 0x0d, 0x1 },
  178. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[3].inhibitTime, 0x8d, 0x2 },
  179. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[3].compatibilityEntry, 0x05, 0x1 },
  180. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[3].eventTimer, 0x8d, 0x2 },
  181. { (void *)&CO_OD_ROM.TPDOCommunicationParameter[3].SYNCStartValue, 0x0d, 0x1 },
  182. };
  183. /*0x1a00*/ const CO_OD_entryRecord_t OD_record1a00[9] = {
  184. { (void *)&CO_OD_ROM.TPDOMappingParameter[0].numberOfMappedObjects, 0x0d, 0x1 },
  185. { (void *)&CO_OD_ROM.TPDOMappingParameter[0].mappedObject1, 0x8d, 0x4 },
  186. { (void *)&CO_OD_ROM.TPDOMappingParameter[0].mappedObject2, 0x8d, 0x4 },
  187. { (void *)&CO_OD_ROM.TPDOMappingParameter[0].mappedObject3, 0x8d, 0x4 },
  188. { (void *)&CO_OD_ROM.TPDOMappingParameter[0].mappedObject4, 0x8d, 0x4 },
  189. { (void *)&CO_OD_ROM.TPDOMappingParameter[0].mappedObject5, 0x8d, 0x4 },
  190. { (void *)&CO_OD_ROM.TPDOMappingParameter[0].mappedObject6, 0x8d, 0x4 },
  191. { (void *)&CO_OD_ROM.TPDOMappingParameter[0].mappedObject7, 0x8d, 0x4 },
  192. { (void *)&CO_OD_ROM.TPDOMappingParameter[0].mappedObject8, 0x8d, 0x4 },
  193. };
  194. /*0x1a01*/ const CO_OD_entryRecord_t OD_record1a01[9] = {
  195. { (void *)&CO_OD_ROM.TPDOMappingParameter[1].numberOfMappedObjects, 0x0d, 0x1 },
  196. { (void *)&CO_OD_ROM.TPDOMappingParameter[1].mappedObject1, 0x8d, 0x4 },
  197. { (void *)&CO_OD_ROM.TPDOMappingParameter[1].mappedObject2, 0x8d, 0x4 },
  198. { (void *)&CO_OD_ROM.TPDOMappingParameter[1].mappedObject3, 0x8d, 0x4 },
  199. { (void *)&CO_OD_ROM.TPDOMappingParameter[1].mappedObject4, 0x8d, 0x4 },
  200. { (void *)&CO_OD_ROM.TPDOMappingParameter[1].mappedObject5, 0x8d, 0x4 },
  201. { (void *)&CO_OD_ROM.TPDOMappingParameter[1].mappedObject6, 0x8d, 0x4 },
  202. { (void *)&CO_OD_ROM.TPDOMappingParameter[1].mappedObject7, 0x8d, 0x4 },
  203. { (void *)&CO_OD_ROM.TPDOMappingParameter[1].mappedObject8, 0x8d, 0x4 },
  204. };
  205. /*0x1a02*/ const CO_OD_entryRecord_t OD_record1a02[9] = {
  206. { (void *)&CO_OD_ROM.TPDOMappingParameter[2].numberOfMappedObjects, 0x0d, 0x1 },
  207. { (void *)&CO_OD_ROM.TPDOMappingParameter[2].mappedObject1, 0x8d, 0x4 },
  208. { (void *)&CO_OD_ROM.TPDOMappingParameter[2].mappedObject2, 0x8d, 0x4 },
  209. { (void *)&CO_OD_ROM.TPDOMappingParameter[2].mappedObject3, 0x8d, 0x4 },
  210. { (void *)&CO_OD_ROM.TPDOMappingParameter[2].mappedObject4, 0x8d, 0x4 },
  211. { (void *)&CO_OD_ROM.TPDOMappingParameter[2].mappedObject5, 0x8d, 0x4 },
  212. { (void *)&CO_OD_ROM.TPDOMappingParameter[2].mappedObject6, 0x8d, 0x4 },
  213. { (void *)&CO_OD_ROM.TPDOMappingParameter[2].mappedObject7, 0x8d, 0x4 },
  214. { (void *)&CO_OD_ROM.TPDOMappingParameter[2].mappedObject8, 0x8d, 0x4 },
  215. };
  216. /*0x1a03*/ const CO_OD_entryRecord_t OD_record1a03[9] = {
  217. { (void *)&CO_OD_ROM.TPDOMappingParameter[3].numberOfMappedObjects, 0x0d, 0x1 },
  218. { (void *)&CO_OD_ROM.TPDOMappingParameter[3].mappedObject1, 0x8d, 0x4 },
  219. { (void *)&CO_OD_ROM.TPDOMappingParameter[3].mappedObject2, 0x8d, 0x4 },
  220. { (void *)&CO_OD_ROM.TPDOMappingParameter[3].mappedObject3, 0x8d, 0x4 },
  221. { (void *)&CO_OD_ROM.TPDOMappingParameter[3].mappedObject4, 0x8d, 0x4 },
  222. { (void *)&CO_OD_ROM.TPDOMappingParameter[3].mappedObject5, 0x8d, 0x4 },
  223. { (void *)&CO_OD_ROM.TPDOMappingParameter[3].mappedObject6, 0x8d, 0x4 },
  224. { (void *)&CO_OD_ROM.TPDOMappingParameter[3].mappedObject7, 0x8d, 0x4 },
  225. { (void *)&CO_OD_ROM.TPDOMappingParameter[3].mappedObject8, 0x8d, 0x4 },
  226. };
  227. /* OBJECT DICTIONARY */
  228. const CO_OD_entry_t CO_OD[45] = {
  229. { 0x1000, 0x00, 0x85, 4, (void *)&CO_OD_ROM.deviceType },
  230. { 0x1001, 0x00, 0x26, 1, (void *)&CO_OD_RAM.errorRegister },
  231. { 0x1002, 0x00, 0xa6, 4, (void *)&CO_OD_RAM.manufacturerStatusRegister },
  232. { 0x1003, 0x08, 0x8e, 4, (void *)&CO_OD_RAM.preDefinedErrorField[0] },
  233. { 0x1005, 0x00, 0x8d, 4, (void *)&CO_OD_ROM.COB_ID_SYNCMessage },
  234. { 0x1006, 0x00, 0x8d, 4, (void *)&CO_OD_ROM.communicationCyclePeriod },
  235. { 0x1007, 0x00, 0x8d, 4, (void *)&CO_OD_ROM.synchronousWindowLength },
  236. { 0x1008, 0x00, 0x05, 23, (void *)&CO_OD_ROM.manufacturerDeviceName },
  237. { 0x1009, 0x00, 0x05, 4, (void *)&CO_OD_ROM.manufacturerHardwareVersion },
  238. { 0x100a, 0x00, 0x05, 4, (void *)&CO_OD_ROM.manufacturerSoftwareVersion },
  239. { 0x1010, 0x01, 0x8e, 4, (void *)&CO_OD_RAM.storeParameters[0] },
  240. { 0x1011, 0x01, 0x8e, 4, (void *)&CO_OD_RAM.restoreDefaultParameters[0] },
  241. { 0x1012, 0x00, 0x85, 4, (void *)&CO_OD_ROM.COB_ID_TIME },
  242. { 0x1014, 0x00, 0x85, 4, (void *)&CO_OD_ROM.COB_ID_EMCY },
  243. { 0x1015, 0x00, 0x8d, 2, (void *)&CO_OD_ROM.inhibitTimeEMCY },
  244. { 0x1016, 0x04, 0x8d, 4, (void *)&CO_OD_ROM.consumerHeartbeatTime[0] },
  245. { 0x1017, 0x00, 0x8d, 2, (void *)&CO_OD_ROM.producerHeartbeatTime },
  246. { 0x1018, 0x04, 0x00, 0, (void *)&OD_record1018 },
  247. { 0x1019, 0x00, 0x0d, 1, (void *)&CO_OD_ROM.synchronousCounterOverflowValue },
  248. { 0x1029, 0x06, 0x0d, 1, (void *)&CO_OD_ROM.errorBehavior[0] },
  249. { 0x1200, 0x02, 0x00, 0, (void *)&OD_record1200 },
  250. { 0x1400, 0x02, 0x00, 0, (void *)&OD_record1400 },
  251. { 0x1401, 0x02, 0x00, 0, (void *)&OD_record1401 },
  252. { 0x1402, 0x02, 0x00, 0, (void *)&OD_record1402 },
  253. { 0x1403, 0x02, 0x00, 0, (void *)&OD_record1403 },
  254. { 0x1600, 0x08, 0x00, 0, (void *)&OD_record1600 },
  255. { 0x1601, 0x08, 0x00, 4, (void *)&OD_record1601 },
  256. { 0x1602, 0x08, 0x00, 4, (void *)&OD_record1602 },
  257. { 0x1603, 0x08, 0x00, 4, (void *)&OD_record1603 },
  258. { 0x1800, 0x06, 0x00, 0, (void *)&OD_record1800 },
  259. { 0x1801, 0x06, 0x00, 4, (void *)&OD_record1801 },
  260. { 0x1802, 0x06, 0x00, 4, (void *)&OD_record1802 },
  261. { 0x1803, 0x06, 0x00, 4, (void *)&OD_record1803 },
  262. { 0x1a00, 0x08, 0x00, 0, (void *)&OD_record1a00 },
  263. { 0x1a01, 0x08, 0x00, 4, (void *)&OD_record1a01 },
  264. { 0x1a02, 0x08, 0x00, 0, (void *)&OD_record1a02 },
  265. { 0x1a03, 0x08, 0x00, 0, (void *)&OD_record1a03 },
  266. { 0x1f50, 0x01, 0x0a, 0, (void *)0 },
  267. { 0x1f51, 0x01, 0x0e, 1, (void *)&CO_OD_RAM.programControl[0] },
  268. { 0x1f56, 0x01, 0x86, 4, (void *)&CO_OD_RAM.programSoftwareIdentification[0] },
  269. { 0x1f57, 0x01, 0x86, 4, (void *)&CO_OD_RAM.flashStatusIdentification[0] },
  270. { 0x1f80, 0x00, 0x8d, 4, (void *)&CO_OD_ROM.NMTStartup },
  271. { 0x2100, 0x00, 0x26, 10, (void *)&CO_OD_RAM.errorStatusBits },
  272. { 0x2101, 0x00, 0xa7, 4, (void *)&CO_OD_EEPROM.powerOnCounter },
  273. { 0x2102, 0x01, 0xfe, 4, (void *)&CO_OD_RAM.buttonPressCounter },
  274. };