powerlnk.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. /*
  2. powerlnk.h
  3. (C) B&R Industrie Elektronik
  4. */
  5. #ifndef POWERLNK_H_
  6. #define POWERLNK_H_ 0x1105 /* Version V1.10.5 */
  7. #ifdef __cplusplus
  8. extern "C" {
  9. #endif
  10. #include <bur/plctypes.h>
  11. /* Constants */
  12. /* Error Numbers */
  13. #define ERR_PLMGR_VERS_CONFLICT 20900 /* Version conflict in system structures */
  14. #define ERR_PLMGR_NOMEM 20901 /* Failed to allocate memory */
  15. #define ERR_PLMGR_WRONG_DEVICE 20903 /* wrong device description */
  16. #define ERR_PLMGR_CONFIG_NOT_FOUND 20904 /* configuration not found */
  17. #define ERR_PLMGR_ALREADY_CONFIGURATED 20905 /* configuration already done */
  18. #define ERR_PLMGR_NOT_IMPLEMENTED 20906 /* function is not implemented */
  19. #define ERR_PLMGR_ILLEGAL_PARAMETER 20908 /* Illegal parameters in function call */
  20. #define ERR_PLMGR_WRONG_IDENT 20911 /* Wrong ident */
  21. #define ERR_PLMGR_ERROR_ALLOC_STATION 20913 /* Error at allocating station */
  22. #define ERR_PLMGR_ERROR_ALLOC_CHANNEL 20914 /* Error at allocating channel */
  23. #define ERR_PLMGR_ERROR_ALLOC_BUFFER 20915 /* Error at allocating buffer */
  24. #define ERR_PLMGR_CHANNEL_ALREADY_OPEN 20916 /* Channel was opened by someone else */
  25. #define ERR_PLMGR_NO_FRAME_RECEIVED 20917 /* No frame received by now */
  26. #define ERR_PLMGR_FRAME_TOO_LONG 20918 /* Received frame does not fit into buffer */
  27. #define ERR_PLMGR_WRITE_ACTIVE 20919 /* Write is already active for this channel */
  28. #define ERR_PLMGR_OFFSET_TO_HIGH 20920 /* Offset for ident is too high */
  29. #define ERR_PLMGR_NIL_POINTER 20921 /* parameter pointed to address 0 */
  30. #define ERR_PLMGR_OVERFLOW 20922 /* overflow of buffer */
  31. #define ERR_PLMGR_UNAVAILABLE_DATAPOINT 20923 /* datapoint not available */
  32. #define ERR_PLMGR_WRONG_TASKCLASS 20924 /* taskklass does not exist */
  33. #define ERR_PLMGR_STATION_NOT_ACTIVE 20925 /* station not active */
  34. #define ERR_PLMGR_TOO_MANY_INTERFACES 20926 /* To many PowerLink-Interfaces configured */
  35. #define ERR_PLMGR_BUS_CONFIGURED_TWICE 20927 /* Same bus number declared twice */
  36. #define ERR_PLMGR_SYNC_BY_SYSTEM 20928 /* Syncronisation has to be configured by System */
  37. #define ERR_PLMGR_SYNC_FAILED 20929 /* Synchronizing System failed */
  38. #define ERR_PLMGR_CONFIG_CONFLICT 20930 /* Conflict with IOTIMER-Device-Configuration */
  39. #define ERR_PLMGR_NOT_IN_PRES 20931 /* data point not in poll response of station */
  40. #define ERR_PLMGR_UNKNOWN_TYPE 20932 /* datatype of data point not valid */
  41. #define ERR_PLMGR_NO_PDO_MAPPING_DEFINED 20933 /* no PDO mapping defined */
  42. #define ERR_PLMGR_PARSE_ERROR 20950 /* Error at parsing datapoint description */
  43. #define ERR_PLMGR_PARSE_END_EXPECTED 20951 /* expected end of string earlier */
  44. #define ERR_PLMGR_PARSE_NO_PERCENT 20952 /* no percent % singn at start of datapoint description */
  45. #define ERR_PLMGR_PARSE_NOT_IN_OR_OUT 20953 /* Direction neither I nor Q */
  46. #define ERR_PLMGR_PARSE_INTERFACE 20954 /* incorrect interface number */
  47. #define ERR_PLMGR_PARSE_STATION 20955 /* incorrect station number */
  48. #define ERR_PLMGR_PARSE_MODUL 20956 /* incorrect modul number */
  49. #define ERR_PLMGR_PARSE_SUBMODUL 20957 /* incorrect sub modul number */
  50. #define ERR_PLMGR_PARSE_CHANNEL 20958 /* incorrect channel number */
  51. #define ERR_PLMGR_PARSE_BIT 20959 /* incorrect bit number */
  52. #define ERR_PLMGR_PARSE_TO_MANY_NUMBERS 20960 /* too many numbers in datapoint description */
  53. #define ERR_PLMGR_PARSE_NETTIME 20961 /* wrong datatype or length for nettime */
  54. #define ERR_PLMGR_PARSE_SLOT 20962 /* incorrect slot number SL */
  55. #define ERR_PLMGR_PARSE_SUBSLOT 20963 /* incorrect subslot number SS */
  56. #define ERR_PLMGR_PARSE_TRAILINGCHARS 20964 /* trailing characters after valid channel or device name*/
  57. #define ERR_PLMGR_WARNING_FW_UPDATE 20980 /* Updated firmware for station, (in error log book) */
  58. #define ERR_PLMGR_HW_BOOTUP_FAILED 20981 /* Error at starting PowerLink hardware (in error log book) */
  59. #define ERR_PLMGR_RECOMMEND_FW_UPDATE 20982 /* Firmware update for IF686 is recommended, download plfif686.br */
  60. #define ERR_PLMGR_INTERNAL 20997 /* Internal error in Library, this should never happen (in error log book) */
  61. #define ERR_PLMGR_EXCEPTION 20998 /* unexpected exception from PowerLink hardware (in error log book) */
  62. #define ERR_PLMGR_NO_POWERLNK_LIBRARY 20999 /* PowerLink-Library not on plc */
  63. /* Taskclasses for plCECreate function */
  64. #define plCE_CYCLIC_1 1
  65. #define plCE_CYCLIC_2 2
  66. #define plCE_CYCLIC_3 3
  67. #define plCE_CYCLIC_4 4
  68. /* plCE_CYCLIC_5 .. 8 only valid for i386-Targets */
  69. #define plCE_CYCLIC_5 5
  70. #define plCE_CYCLIC_6 6
  71. #define plCE_CYCLIC_7 7
  72. #define plCE_CYCLIC_8 8
  73. /* plCE_TIMER_x only valid for m68k-Targets */
  74. #define plCE_TIMER_1 -1
  75. #define plCE_TIMER_2 -2
  76. /* Flags for plAcycOpen function */
  77. #define plOPEN_MODE_READ 0 /* open channel for read*/
  78. #define plOPEN_MODE_WRITE 1 /* open channel for write */
  79. #define plOPEN_MODE_RW 2 /* open channel for read and write */
  80. #define plOPEN_MODE_EPLV1 0x10 /* Force to V1 format */
  81. #define plOPEN_MODE_EPLV2 0x20 /* Force to V2 format */
  82. #define plOPEN_MODE_LENGTH 0x40 /* Use length in frame even in V2 */
  83. #define plOPEN_PRIORITY_ENABLE 0x8000 /* enable using priority (used in V2 only) */
  84. /* priority for asynchrounous send, applied in EPL V2 only */
  85. #define plOPEN_PRIORITY_LOWEST 0x0000 /* lowest priority */
  86. #define plOPEN_PRIORITY_LOWER 0x0100
  87. #define plOPEN_PRIORITY_LOW 0x0200
  88. #define plOPEN_PRIORITY_GENERIC 0x0300 /* normal priority (default) */
  89. #define plOPEN_PRIORITY_HIGH 0x0400
  90. #define plOPEN_PRIORITY_HIGHER 0x0500
  91. #define plOPEN_PRIORITY_HIGHEST 0x0600 /* highest priority */
  92. #define plOPEN_PRIORITY_NMT 0x0700 /* reserved for NMT requests */
  93. /* States from plState Function */
  94. /* Error States from plState */
  95. #define plSTATE_WRONG_IDENT 0xffff
  96. /* States of Stations */
  97. #define plSTATE_STATION_NONEXISTANT 0x0000 /* No Access to this station has occured yet */
  98. #define plSTATE_STATION_WAITING 0x0001 /* The software tried to access this station, but it is not on the BUS */
  99. #define plSTATE_STATION_OSDL 0x0002 /* The firmware had the wrong version so a Firmwareupdate is in progress */
  100. #define plSTATE_STATION_CONFIG 0x0003 /* The configuration of the Station is in progress */
  101. #define plSTATE_STATION_ACTIVATEING 0x0004 /* The activation of the copy entries is in progress */
  102. #define plSTATE_STATION_ACTIVE 0x0005 /* The station is online and the copy entries are handle cyclically */
  103. #define plSTATE_STATION_INACTIVE 0x0006 /* The station is offline but was active before */
  104. #define plSTATE_STATION_CHANGED 0x0007 /* The IO configuration of the station has changed, a reboot is necessary to
  105. allow the changed station to get active. */
  106. #define plSTATE_STATION_CFGFAILED 0x0008 /* The configuration of the station failed, and the option EPL_NoResetOnConfigFail is on. */
  107. #define plSTATE_STATION_FAILED 0x000f /* Configuration of Station failed (out of memory or other serious problem) */
  108. /* States of Copy Entries */
  109. #define plSTATE_CE_WAITING 1 /* Station for Copy-Entry was not active since Copy-Entry was created */
  110. #define plSTATE_CE_ACTIVE 2 /* Station is online and Copy-Entry is active */
  111. #define plSTATE_CE_INACTIVE 3 /* Copy-Entry is active, but Station is not online */
  112. #define plSTATE_CE_ERROR 4 /* Copy-Entry is not available on its Station */
  113. /* States of Write Channels */
  114. #define plSTATE_CHANNEL_WRITE_MASK 0x0f00 /* Mask state of Read/Write-Channels with this mask to get the Write-State */
  115. #define plSTATE_CHANNEL_WRITE_CLOSED 0x0000 /* This Channel is not opend for Write access */
  116. #define plSTATE_CHANNEL_WRITE_OPEN 0x0100 /* Channel is open, no Frames are waiting to be sent */
  117. #define plSTATE_CHANNEL_WRITE_ACTIVE 0x0200 /* Write-Buffer is waiting to be sent */
  118. #define plSTATE_CHANNEL_WRITE_WRONG 0x0f00 /* Result of plSTATE_WRONG_IDENT & plSTATE_CHANNEL_WRITE_MASK */
  119. /* States of Read Channels */
  120. #define plSTATE_CHANNEL_READ_MASK 0x00f0 /* Mask state of Read/Write-Channels with this mask to get the Read-State */
  121. #define plSTATE_CHANNEL_READ_CLOSED 0x0000 /* This channel is not opend for Read access */
  122. #define plSTATE_CHANNEL_READ_EMPTY 0x0010 /* This channel is open but does not have any frames */
  123. #define plSTATE_CHANNEL_READ_READY 0x0020 /* This channel is open and has a ready frame to be read */
  124. #define plSTATE_CHANNEL_READ_WRONG 0x00f0 /* Result of plSTATE_WRONG_IDEND & plSTATE_CHANNEL_READ_MASK */
  125. /* actionIDs for plAction function */
  126. #define plACTION_GET_NET_QUALITY 1 /* read statistical info of netquality*/
  127. #define plACTION_GET_IDENT 2 /* get ident of a PowerLink station */
  128. #define plACTION_START_SYNC_STATISTICS 3 /* start collection of statistic information of synchronous task class only on SG3 */
  129. #define plACTION_STOP_SYNC_STATISTICS 4 /* stop collection of statistic information of synchronous task class only on SG3*/
  130. #define plACTION_GET_SYNC_STATISTICS 5 /* read statistic information of synchrounous task class to
  131. a PLACTION_SYNC_STATISTICS_typ structure only on SG3 */
  132. #define plACTION_GET_FIRMWARE_VERSION 6 /* read version of firmware to UDINT variable */
  133. #define plACTION_DEVICE_TO_BUS_NR 7 /* Convert device string to bus number */
  134. #define plACTION_GET_STATION_NUMBER 8 /* read node number of local station to UDINT variable */
  135. #define plACTION_GET_IF_PARAMETERS 9 /* get the interface parameters for a powerlink bus */
  136. #define plACTION_GET_LOST_INA_SOURCE 10 /* internal only! get last source station of lost ina request to a DINT (-1) if no lost */
  137. #define plACTION_GET_STATIONFLAG 12 /* get station flag e.g. plSYSCONF_STATIONFLAG_SLOW to UDINT variable */
  138. #define plACTION_GET_STATION_HWVARIANT 13 /* get hardware ident of station to UDINT variable */
  139. #define plACTION_GET_STATION_SHIFT 14 /* get cyclic cycle shift of multiplexed station to UDINT variable */
  140. #define plACTION_GET_IF_CYCLE_TIME 15 /* get powerlink cycle time to UDINT variable */
  141. #define plACTION_GET_IF_PRESCALE 16 /* get powerlink prescale to UDINT variable */
  142. #define plACTION_GET_IF_MUXPRESCALE 17 /* get multiplex prescale to UDINT variable */
  143. #define plACTION_GET_IF_RSQUEUELAPCNT 18 /* get rs queue lap count to UDINT variable */
  144. #define plACTION_GET_CROSSLINK_INFO 19 /* get crosslink infomation of input datapoint (only SG4 >= AR V2.85) */
  145. #define plACTION_GET_PROTOCOL_VERSION 20 /* get set protocol version to UDINT variable */
  146. #define plACTION_GET_DP_INFO 21 /* query the PDO information of an I/O data point (only SG4 >= AR B2.96) */
  147. #define plACTION_GET_PDO_INFO 22 /* query the PDO information of by Index/Subindex (only SG4 >= AR B2.96) */
  148. /* action 23, 24 and 25 used by ncman */
  149. #define plDIRECTION_IN 1 /* Direction "input" to PLC returned from plACTION_GET_PDO_INFO */
  150. #define plDIRECTION_OUT 2 /* Direction "output" from PLC returned from plACTION_GET_PDO_INFO */
  151. #define plDIRECTION_XOUT 3 /* Direction "crosslinked output" returned from plACTION_GET_PDO_INFO */
  152. #define plMESSAGE_TYPE_PREQ 3 /* MessageType "poll request" returned from plACTION_GET_PDO_INFO */
  153. #define plMESSAGE_TYPE_PRES 4 /* MessageType "poll response" returned from plACTION_GET_PDO_INFO */
  154. /* Flags for stations in config */
  155. #define plSYSCONF_STATIONFLAG_SLOW 0x20 /* Station is a slow one */
  156. /* Data types for system configuration */
  157. /* Konfiguration for remote stations */
  158. typedef struct PLSYSCONF_RS_typ
  159. {
  160. USINT size_x16; /* Size of configuration entry in blocks of 16 bytes (by now always 1) */
  161. /* Set size_x16 to 0 to mark the last remote station configuration entry */
  162. USINT bus; /* Bus number: Valid Numbers 1 .. 255 */
  163. USINT station; /* Station number */
  164. USINT flags; /* flags as OR of constants plSYSCONF_STATIONFLAG_... */
  165. UDINT hwVariant; /* Hardware variant: 0=any */
  166. INT insize; /* Size for input buffer (0xffff for automatic)*/
  167. INT outsize; /* Size for output buffer (0xffff for automatic)*/
  168. INT RespTimeout; /* response timeout in µs <= 0 -> default = 25µs */
  169. USINT MuxNetworkSlot; /* ignored for normal stations, for multiplexed stations 1 to MuxPrescaler */
  170. USINT reserve2; /* reserved set to 0 */
  171. }PLSYSCONF_RS_typ;
  172. /* Konfiguration of interfaces */
  173. typedef struct PLSYSCONF_IF_typ/* Configuration structure for PowerLink Interface Modules */
  174. {
  175. USINT station; /* Station number 0 for Master, 1..253 for intelligent slave */
  176. USINT slot; /* Module Slot 0..directly on CPU, slotnumber on Backplane */
  177. USINT subslot; /* Slot in CP260 1 or 2, in other cases allways 1 */
  178. USINT interface; /* allways 1*/
  179. UDINT pl_cycle; /* cycle time of PowerLink cycle in us */
  180. UDINT pl_prescale; /* prescaler for synchron PowerLink timer-taskclass */
  181. UDINT uptimeout; /* timeout for configurated remote stations at power up in us */
  182. USINT bus; /* Bus number of PowerLink interface. Corresponds to
  183. "bus" element in the PLSYSCONF_RS_typ. Valid Number 1...255.
  184. If bus is set to 0, the Library countes the busses by itself. */
  185. USINT MuxStationsPerCycle; /* ignored since FW-Version V0.06.0: until FW-Version V0.05.9 number of handled multiplexed stations in each powerlink cycle */
  186. USINT MuxPrescaler; /* number of powerlink cycles for one mux cycle 1 .. 253 */
  187. USINT reservedbyte2; /* reserved set to 0 */
  188. UDINT reservedlong; /* reserved set to 0 */
  189. }PLSYSCONF_IF_typ;
  190. typedef struct PLSYSCONF_typ /* global PowerLink configuration */
  191. {
  192. USINT noIF; /* Number of interface Cards (allways 1)*/
  193. USINT takt_master; /* Which interface is taktmaster (allways 1), 0 for no taktmaster */
  194. UINT reserve1; /* reserved set to 0 */
  195. UDINT pRemoteCfg; /* Pointer to array of remote station configuration */
  196. /* end array with an entry with .size_x16=0 */
  197. PLSYSCONF_IF_typ interfaces[15]; /* Interface configurations */
  198. }PLSYSCONF_typ;
  199. /* Object structures for plAction function */
  200. typedef struct PLACTION_NET_QUALITY_typ{
  201. UDINT nLineQualFreezeCnt; /* out: count of started io cycles within last time */
  202. UDINT nLineQualFailCnt; /* out: count of failed cycles within last time */
  203. }PLACTION_NET_QUALITY_typ;
  204. typedef struct PLACTION_GET_IDENT_typ{
  205. char *pName; /* in: name */
  206. UDINT ident; /* out: ident */
  207. }PLACTION_GET_IDENT_typ;
  208. typedef struct PLACTION_DEVICE_TO_BUS_NR_typ{
  209. char *pDeviceString; /* in: device string */
  210. USINT busNumber; /* out: bus number */
  211. }PLACTION_DEVICE_TO_BUS_NR_typ;
  212. /* PLACTION_SYNC_STATISTICS_typ Supported only on SG3 */
  213. typedef struct PLACTION_SYNC_STATISTICS_typ{
  214. UINT act_usec; /* out: duration of last synchrounous taskclass */
  215. UINT min_usec; /* out: minimal duration of synchrounous taskclass */
  216. UINT max_usec; /* out: maximal duration of synchrounous taskclass */
  217. UINT act_cycle; /* out: exact cycletime of last synchronous taskclass */
  218. UINT min_cycle; /* out: minimal cycletime of synchronous taskclass */
  219. UINT max_cycle; /* out: maximal cycletime of synchronous taskclass */
  220. }PLACTION_SYNC_STATISTICS_typ;
  221. typedef struct PLACTION_GET_CROSSLINK_INFO_typ{
  222. const char *DeviceName; /* in: name of io device e.g. "SS1.IF2.ST3.SL7" */
  223. const char *ChannelName; /* in: name of datapoint e.g. "AnalogInput01" */
  224. UINT NodeId; /* out: Node number of powerlink station */
  225. UINT Offset; /* out: Offset in data counted in Bits */
  226. UINT Length; /* out: Length of data point counted in Bits */
  227. UINT TypeId; /* out: Type ident of datapoint EPL V2 (matches CANopen Specification) */
  228. }PLACTION_GET_CROSSLINK_INFO_typ;
  229. typedef struct PLACTION_GET_DP_INFO_typ{
  230. const char *DeviceName; /* in: name of io device e.g. "SS1.IF2.ST3.SL7" */
  231. const char *ChannelName; /* in: name of datapoint e.g. "AnalogInput01" */
  232. USINT DestNode; /* out: Node number of destination in network frame */
  233. USINT SrcNode; /* out: Node number of source in network frame */
  234. USINT MessageType; /* out: Message Type on Powerlink (plMESSAGE_TYPE_PREQ(=3) PReq, plMESSAGE_TYPE_PRES(=4) PRes) */
  235. USINT MuxSlot; /* out: multiplex slot (0 continous station) */
  236. UINT OffsetAbs; /* out: Offset in net data of EPL frame counted in bits */
  237. UINT OffsetRel; /* out: Offset relative to station net data in bits */
  238. UINT Length; /* out: Length of data point counted in bits */
  239. UINT TypeId; /* out: Type ident of datapoint EPL V2 (matches CANopen Specification) */
  240. UINT NodeInSize; /* out: input net size of station (PRes) */
  241. UINT NodeOutSize; /* out: output net size of station (size of PReq, or part of PResMN ) */
  242. USINT Direction; /* out: plDIRECTION_IN(=1) Input,plDIRECTION_OUT(=2) Output relative to local node */
  243. USINT Node; /* out: node of datapoint */
  244. UINT reserved; /* res: reserved word for alignment */
  245. UDINT ImageIndex; /* out: image index for inputs 0 for outputs */
  246. UDINT ImageOffset; /* out: offset of datapoint in local image buffer (bytes) */
  247. }PLACTION_GET_DP_INFO_typ;
  248. typedef struct PLACTION_GET_PDO_INFO_typ{
  249. const char *DeviceName; /* in: name of io device e.g. "SS1.IF2.ST3.SL7" */
  250. UINT ODIndex; /* in: Index of object in Powerlink object dictionary */
  251. USINT ODSubindex; /* in: query the PDO information of by Index/Subindex */
  252. USINT align; /* res: reseved for alignment */
  253. USINT DestNode; /* out: Node number of destination in network frame */
  254. USINT SrcNode; /* out: Node number of source in network frame */
  255. USINT MessageType; /* out: Message Type on Powerlink (plMESSAGE_TYPE_PREQ(=3) PReq, plMESSAGE_TYPE_PRES(=4) PRes) */
  256. USINT MuxSlot; /* out: multiplex slot (0 continous station) */
  257. UINT OffsetAbs; /* out: Offset in net data of EPL frame counted in bits */
  258. UINT OffsetRel; /* out: Offset relative to station net data in bits */
  259. UINT Length; /* out: Length of data point counted in bits */
  260. UINT TypeId; /* out: Type ident of datapoint EPL V2 (matches CANopen Specification) */
  261. UINT NodeInSize; /* out: input net size of station (PRes) */
  262. UINT NodeOutSize; /* out: output net size of station (size of PReq, or part of PResMN ) */
  263. USINT Direction; /* out: plDIRECTION_IN(=1) Input,plDIRECTION_OUT(=2) Output relative to local node */
  264. USINT Node; /* out: node of datapoint */
  265. UINT reserved; /* res: reserved word for alignment */
  266. UDINT ImageIndex; /* out: image index for inputs 0 for outputs */
  267. UDINT ImageOffset; /* out: offset of datapoint in local image buffer (bytes) */
  268. }PLACTION_GET_PDO_INFO_typ;
  269. /* Prototyping of functions and function blocks */
  270. UINT plConfig(PLSYSCONF_typ *pConfigStruct);
  271. UINT plCECreate(const char* pDatapoint, void* address, SINT taskclass, UDINT *pIdent);
  272. UINT plCEDelete(UDINT ident);
  273. UINT plState(UDINT ident);
  274. UINT plAction(UDINT ident, UDINT actionID, void* pObject, UDINT objectSize);
  275. UINT plAcycOpen(const char* pName, UDINT flags, UDINT *pIdent);
  276. UINT plAcycClose(UDINT ident);
  277. UINT plAcycRead(UDINT ident, void* bufferAdr, UDINT bufferLen, UDINT *pReadLen);
  278. UINT plAcycInvite(UDINT ident);
  279. UINT plAcycWrite(UDINT ident, void* bufferAdr, UDINT bufferLen, UDINT *pWrittenLen);
  280. #ifdef __cplusplus
  281. };
  282. #endif
  283. #endif /* POWERLNK_H_ */