Advertisement
Guest User

Untitled

a guest
May 28th, 2016
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 40.98 KB | None | 0 0
  1. /*=============================================================================|
  2. | PROJECT SNAP7 1.4.0 |
  3. |==============================================================================|
  4. | Copyright (C) 2013, 2014 Davide Nardella |
  5. | All rights reserved. |
  6. |==============================================================================|
  7. | SNAP7 is free software: you can redistribute it and/or modify |
  8. | it under the terms of the Lesser GNU General Public License as published by |
  9. | the Free Software Foundation, either version 3 of the License, or |
  10. | (at your option) any later version. |
  11. | |
  12. | It means that you can distribute your commercial software linked with |
  13. | SNAP7 without the requirement to distribute the source code of your |
  14. | application and without the requirement that your application be itself |
  15. | distributed under LGPL. |
  16. | |
  17. | SNAP7 is distributed in the hope that it will be useful, |
  18. | but WITHOUT ANY WARRANTY; without even the implied warranty of |
  19. | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
  20. | Lesser GNU General Public License for more details. |
  21. | |
  22. | You should have received a copy of the GNU General Public License and a |
  23. | copy of Lesser GNU General Public License along with Snap7. |
  24. | If not, see http://www.gnu.org/licenses/ |
  25. |==============================================================================|
  26. | |
  27. | C/C++ Snap 7 classes/Imports definitions |
  28. | |
  29. |=============================================================================*/
  30. #ifndef snap7_h
  31. #define snap7_h
  32. //---------------------------------------------------------------------------
  33. // Platform detection
  34. //---------------------------------------------------------------------------
  35. #if defined (_WIN32)||defined(_WIN64)||defined(__WIN32__)||defined(__WINDOWS__)
  36. # define OS_WINDOWS
  37. #endif
  38.  
  39. // Visual Studio needs this to use the correct time_t size
  40. #if defined (_WIN32) && !defined(_WIN64)
  41. # define _USE_32BIT_TIME_T
  42. #endif
  43.  
  44. #if defined(unix) || defined(__unix__) || defined(__unix)
  45. # define PLATFORM_UNIX
  46. #endif
  47.  
  48. #if defined(__SVR4) || defined(__svr4__)
  49. # define OS_SOLARIS
  50. #endif
  51.  
  52. #if BSD>=0
  53. # define OS_BSD
  54. #endif
  55.  
  56. #if defined(__APPLE__)
  57. # define OS_OSX
  58. #endif
  59.  
  60. #if defined(PLATFORM_UNIX) || defined(OS_OSX)
  61. # include <unistd.h>
  62. # if defined(_POSIX_VERSION)
  63. # define POSIX
  64. # endif
  65. #endif
  66.  
  67. //---------------------------------------------------------------------------
  68. // C++ Library
  69. //---------------------------------------------------------------------------
  70. #ifdef __cplusplus
  71. #include <string>
  72. #include <time.h>
  73.  
  74. // Visual C++ not C99 compliant (VS2008--)
  75. #ifdef _MSC_VER
  76. # if _MSC_VER >= 1600
  77. # include <stdint.h> // VS2010++ have it
  78. # else
  79. typedef signed __int8 int8_t;
  80. typedef signed __int16 int16_t;
  81. typedef signed __int32 int32_t;
  82. typedef signed __int64 int64_t;
  83. typedef unsigned __int8 uint8_t;
  84. typedef unsigned __int16 uint16_t;
  85. typedef unsigned __int32 uint32_t;
  86. typedef unsigned __int64 uint64_t;
  87. #ifdef _WIN64
  88. typedef unsigned __int64 uintptr_t;
  89. #else
  90. typedef unsigned __int32 uintptr_t;
  91. #endif
  92. # endif
  93. #else
  94. # include <stdint.h>
  95. #endif
  96.  
  97. extern "C" {
  98. #endif
  99. //---------------------------------------------------------------------------
  100. // C exact length types
  101. //---------------------------------------------------------------------------
  102. #ifndef __cplusplus
  103.  
  104. #ifdef OS_BSD
  105. # include <stdint.h>
  106. # include <time.h>
  107. #endif
  108.  
  109. #ifdef OS_OSX
  110. # include <stdint.h>
  111. # include <time.h>
  112. #endif
  113.  
  114. #ifdef OS_SOLARIS
  115. # include <stdint.h>
  116. # include <time.h>
  117. #endif
  118.  
  119. #if defined(_UINTPTR_T_DEFINED)
  120. # include <stdint.h>
  121. # include <time.h>
  122. #endif
  123.  
  124. #if !defined(_UINTPTR_T_DEFINED) && !defined(OS_SOLARIS) && !defined(OS_BSD) && !defined(OS_OSX)
  125. typedef unsigned char uint8_t; // 8 bit unsigned integer
  126. typedef unsigned short uint16_t; // 16 bit unsigned integer
  127. typedef unsigned int uint32_t; // 32 bit unsigned integer
  128. typedef unsigned long uintptr_t;// 64 bit unsigned integer
  129. #endif
  130.  
  131. #endif
  132.  
  133. #ifdef OS_WINDOWS
  134. # define S7API __stdcall
  135. #else
  136. # define S7API
  137. #endif
  138.  
  139. #pragma pack(1)
  140. //******************************************************************************
  141. // COMMON
  142. //******************************************************************************
  143. // Exact length types regardless of platform/processor
  144. typedef uint8_t byte;
  145. typedef uint16_t word;
  146. typedef uint32_t longword;
  147. typedef byte *pbyte;
  148. typedef word *pword;
  149. typedef uintptr_t S7Object; // multi platform/processor object reference
  150. // DON'T CONFUSE IT WITH AN OLE OBJECT, IT'S SIMPLY
  151. // AN INTEGER VALUE (32 OR 64 BIT) USED AS HANDLE.
  152.  
  153. #ifndef __cplusplus
  154. typedef struct
  155. {
  156. int tm_sec;
  157. int tm_min;
  158. int tm_hour;
  159. int tm_mday;
  160. int tm_mon;
  161. int tm_year;
  162. int tm_wday;
  163. int tm_yday;
  164. int tm_isdst;
  165. }tm;
  166.  
  167. typedef int bool;
  168. #define false 0;
  169. #define true 1;
  170. #endif
  171.  
  172. const int errLibInvalidParam = -1;
  173. const int errLibInvalidObject = -2;
  174.  
  175. // CPU status
  176. #define S7CpuStatusUnknown 0x00
  177. #define S7CpuStatusRun 0x08
  178. #define S7CpuStatusStop 0x04
  179.  
  180. // ISO Errors
  181. const longword errIsoConnect = 0x00010000; // Connection error
  182. const longword errIsoDisconnect = 0x00020000; // Disconnect error
  183. const longword errIsoInvalidPDU = 0x00030000; // Bad format
  184. const longword errIsoInvalidDataSize = 0x00040000; // Bad Datasize passed to send/recv buffer is invalid
  185. const longword errIsoNullPointer = 0x00050000; // Null passed as pointer
  186. const longword errIsoShortPacket = 0x00060000; // A short packet received
  187. const longword errIsoTooManyFragments = 0x00070000; // Too many packets without EoT flag
  188. const longword errIsoPduOverflow = 0x00080000; // The sum of fragments data exceded maximum packet size
  189. const longword errIsoSendPacket = 0x00090000; // An error occurred during send
  190. const longword errIsoRecvPacket = 0x000A0000; // An error occurred during recv
  191. const longword errIsoInvalidParams = 0x000B0000; // Invalid TSAP params
  192. const longword errIsoResvd_1 = 0x000C0000; // Unassigned
  193. const longword errIsoResvd_2 = 0x000D0000; // Unassigned
  194. const longword errIsoResvd_3 = 0x000E0000; // Unassigned
  195. const longword errIsoResvd_4 = 0x000F0000; // Unassigned
  196.  
  197. // Tag Struct
  198. typedef struct{
  199. int Area;
  200. int DBNumber;
  201. int Start;
  202. int Size;
  203. int WordLen;
  204. }TS7Tag, *PS7Tag;
  205.  
  206. //------------------------------------------------------------------------------
  207. // PARAMS LIST
  208. //------------------------------------------------------------------------------
  209. const int p_u16_LocalPort = 1;
  210. const int p_u16_RemotePort = 2;
  211. const int p_i32_PingTimeout = 3;
  212. const int p_i32_SendTimeout = 4;
  213. const int p_i32_RecvTimeout = 5;
  214. const int p_i32_WorkInterval = 6;
  215. const int p_u16_SrcRef = 7;
  216. const int p_u16_DstRef = 8;
  217. const int p_u16_SrcTSap = 9;
  218. const int p_i32_PDURequest = 10;
  219. const int p_i32_MaxClients = 11;
  220. const int p_i32_BSendTimeout = 12;
  221. const int p_i32_BRecvTimeout = 13;
  222. const int p_u32_RecoveryTime = 14;
  223. const int p_u32_KeepAliveTime = 15;
  224.  
  225. // Client/Partner Job status
  226. const int JobComplete = 0;
  227. const int JobPending = 1;
  228.  
  229. //******************************************************************************
  230. // CLIENT
  231. //******************************************************************************
  232.  
  233. // Error codes
  234. const longword errNegotiatingPDU = 0x00100000;
  235. const longword errCliInvalidParams = 0x00200000;
  236. const longword errCliJobPending = 0x00300000;
  237. const longword errCliTooManyItems = 0x00400000;
  238. const longword errCliInvalidWordLen = 0x00500000;
  239. const longword errCliPartialDataWritten = 0x00600000;
  240. const longword errCliSizeOverPDU = 0x00700000;
  241. const longword errCliInvalidPlcAnswer = 0x00800000;
  242. const longword errCliAddressOutOfRange = 0x00900000;
  243. const longword errCliInvalidTransportSize = 0x00A00000;
  244. const longword errCliWriteDataSizeMismatch = 0x00B00000;
  245. const longword errCliItemNotAvailable = 0x00C00000;
  246. const longword errCliInvalidValue = 0x00D00000;
  247. const longword errCliCannotStartPLC = 0x00E00000;
  248. const longword errCliAlreadyRun = 0x00F00000;
  249. const longword errCliCannotStopPLC = 0x01000000;
  250. const longword errCliCannotCopyRamToRom = 0x01100000;
  251. const longword errCliCannotCompress = 0x01200000;
  252. const longword errCliAlreadyStop = 0x01300000;
  253. const longword errCliFunNotAvailable = 0x01400000;
  254. const longword errCliUploadSequenceFailed = 0x01500000;
  255. const longword errCliInvalidDataSizeRecvd = 0x01600000;
  256. const longword errCliInvalidBlockType = 0x01700000;
  257. const longword errCliInvalidBlockNumber = 0x01800000;
  258. const longword errCliInvalidBlockSize = 0x01900000;
  259. const longword errCliDownloadSequenceFailed = 0x01A00000;
  260. const longword errCliInsertRefused = 0x01B00000;
  261. const longword errCliDeleteRefused = 0x01C00000;
  262. const longword errCliNeedPassword = 0x01D00000;
  263. const longword errCliInvalidPassword = 0x01E00000;
  264. const longword errCliNoPasswordToSetOrClear = 0x01F00000;
  265. const longword errCliJobTimeout = 0x02000000;
  266. const longword errCliPartialDataRead = 0x02100000;
  267. const longword errCliBufferTooSmall = 0x02200000;
  268. const longword errCliFunctionRefused = 0x02300000;
  269. const longword errCliDestroying = 0x02400000;
  270. const longword errCliInvalidParamNumber = 0x02500000;
  271. const longword errCliCannotChangeParam = 0x02600000;
  272.  
  273. const int MaxVars = 20; // Max vars that can be transferred with MultiRead/MultiWrite
  274.  
  275. // Client Connection Type
  276. const word CONNTYPE_PG = 0x0001; // Connect to the PLC as a PG
  277. const word CONNTYPE_OP = 0x0002; // Connect to the PLC as an OP
  278. const word CONNTYPE_BASIC = 0x0003; // Basic connection
  279.  
  280. // Area ID
  281. const byte S7AreaPE = 0x81;
  282. const byte S7AreaPA = 0x82;
  283. const byte S7AreaMK = 0x83;
  284. const byte S7AreaDB = 0x84;
  285. const byte S7AreaCT = 0x1C;
  286. const byte S7AreaTM = 0x1D;
  287.  
  288. // Word Length
  289. const int S7WLBit = 0x01;
  290. const int S7WLByte = 0x02;
  291. const int S7WLWord = 0x04;
  292. const int S7WLDWord = 0x06;
  293. const int S7WLReal = 0x08;
  294. const int S7WLCounter = 0x1C;
  295. const int S7WLTimer = 0x1D;
  296.  
  297. // Block type
  298. const byte Block_OB = 0x38;
  299. const byte Block_DB = 0x41;
  300. const byte Block_SDB = 0x42;
  301. const byte Block_FC = 0x43;
  302. const byte Block_SFC = 0x44;
  303. const byte Block_FB = 0x45;
  304. const byte Block_SFB = 0x46;
  305.  
  306. // Sub Block Type
  307. const byte SubBlk_OB = 0x08;
  308. const byte SubBlk_DB = 0x0A;
  309. const byte SubBlk_SDB = 0x0B;
  310. const byte SubBlk_FC = 0x0C;
  311. const byte SubBlk_SFC = 0x0D;
  312. const byte SubBlk_FB = 0x0E;
  313. const byte SubBlk_SFB = 0x0F;
  314.  
  315. // Block languages
  316. const byte BlockLangAWL = 0x01;
  317. const byte BlockLangKOP = 0x02;
  318. const byte BlockLangFUP = 0x03;
  319. const byte BlockLangSCL = 0x04;
  320. const byte BlockLangDB = 0x05;
  321. const byte BlockLangGRAPH = 0x06;
  322.  
  323. // Read/Write Multivars
  324. typedef struct{
  325. int Area;
  326. int WordLen;
  327. int Result;
  328. int DBNumber;
  329. int Start;
  330. int Amount;
  331. void *pdata;
  332. } TS7DataItem, *PS7DataItem;
  333.  
  334. //typedef int TS7ResultItems[MaxVars];
  335. //typedef TS7ResultItems *PS7ResultItems;
  336.  
  337. // List Blocks
  338. typedef struct {
  339. int OBCount;
  340. int FBCount;
  341. int FCCount;
  342. int SFBCount;
  343. int SFCCount;
  344. int DBCount;
  345. int SDBCount;
  346. } TS7BlocksList, *PS7BlocksList;
  347.  
  348. // Blocks info
  349. typedef struct {
  350. int BlkType; // Block Type (OB, DB)
  351. int BlkNumber; // Block number
  352. int BlkLang; // Block Language
  353. int BlkFlags; // Block flags
  354. int MC7Size; // The real size in bytes
  355. int LoadSize; // Load memory size
  356. int LocalData; // Local data
  357. int SBBLength; // SBB Length
  358. int CheckSum; // Checksum
  359. int Version; // Block version
  360. // Chars info
  361. char CodeDate[11]; // Code date
  362. char IntfDate[11]; // Interface date
  363. char Author[9]; // Author
  364. char Family[9]; // Family
  365. char Header[9]; // Header
  366. } TS7BlockInfo, *PS7BlockInfo ;
  367.  
  368. typedef word TS7BlocksOfType[0x2000];
  369. typedef TS7BlocksOfType *PS7BlocksOfType;
  370.  
  371. // Order code
  372. typedef struct {
  373. char Code[21];
  374. byte V1;
  375. byte V2;
  376. byte V3;
  377. } TS7OrderCode, *PS7OrderCode;
  378.  
  379. // CPU Info
  380. typedef struct {
  381. char ModuleTypeName[33];
  382. char SerialNumber[25];
  383. char ASName[25];
  384. char Copyright[27];
  385. char ModuleName[25];
  386. } TS7CpuInfo, *PS7CpuInfo;
  387.  
  388. // CP Info
  389. typedef struct {
  390. int MaxPduLengt;
  391. int MaxConnections;
  392. int MaxMpiRate;
  393. int MaxBusRate;
  394. } TS7CpInfo, *PS7CpInfo;
  395.  
  396. // See ยง33.1 of "System Software for S7-300/400 System and Standard Functions"
  397. // and see SFC51 description too
  398. typedef struct {
  399. word LENTHDR;
  400. word N_DR;
  401. } SZL_HEADER, *PSZL_HEADER;
  402.  
  403. typedef struct {
  404. SZL_HEADER Header;
  405. byte Data[0x4000-4];
  406. } TS7SZL, *PS7SZL;
  407.  
  408. // SZL List of available SZL IDs : same as SZL but List items are big-endian adjusted
  409. typedef struct {
  410. SZL_HEADER Header;
  411. word List[0x2000-2];
  412. } TS7SZLList, *PS7SZLList;
  413.  
  414. // See ยง33.19 of "System Software for S7-300/400 System and Standard Functions"
  415. typedef struct {
  416. word sch_schal;
  417. word sch_par;
  418. word sch_rel;
  419. word bart_sch;
  420. word anl_sch;
  421. } TS7Protection, *PS7Protection;
  422.  
  423. // Client completion callback
  424. typedef void (S7API *pfn_CliCompletion) (void *usrPtr, int opCode, int opResult);
  425. //------------------------------------------------------------------------------
  426. // Import prototypes
  427. //------------------------------------------------------------------------------
  428. S7Object S7API Cli_Create();
  429. void S7API Cli_Destroy(S7Object *Client);
  430. int S7API Cli_ConnectTo(S7Object Client, const char *Address, int Rack, int Slot);
  431. int S7API Cli_SetConnectionParams(S7Object Client, const char *Address, word LocalTSAP, word RemoteTSAP);
  432. int S7API Cli_SetConnectionType(S7Object Client, word ConnectionType);
  433. int S7API Cli_Connect(S7Object Client);
  434. int S7API Cli_Disconnect(S7Object Client);
  435. int S7API Cli_GetParam(S7Object Client, int ParamNumber, void *pValue);
  436. int S7API Cli_SetParam(S7Object Client, int ParamNumber, void *pValue);
  437. int S7API Cli_SetAsCallback(S7Object Client, pfn_CliCompletion pCompletion, void *usrPtr);
  438. // Data I/O main functions
  439. int S7API Cli_ReadArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);
  440. int S7API Cli_WriteArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);
  441. int S7API Cli_ReadMultiVars(S7Object Client, PS7DataItem Item, int ItemsCount);
  442. int S7API Cli_WriteMultiVars(S7Object Client, PS7DataItem Item, int ItemsCount);
  443. // Data I/O Lean functions
  444. int S7API Cli_DBRead(S7Object Client, int DBNumber, int Start, int Size, void *pUsrData);
  445. int S7API Cli_DBWrite(S7Object Client, int DBNumber, int Start, int Size, void *pUsrData);
  446. int S7API Cli_MBRead(S7Object Client, int Start, int Size, void *pUsrData);
  447. int S7API Cli_MBWrite(S7Object Client, int Start, int Size, void *pUsrData);
  448. int S7API Cli_EBRead(S7Object Client, int Start, int Size, void *pUsrData);
  449. int S7API Cli_EBWrite(S7Object Client, int Start, int Size, void *pUsrData);
  450. int S7API Cli_ABRead(S7Object Client, int Start, int Size, void *pUsrData);
  451. int S7API Cli_ABWrite(S7Object Client, int Start, int Size, void *pUsrData);
  452. int S7API Cli_TMRead(S7Object Client, int Start, int Amount, void *pUsrData);
  453. int S7API Cli_TMWrite(S7Object Client, int Start, int Amount, void *pUsrData);
  454. int S7API Cli_CTRead(S7Object Client, int Start, int Amount, void *pUsrData);
  455. int S7API Cli_CTWrite(S7Object Client, int Start, int Amount, void *pUsrData);
  456. // Directory functions
  457. int S7API Cli_ListBlocks(S7Object Client, TS7BlocksList *pUsrData);
  458. int S7API Cli_GetAgBlockInfo(S7Object Client, int BlockType, int BlockNum, TS7BlockInfo *pUsrData);
  459. int S7API Cli_GetPgBlockInfo(S7Object Client, void *pBlock, TS7BlockInfo *pUsrData, int Size);
  460. int S7API Cli_ListBlocksOfType(S7Object Client, int BlockType, TS7BlocksOfType *pUsrData, int *ItemsCount);
  461. // Blocks functions
  462. int S7API Cli_Upload(S7Object Client, int BlockType, int BlockNum, void *pUsrData, int *Size);
  463. int S7API Cli_FullUpload(S7Object Client, int BlockType, int BlockNum, void *pUsrData, int *Size);
  464. int S7API Cli_Download(S7Object Client, int BlockNum, void *pUsrData, int Size);
  465. int S7API Cli_Delete(S7Object Client, int BlockType, int BlockNum);
  466. int S7API Cli_DBGet(S7Object Client, int DBNumber, void *pUsrData, int *Size);
  467. int S7API Cli_DBFill(S7Object Client, int DBNumber, int FillChar);
  468. // Date/Time functions
  469. int S7API Cli_GetPlcDateTime(S7Object Client, tm *DateTime);
  470. int S7API Cli_SetPlcDateTime(S7Object Client, tm *DateTime);
  471. int S7API Cli_SetPlcSystemDateTime(S7Object Client);
  472. // System Info functions
  473. int S7API Cli_GetOrderCode(S7Object Client, TS7OrderCode *pUsrData);
  474. int S7API Cli_GetCpuInfo(S7Object Client, TS7CpuInfo *pUsrData);
  475. int S7API Cli_GetCpInfo(S7Object Client, TS7CpInfo *pUsrData);
  476. int S7API Cli_ReadSZL(S7Object Client, int ID, int Index, TS7SZL *pUsrData, int *Size);
  477. int S7API Cli_ReadSZLList(S7Object Client, TS7SZLList *pUsrData, int *ItemsCount);
  478. // Control functions
  479. int S7API Cli_PlcHotStart(S7Object Client);
  480. int S7API Cli_PlcColdStart(S7Object Client);
  481. int S7API Cli_PlcStop(S7Object Client);
  482. int S7API Cli_CopyRamToRom(S7Object Client, int Timeout);
  483. int S7API Cli_Compress(S7Object Client, int Timeout);
  484. int S7API Cli_GetPlcStatus(S7Object Client, int *Status);
  485. // Security functions
  486. int S7API Cli_GetProtection(S7Object Client, TS7Protection *pUsrData);
  487. int S7API Cli_SetSessionPassword(S7Object Client, char *Password);
  488. int S7API Cli_ClearSessionPassword(S7Object Client);
  489. // Low level
  490. int S7API Cli_IsoExchangeBuffer(S7Object Client, void *pUsrData, int *Size);
  491. // Misc
  492. int S7API Cli_GetExecTime(S7Object Client, int *Time);
  493. int S7API Cli_GetLastError(S7Object Client, int *LastError);
  494. int S7API Cli_GetPduLength(S7Object Client, int *Requested, int *Negotiated);
  495. int S7API Cli_ErrorText(int Error, char *Text, int TextLen);
  496. // 1.1.0
  497. int S7API Cli_GetConnected(S7Object Client, int *Connected);
  498. //------------------------------------------------------------------------------
  499. // Async functions
  500. //------------------------------------------------------------------------------
  501. int S7API Cli_AsReadArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);
  502. int S7API Cli_AsWriteArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);
  503. int S7API Cli_AsDBRead(S7Object Client, int DBNumber, int Start, int Size, void *pUsrData);
  504. int S7API Cli_AsDBWrite(S7Object Client, int DBNumber, int Start, int Size, void *pUsrData);
  505. int S7API Cli_AsMBRead(S7Object Client, int Start, int Size, void *pUsrData);
  506. int S7API Cli_AsMBWrite(S7Object Client, int Start, int Size, void *pUsrData);
  507. int S7API Cli_AsEBRead(S7Object Client, int Start, int Size, void *pUsrData);
  508. int S7API Cli_AsEBWrite(S7Object Client, int Start, int Size, void *pUsrData);
  509. int S7API Cli_AsABRead(S7Object Client, int Start, int Size, void *pUsrData);
  510. int S7API Cli_AsABWrite(S7Object Client, int Start, int Size, void *pUsrData);
  511. int S7API Cli_AsTMRead(S7Object Client, int Start, int Amount, void *pUsrData);
  512. int S7API Cli_AsTMWrite(S7Object Client, int Start, int Amount, void *pUsrData);
  513. int S7API Cli_AsCTRead(S7Object Client, int Start, int Amount, void *pUsrData);
  514. int S7API Cli_AsCTWrite(S7Object Client, int Start, int Amount, void *pUsrData);
  515. int S7API Cli_AsListBlocksOfType(S7Object Client, int BlockType, TS7BlocksOfType *pUsrData, int *ItemsCount);
  516. int S7API Cli_AsReadSZL(S7Object Client, int ID, int Index, TS7SZL *pUsrData, int *Size);
  517. int S7API Cli_AsReadSZLList(S7Object Client, TS7SZLList *pUsrData, int *ItemsCount);
  518. int S7API Cli_AsUpload(S7Object Client, int BlockType, int BlockNum, void *pUsrData, int *Size);
  519. int S7API Cli_AsFullUpload(S7Object Client, int BlockType, int BlockNum, void *pUsrData, int *Size);
  520. int S7API Cli_AsDownload(S7Object Client, int BlockNum, void *pUsrData, int Size);
  521. int S7API Cli_AsCopyRamToRom(S7Object Client, int Timeout);
  522. int S7API Cli_AsCompress(S7Object Client, int Timeout);
  523. int S7API Cli_AsDBGet(S7Object Client, int DBNumber, void *pUsrData, int *Size);
  524. int S7API Cli_AsDBFill(S7Object Client, int DBNumber, int FillChar);
  525. int S7API Cli_CheckAsCompletion(S7Object Client, int *opResult);
  526. int S7API Cli_WaitAsCompletion(S7Object Client, int Timeout);
  527.  
  528. //******************************************************************************
  529. // SERVER
  530. //******************************************************************************
  531. const int OperationRead = 0;
  532. const int OperationWrite = 1;
  533.  
  534. const int mkEvent = 0;
  535. const int mkLog = 1;
  536.  
  537. // Server Area ID (use with Register/unregister - Lock/unlock Area)
  538. const int srvAreaPE = 0;
  539. const int srvAreaPA = 1;
  540. const int srvAreaMK = 2;
  541. const int srvAreaCT = 3;
  542. const int srvAreaTM = 4;
  543. const int srvAreaDB = 5;
  544.  
  545. // Errors
  546. const longword errSrvCannotStart = 0x00100000; // Server cannot start
  547. const longword errSrvDBNullPointer = 0x00200000; // Passed null as PData
  548. const longword errSrvAreaAlreadyExists = 0x00300000; // Area Re-registration
  549. const longword errSrvUnknownArea = 0x00400000; // Unknown area
  550. const longword errSrvInvalidParams = 0x00500000; // Invalid param(s) supplied
  551. const longword errSrvTooManyDB = 0x00600000; // Cannot register DB
  552. const longword errSrvInvalidParamNumber = 0x00700000; // Invalid param (srv_get/set_param)
  553. const longword errSrvCannotChangeParam = 0x00800000; // Cannot change because running
  554.  
  555. // TCP Server Event codes
  556. const longword evcServerStarted = 0x00000001;
  557. const longword evcServerStopped = 0x00000002;
  558. const longword evcListenerCannotStart = 0x00000004;
  559. const longword evcClientAdded = 0x00000008;
  560. const longword evcClientRejected = 0x00000010;
  561. const longword evcClientNoRoom = 0x00000020;
  562. const longword evcClientException = 0x00000040;
  563. const longword evcClientDisconnected = 0x00000080;
  564. const longword evcClientTerminated = 0x00000100;
  565. const longword evcClientsDropped = 0x00000200;
  566. const longword evcReserved_00000400 = 0x00000400; // actually unused
  567. const longword evcReserved_00000800 = 0x00000800; // actually unused
  568. const longword evcReserved_00001000 = 0x00001000; // actually unused
  569. const longword evcReserved_00002000 = 0x00002000; // actually unused
  570. const longword evcReserved_00004000 = 0x00004000; // actually unused
  571. const longword evcReserved_00008000 = 0x00008000; // actually unused
  572. // S7 Server Event Code
  573. const longword evcPDUincoming = 0x00010000;
  574. const longword evcDataRead = 0x00020000;
  575. const longword evcDataWrite = 0x00040000;
  576. const longword evcNegotiatePDU = 0x00080000;
  577. const longword evcReadSZL = 0x00100000;
  578. const longword evcClock = 0x00200000;
  579. const longword evcUpload = 0x00400000;
  580. const longword evcDownload = 0x00800000;
  581. const longword evcDirectory = 0x01000000;
  582. const longword evcSecurity = 0x02000000;
  583. const longword evcControl = 0x04000000;
  584. const longword evcReserved_08000000 = 0x08000000; // actually unused
  585. const longword evcReserved_10000000 = 0x10000000; // actually unused
  586. const longword evcReserved_20000000 = 0x20000000; // actually unused
  587. const longword evcReserved_40000000 = 0x40000000; // actually unused
  588. const longword evcReserved_80000000 = 0x80000000; // actually unused
  589. // Masks to enable/disable all events
  590. const longword evcAll = 0xFFFFFFFF;
  591. const longword evcNone = 0x00000000;
  592. // Event SubCodes
  593. const word evsUnknown = 0x0000;
  594. const word evsStartUpload = 0x0001;
  595. const word evsStartDownload = 0x0001;
  596. const word evsGetBlockList = 0x0001;
  597. const word evsStartListBoT = 0x0002;
  598. const word evsListBoT = 0x0003;
  599. const word evsGetBlockInfo = 0x0004;
  600. const word evsGetClock = 0x0001;
  601. const word evsSetClock = 0x0002;
  602. const word evsSetPassword = 0x0001;
  603. const word evsClrPassword = 0x0002;
  604. // Event Params : functions group
  605. const word grProgrammer = 0x0041;
  606. const word grCyclicData = 0x0042;
  607. const word grBlocksInfo = 0x0043;
  608. const word grSZL = 0x0044;
  609. const word grPassword = 0x0045;
  610. const word grBSend = 0x0046;
  611. const word grClock = 0x0047;
  612. const word grSecurity = 0x0045;
  613. // Event Params : control codes
  614. const word CodeControlUnknown = 0x0000;
  615. const word CodeControlColdStart = 0x0001;
  616. const word CodeControlWarmStart = 0x0002;
  617. const word CodeControlStop = 0x0003;
  618. const word CodeControlCompress = 0x0004;
  619. const word CodeControlCpyRamRom = 0x0005;
  620. const word CodeControlInsDel = 0x0006;
  621. // Event Result
  622. const word evrNoError = 0x0000;
  623. const word evrFragmentRejected = 0x0001;
  624. const word evrMalformedPDU = 0x0002;
  625. const word evrSparseBytes = 0x0003;
  626. const word evrCannotHandlePDU = 0x0004;
  627. const word evrNotImplemented = 0x0005;
  628. const word evrErrException = 0x0006;
  629. const word evrErrAreaNotFound = 0x0007;
  630. const word evrErrOutOfRange = 0x0008;
  631. const word evrErrOverPDU = 0x0009;
  632. const word evrErrTransportSize = 0x000A;
  633. const word evrInvalidGroupUData = 0x000B;
  634. const word evrInvalidSZL = 0x000C;
  635. const word evrDataSizeMismatch = 0x000D;
  636. const word evrCannotUpload = 0x000E;
  637. const word evrCannotDownload = 0x000F;
  638. const word evrUploadInvalidID = 0x0010;
  639. const word evrResNotFound = 0x0011;
  640.  
  641. typedef struct{
  642. time_t EvtTime; // Timestamp
  643. int EvtSender; // Sender
  644. longword EvtCode; // Event code
  645. word EvtRetCode; // Event result
  646. word EvtParam1; // Param 1 (if available)
  647. word EvtParam2; // Param 2 (if available)
  648. word EvtParam3; // Param 3 (if available)
  649. word EvtParam4; // Param 4 (if available)
  650. }TSrvEvent, *PSrvEvent;
  651.  
  652. // Server Events callback
  653. typedef void (S7API *pfn_SrvCallBack)(void *usrPtr, PSrvEvent PEvent, int Size);
  654. // Server Read/Write callback
  655. typedef int(S7API *pfn_RWAreaCallBack)(void *usrPtr, int Sender, int Operation, PS7Tag PTag, void *pUsrData);
  656.  
  657. S7Object S7API Srv_Create();
  658. void S7API Srv_Destroy(S7Object *Server);
  659. int S7API Srv_GetParam(S7Object Server, int ParamNumber, void *pValue);
  660. int S7API Srv_SetParam(S7Object Server, int ParamNumber, void *pValue);
  661. int S7API Srv_StartTo(S7Object Server, const char *Address);
  662. int S7API Srv_Start(S7Object Server);
  663. int S7API Srv_Stop(S7Object Server);
  664. int S7API Srv_RegisterArea(S7Object Server, int AreaCode, word Index, void *pUsrData, int Size);
  665. int S7API Srv_UnregisterArea(S7Object Server, int AreaCode, word Index);
  666. int S7API Srv_LockArea(S7Object Server, int AreaCode, word Index);
  667. int S7API Srv_UnlockArea(S7Object Server, int AreaCode, word Index);
  668. int S7API Srv_GetStatus(S7Object Server, int *ServerStatus, int *CpuStatus, int *ClientsCount);
  669. int S7API Srv_SetCpuStatus(S7Object Server, int CpuStatus);
  670. int S7API Srv_ClearEvents(S7Object Server);
  671. int S7API Srv_PickEvent(S7Object Server, TSrvEvent *pEvent, int *EvtReady);
  672. int S7API Srv_GetMask(S7Object Server, int MaskKind, longword *Mask);
  673. int S7API Srv_SetMask(S7Object Server, int MaskKind, longword Mask);
  674. int S7API Srv_SetEventsCallback(S7Object Server, pfn_SrvCallBack pCallback, void *usrPtr);
  675. int S7API Srv_SetReadEventsCallback(S7Object Server, pfn_SrvCallBack pCallback, void *usrPtr);
  676. int S7API Srv_SetRWAreaCallback(S7Object Server, pfn_RWAreaCallBack pCallback, void *usrPtr);
  677. int S7API Srv_EventText(TSrvEvent *Event, char *Text, int TextLen);
  678. int S7API Srv_ErrorText(int Error, char *Text, int TextLen);
  679.  
  680. //******************************************************************************
  681. // PARTNER
  682. //******************************************************************************
  683.  
  684. // Status
  685. const int par_stopped = 0; // stopped
  686. const int par_connecting = 1; // running and active connecting
  687. const int par_waiting = 2; // running and waiting for a connection
  688. const int par_linked = 3; // running and connected : linked
  689. const int par_sending = 4; // sending data
  690. const int par_receiving = 5; // receiving data
  691. const int par_binderror = 6; // error starting passive server
  692.  
  693. // Errors
  694. const longword errParAddressInUse = 0x00200000;
  695. const longword errParNoRoom = 0x00300000;
  696. const longword errServerNoRoom = 0x00400000;
  697. const longword errParInvalidParams = 0x00500000;
  698. const longword errParNotLinked = 0x00600000;
  699. const longword errParBusy = 0x00700000;
  700. const longword errParFrameTimeout = 0x00800000;
  701. const longword errParInvalidPDU = 0x00900000;
  702. const longword errParSendTimeout = 0x00A00000;
  703. const longword errParRecvTimeout = 0x00B00000;
  704. const longword errParSendRefused = 0x00C00000;
  705. const longword errParNegotiatingPDU = 0x00D00000;
  706. const longword errParSendingBlock = 0x00E00000;
  707. const longword errParRecvingBlock = 0x00F00000;
  708. const longword errParBindError = 0x01000000;
  709. const longword errParDestroying = 0x01100000;
  710. const longword errParInvalidParamNumber = 0x01200000; // Invalid param (par_get/set_param)
  711. const longword errParCannotChangeParam = 0x01300000; // Cannot change because running
  712. const longword errParBufferTooSmall = 0x01400000; // Raised by LabVIEW wrapper
  713.  
  714. // Brecv Data incoming Callback
  715. typedef void (S7API *pfn_ParRecvCallBack)(void * usrPtr, int opResult, longword R_ID, void *pData, int Size);
  716. // BSend Completion Callback
  717. typedef void (S7API *pfn_ParSendCompletion)(void * usrPtr, int opResult);
  718.  
  719. S7Object S7API Par_Create(int Active);
  720. void S7API Par_Destroy(S7Object *Partner);
  721. int S7API Par_GetParam(S7Object Partner, int ParamNumber, void *pValue);
  722. int S7API Par_SetParam(S7Object Partner, int ParamNumber, void *pValue);
  723. int S7API Par_StartTo(S7Object Partner, const char *LocalAddress, const char *RemoteAddress,
  724. word LocTsap, word RemTsap);
  725. int S7API Par_Start(S7Object Partner);
  726. int S7API Par_Stop(S7Object Partner);
  727. // BSend
  728. int S7API Par_BSend(S7Object Partner, longword R_ID, void *pUsrData, int Size);
  729. int S7API Par_AsBSend(S7Object Partner, longword R_ID, void *pUsrData, int Size);
  730. int S7API Par_CheckAsBSendCompletion(S7Object Partner, int *opResult);
  731. int S7API Par_WaitAsBSendCompletion(S7Object Partner, longword Timeout);
  732. int S7API Par_SetSendCallback(S7Object Partner, pfn_ParSendCompletion pCompletion, void *usrPtr);
  733. // BRecv
  734. int S7API Par_BRecv(S7Object Partner, longword *R_ID, void *pData, int *Size, longword Timeout);
  735. int S7API Par_CheckAsBRecvCompletion(S7Object Partner, int *opResult, longword *R_ID,
  736. void *pData, int *Size);
  737. int S7API Par_SetRecvCallback(S7Object Partner, pfn_ParRecvCallBack pCompletion, void *usrPtr);
  738. // Stat
  739. int S7API Par_GetTimes(S7Object Partner, longword *SendTime, longword *RecvTime);
  740. int S7API Par_GetStats(S7Object Partner, longword *BytesSent, longword *BytesRecv,
  741. longword *SendErrors, longword *RecvErrors);
  742. int S7API Par_GetLastError(S7Object Partner, int *LastError);
  743. int S7API Par_GetStatus(S7Object Partner, int *Status);
  744. int S7API Par_ErrorText(int Error, char *Text, int TextLen);
  745.  
  746.  
  747. #pragma pack()
  748. #ifdef __cplusplus
  749. }
  750. #endif // __cplusplus
  751.  
  752. #ifdef __cplusplus
  753.  
  754. //******************************************************************************
  755. // CLIENT CLASS DEFINITION
  756. //******************************************************************************
  757. class TS7Client
  758. {
  759. private:
  760. S7Object Client;
  761. public:
  762. TS7Client();
  763. ~TS7Client();
  764. // Control functions
  765. int Connect();
  766. int ConnectTo(const char *RemAddress, int Rack, int Slot);
  767. int SetConnectionParams(const char *RemAddress, word LocalTSAP, word RemoteTSAP);
  768. int SetConnectionType(word ConnectionType);
  769. int Disconnect();
  770. int GetParam(int ParamNumber, void *pValue);
  771. int SetParam(int ParamNumber, void *pValue);
  772. // Data I/O Main functions
  773. int ReadArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);
  774. int WriteArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);
  775. int ReadMultiVars(PS7DataItem Item, int ItemsCount);
  776. int WriteMultiVars(PS7DataItem Item, int ItemsCount);
  777. // Data I/O Lean functions
  778. int DBRead(int DBNumber, int Start, int Size, void *pUsrData);
  779. int DBWrite(int DBNumber, int Start, int Size, void *pUsrData);
  780. int MBRead(int Start, int Size, void *pUsrData);
  781. int MBWrite(int Start, int Size, void *pUsrData);
  782. int EBRead(int Start, int Size, void *pUsrData);
  783. int EBWrite(int Start, int Size, void *pUsrData);
  784. int ABRead(int Start, int Size, void *pUsrData);
  785. int ABWrite(int Start, int Size, void *pUsrData);
  786. int TMRead(int Start, int Amount, void *pUsrData);
  787. int TMWrite(int Start, int Amount, void *pUsrData);
  788. int CTRead(int Start, int Amount, void *pUsrData);
  789. int CTWrite(int Start, int Amount, void *pUsrData);
  790. // Directory functions
  791. int ListBlocks(PS7BlocksList pUsrData);
  792. int GetAgBlockInfo(int BlockType, int BlockNum, PS7BlockInfo pUsrData);
  793. int GetPgBlockInfo(void *pBlock, PS7BlockInfo pUsrData, int Size);
  794. int ListBlocksOfType(int BlockType, TS7BlocksOfType *pUsrData, int *ItemsCount);
  795. // Blocks functions
  796. int Upload(int BlockType, int BlockNum, void *pUsrData, int *Size);
  797. int FullUpload(int BlockType, int BlockNum, void *pUsrData, int *Size);
  798. int Download(int BlockNum, void *pUsrData, int Size);
  799. int Delete(int BlockType, int BlockNum);
  800. int DBGet(int DBNumber, void *pUsrData, int *Size);
  801. int DBFill(int DBNumber, int FillChar);
  802. // Date/Time functions
  803. int GetPlcDateTime(tm *DateTime);
  804. int SetPlcDateTime(tm *DateTime);
  805. int SetPlcSystemDateTime();
  806. // System Info functions
  807. int GetOrderCode(PS7OrderCode pUsrData);
  808. int GetCpuInfo(PS7CpuInfo pUsrData);
  809. int GetCpInfo(PS7CpInfo pUsrData);
  810. int ReadSZL(int ID, int Index, PS7SZL pUsrData, int *Size);
  811. int ReadSZLList(PS7SZLList pUsrData, int *ItemsCount);
  812. // Control functions
  813. int PlcHotStart();
  814. int PlcColdStart();
  815. int PlcStop();
  816. int CopyRamToRom(int Timeout);
  817. int Compress(int Timeout);
  818. // Security functions
  819. int GetProtection(PS7Protection pUsrData);
  820. int SetSessionPassword(char *Password);
  821. int ClearSessionPassword();
  822. // Properties
  823. int ExecTime();
  824. int LastError();
  825. int PDURequested();
  826. int PDULength();
  827. int PlcStatus();
  828. bool Connected();
  829. // Async functions
  830. int SetAsCallback(pfn_CliCompletion pCompletion, void *usrPtr);
  831. bool CheckAsCompletion(int *opResult);
  832. int WaitAsCompletion(longword Timeout);
  833. int AsReadArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);
  834. int AsWriteArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);
  835. int AsListBlocksOfType(int BlockType, PS7BlocksOfType pUsrData, int *ItemsCount);
  836. int AsReadSZL(int ID, int Index, PS7SZL pUsrData, int *Size);
  837. int AsReadSZLList(PS7SZLList pUsrData, int *ItemsCount);
  838. int AsUpload(int BlockType, int BlockNum, void *pUsrData, int *Size);
  839. int AsFullUpload(int BlockType, int BlockNum, void *pUsrData, int *Size);
  840. int AsDownload(int BlockNum, void *pUsrData, int Size);
  841. int AsCopyRamToRom(int Timeout);
  842. int AsCompress(int Timeout);
  843. int AsDBRead(int DBNumber, int Start, int Size, void *pUsrData);
  844. int AsDBWrite(int DBNumber, int Start, int Size, void *pUsrData);
  845. int AsMBRead(int Start, int Size, void *pUsrData);
  846. int AsMBWrite(int Start, int Size, void *pUsrData);
  847. int AsEBRead(int Start, int Size, void *pUsrData);
  848. int AsEBWrite(int Start, int Size, void *pUsrData);
  849. int AsABRead(int Start, int Size, void *pUsrData);
  850. int AsABWrite(int Start, int Size, void *pUsrData);
  851. int AsTMRead(int Start, int Amount, void *pUsrData);
  852. int AsTMWrite(int Start, int Amount, void *pUsrData);
  853. int AsCTRead(int Start, int Amount, void *pUsrData);
  854. int AsCTWrite(int Start, int Amount, void *pUsrData);
  855. int AsDBGet(int DBNumber, void *pUsrData, int *Size);
  856. int AsDBFill(int DBNumber, int FillChar);
  857. };
  858. typedef TS7Client *PS7Client;
  859. //******************************************************************************
  860. // SERVER CLASS DEFINITION
  861. //******************************************************************************
  862. class TS7Server
  863. {
  864. private:
  865. S7Object Server;
  866. public:
  867. TS7Server();
  868. ~TS7Server();
  869. // Control
  870. int Start();
  871. int StartTo(const char *Address);
  872. int Stop();
  873. int GetParam(int ParamNumber, void *pValue);
  874. int SetParam(int ParamNumber, void *pValue);
  875. // Events
  876. int SetEventsCallback(pfn_SrvCallBack PCallBack, void *UsrPtr);
  877. int SetReadEventsCallback(pfn_SrvCallBack PCallBack, void *UsrPtr);
  878. int SetRWAreaCallback(pfn_RWAreaCallBack PCallBack, void *UsrPtr);
  879. bool PickEvent(TSrvEvent *pEvent);
  880. void ClearEvents();
  881. longword GetEventsMask();
  882. longword GetLogMask();
  883. void SetEventsMask(longword Mask);
  884. void SetLogMask(longword Mask);
  885. // Resources
  886. int RegisterArea(int AreaCode, word Index, void *pUsrData, word Size);
  887. int UnregisterArea(int AreaCode, word Index);
  888. int LockArea(int AreaCode, word Index);
  889. int UnlockArea(int AreaCode, word Index);
  890. // Properties
  891. int ServerStatus();
  892. int GetCpuStatus();
  893. int SetCpuStatus(int Status);
  894. int ClientsCount();
  895. };
  896. typedef TS7Server *PS7Server;
  897.  
  898. //******************************************************************************
  899. // PARTNER CLASS DEFINITION
  900. //******************************************************************************
  901. class TS7Partner
  902. {
  903. private:
  904. S7Object Partner; // Partner Handle
  905. public:
  906. TS7Partner(bool Active);
  907. ~TS7Partner();
  908. // Control
  909. int GetParam(int ParamNumber, void *pValue);
  910. int SetParam(int ParamNumber, void *pValue);
  911. int Start();
  912. int StartTo(const char *LocalAddress,
  913. const char *RemoteAddress,
  914. int LocalTSAP,
  915. int RemoteTSAP);
  916. int Stop();
  917. // Data I/O functions : BSend
  918. int BSend(longword R_ID, void *pUsrData, int Size);
  919. int AsBSend(longword R_ID, void *pUsrData, int Size);
  920. bool CheckAsBSendCompletion(int *opResult);
  921. int WaitAsBSendCompletion(longword Timeout);
  922. int SetSendCallback(pfn_ParSendCompletion pCompletion, void *usrPtr);
  923. // Data I/O functions : BRecv
  924. int BRecv(longword *R_ID, void *pUsrData, int *Size, longword Timeout);
  925. bool CheckAsBRecvCompletion(int *opResult, longword *R_ID, void *pUsrData, int *Size);
  926. int SetRecvCallback(pfn_ParRecvCallBack pCallback, void *usrPtr);
  927. // Properties
  928. int Status();
  929. int LastError();
  930. int GetTimes(longword *SendTime, longword *RecvTime);
  931. int GetStats(longword *BytesSent,
  932. longword *BytesRecv,
  933. longword *ErrSend,
  934. longword *ErrRecv);
  935. bool Linked();
  936. };
  937. typedef TS7Partner *PS7Partner;
  938. //******************************************************************************
  939. // TEXT ROUTINES
  940. // Only for C++, for pure C use xxx_ErrorText() which uses *char
  941. //******************************************************************************
  942. #define TextLen 1024
  943.  
  944. // String type
  945. // Here we define generic TextString (by default mapped onto std::string).
  946. // So you can change it if needed (Unicodestring, Ansistring etc...)
  947.  
  948. typedef std::string TextString;
  949.  
  950. TextString CliErrorText(int Error);
  951. TextString SrvErrorText(int Error);
  952. TextString ParErrorText(int Error);
  953. TextString SrvEventText(TSrvEvent *Event);
  954.  
  955.  
  956. #endif // __cplusplus
  957. #endif // snap7_h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement