EtherNet/IP™ Adapter3.09.00
 
Loading...
Searching...
No Matches

◆ EI_API_CIP_addAssemblyMemberCustomMapped()

uint32_t EI_API_CIP_addAssemblyMemberCustomMapped ( T *  pCipNode_p,
uint16_t  assemblyInstanceId_p,
EI_API_CIP_SAssemCustomMap_t pCustomAssembMap 
)

Add a member to an assembly member list with customized mapping.

This function adds the given attribute to the given assembly instance. It also gives the user the possibility to implemented Set and Get functions for customized mapping between the Attribute and its Assembly representation.

Parameters
[in]pCipNode_pPointer to the CIP node.
[in]assemblyInstanceId_pAssembly instance identifier.
[in]pCustomAssembMapPointer to the mapping descriptor
Returns
EI_API_CIP_EError_t as uint32_t value.
Return values
EI_API_CIP_eERR_OKSuccess.
EI_API_CIP_eERR_NODE_INVALIDCIP node is invalid, possibly EI_API_CIP_NODE_new() was not called.
EI_API_CIP_eERR_INSTANCE_DOES_NOT_EXISTInstance does not exist in CIP node dictionary.
EI_API_CIP_eERR_ATTRIBUTE_DOES_NOT_EXISTAttribute does not exist in class or instance.
EI_API_CIP_eERR_ASSEMBLY_DOES_NOT_EXISTThe assembly with the given ID could not be found.
EI_API_CIP_eERR_ASSEMBLY_INVALID_ACCESSMODEAttempted to add a read only attribute to a writable assembly.
EI_API_CIP_eERR_ASSEMBLY_MAXLENGTH_EXCEEDEDThe total length of assemblies data exceeds the maximum connection size.
EI_API_CIP_eERR_MEMALLOCMemory allocation error.
EI_API_CIP_eERR_GENERALGeneral CIP error.
Example
#include "EI_API.h"
// in this example we create 2 instaces of a class (ClassID=0x70) and for each instance we create instanceAttribute (ID=0x01)
// Then we create an Assembly instance (InstanceID=0x71) and add 2 member to it.
// These members will use customized mapping function.
// The mapping between the Assembly representation and the Attributes is as follows:
// | 0xFF <------------------> Set Bit 6 |
// Attribute0x01-Class0x70-Instance0x01 --| |-- Assembly representation byte
// | 0x00 <------------------> Clear Bit 6 |
// | 0xFF <------------------> Set Bit 7 |
// Attribute0x01-Class0x70-Instance0x02 --| |-- Assembly representation byte
// | 0x00 <------------------> Clear Bit 7 |
static EI_API_CIP_EAssemb_Return_Code_t cbGetCustomMap( const EI_API_CIP_SAssemMapData_t *pAttrMapData, EI_API_CIP_STransferBuffer_t *pProduceBuffer)
{
EI_API_CIP_EAssemb_Return_Code_t retValue = ASSEMB_SERVICE_NO_RESPONSE;
static const uint8_t mapArray[] = {(1<<6) , (1<<7)};
uint8_t u8var;
if((0x70 == pAttrMapData->classId) && (0x01 == pAttrMapData->attributeId))
{
if((1 == pAttrMapData->instanceId) || (2 == pAttrMapData->instanceId))
{
// bit position 6 will represent the status of Attribute0x01-Class0x70-Instance0x01
// bit position 7 will represent the status of Attribute0x01-Class0x70-Instance0x02
u8var = mapArray[pAttrMapData->instanceId - 1];
// Map from Byte representation to Bit in Assembly representation
if(0xFF == pAttrMapData->pAttribBuf[0])
{
pProduceBuffer->p8uDataBuf[0] |= u8var; //set the corresponding bit
}
else
{
pProduceBuffer->p8uDataBuf[0] &= ~u8var; //clear the corresponding bit
}
pProduceBuffer->u16uActData = 1;
retValue = ASSEMB_SERVICE_RESPONSE_OK;
}
}
return retValue;
}
static EI_API_CIP_EAssemb_Return_Code_t cbSetCustomMap( EI_API_CIP_SAssemMapData_t *pAttrMapData, const EI_API_CIP_STransferBuffer_t *pConsumeBuffer)
{
EI_API_CIP_EAssemb_Return_Code_t retValue = ASSEMB_SERVICE_NO_RESPONSE;
static const uint8_t maskArray[] = {(1<<6) , (1<<7)};
if((0x70 == pAttrMapData->classId) && (0x01 == pAttrMapData->attributeId))
{
if((1 == pAttrMapData->instanceId) || (2 == pAttrMapData->instanceId))
{
// bit position 6 will represent the status of Attribute0x01-Class0x70-Instance0x01
// bit position 7 will represent the status of Attribute0x01-Class0x70-Instance0x02
// Map From Bit representation to byte representation
if(pConsumeBuffer->p8uDataBuf[pConsumeBuffer->u16uActData] & maskArray[pAttrMapData->instanceId - 1])
{
pAttrMapData->pAttribBuf[0] = 0xFF;
}
else
{
pAttrMapData->pAttribBuf[0] = 0x00;
}
retValue = ASSEMB_SERVICE_RESPONSE_OK;
}
}
return retValue;
}
...
EI_API_ADP_T* pEI_API_ADP = NULL;
EI_API_CIP_NODE_T* pEI_API_CIP_NODE = NULL;
uint32_t errCode;
uint8_t numInterfaces = 1;
uint8_t defualtValue = 0;
uint16_t classId;
uint16_t instanceId;
uint16_t attrId;
uint16_t assemblyInstanceId;
// Create a new adapter first
pEI_API_ADP = EI_API_ADP_new(numInterfaces);
// Create a CIP node next
initParams.maxInstanceNum = 256;
pEI_API_CIP_NODE = EI_API_CIP_NODE_new(&initParams);
...
// Create class for holding data attributes
classId = 0x70;
errCode = EI_API_CIP_createClass(pEI_API_CIP_NODE, classId);
// Define services on defined class
service.getAttrAllResponseCnt = 0;
service.callback = NULL;
errCode = EI_API_CIP_addClassService(pEI_API_CIP_NODE, classId, &service);
errCode = EI_API_CIP_addClassService(pEI_API_CIP_NODE, classId, &service);
// Create instance with ID = 1, under defined class
instanceId = 0x01;
errCode = EI_API_CIP_createInstance(pEI_API_CIP_NODE, classId, instanceId);
// Crearte another instance of the same class
errCode = EI_API_CIP_createInstance(pEI_API_CIP_NODE, classId, instanceId + 1);
// Add instance services to created instances
OSAL_MEMORY_memset(&service, 0, sizeof(EI_API_CIP_SService_t));
errCode = EI_API_CIP_addInstanceService(pEI_API_CIP_NODE, classId, instanceId, &service);
errCode = EI_API_CIP_addInstanceService(pEI_API_CIP_NODE, classId, instanceId + 1, &service);
errCode = EI_API_CIP_addInstanceService(pEI_API_CIP_NODE, classId, instanceId, &service);
errCode = EI_API_CIP_addInstanceService(pEI_API_CIP_NODE, classId, instanceId + 1, &service);
// Add attribute with ID = 0x01
// of type USINT and read-write access under the created instances
attrId = 0x01;
attr.id = attrId;
attr.cdtSize = 0;
attr.pvValue = &defualtValue;
errCode = EI_API_CIP_addInstanceAttr(pEI_API_CIP_NODE, classId, instanceId, &attr);
errCode = EI_API_CIP_setInstanceAttr(pEI_API_CIP_NODE, classId, instanceId, &attr);
errCode = EI_API_CIP_addInstanceAttr(pEI_API_CIP_NODE, classId, instanceId + 1, &attr);
errCode = EI_API_CIP_setInstanceAttr(pEI_API_CIP_NODE, classId, instanceId + 1, &attr);
// Under pEI_API_CIP_NODE, create assembly instance with ID = 0x71, with read-write access
assemblyInstanceId = 0x71;
errCode = EI_API_CIP_createAssembly(pEI_API_CIP_NODE, assemblyInstanceId, EI_API_CIP_eAR_GET_AND_SET);
...
EI_API_CIP_SAssemCustomMap_t assembCustomMapCfg = {0};
// Add custom mapped assembly members
for(uint16_t i=1; i<=2; i++)
{
// both assembly members will occupy the same byte.
// So, we Set .assemblyMemberLength to 1 only for one of them
assembCustomMapCfg.assemblyMemberLength = (1==i)?(1):0;
assembCustomMapCfg.mappedClassId = classId;
assembCustomMapCfg.mappedInstanceId = i;
assembCustomMapCfg.mappedAttributeId = 1;
assembCustomMapCfg.fuCustomGet = cbGetCustomMap;
assembCustomMapCfg.fuCustomSet = cbSetCustomMap;
errCode = EI_API_CIP_addAssemblyMemberCustomMapped(pEI_API_CIP_NODE, assemblyInstanceId, &assembCustomMapCfg);
}
ETHIP_API T * EI_API_ADP_new(uint8_t numInterfaces_p)
Create a new EtherNet/IP adapter.
Definition EI_API_ADP_stub.c:231
ETHIP_API uint32_t EI_API_CIP_addAssemblyMemberCustomMapped(T *pCipNode_p, uint16_t assemblyInstanceId_p, EI_API_CIP_SAssemCustomMap_t *pCustomAssembMap)
Add a member to an assembly member list with customized mapping.
Definition EI_API_CIP_stub.c:4658
ETHIP_API uint32_t EI_API_CIP_createAssembly(T *pCipNode_p, uint16_t assemblyInstanceId_p, EI_API_CIP_EAr_t accessRule_p)
Create a new assembly instance.
Definition EI_API_CIP_stub.c:4312
ETHIP_API uint32_t EI_API_CIP_addClassService(T *pCipNode_p, uint16_t classId_p, EI_API_CIP_SService_t *pService_p)
Add service/s to the class.
Definition EI_API_CIP_stub.c:292
ETHIP_API uint32_t EI_API_CIP_createClass(T *pCipNode_p, uint16_t classId_p)
Create a CIP class.
Definition EI_API_CIP_stub.c:215
@ EI_API_CIP_eSC_GETATTRSINGLE
Definition EI_API_def.h:109
@ EI_API_CIP_eSC_SETATTRSINGLE
Definition EI_API_def.h:110
@ EI_API_CIP_eAR_GET_AND_SET
Definition EI_API_def.h:124
@ EI_API_CIP_eEDT_USINT
Definition EI_API_CIP_define.h:97
@ EI_API_CIP_eCDT_NO
Definition EI_API_CIP_define.h:133
ETHIP_API uint32_t EI_API_CIP_addInstanceService(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, EI_API_CIP_SService_t *pService_p)
Add one or more service/s to the class instance.
Definition EI_API_CIP_stub.c:887
ETHIP_API uint32_t EI_API_CIP_createInstance(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p)
Creates a CIP instance.
Definition EI_API_CIP_stub.c:787
ETHIP_API uint32_t EI_API_CIP_addInstanceAttr(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, EI_API_CIP_SAttr_t *pAttr_p)
Add an attribute to an instance.
Definition EI_API_CIP_stub.c:1170
ETHIP_API uint32_t EI_API_CIP_setInstanceAttr(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, EI_API_CIP_SAttr_t *pAttr_p)
Set instance attribute value only.
Definition EI_API_CIP_stub.c:1592
ETHIP_API T * EI_API_CIP_NODE_new(EI_API_CIP_NODE_InitParams_t *pInitParams)
Create a new CIP node.
Definition EI_API_CIP_stub.c:81
uint16_t maxInstanceNum
Definition EI_API_CIP_define.h:162
Initialization parameters to create new CIP Node.
Definition EI_API_CIP_define.h:161
uint16_t mappedInstanceId
InstanceID to be mapped.
Definition EI_API_CIP_define.h:245
EI_API_CIP_CBGetAssemblyMapped fuCustomGet
Function pointer to user implemented Get (Mapping from Attribute to Assembly representation)
Definition EI_API_CIP_define.h:247
uint16_t assemblyMemberLength
The length of the Assembly member representation in bytes.
Definition EI_API_CIP_define.h:243
uint16_t mappedAttributeId
AttributeID to be mapped.
Definition EI_API_CIP_define.h:246
EI_API_CIP_CBSetAssemblyMapped fuCustomSet
Function pointer to user implemented Set (Mapping from Assembly to Attribute representation)
Definition EI_API_CIP_define.h:248
uint16_t mappedClassId
ClassID to be mapped.
Definition EI_API_CIP_define.h:244
Custom Assembly mapping structure.
Definition EI_API_CIP_define.h:242
uint16_t classId
Definition EI_API_def.h:384
uint16_t attributeId
Definition EI_API_def.h:386
uint16_t instanceId
Definition EI_API_def.h:385
uint8_t * pAttribBuf
Definition EI_API_def.h:387
Data structure used during callback in custom-map assemblies.
Definition EI_API_def.h:383
EI_API_CIP_EEdt_t edt
Definition EI_API_CIP_define.h:186
EI_API_CIP_EAr_t accessRule
Definition EI_API_CIP_define.h:188
uint16_t id
Definition EI_API_CIP_define.h:185
EI_API_CIP_ECdt_t cdt
Definition EI_API_CIP_define.h:187
uint16_t cdtSize
Definition EI_API_CIP_define.h:190
void * pvValue
Definition EI_API_CIP_define.h:192
General attribute parameter collection.
Definition EI_API_CIP_define.h:184
EI_API_CIP_ESc_t code
Definition EI_API_CIP_define.h:173
EI_API_CIP_CBService callback
Definition EI_API_CIP_define.h:176
uint16_t getAttrAllResponseCnt
Definition EI_API_CIP_define.h:174
General service parameter collection.
Definition EI_API_CIP_define.h:172
uint8_t * p8uDataBuf
Pointer to data buffer.
Definition EI_API_def.h:394
uint16_t u16uActData
Current index in buffer / current used data.
Definition EI_API_def.h:393
Definition EI_API_def.h:391
See also
EI_API_CIP_createAssembly EI_API_CIP_getAssemblySize EI_API_CIP_getAssemblyData EI_API_CIP_setAssemblyData EI_API_CIP_SService_t EI_API_CIP_SAttr_t EI_API_CIP_EAr_t EI_API_CIP_EError_t