/*=============================================================================| | PROJECT SNAP7 1.4.0 | |==============================================================================| | Copyright (C) 2013, 2014 Davide Nardella | | All rights reserved. | |==============================================================================| | SNAP7 is free software: you can redistribute it and/or modify | | it under the terms of the Lesser GNU General Public License as published by | | the Free Software Foundation, either version 3 of the License, or | | (at your option) any later version. | | | | It means that you can distribute your commercial software linked with | | SNAP7 without the requirement to distribute the source code of your | | application and without the requirement that your application be itself | | distributed under LGPL. | | | | SNAP7 is distributed in the hope that it will be useful, | | but WITHOUT ANY WARRANTY; without even the implied warranty of | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | Lesser GNU General Public License for more details. | | | | You should have received a copy of the GNU General Public License and a | | copy of Lesser GNU General Public License along with Snap7. | | If not, see http://www.gnu.org/licenses/ | |==============================================================================| | | | C/C++ Snap 7 classes/Imports definitions | | | |=============================================================================*/ #ifndef snap7_h #define snap7_h //--------------------------------------------------------------------------- // Platform detection //--------------------------------------------------------------------------- #if defined (_WIN32)||defined(_WIN64)||defined(__WIN32__)||defined(__WINDOWS__) # define OS_WINDOWS #endif // Visual Studio needs this to use the correct time_t size #if defined (_WIN32) && !defined(_WIN64) # define _USE_32BIT_TIME_T #endif #if defined(unix) || defined(__unix__) || defined(__unix) # define PLATFORM_UNIX #endif #if defined(__SVR4) || defined(__svr4__) # define OS_SOLARIS #endif #if BSD>=0 # define OS_BSD #endif #if defined(__APPLE__) # define OS_OSX #endif #if defined(PLATFORM_UNIX) || defined(OS_OSX) # include # if defined(_POSIX_VERSION) # define POSIX # endif #endif //--------------------------------------------------------------------------- // C++ Library //--------------------------------------------------------------------------- #ifdef __cplusplus #include #include // Visual C++ not C99 compliant (VS2008--) #ifdef _MSC_VER # if _MSC_VER >= 1600 # include // VS2010++ have it # else typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef signed __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #ifdef _WIN64 typedef unsigned __int64 uintptr_t; #else typedef unsigned __int32 uintptr_t; #endif # endif #else # include #endif extern "C" { #endif //--------------------------------------------------------------------------- // C exact length types //--------------------------------------------------------------------------- #ifndef __cplusplus #ifdef OS_BSD # include # include #endif #ifdef OS_OSX # include # include #endif #ifdef OS_SOLARIS # include # include #endif #if defined(_UINTPTR_T_DEFINED) # include # include #endif #if !defined(_UINTPTR_T_DEFINED) && !defined(OS_SOLARIS) && !defined(OS_BSD) && !defined(OS_OSX) typedef unsigned char uint8_t; // 8 bit unsigned integer typedef unsigned short uint16_t; // 16 bit unsigned integer typedef unsigned int uint32_t; // 32 bit unsigned integer typedef unsigned long uintptr_t;// 64 bit unsigned integer #endif #endif #ifdef OS_WINDOWS # define S7API __stdcall #else # define S7API #endif #pragma pack(1) //****************************************************************************** // COMMON //****************************************************************************** // Exact length types regardless of platform/processor typedef uint8_t byte; typedef uint16_t word; typedef uint32_t longword; typedef byte *pbyte; typedef word *pword; typedef uintptr_t S7Object; // multi platform/processor object reference // DON'T CONFUSE IT WITH AN OLE OBJECT, IT'S SIMPLY // AN INTEGER VALUE (32 OR 64 BIT) USED AS HANDLE. #ifndef __cplusplus typedef struct { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; }tm; typedef int bool; #define false 0; #define true 1; #endif const int errLibInvalidParam = -1; const int errLibInvalidObject = -2; // CPU status #define S7CpuStatusUnknown 0x00 #define S7CpuStatusRun 0x08 #define S7CpuStatusStop 0x04 // ISO Errors const longword errIsoConnect = 0x00010000; // Connection error const longword errIsoDisconnect = 0x00020000; // Disconnect error const longword errIsoInvalidPDU = 0x00030000; // Bad format const longword errIsoInvalidDataSize = 0x00040000; // Bad Datasize passed to send/recv buffer is invalid const longword errIsoNullPointer = 0x00050000; // Null passed as pointer const longword errIsoShortPacket = 0x00060000; // A short packet received const longword errIsoTooManyFragments = 0x00070000; // Too many packets without EoT flag const longword errIsoPduOverflow = 0x00080000; // The sum of fragments data exceded maximum packet size const longword errIsoSendPacket = 0x00090000; // An error occurred during send const longword errIsoRecvPacket = 0x000A0000; // An error occurred during recv const longword errIsoInvalidParams = 0x000B0000; // Invalid TSAP params const longword errIsoResvd_1 = 0x000C0000; // Unassigned const longword errIsoResvd_2 = 0x000D0000; // Unassigned const longword errIsoResvd_3 = 0x000E0000; // Unassigned const longword errIsoResvd_4 = 0x000F0000; // Unassigned // Tag Struct typedef struct{ int Area; int DBNumber; int Start; int Size; int WordLen; }TS7Tag, *PS7Tag; //------------------------------------------------------------------------------ // PARAMS LIST //------------------------------------------------------------------------------ const int p_u16_LocalPort = 1; const int p_u16_RemotePort = 2; const int p_i32_PingTimeout = 3; const int p_i32_SendTimeout = 4; const int p_i32_RecvTimeout = 5; const int p_i32_WorkInterval = 6; const int p_u16_SrcRef = 7; const int p_u16_DstRef = 8; const int p_u16_SrcTSap = 9; const int p_i32_PDURequest = 10; const int p_i32_MaxClients = 11; const int p_i32_BSendTimeout = 12; const int p_i32_BRecvTimeout = 13; const int p_u32_RecoveryTime = 14; const int p_u32_KeepAliveTime = 15; // Client/Partner Job status const int JobComplete = 0; const int JobPending = 1; //****************************************************************************** // CLIENT //****************************************************************************** // Error codes const longword errNegotiatingPDU = 0x00100000; const longword errCliInvalidParams = 0x00200000; const longword errCliJobPending = 0x00300000; const longword errCliTooManyItems = 0x00400000; const longword errCliInvalidWordLen = 0x00500000; const longword errCliPartialDataWritten = 0x00600000; const longword errCliSizeOverPDU = 0x00700000; const longword errCliInvalidPlcAnswer = 0x00800000; const longword errCliAddressOutOfRange = 0x00900000; const longword errCliInvalidTransportSize = 0x00A00000; const longword errCliWriteDataSizeMismatch = 0x00B00000; const longword errCliItemNotAvailable = 0x00C00000; const longword errCliInvalidValue = 0x00D00000; const longword errCliCannotStartPLC = 0x00E00000; const longword errCliAlreadyRun = 0x00F00000; const longword errCliCannotStopPLC = 0x01000000; const longword errCliCannotCopyRamToRom = 0x01100000; const longword errCliCannotCompress = 0x01200000; const longword errCliAlreadyStop = 0x01300000; const longword errCliFunNotAvailable = 0x01400000; const longword errCliUploadSequenceFailed = 0x01500000; const longword errCliInvalidDataSizeRecvd = 0x01600000; const longword errCliInvalidBlockType = 0x01700000; const longword errCliInvalidBlockNumber = 0x01800000; const longword errCliInvalidBlockSize = 0x01900000; const longword errCliDownloadSequenceFailed = 0x01A00000; const longword errCliInsertRefused = 0x01B00000; const longword errCliDeleteRefused = 0x01C00000; const longword errCliNeedPassword = 0x01D00000; const longword errCliInvalidPassword = 0x01E00000; const longword errCliNoPasswordToSetOrClear = 0x01F00000; const longword errCliJobTimeout = 0x02000000; const longword errCliPartialDataRead = 0x02100000; const longword errCliBufferTooSmall = 0x02200000; const longword errCliFunctionRefused = 0x02300000; const longword errCliDestroying = 0x02400000; const longword errCliInvalidParamNumber = 0x02500000; const longword errCliCannotChangeParam = 0x02600000; const int MaxVars = 20; // Max vars that can be transferred with MultiRead/MultiWrite // Client Connection Type const word CONNTYPE_PG = 0x0001; // Connect to the PLC as a PG const word CONNTYPE_OP = 0x0002; // Connect to the PLC as an OP const word CONNTYPE_BASIC = 0x0003; // Basic connection // Area ID const byte S7AreaPE = 0x81; const byte S7AreaPA = 0x82; const byte S7AreaMK = 0x83; const byte S7AreaDB = 0x84; const byte S7AreaCT = 0x1C; const byte S7AreaTM = 0x1D; // Word Length const int S7WLBit = 0x01; const int S7WLByte = 0x02; const int S7WLWord = 0x04; const int S7WLDWord = 0x06; const int S7WLReal = 0x08; const int S7WLCounter = 0x1C; const int S7WLTimer = 0x1D; // Block type const byte Block_OB = 0x38; const byte Block_DB = 0x41; const byte Block_SDB = 0x42; const byte Block_FC = 0x43; const byte Block_SFC = 0x44; const byte Block_FB = 0x45; const byte Block_SFB = 0x46; // Sub Block Type const byte SubBlk_OB = 0x08; const byte SubBlk_DB = 0x0A; const byte SubBlk_SDB = 0x0B; const byte SubBlk_FC = 0x0C; const byte SubBlk_SFC = 0x0D; const byte SubBlk_FB = 0x0E; const byte SubBlk_SFB = 0x0F; // Block languages const byte BlockLangAWL = 0x01; const byte BlockLangKOP = 0x02; const byte BlockLangFUP = 0x03; const byte BlockLangSCL = 0x04; const byte BlockLangDB = 0x05; const byte BlockLangGRAPH = 0x06; // Read/Write Multivars typedef struct{ int Area; int WordLen; int Result; int DBNumber; int Start; int Amount; void *pdata; } TS7DataItem, *PS7DataItem; //typedef int TS7ResultItems[MaxVars]; //typedef TS7ResultItems *PS7ResultItems; // List Blocks typedef struct { int OBCount; int FBCount; int FCCount; int SFBCount; int SFCCount; int DBCount; int SDBCount; } TS7BlocksList, *PS7BlocksList; // Blocks info typedef struct { int BlkType; // Block Type (OB, DB) int BlkNumber; // Block number int BlkLang; // Block Language int BlkFlags; // Block flags int MC7Size; // The real size in bytes int LoadSize; // Load memory size int LocalData; // Local data int SBBLength; // SBB Length int CheckSum; // Checksum int Version; // Block version // Chars info char CodeDate[11]; // Code date char IntfDate[11]; // Interface date char Author[9]; // Author char Family[9]; // Family char Header[9]; // Header } TS7BlockInfo, *PS7BlockInfo ; typedef word TS7BlocksOfType[0x2000]; typedef TS7BlocksOfType *PS7BlocksOfType; // Order code typedef struct { char Code[21]; byte V1; byte V2; byte V3; } TS7OrderCode, *PS7OrderCode; // CPU Info typedef struct { char ModuleTypeName[33]; char SerialNumber[25]; char ASName[25]; char Copyright[27]; char ModuleName[25]; } TS7CpuInfo, *PS7CpuInfo; // CP Info typedef struct { int MaxPduLengt; int MaxConnections; int MaxMpiRate; int MaxBusRate; } TS7CpInfo, *PS7CpInfo; // See §33.1 of "System Software for S7-300/400 System and Standard Functions" // and see SFC51 description too typedef struct { word LENTHDR; word N_DR; } SZL_HEADER, *PSZL_HEADER; typedef struct { SZL_HEADER Header; byte Data[0x4000-4]; } TS7SZL, *PS7SZL; // SZL List of available SZL IDs : same as SZL but List items are big-endian adjusted typedef struct { SZL_HEADER Header; word List[0x2000-2]; } TS7SZLList, *PS7SZLList; // See §33.19 of "System Software for S7-300/400 System and Standard Functions" typedef struct { word sch_schal; word sch_par; word sch_rel; word bart_sch; word anl_sch; } TS7Protection, *PS7Protection; // Client completion callback typedef void (S7API *pfn_CliCompletion) (void *usrPtr, int opCode, int opResult); //------------------------------------------------------------------------------ // Import prototypes //------------------------------------------------------------------------------ S7Object S7API Cli_Create(); void S7API Cli_Destroy(S7Object *Client); int S7API Cli_ConnectTo(S7Object Client, const char *Address, int Rack, int Slot); int S7API Cli_SetConnectionParams(S7Object Client, const char *Address, word LocalTSAP, word RemoteTSAP); int S7API Cli_SetConnectionType(S7Object Client, word ConnectionType); int S7API Cli_Connect(S7Object Client); int S7API Cli_Disconnect(S7Object Client); int S7API Cli_GetParam(S7Object Client, int ParamNumber, void *pValue); int S7API Cli_SetParam(S7Object Client, int ParamNumber, void *pValue); int S7API Cli_SetAsCallback(S7Object Client, pfn_CliCompletion pCompletion, void *usrPtr); // Data I/O main functions int S7API Cli_ReadArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData); int S7API Cli_WriteArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData); int S7API Cli_ReadMultiVars(S7Object Client, PS7DataItem Item, int ItemsCount); int S7API Cli_WriteMultiVars(S7Object Client, PS7DataItem Item, int ItemsCount); // Data I/O Lean functions int S7API Cli_DBRead(S7Object Client, int DBNumber, int Start, int Size, void *pUsrData); int S7API Cli_DBWrite(S7Object Client, int DBNumber, int Start, int Size, void *pUsrData); int S7API Cli_MBRead(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_MBWrite(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_EBRead(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_EBWrite(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_ABRead(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_ABWrite(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_TMRead(S7Object Client, int Start, int Amount, void *pUsrData); int S7API Cli_TMWrite(S7Object Client, int Start, int Amount, void *pUsrData); int S7API Cli_CTRead(S7Object Client, int Start, int Amount, void *pUsrData); int S7API Cli_CTWrite(S7Object Client, int Start, int Amount, void *pUsrData); // Directory functions int S7API Cli_ListBlocks(S7Object Client, TS7BlocksList *pUsrData); int S7API Cli_GetAgBlockInfo(S7Object Client, int BlockType, int BlockNum, TS7BlockInfo *pUsrData); int S7API Cli_GetPgBlockInfo(S7Object Client, void *pBlock, TS7BlockInfo *pUsrData, int Size); int S7API Cli_ListBlocksOfType(S7Object Client, int BlockType, TS7BlocksOfType *pUsrData, int *ItemsCount); // Blocks functions int S7API Cli_Upload(S7Object Client, int BlockType, int BlockNum, void *pUsrData, int *Size); int S7API Cli_FullUpload(S7Object Client, int BlockType, int BlockNum, void *pUsrData, int *Size); int S7API Cli_Download(S7Object Client, int BlockNum, void *pUsrData, int Size); int S7API Cli_Delete(S7Object Client, int BlockType, int BlockNum); int S7API Cli_DBGet(S7Object Client, int DBNumber, void *pUsrData, int *Size); int S7API Cli_DBFill(S7Object Client, int DBNumber, int FillChar); // Date/Time functions int S7API Cli_GetPlcDateTime(S7Object Client, tm *DateTime); int S7API Cli_SetPlcDateTime(S7Object Client, tm *DateTime); int S7API Cli_SetPlcSystemDateTime(S7Object Client); // System Info functions int S7API Cli_GetOrderCode(S7Object Client, TS7OrderCode *pUsrData); int S7API Cli_GetCpuInfo(S7Object Client, TS7CpuInfo *pUsrData); int S7API Cli_GetCpInfo(S7Object Client, TS7CpInfo *pUsrData); int S7API Cli_ReadSZL(S7Object Client, int ID, int Index, TS7SZL *pUsrData, int *Size); int S7API Cli_ReadSZLList(S7Object Client, TS7SZLList *pUsrData, int *ItemsCount); // Control functions int S7API Cli_PlcHotStart(S7Object Client); int S7API Cli_PlcColdStart(S7Object Client); int S7API Cli_PlcStop(S7Object Client); int S7API Cli_CopyRamToRom(S7Object Client, int Timeout); int S7API Cli_Compress(S7Object Client, int Timeout); int S7API Cli_GetPlcStatus(S7Object Client, int *Status); // Security functions int S7API Cli_GetProtection(S7Object Client, TS7Protection *pUsrData); int S7API Cli_SetSessionPassword(S7Object Client, char *Password); int S7API Cli_ClearSessionPassword(S7Object Client); // Low level int S7API Cli_IsoExchangeBuffer(S7Object Client, void *pUsrData, int *Size); // Misc int S7API Cli_GetExecTime(S7Object Client, int *Time); int S7API Cli_GetLastError(S7Object Client, int *LastError); int S7API Cli_GetPduLength(S7Object Client, int *Requested, int *Negotiated); int S7API Cli_ErrorText(int Error, char *Text, int TextLen); // 1.1.0 int S7API Cli_GetConnected(S7Object Client, int *Connected); //------------------------------------------------------------------------------ // Async functions //------------------------------------------------------------------------------ int S7API Cli_AsReadArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData); int S7API Cli_AsWriteArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData); int S7API Cli_AsDBRead(S7Object Client, int DBNumber, int Start, int Size, void *pUsrData); int S7API Cli_AsDBWrite(S7Object Client, int DBNumber, int Start, int Size, void *pUsrData); int S7API Cli_AsMBRead(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_AsMBWrite(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_AsEBRead(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_AsEBWrite(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_AsABRead(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_AsABWrite(S7Object Client, int Start, int Size, void *pUsrData); int S7API Cli_AsTMRead(S7Object Client, int Start, int Amount, void *pUsrData); int S7API Cli_AsTMWrite(S7Object Client, int Start, int Amount, void *pUsrData); int S7API Cli_AsCTRead(S7Object Client, int Start, int Amount, void *pUsrData); int S7API Cli_AsCTWrite(S7Object Client, int Start, int Amount, void *pUsrData); int S7API Cli_AsListBlocksOfType(S7Object Client, int BlockType, TS7BlocksOfType *pUsrData, int *ItemsCount); int S7API Cli_AsReadSZL(S7Object Client, int ID, int Index, TS7SZL *pUsrData, int *Size); int S7API Cli_AsReadSZLList(S7Object Client, TS7SZLList *pUsrData, int *ItemsCount); int S7API Cli_AsUpload(S7Object Client, int BlockType, int BlockNum, void *pUsrData, int *Size); int S7API Cli_AsFullUpload(S7Object Client, int BlockType, int BlockNum, void *pUsrData, int *Size); int S7API Cli_AsDownload(S7Object Client, int BlockNum, void *pUsrData, int Size); int S7API Cli_AsCopyRamToRom(S7Object Client, int Timeout); int S7API Cli_AsCompress(S7Object Client, int Timeout); int S7API Cli_AsDBGet(S7Object Client, int DBNumber, void *pUsrData, int *Size); int S7API Cli_AsDBFill(S7Object Client, int DBNumber, int FillChar); int S7API Cli_CheckAsCompletion(S7Object Client, int *opResult); int S7API Cli_WaitAsCompletion(S7Object Client, int Timeout); //****************************************************************************** // SERVER //****************************************************************************** const int OperationRead = 0; const int OperationWrite = 1; const int mkEvent = 0; const int mkLog = 1; // Server Area ID (use with Register/unregister - Lock/unlock Area) const int srvAreaPE = 0; const int srvAreaPA = 1; const int srvAreaMK = 2; const int srvAreaCT = 3; const int srvAreaTM = 4; const int srvAreaDB = 5; // Errors const longword errSrvCannotStart = 0x00100000; // Server cannot start const longword errSrvDBNullPointer = 0x00200000; // Passed null as PData const longword errSrvAreaAlreadyExists = 0x00300000; // Area Re-registration const longword errSrvUnknownArea = 0x00400000; // Unknown area const longword errSrvInvalidParams = 0x00500000; // Invalid param(s) supplied const longword errSrvTooManyDB = 0x00600000; // Cannot register DB const longword errSrvInvalidParamNumber = 0x00700000; // Invalid param (srv_get/set_param) const longword errSrvCannotChangeParam = 0x00800000; // Cannot change because running // TCP Server Event codes const longword evcServerStarted = 0x00000001; const longword evcServerStopped = 0x00000002; const longword evcListenerCannotStart = 0x00000004; const longword evcClientAdded = 0x00000008; const longword evcClientRejected = 0x00000010; const longword evcClientNoRoom = 0x00000020; const longword evcClientException = 0x00000040; const longword evcClientDisconnected = 0x00000080; const longword evcClientTerminated = 0x00000100; const longword evcClientsDropped = 0x00000200; const longword evcReserved_00000400 = 0x00000400; // actually unused const longword evcReserved_00000800 = 0x00000800; // actually unused const longword evcReserved_00001000 = 0x00001000; // actually unused const longword evcReserved_00002000 = 0x00002000; // actually unused const longword evcReserved_00004000 = 0x00004000; // actually unused const longword evcReserved_00008000 = 0x00008000; // actually unused // S7 Server Event Code const longword evcPDUincoming = 0x00010000; const longword evcDataRead = 0x00020000; const longword evcDataWrite = 0x00040000; const longword evcNegotiatePDU = 0x00080000; const longword evcReadSZL = 0x00100000; const longword evcClock = 0x00200000; const longword evcUpload = 0x00400000; const longword evcDownload = 0x00800000; const longword evcDirectory = 0x01000000; const longword evcSecurity = 0x02000000; const longword evcControl = 0x04000000; const longword evcReserved_08000000 = 0x08000000; // actually unused const longword evcReserved_10000000 = 0x10000000; // actually unused const longword evcReserved_20000000 = 0x20000000; // actually unused const longword evcReserved_40000000 = 0x40000000; // actually unused const longword evcReserved_80000000 = 0x80000000; // actually unused // Masks to enable/disable all events const longword evcAll = 0xFFFFFFFF; const longword evcNone = 0x00000000; // Event SubCodes const word evsUnknown = 0x0000; const word evsStartUpload = 0x0001; const word evsStartDownload = 0x0001; const word evsGetBlockList = 0x0001; const word evsStartListBoT = 0x0002; const word evsListBoT = 0x0003; const word evsGetBlockInfo = 0x0004; const word evsGetClock = 0x0001; const word evsSetClock = 0x0002; const word evsSetPassword = 0x0001; const word evsClrPassword = 0x0002; // Event Params : functions group const word grProgrammer = 0x0041; const word grCyclicData = 0x0042; const word grBlocksInfo = 0x0043; const word grSZL = 0x0044; const word grPassword = 0x0045; const word grBSend = 0x0046; const word grClock = 0x0047; const word grSecurity = 0x0045; // Event Params : control codes const word CodeControlUnknown = 0x0000; const word CodeControlColdStart = 0x0001; const word CodeControlWarmStart = 0x0002; const word CodeControlStop = 0x0003; const word CodeControlCompress = 0x0004; const word CodeControlCpyRamRom = 0x0005; const word CodeControlInsDel = 0x0006; // Event Result const word evrNoError = 0x0000; const word evrFragmentRejected = 0x0001; const word evrMalformedPDU = 0x0002; const word evrSparseBytes = 0x0003; const word evrCannotHandlePDU = 0x0004; const word evrNotImplemented = 0x0005; const word evrErrException = 0x0006; const word evrErrAreaNotFound = 0x0007; const word evrErrOutOfRange = 0x0008; const word evrErrOverPDU = 0x0009; const word evrErrTransportSize = 0x000A; const word evrInvalidGroupUData = 0x000B; const word evrInvalidSZL = 0x000C; const word evrDataSizeMismatch = 0x000D; const word evrCannotUpload = 0x000E; const word evrCannotDownload = 0x000F; const word evrUploadInvalidID = 0x0010; const word evrResNotFound = 0x0011; typedef struct{ time_t EvtTime; // Timestamp int EvtSender; // Sender longword EvtCode; // Event code word EvtRetCode; // Event result word EvtParam1; // Param 1 (if available) word EvtParam2; // Param 2 (if available) word EvtParam3; // Param 3 (if available) word EvtParam4; // Param 4 (if available) }TSrvEvent, *PSrvEvent; // Server Events callback typedef void (S7API *pfn_SrvCallBack)(void *usrPtr, PSrvEvent PEvent, int Size); // Server Read/Write callback typedef int(S7API *pfn_RWAreaCallBack)(void *usrPtr, int Sender, int Operation, PS7Tag PTag, void *pUsrData); S7Object S7API Srv_Create(); void S7API Srv_Destroy(S7Object *Server); int S7API Srv_GetParam(S7Object Server, int ParamNumber, void *pValue); int S7API Srv_SetParam(S7Object Server, int ParamNumber, void *pValue); int S7API Srv_StartTo(S7Object Server, const char *Address); int S7API Srv_Start(S7Object Server); int S7API Srv_Stop(S7Object Server); int S7API Srv_RegisterArea(S7Object Server, int AreaCode, word Index, void *pUsrData, int Size); int S7API Srv_UnregisterArea(S7Object Server, int AreaCode, word Index); int S7API Srv_LockArea(S7Object Server, int AreaCode, word Index); int S7API Srv_UnlockArea(S7Object Server, int AreaCode, word Index); int S7API Srv_GetStatus(S7Object Server, int *ServerStatus, int *CpuStatus, int *ClientsCount); int S7API Srv_SetCpuStatus(S7Object Server, int CpuStatus); int S7API Srv_ClearEvents(S7Object Server); int S7API Srv_PickEvent(S7Object Server, TSrvEvent *pEvent, int *EvtReady); int S7API Srv_GetMask(S7Object Server, int MaskKind, longword *Mask); int S7API Srv_SetMask(S7Object Server, int MaskKind, longword Mask); int S7API Srv_SetEventsCallback(S7Object Server, pfn_SrvCallBack pCallback, void *usrPtr); int S7API Srv_SetReadEventsCallback(S7Object Server, pfn_SrvCallBack pCallback, void *usrPtr); int S7API Srv_SetRWAreaCallback(S7Object Server, pfn_RWAreaCallBack pCallback, void *usrPtr); int S7API Srv_EventText(TSrvEvent *Event, char *Text, int TextLen); int S7API Srv_ErrorText(int Error, char *Text, int TextLen); //****************************************************************************** // PARTNER //****************************************************************************** // Status const int par_stopped = 0; // stopped const int par_connecting = 1; // running and active connecting const int par_waiting = 2; // running and waiting for a connection const int par_linked = 3; // running and connected : linked const int par_sending = 4; // sending data const int par_receiving = 5; // receiving data const int par_binderror = 6; // error starting passive server // Errors const longword errParAddressInUse = 0x00200000; const longword errParNoRoom = 0x00300000; const longword errServerNoRoom = 0x00400000; const longword errParInvalidParams = 0x00500000; const longword errParNotLinked = 0x00600000; const longword errParBusy = 0x00700000; const longword errParFrameTimeout = 0x00800000; const longword errParInvalidPDU = 0x00900000; const longword errParSendTimeout = 0x00A00000; const longword errParRecvTimeout = 0x00B00000; const longword errParSendRefused = 0x00C00000; const longword errParNegotiatingPDU = 0x00D00000; const longword errParSendingBlock = 0x00E00000; const longword errParRecvingBlock = 0x00F00000; const longword errParBindError = 0x01000000; const longword errParDestroying = 0x01100000; const longword errParInvalidParamNumber = 0x01200000; // Invalid param (par_get/set_param) const longword errParCannotChangeParam = 0x01300000; // Cannot change because running const longword errParBufferTooSmall = 0x01400000; // Raised by LabVIEW wrapper // Brecv Data incoming Callback typedef void (S7API *pfn_ParRecvCallBack)(void * usrPtr, int opResult, longword R_ID, void *pData, int Size); // BSend Completion Callback typedef void (S7API *pfn_ParSendCompletion)(void * usrPtr, int opResult); S7Object S7API Par_Create(int Active); void S7API Par_Destroy(S7Object *Partner); int S7API Par_GetParam(S7Object Partner, int ParamNumber, void *pValue); int S7API Par_SetParam(S7Object Partner, int ParamNumber, void *pValue); int S7API Par_StartTo(S7Object Partner, const char *LocalAddress, const char *RemoteAddress, word LocTsap, word RemTsap); int S7API Par_Start(S7Object Partner); int S7API Par_Stop(S7Object Partner); // BSend int S7API Par_BSend(S7Object Partner, longword R_ID, void *pUsrData, int Size); int S7API Par_AsBSend(S7Object Partner, longword R_ID, void *pUsrData, int Size); int S7API Par_CheckAsBSendCompletion(S7Object Partner, int *opResult); int S7API Par_WaitAsBSendCompletion(S7Object Partner, longword Timeout); int S7API Par_SetSendCallback(S7Object Partner, pfn_ParSendCompletion pCompletion, void *usrPtr); // BRecv int S7API Par_BRecv(S7Object Partner, longword *R_ID, void *pData, int *Size, longword Timeout); int S7API Par_CheckAsBRecvCompletion(S7Object Partner, int *opResult, longword *R_ID, void *pData, int *Size); int S7API Par_SetRecvCallback(S7Object Partner, pfn_ParRecvCallBack pCompletion, void *usrPtr); // Stat int S7API Par_GetTimes(S7Object Partner, longword *SendTime, longword *RecvTime); int S7API Par_GetStats(S7Object Partner, longword *BytesSent, longword *BytesRecv, longword *SendErrors, longword *RecvErrors); int S7API Par_GetLastError(S7Object Partner, int *LastError); int S7API Par_GetStatus(S7Object Partner, int *Status); int S7API Par_ErrorText(int Error, char *Text, int TextLen); #pragma pack() #ifdef __cplusplus } #endif // __cplusplus #ifdef __cplusplus //****************************************************************************** // CLIENT CLASS DEFINITION //****************************************************************************** class TS7Client { private: S7Object Client; public: TS7Client(); ~TS7Client(); // Control functions int Connect(); int ConnectTo(const char *RemAddress, int Rack, int Slot); int SetConnectionParams(const char *RemAddress, word LocalTSAP, word RemoteTSAP); int SetConnectionType(word ConnectionType); int Disconnect(); int GetParam(int ParamNumber, void *pValue); int SetParam(int ParamNumber, void *pValue); // Data I/O Main functions int ReadArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData); int WriteArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData); int ReadMultiVars(PS7DataItem Item, int ItemsCount); int WriteMultiVars(PS7DataItem Item, int ItemsCount); // Data I/O Lean functions int DBRead(int DBNumber, int Start, int Size, void *pUsrData); int DBWrite(int DBNumber, int Start, int Size, void *pUsrData); int MBRead(int Start, int Size, void *pUsrData); int MBWrite(int Start, int Size, void *pUsrData); int EBRead(int Start, int Size, void *pUsrData); int EBWrite(int Start, int Size, void *pUsrData); int ABRead(int Start, int Size, void *pUsrData); int ABWrite(int Start, int Size, void *pUsrData); int TMRead(int Start, int Amount, void *pUsrData); int TMWrite(int Start, int Amount, void *pUsrData); int CTRead(int Start, int Amount, void *pUsrData); int CTWrite(int Start, int Amount, void *pUsrData); // Directory functions int ListBlocks(PS7BlocksList pUsrData); int GetAgBlockInfo(int BlockType, int BlockNum, PS7BlockInfo pUsrData); int GetPgBlockInfo(void *pBlock, PS7BlockInfo pUsrData, int Size); int ListBlocksOfType(int BlockType, TS7BlocksOfType *pUsrData, int *ItemsCount); // Blocks functions int Upload(int BlockType, int BlockNum, void *pUsrData, int *Size); int FullUpload(int BlockType, int BlockNum, void *pUsrData, int *Size); int Download(int BlockNum, void *pUsrData, int Size); int Delete(int BlockType, int BlockNum); int DBGet(int DBNumber, void *pUsrData, int *Size); int DBFill(int DBNumber, int FillChar); // Date/Time functions int GetPlcDateTime(tm *DateTime); int SetPlcDateTime(tm *DateTime); int SetPlcSystemDateTime(); // System Info functions int GetOrderCode(PS7OrderCode pUsrData); int GetCpuInfo(PS7CpuInfo pUsrData); int GetCpInfo(PS7CpInfo pUsrData); int ReadSZL(int ID, int Index, PS7SZL pUsrData, int *Size); int ReadSZLList(PS7SZLList pUsrData, int *ItemsCount); // Control functions int PlcHotStart(); int PlcColdStart(); int PlcStop(); int CopyRamToRom(int Timeout); int Compress(int Timeout); // Security functions int GetProtection(PS7Protection pUsrData); int SetSessionPassword(char *Password); int ClearSessionPassword(); // Properties int ExecTime(); int LastError(); int PDURequested(); int PDULength(); int PlcStatus(); bool Connected(); // Async functions int SetAsCallback(pfn_CliCompletion pCompletion, void *usrPtr); bool CheckAsCompletion(int *opResult); int WaitAsCompletion(longword Timeout); int AsReadArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData); int AsWriteArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData); int AsListBlocksOfType(int BlockType, PS7BlocksOfType pUsrData, int *ItemsCount); int AsReadSZL(int ID, int Index, PS7SZL pUsrData, int *Size); int AsReadSZLList(PS7SZLList pUsrData, int *ItemsCount); int AsUpload(int BlockType, int BlockNum, void *pUsrData, int *Size); int AsFullUpload(int BlockType, int BlockNum, void *pUsrData, int *Size); int AsDownload(int BlockNum, void *pUsrData, int Size); int AsCopyRamToRom(int Timeout); int AsCompress(int Timeout); int AsDBRead(int DBNumber, int Start, int Size, void *pUsrData); int AsDBWrite(int DBNumber, int Start, int Size, void *pUsrData); int AsMBRead(int Start, int Size, void *pUsrData); int AsMBWrite(int Start, int Size, void *pUsrData); int AsEBRead(int Start, int Size, void *pUsrData); int AsEBWrite(int Start, int Size, void *pUsrData); int AsABRead(int Start, int Size, void *pUsrData); int AsABWrite(int Start, int Size, void *pUsrData); int AsTMRead(int Start, int Amount, void *pUsrData); int AsTMWrite(int Start, int Amount, void *pUsrData); int AsCTRead(int Start, int Amount, void *pUsrData); int AsCTWrite(int Start, int Amount, void *pUsrData); int AsDBGet(int DBNumber, void *pUsrData, int *Size); int AsDBFill(int DBNumber, int FillChar); }; typedef TS7Client *PS7Client; //****************************************************************************** // SERVER CLASS DEFINITION //****************************************************************************** class TS7Server { private: S7Object Server; public: TS7Server(); ~TS7Server(); // Control int Start(); int StartTo(const char *Address); int Stop(); int GetParam(int ParamNumber, void *pValue); int SetParam(int ParamNumber, void *pValue); // Events int SetEventsCallback(pfn_SrvCallBack PCallBack, void *UsrPtr); int SetReadEventsCallback(pfn_SrvCallBack PCallBack, void *UsrPtr); int SetRWAreaCallback(pfn_RWAreaCallBack PCallBack, void *UsrPtr); bool PickEvent(TSrvEvent *pEvent); void ClearEvents(); longword GetEventsMask(); longword GetLogMask(); void SetEventsMask(longword Mask); void SetLogMask(longword Mask); // Resources int RegisterArea(int AreaCode, word Index, void *pUsrData, word Size); int UnregisterArea(int AreaCode, word Index); int LockArea(int AreaCode, word Index); int UnlockArea(int AreaCode, word Index); // Properties int ServerStatus(); int GetCpuStatus(); int SetCpuStatus(int Status); int ClientsCount(); }; typedef TS7Server *PS7Server; //****************************************************************************** // PARTNER CLASS DEFINITION //****************************************************************************** class TS7Partner { private: S7Object Partner; // Partner Handle public: TS7Partner(bool Active); ~TS7Partner(); // Control int GetParam(int ParamNumber, void *pValue); int SetParam(int ParamNumber, void *pValue); int Start(); int StartTo(const char *LocalAddress, const char *RemoteAddress, int LocalTSAP, int RemoteTSAP); int Stop(); // Data I/O functions : BSend int BSend(longword R_ID, void *pUsrData, int Size); int AsBSend(longword R_ID, void *pUsrData, int Size); bool CheckAsBSendCompletion(int *opResult); int WaitAsBSendCompletion(longword Timeout); int SetSendCallback(pfn_ParSendCompletion pCompletion, void *usrPtr); // Data I/O functions : BRecv int BRecv(longword *R_ID, void *pUsrData, int *Size, longword Timeout); bool CheckAsBRecvCompletion(int *opResult, longword *R_ID, void *pUsrData, int *Size); int SetRecvCallback(pfn_ParRecvCallBack pCallback, void *usrPtr); // Properties int Status(); int LastError(); int GetTimes(longword *SendTime, longword *RecvTime); int GetStats(longword *BytesSent, longword *BytesRecv, longword *ErrSend, longword *ErrRecv); bool Linked(); }; typedef TS7Partner *PS7Partner; //****************************************************************************** // TEXT ROUTINES // Only for C++, for pure C use xxx_ErrorText() which uses *char //****************************************************************************** #define TextLen 1024 // String type // Here we define generic TextString (by default mapped onto std::string). // So you can change it if needed (Unicodestring, Ansistring etc...) typedef std::string TextString; TextString CliErrorText(int Error); TextString SrvErrorText(int Error); TextString ParErrorText(int Error); TextString SrvEventText(TSrvEvent *Event); #endif // __cplusplus #endif // snap7_h