EtherNet/IP™ Adapter  2.01.00
appClass71.c

EtherNet/IP™ Adapter Example, create and handle user defined class 0x71.

Author
KUNBUS GmbH
Date
2021-06-09
#include <stdio.h>
#include <string.h>
#include <api/EI_API.h>
#include <api/EI_API_def.h>
typedef struct
{
uint16_t revision;
uint16_t maxInstance;
uint16_t noInstance;
typedef struct
{
bool run_state;
uint32_t counter;
uint16_t increment;
char counter_text[32];
// Global variables and pointers used in this example.
static EI_API_CIP_NODE_T* pEI_API_CIP_NODE_g = NULL;
EI_APP_CLASS71_ClassData appClass71Data_g = {1, 1, 1};
EI_APP_CLASS71_InstanceData appClass71InstanceData_g = {true, 0, 1, "unitialized"};
const uint16_t classId_g = 0x71;
const uint16_t instanceId1_g = 1;
static uint32_t EI_APP_CLASS71_addClassAttribute(uint16_t attrId, void* pvValue)
{
uint32_t errcode;
OSAL_MEMORY_memset(&attr, 0, sizeof(attr));
attr.id = attrId;
attr.pvValue = &pvValue;
errcode = EI_API_CIP_addClassAttr(pEI_API_CIP_NODE_g, classId_g, &attr);
if(errcode != EI_API_CIP_eERR_OK)
return errcode;
errcode = EI_API_CIP_setClassAttr(pEI_API_CIP_NODE_g, classId_g, &attr);
if (errcode != EI_API_CIP_eERR_OK)
return errcode;
}
static uint32_t EI_APP_CLASS71_addInstance1Attribute(
uint16_t attrId,
uint16_t len, void* pvValue)
{
uint32_t errcode;
OSAL_MEMORY_memset(&attr, 0, sizeof(attr));
attr.id = attrId;
attr.edt = edt;
attr.edtSize = len;
attr.accessRule = accessRule;
attr.get_callback = getCb;
attr.set_callback = setCb;
attr.pvValue = pvValue;
// add attribute
errcode = EI_API_CIP_addInstanceAttr(pEI_API_CIP_NODE_g, classId_g, instanceId1_g, &attr);
if (errcode != EI_API_CIP_eERR_OK)
{
return errcode;
}
// set initial value
errcode = EI_API_CIP_setInstanceAttr(pEI_API_CIP_NODE_g, classId_g, instanceId1_g, &attr);
if (errcode != EI_API_CIP_eERR_OK)
{
return errcode;
}
// set callback function
if (attr.get_callback != NULL || attr.set_callback != NULL)
{
errcode = EI_API_CIP_setInstanceAttrFunc(pEI_API_CIP_NODE_g, classId_g, instanceId1_g, &attr);
if (errcode != EI_API_CIP_eERR_OK)
{
return errcode;
}
}
}
uint32_t EI_APP_CLASS71_SetRunStateCb(EI_API_CIP_NODE_T* cipNode, uint16_t classId, uint16_t instanceId, uint16_t attrId, uint16_t len, void* pvValue)
{
if (len == sizeof(bool))
{
if (*(uint8_t*)pvValue <= 1)
{
appClass71InstanceData_g.run_state = *(bool*)pvValue;
}
else
{
}
}
else
{
}
}
uint32_t EI_APP_CLASS71_GetRunStateCb(EI_API_CIP_NODE_T* cipNode, uint16_t classId, uint16_t instanceId, uint16_t attrId, uint16_t* len, void* pvValue)
{
*len = sizeof(bool);
*(bool*)pvValue = appClass71InstanceData_g.run_state;
}
uint32_t EI_APP_CLASS71_SetCounterCb(EI_API_CIP_NODE_T* cipNode, uint16_t classId, uint16_t instanceId, uint16_t attrId, uint16_t len, void* pvValue)
{
if (len == sizeof(uint32_t))
{
if (*(uint16_t*)pvValue == 0)
{
appClass71InstanceData_g.counter = 0;
}
else
{
}
}
else
{
}
}
uint32_t EI_APP_CLASS71_GetCounterCb(EI_API_CIP_NODE_T* cipNode, uint16_t classId, uint16_t instanceId, uint16_t attrId, uint16_t* len, void* pvValue)
{
*len = sizeof(uint32_t);
*(uint32_t*)pvValue = appClass71InstanceData_g.counter;
}
uint32_t EI_APP_CLASS71_SetIncrementCb(EI_API_CIP_NODE_T* cipNode, uint16_t classId, uint16_t instanceId, uint16_t attrId, uint16_t len, void* pvValue)
{
if (len == sizeof(uint16_t))
{
if (*(uint16_t*)pvValue <= 1000)
{
appClass71InstanceData_g.increment = *(uint16_t*)pvValue;
}
else
{
}
}
else
{
}
}
uint32_t EI_APP_CLASS71_GetIncrementCb(EI_API_CIP_NODE_T* cipNode, uint16_t classId, uint16_t instanceId, uint16_t attrId, uint16_t* len, void* pvValue)
{
*len = sizeof(uint16_t);
*(uint16_t*)pvValue = appClass71InstanceData_g.increment;
}
uint32_t EI_APP_CLASS71_GetCounterTextCb(EI_API_CIP_NODE_T* cipNode, uint16_t classId, uint16_t instanceId, uint16_t attrId, uint16_t* len, void* pvValue)
{
*len = strlen(appClass71InstanceData_g.counter_text);
strcpy((char*)pvValue, appClass71InstanceData_g.counter_text);
}
void EI_APP_CLASS71_init(EI_API_CIP_NODE_T* pEI_API_CIP_NODE_p)
{
uint32_t errCode;
pEI_API_CIP_NODE_g = pEI_API_CIP_NODE_p;
errCode = EI_API_CIP_createClass(pEI_API_CIP_NODE_g, classId_g);
// set class instance
OSAL_MEMORY_memset(&service, 0, sizeof(service));
errCode = EI_API_CIP_addClassService(pEI_API_CIP_NODE_g, classId_g, &service);
errCode = EI_APP_CLASS71_addClassAttribute(1, &appClass71Data_g.revision);
errCode = EI_APP_CLASS71_addClassAttribute(2, &appClass71Data_g.maxInstance);
errCode = EI_APP_CLASS71_addClassAttribute(3, &appClass71Data_g.noInstance);
// Create instance 1
errCode = EI_API_CIP_createInstance(pEI_API_CIP_NODE_g, classId_g, instanceId1_g);
// Add get and set service for instance 1
errCode = EI_API_CIP_addInstanceService(pEI_API_CIP_NODE_g, classId_g, instanceId1_g, &service);
errCode = EI_API_CIP_addInstanceService(pEI_API_CIP_NODE_g, classId_g, instanceId1_g, &service);
// Add attributes for instance 1
errCode = EI_APP_CLASS71_addInstance1Attribute(
NULL, EI_APP_CLASS71_SetRunStateCb,
sizeof(appClass71InstanceData_g.run_state), &appClass71InstanceData_g.run_state);
errCode = EI_APP_CLASS71_addInstance1Attribute(
EI_APP_CLASS71_GetCounterCb, EI_APP_CLASS71_SetCounterCb,
sizeof(appClass71InstanceData_g.counter), &appClass71InstanceData_g.counter);
errCode = EI_APP_CLASS71_addInstance1Attribute(
EI_APP_CLASS71_GetIncrementCb, EI_APP_CLASS71_SetIncrementCb,
sizeof(appClass71InstanceData_g.increment), &appClass71InstanceData_g.increment);
errCode = EI_APP_CLASS71_addInstance1Attribute(
EI_APP_CLASS71_GetCounterTextCb, NULL,
sizeof(appClass71InstanceData_g.counter_text), &appClass71InstanceData_g.counter_text);
}
void EI_APP_CLASS71_run(void)
{
if (appClass71InstanceData_g.run_state)
{
appClass71InstanceData_g.counter += appClass71InstanceData_g.increment;
//sprintf(appClass71InstanceData_g.counter_text, "counter is at %d (hex %08x)", appClass71InstanceData_g.counter, appClass71InstanceData_g.counter);
}
}
uint32_t(* EI_API_CIP_CBSetAttr)(EI_API_CIP_NODE_T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, uint16_t attrId_p, uint16_t len_p, void *pvValue_p)
Function prototype for CIP set attribute callback function.
Definition: EI_API_def.h:316
uint32_t(* EI_API_CIP_CBGetAttr)(EI_API_CIP_NODE_T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, uint16_t attrId_p, uint16_t *len_p, void *pvValue_p)
Function prototype for CIP get attribute callback function.
Definition: EI_API_def.h:311
ETHIP_API uint32_t EI_API_CIP_addClassAttr(T *pCipNode_p, uint16_t classId_p, EI_API_CIP_SAttr_t *pAttr_p)
Add an attribute to a class.
Definition: EI_API_CIP_main.c:581
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_main.c:433
ETHIP_API uint32_t EI_API_CIP_setClassAttr(T *pCipNode_p, uint16_t classId_p, EI_API_CIP_SAttr_t *pAttr_p)
Set class attribute value.
Definition: EI_API_CIP_main.c:832
ETHIP_API uint32_t EI_API_CIP_createClass(T *pCipNode_p, uint16_t classId_p)
Create a CIP class.
Definition: EI_API_CIP_main.c:359
enum EI_API_CIP_EEdt EI_API_CIP_EEdt_t
Elementary Data Type Reporting.
@ EI_API_CIP_eSC_GETATTRSINGLE
Definition: EI_API_def.h:116
@ EI_API_CIP_eSC_SETATTRSINGLE
Definition: EI_API_def.h:117
@ EI_API_CIP_eAR_GET_AND_SET
Definition: EI_API_def.h:131
@ EI_API_CIP_eAR_GET
Attribute is gettable.
Definition: EI_API_def.h:130
@ EI_API_CIP_eEDT_SHORTSTRING
Definition: EI_API_CIP.h:147
@ EI_API_CIP_eEDT_BOOL
Definition: EI_API_CIP.h:122
@ EI_API_CIP_eEDT_UDINT
Definition: EI_API_CIP.h:129
@ EI_API_CIP_eEDT_UINT
Definition: EI_API_CIP.h:128
enum EI_API_CIP_EAr EI_API_CIP_EAr_t
These are the available attribute access rules.
@ EI_API_eERR_CB_TOO_MUCH_DATA
Definition: EI_API_def.h:148
@ EI_API_eERR_CB_NOT_ENOUGH_DATA
Definition: EI_API_def.h:147
@ EI_API_eERR_CB_NO_ERROR
Definition: EI_API_def.h:143
@ EI_API_eERR_CB_VAL_TOO_HIGH
Definition: EI_API_def.h:144
@ EI_API_eERR_CB_INVALID_VALUE
Definition: EI_API_def.h:146
@ EI_API_CIP_eERR_OK
Definition: EI_API_CIP.h:52
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_main.c:1075
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_main.c:904
ETHIP_API uint32_t EI_API_CIP_setInstanceAttrFunc(T *pCipNode_p, uint16_t classId_p, uint16_t instanceId_p, EI_API_CIP_SAttr_t *pAttr_p)
Register a callback function to a specific CIP attribute.
Definition: EI_API_CIP_main.c:1812
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_main.c:1455
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_main.c:2234
EI_API_CIP_CBSetAttr set_callback
Definition: EI_API_CIP.h:202
EI_API_CIP_EEdt_t edt
Definition: EI_API_CIP.h:194
EI_API_CIP_EAr_t accessRule
Definition: EI_API_CIP.h:196
uint16_t id
Definition: EI_API_CIP.h:193
EI_API_CIP_CBGetAttr get_callback
Definition: EI_API_CIP.h:201
uint16_t edtSize
Definition: EI_API_CIP.h:197
void * pvValue
Definition: EI_API_CIP.h:200
General attribute parameter collection.
Definition: EI_API_CIP.h:192
EI_API_CIP_ESc_t code
Definition: EI_API_CIP.h:181
General service parameter collection.
Definition: EI_API_CIP.h:180
uint16_t revision
Definition: appClass71.c:48
uint16_t maxInstance
Definition: appClass71.c:49
uint16_t noInstance
Definition: appClass71.c:50
Definition: appClass71.c:47
uint32_t counter
Definition: appClass71.c:56
char counter_text[32]
Definition: appClass71.c:58
uint16_t increment
Definition: appClass71.c:57
bool run_state
Definition: appClass71.c:55
Definition: appClass71.c:54