map/das-dn/third_party/AdsLib/Standalone/AdsDef.h
2024-12-09 09:41:04 +08:00

427 lines
19 KiB
C++

// SPDX-License-Identifier: MIT
/** @file
Copyright (c) 2015 - 2022 Beckhoff Automation GmbH & Co. KG
*/
#pragma once
#include <cstdint>
#include <string>
namespace Beckhoff
{
namespace Ads
{
#define ADS_TCP_SERVER_PORT 0xBF02
#define ADS_UDP_SERVER_PORT 0xBF03
#define ADS_TCP_SERVER_PORT_STR "48898"
#define ADS_UDP_SERVER_PORT_STR "48899"
////////////////////////////////////////////////////////////////////////////////
// AMS Ports
enum AMSPORT : uint16_t {
AMSPORT_LOGGER = 100,
AMSPORT_R0_RTIME = 200,
AMSPORT_R0_TRACE = (AMSPORT_R0_RTIME + 90),
AMSPORT_R0_IO = 300,
AMSPORT_R0_SPS = 400,
AMSPORT_R0_NC = 500,
AMSPORT_R0_ISG = 550,
AMSPORT_R0_PCS = 600,
AMSPORT_R0_PLC = 801,
AMSPORT_R0_PLC_RTS1 = 801,
AMSPORT_R0_PLC_RTS2 = 811,
AMSPORT_R0_PLC_RTS3 = 821,
AMSPORT_R0_PLC_RTS4 = 831,
AMSPORT_R0_PLC_TC3 = 851
};
////////////////////////////////////////////////////////////////////////////////
// ADS Cmd Ids
#define ADSSRVID_INVALID 0x00
#define ADSSRVID_READDEVICEINFO 0x01
#define ADSSRVID_READ 0x02
#define ADSSRVID_WRITE 0x03
#define ADSSRVID_READSTATE 0x04
#define ADSSRVID_WRITECTRL 0x05
#define ADSSRVID_ADDDEVICENOTE 0x06
#define ADSSRVID_DELDEVICENOTE 0x07
#define ADSSRVID_DEVICENOTE 0x08
#define ADSSRVID_READWRITE 0x09
////////////////////////////////////////////////////////////////////////////////
// ADS reserved index groups
#define ADSIGRP_SYMTAB 0xF000
#define ADSIGRP_SYMNAME 0xF001
#define ADSIGRP_SYMVAL 0xF002
#define ADSIGRP_SYM_HNDBYNAME 0xF003
#define ADSIGRP_SYM_VALBYNAME 0xF004
#define ADSIGRP_SYM_VALBYHND 0xF005
#define ADSIGRP_SYM_RELEASEHND 0xF006
#define ADSIGRP_SYM_INFOBYNAME 0xF007
#define ADSIGRP_SYM_VERSION 0xF008
#define ADSIGRP_SYM_INFOBYNAMEEX 0xF009
#define ADSIGRP_SYM_DOWNLOAD 0xF00A
#define ADSIGRP_SYM_UPLOAD 0xF00B
#define ADSIGRP_SYM_UPLOADINFO 0xF00C
#define ADSIGRP_SYM_DOWNLOAD2 0xF00D
#define ADSIGRP_SYM_DT_UPLOAD 0xF00E
#define ADSIGRP_SYM_UPLOADINFO2 0xF00F
#define ADSIGRP_SYMNOTE 0xF010 /**< notification of named handle */
/**
* AdsRW IOffs list size or 0 (=0 -> list size == WLength/3*sizeof(ULONG))
* @param W: {list of IGrp, IOffs, Length}
* @param R: if IOffs != 0 then {list of results} and {list of data}
* @param R: if IOffs == 0 then only data (sum result)
*/
#define ADSIGRP_SUMUP_READ 0xF080
/**
* AdsRW IOffs list size
* @param W: {list of IGrp, IOffs, Length} followed by {list of data}
* @param R: list of results
*/
#define ADSIGRP_SUMUP_WRITE 0xF081
/**
* AdsRW IOffs list size
* @param W: {list of IGrp, IOffs, RLength, WLength} followed by {list of data}
* @param R: {list of results, RLength} followed by {list of data}
*/
#define ADSIGRP_SUMUP_READWRITE 0xF082
/**
* AdsRW IOffs list size
* @param W: {list of IGrp, IOffs, Length}
*/
#define ADSIGRP_SUMUP_READEX 0xF083
/**
* AdsRW IOffs list size
* @param W: {list of IGrp, IOffs, Length}
* @param R: {list of results, Length} followed by {list of data (returned lengths)}
*/
#define ADSIGRP_SUMUP_READEX2 0xF084
/**
* AdsRW IOffs list size
* @param W: {list of IGrp, IOffs, Attrib}
* @param R: {list of results, handles}
*/
#define ADSIGRP_SUMUP_ADDDEVNOTE 0xF085
/**
* AdsRW IOffs list size
* @param W: {list of handles}
* @param R: {list of results, Length} followed by {list of data}
*/
#define ADSIGRP_SUMUP_DELDEVNOTE 0xF086
#define ADSIGRP_IOIMAGE_RWIB 0xF020 /**< read/write input byte(s) */
#define ADSIGRP_IOIMAGE_RWIX 0xF021 /**< read/write input bit */
#define ADSIGRP_IOIMAGE_RISIZE 0xF025 /**< read input size (in byte) */
#define ADSIGRP_IOIMAGE_RWOB 0xF030 /**< read/write output byte(s) */
#define ADSIGRP_IOIMAGE_RWOX 0xF031 /**< read/write output bit */
#define ADSIGRP_IOIMAGE_ROSIZE 0xF035 /**< read output size (in byte) */
#define ADSIGRP_IOIMAGE_CLEARI 0xF040 /**< write inputs to null */
#define ADSIGRP_IOIMAGE_CLEARO 0xF050 /**< write outputs to null */
#define ADSIGRP_IOIMAGE_RWIOB 0xF060 /**< read input and write output byte(s) */
#define ADSIGRP_DEVICE_DATA 0xF100 /**< state, name, etc... */
#define ADSIOFFS_DEVDATA_ADSSTATE 0x0000 /**< ads state of device */
#define ADSIOFFS_DEVDATA_DEVSTATE 0x0002 /**< device state */
////////////////////////////////////////////////////////////////////////////////
// Global Return codes
#define ERR_GLOBAL 0x0000
#define GLOBALERR_TARGET_PORT (0x06 + ERR_GLOBAL) /**< target port not found, possibly the ADS Server is not started */
#define GLOBALERR_MISSING_ROUTE (0x07 + ERR_GLOBAL) /**< target machine not found, possibly missing ADS routes */
#define GLOBALERR_NO_MEMORY (0x19 + ERR_GLOBAL) /**< No memory */
#define GLOBALERR_TCP_SEND (0x1A + ERR_GLOBAL) /**< TCP send error */
////////////////////////////////////////////////////////////////////////////////
// Router Return codes
#define ERR_ROUTER 0x0500
#define ROUTERERR_PORTALREADYINUSE (0x06 + ERR_ROUTER) /**< The desired port number is already assigned */
#define ROUTERERR_NOTREGISTERED (0x07 + ERR_ROUTER) /**< Port not registered */
#define ROUTERERR_NOMOREQUEUES (0x08 + ERR_ROUTER) /**< The maximum number of Ports reached */
#define ROUTERERR_INVALIDHOST (0x10 + ERR_ROUTER) /**< The host address is invalid or unkown */
#define ROUTERERR_HOSTDENY (0x11 + ERR_ROUTER) /**< The host can not be connected */
////////////////////////////////////////////////////////////////////////////////
// ADS Return codes
#define ADSERR_NOERR 0x00
#define ERR_ADSERRS 0x0700
#define ADSERR_DEVICE_ERROR (0x00 + ERR_ADSERRS) /**< Error class < device error > */
#define ADSERR_DEVICE_SRVNOTSUPP (0x01 + ERR_ADSERRS) /**< Service is not supported by server */
#define ADSERR_DEVICE_INVALIDGRP (0x02 + ERR_ADSERRS) /**< invalid indexGroup */
#define ADSERR_DEVICE_INVALIDOFFSET (0x03 + ERR_ADSERRS) /**< invalid indexOffset */
#define ADSERR_DEVICE_INVALIDACCESS (0x04 + ERR_ADSERRS) /**< reading/writing not permitted */
#define ADSERR_DEVICE_INVALIDSIZE (0x05 + ERR_ADSERRS) /**< parameter size not correct */
#define ADSERR_DEVICE_INVALIDDATA (0x06 + ERR_ADSERRS) /**< invalid parameter value(s) */
#define ADSERR_DEVICE_NOTREADY (0x07 + ERR_ADSERRS) /**< device is not in a ready state */
#define ADSERR_DEVICE_BUSY (0x08 + ERR_ADSERRS) /**< device is busy */
#define ADSERR_DEVICE_INVALIDCONTEXT (0x09 + ERR_ADSERRS) /**< invalid context (must be InWindows) */
#define ADSERR_DEVICE_NOMEMORY (0x0A + ERR_ADSERRS) /**< out of memory */
#define ADSERR_DEVICE_INVALIDPARM (0x0B + ERR_ADSERRS) /**< invalid parameter value(s) */
#define ADSERR_DEVICE_NOTFOUND (0x0C + ERR_ADSERRS) /**< not found (files, ...) */
#define ADSERR_DEVICE_SYNTAX (0x0D + ERR_ADSERRS) /**< syntax error in comand or file */
#define ADSERR_DEVICE_INCOMPATIBLE (0x0E + ERR_ADSERRS) /**< objects do not match */
#define ADSERR_DEVICE_EXISTS (0x0F + ERR_ADSERRS) /**< object already exists */
#define ADSERR_DEVICE_SYMBOLNOTFOUND (0x10 + ERR_ADSERRS) /**< symbol not found */
#define ADSERR_DEVICE_SYMBOLVERSIONINVALID (0x11 + ERR_ADSERRS) /**< symbol version invalid, possibly caused by an 'onlinechange' -> try to release handle and get a new one */
#define ADSERR_DEVICE_INVALIDSTATE (0x12 + ERR_ADSERRS) /**< server is in invalid state */
#define ADSERR_DEVICE_TRANSMODENOTSUPP (0x13 + ERR_ADSERRS) /**< AdsTransMode not supported */
#define ADSERR_DEVICE_NOTIFYHNDINVALID (0x14 + ERR_ADSERRS) /**< Notification handle is invalid, possibly caussed by an 'onlinechange' -> try to release handle and get a new one */
#define ADSERR_DEVICE_CLIENTUNKNOWN (0x15 + ERR_ADSERRS) /**< Notification client not registered */
#define ADSERR_DEVICE_NOMOREHDLS (0x16 + ERR_ADSERRS) /**< no more notification handles */
#define ADSERR_DEVICE_INVALIDWATCHSIZE (0x17 + ERR_ADSERRS) /**< size for watch to big */
#define ADSERR_DEVICE_NOTINIT (0x18 + ERR_ADSERRS) /**< device not initialized */
#define ADSERR_DEVICE_TIMEOUT (0x19 + ERR_ADSERRS) /**< device has a timeout */
#define ADSERR_DEVICE_NOINTERFACE (0x1A + ERR_ADSERRS) /**< query interface failed */
#define ADSERR_DEVICE_INVALIDINTERFACE (0x1B + ERR_ADSERRS) /**< wrong interface required */
#define ADSERR_DEVICE_INVALIDCLSID (0x1C + ERR_ADSERRS) /**< class ID is invalid */
#define ADSERR_DEVICE_INVALIDOBJID (0x1D + ERR_ADSERRS) /**< object ID is invalid */
#define ADSERR_DEVICE_PENDING (0x1E + ERR_ADSERRS) /**< request is pending */
#define ADSERR_DEVICE_ABORTED (0x1F + ERR_ADSERRS) /**< request is aborted */
#define ADSERR_DEVICE_WARNING (0x20 + ERR_ADSERRS) /**< signal warning */
#define ADSERR_DEVICE_INVALIDARRAYIDX (0x21 + ERR_ADSERRS) /**< invalid array index */
#define ADSERR_DEVICE_SYMBOLNOTACTIVE (0x22 + ERR_ADSERRS) /**< symbol not active, possibly caussed by an 'onlinechange' -> try to release handle and get a new one */
#define ADSERR_DEVICE_ACCESSDENIED (0x23 + ERR_ADSERRS) /**< access denied */
#define ADSERR_DEVICE_LICENSENOTFOUND (0x24 + ERR_ADSERRS) /**< no license found -> Activate license for TwinCAT 3 function*/
#define ADSERR_DEVICE_LICENSEEXPIRED (0x25 + ERR_ADSERRS) /**< license expired */
#define ADSERR_DEVICE_LICENSEEXCEEDED (0x26 + ERR_ADSERRS) /**< license exceeded */
#define ADSERR_DEVICE_LICENSEINVALID (0x27 + ERR_ADSERRS) /**< license invalid */
#define ADSERR_DEVICE_LICENSESYSTEMID (0x28 + ERR_ADSERRS) /**< license invalid system id */
#define ADSERR_DEVICE_LICENSENOTIMELIMIT (0x29 + ERR_ADSERRS) /**< license not time limited */
#define ADSERR_DEVICE_LICENSEFUTUREISSUE (0x2A + ERR_ADSERRS) /**< license issue time in the future */
#define ADSERR_DEVICE_LICENSETIMETOLONG (0x2B + ERR_ADSERRS) /**< license time period to long */
#define ADSERR_DEVICE_EXCEPTION (0x2C + ERR_ADSERRS) /**< exception in device specific code -> Check each device transistions */
#define ADSERR_DEVICE_LICENSEDUPLICATED (0x2D + ERR_ADSERRS) /**< license file read twice */
#define ADSERR_DEVICE_SIGNATUREINVALID (0x2E + ERR_ADSERRS) /**< invalid signature */
#define ADSERR_DEVICE_CERTIFICATEINVALID (0x2F + ERR_ADSERRS) /**< public key certificate */
#define ADSERR_CLIENT_ERROR (0x40 + ERR_ADSERRS) /**< Error class < client error > */
#define ADSERR_CLIENT_INVALIDPARM (0x41 + ERR_ADSERRS) /**< invalid parameter at service call */
#define ADSERR_CLIENT_LISTEMPTY (0x42 + ERR_ADSERRS) /**< polling list is empty */
#define ADSERR_CLIENT_VARUSED (0x43 + ERR_ADSERRS) /**< var connection already in use */
#define ADSERR_CLIENT_DUPLINVOKEID (0x44 + ERR_ADSERRS) /**< invoke id in use */
#define ADSERR_CLIENT_SYNCTIMEOUT (0x45 + ERR_ADSERRS) /**< timeout elapsed -> Check ADS routes of sender and receiver and your [firewall setting](http://infosys.beckhoff.com/content/1033/tcremoteaccess/html/tcremoteaccess_firewall.html?id=12027) */
#define ADSERR_CLIENT_W32ERROR (0x46 + ERR_ADSERRS) /**< error in win32 subsystem */
#define ADSERR_CLIENT_TIMEOUTINVALID (0x47 + ERR_ADSERRS) /**< Invalid client timeout value */
#define ADSERR_CLIENT_PORTNOTOPEN (0x48 + ERR_ADSERRS) /**< ads dll */
#define ADSERR_CLIENT_NOAMSADDR (0x49 + ERR_ADSERRS) /**< ads dll */
#define ADSERR_CLIENT_SYNCINTERNAL (0x50 + ERR_ADSERRS) /**< internal error in ads sync */
#define ADSERR_CLIENT_ADDHASH (0x51 + ERR_ADSERRS) /**< hash table overflow */
#define ADSERR_CLIENT_REMOVEHASH (0x52 + ERR_ADSERRS) /**< key not found in hash table */
#define ADSERR_CLIENT_NOMORESYM (0x53 + ERR_ADSERRS) /**< no more symbols in cache */
#define ADSERR_CLIENT_SYNCRESINVALID (0x54 + ERR_ADSERRS) /**< invalid response received */
#define ADSERR_CLIENT_SYNCPORTLOCKED (0x55 + ERR_ADSERRS) /**< sync port is locked */
#pragma pack( push, 1)
/**
* @brief The NetId of and ADS device can be represented in this structure.
*/
struct AmsNetId {
/** NetId, consisting of 6 digits. */
uint8_t b[6];
AmsNetId(uint32_t ipv4Addr = 0);
AmsNetId(const std::string& addr);
AmsNetId(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t);
operator bool() const;
};
/**
* @brief The complete address of an ADS device can be stored in this structure.
*/
struct AmsAddr {
/** AMS Net Id */
AmsNetId netId;
/** AMS Port number */
uint16_t port;
};
/**
* @brief The structure contains the version number, revision number and build number.
*/
struct AdsVersion {
/** Version number. */
uint8_t version;
/** Revision number. */
uint8_t revision;
/** Build number */
uint16_t build;
};
enum ADSTRANSMODE {
ADSTRANS_NOTRANS = 0,
ADSTRANS_CLIENTCYCLE = 1,
ADSTRANS_CLIENTONCHA = 2,
ADSTRANS_SERVERCYCLE = 3,
ADSTRANS_SERVERONCHA = 4,
ADSTRANS_SERVERCYCLE2 = 5,
ADSTRANS_SERVERONCHA2 = 6,
ADSTRANS_CLIENT1REQ = 10,
ADSTRANS_MAXMODES
};
enum ADSSTATE : uint16_t {
ADSSTATE_INVALID = 0,
ADSSTATE_IDLE = 1,
ADSSTATE_RESET = 2,
ADSSTATE_INIT = 3,
ADSSTATE_START = 4,
ADSSTATE_RUN = 5,
ADSSTATE_STOP = 6,
ADSSTATE_SAVECFG = 7,
ADSSTATE_LOADCFG = 8,
ADSSTATE_POWERFAILURE = 9,
ADSSTATE_POWERGOOD = 10,
ADSSTATE_ERROR = 11,
ADSSTATE_SHUTDOWN = 12,
ADSSTATE_SUSPEND = 13,
ADSSTATE_RESUME = 14,
ADSSTATE_CONFIG = 15,
ADSSTATE_RECONFIG = 16,
ADSSTATE_STOPPING = 17,
ADSSTATE_INCOMPATIBLE = 18,
ADSSTATE_EXCEPTION = 19,
ADSSTATE_MAXSTATES
};
/**
* @brief This structure contains all the attributes for the definition of a notification.
*
* The ADS DLL is buffered from the real time transmission by a FIFO.
* TwinCAT first writes every value that is to be transmitted by means
* of the callback function into the FIFO. If the buffer is full, or if
* the nMaxDelay time has elapsed, then the callback function is invoked
* for each entry. The nTransMode parameter affects this process as follows:
*
* @par ADSTRANS_SERVERCYCLE
* The value is written cyclically into the FIFO at intervals of
* nCycleTime. The smallest possible value for nCycleTime is the cycle
* time of the ADS server; for the PLC, this is the task cycle time.
* The cycle time can be handled in 1ms steps. If you enter a cycle time
* of 0 ms, then the value is written into the FIFO with every task cycle.
*
* @par ADSTRANS_SERVERONCHA
* A value is only written into the FIFO if it has changed. The real-time
* sampling is executed in the time given in nCycleTime. The cycle time
* can be handled in 1ms steps. If you enter 0 ms as the cycle time, the
* variable is written into the FIFO every time it changes.
*
* Warning: Too many read operations can load the system so heavily that
* the user interface becomes much slower.
*
* Tip: Set the cycle time to the most appropriate values, and always
* close connections when they are no longer required.
*/
struct AdsNotificationAttrib {
/** Length of the data that is to be passed to the callback function. */
uint32_t cbLength;
/**
* ADSTRANS_SERVERCYCLE: The notification's callback function is invoked cyclically.
* ADSTRANS_SERVERONCHA: The notification's callback function is only invoked when the value changes.
*/
uint32_t nTransMode;
/** The notification's callback function is invoked at the latest when this time has elapsed. The unit is 100 ns. */
uint32_t nMaxDelay;
union {
/** The ADS server checks whether the variable has changed after this time interval. The unit is 100 ns. */
uint32_t nCycleTime;
uint32_t dwChangeFilter;
};
};
/**
* @brief This structure is also passed to the callback function.
*/
struct AdsNotificationHeader {
/** Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC). */
uint64_t nTimeStamp;
/** Handle for the notification. Is specified when the notification is defined. */
uint32_t hNotification;
/** Number of bytes transferred. */
uint32_t cbSampleSize;
};
/**
* @brief Type definition of the callback function required by the AdsSyncAddDeviceNotificationReqEx() function.
* @param[in] pAddr Structure with NetId and port number of the ADS server.
* @param[in] pNotification pointer to a AdsNotificationHeader structure
* @param[in] hUser custom handle pass to AdsSyncAddDeviceNotificationReqEx() during registration
*/
typedef void (* PAdsNotificationFuncEx)(const AmsAddr* pAddr, const AdsNotificationHeader* pNotification, uint32_t hUser);
#define ADSSYMBOLFLAG_PERSISTENT ((uint32_t)(1 << 0))
#define ADSSYMBOLFLAG_BITVALUE ((uint32_t)(1 << 1))
#define ADSSYMBOLFLAG_REFERENCETO ((uint32_t)(1 << 2))
#define ADSSYMBOLFLAG_TYPEGUID ((uint32_t)(1 << 3))
#define ADSSYMBOLFLAG_TCCOMIFACEPTR ((uint32_t)(1 << 4))
#define ADSSYMBOLFLAG_READONLY ((uint32_t)(1 << 5))
#define ADSSYMBOLFLAG_CONTEXTMASK ((uint32_t)0xF00)
/**
* @brief This structure describes the header of ADS symbol information
*
* Calling AdsSyncReadWriteReqEx2 with IndexGroup == ADSIGRP_SYM_INFOBYNAMEEX
* will return ADS symbol information in the provided readData buffer.
* The header of that information is structured as AdsSymbolEntry and can
* be followed by zero terminated strings for "symbol name", "type name"
* and a "comment"
*/
struct AdsSymbolEntry {
uint32_t entryLength; // length of complete symbol entry
uint32_t iGroup; // indexGroup of symbol: input, output etc.
uint32_t iOffs; // indexOffset of symbol
uint32_t size; // size of symbol ( in bytes, 0 = bit )
uint32_t dataType; // adsDataType of symbol
uint32_t flags; // see ADSSYMBOLFLAG_*
uint16_t nameLength; // length of symbol name (null terminating character not counted)
uint16_t typeLength; // length of type name (null terminating character not counted)
uint16_t commentLength; // length of comment (null terminating character not counted)
};
/**
* @brief This structure is used to provide ADS symbol information for ADS SUM commands
*/
struct AdsSymbolInfoByName {
uint32_t indexGroup;
uint32_t indexOffset;
uint32_t cbLength;
};
enum nSystemServiceIndexGroups : uint32_t {
SYSTEMSERVICE_FOPEN = 120,
SYSTEMSERVICE_FCLOSE = 121,
SYSTEMSERVICE_FREAD = 122,
SYSTEMSERVICE_FWRITE = 123,
SYSTEMSERVICE_FDELETE = 131,
SYSTEMSERVICE_FFILEFIND = 133,
SYSTEMSERVICE_STARTPROCESS = 500,
SYSTEMSERVICE_SETNUMPROC = 1200
};
}
}
#pragma pack( pop )