📄 ecsample.c
字号:
/* ! */
switch( theAssemblyInstanceNo ){
/* ! */
case SY_INST_ID_CONSUMER_101 : /* user supplied code */ break;
case SY_INST_ID_PRODUCER_102 : /* user supplied code */ break;
case SY_INST_ID_CONFIG_103 : /* user supplied code */ break;
case SY_INST_ID_STATUSIN_104 : /* user supplied code */ break;
case SY_INST_ID_STATUSOUT_105: /* user supplied code */ break;
/* ! */
case SY_INST_ID_CONSUMER_111 : /* user supplied code */ break;
case SY_INST_ID_PRODUCER_112 : /* user supplied code */ break;
case SY_INST_ID_CONFIG_113 : /* user supplied code */ break;
/* ! */
case SY_INST_ID_CONSUMER_121 : /* user supplied code */ break;
case SY_INST_ID_PRODUCER_122 : /* user supplied code */ break;
case SY_INST_ID_CONFIG_123 : /* user supplied code */ break;
/* ! */
case SY_INST_ID_HEARTBEAT : /* user supplied code */ break;
}
}
/*****************************************************************************
******************************************************************************
******************************************************************************
** ! this User supplied function is called before Input date from the assembly object is prepared for transfer
******************************************************************************
*/
void EC_BeforeSyncOfSendDataCB( int theAssemblyInstanceNo ){
/*
** update the selected buffers to transfer the newest data
*/
/* ! */
switch( theAssemblyInstanceNo ){
/* ! */
case SY_INST_ID_CONSUMER_101 : /* user supplied code */ break;
case SY_INST_ID_PRODUCER_102 : /* user supplied code */ break;
case SY_INST_ID_CONFIG_103 : /* user supplied code */ break;
case SY_INST_ID_STATUSIN_104 : /* user supplied code */ break;
case SY_INST_ID_STATUSOUT_105: /* user supplied code */ break;
/* ! */
case SY_INST_ID_CONSUMER_111 : /* user supplied code */ break;
case SY_INST_ID_PRODUCER_112 : /* user supplied code */ break;
case SY_INST_ID_CONFIG_113 : /* user supplied code */ break;
/* ! */
case SY_INST_ID_CONSUMER_121 : /* user supplied code */ break;
case SY_INST_ID_PRODUCER_122 : /* user supplied code */ break;
case SY_INST_ID_CONFIG_123 : /* user supplied code */ break;
/* ! */
case SY_INST_ID_HEARTBEAT : /* user supplied code */ break;
}
}
/*****************************************************************************
******************************************************************************
******************************************************************************
** This Function will be called by the EtherNet/IP Stack to indicate that the PLC is in Run or in Programm Mode.
** The User should decide what to do in this case.
** Normally this is used to set the output data to zero when the PLC is Programm Mode.
**
******************************************************************************
*/
/*
** start edits: September,23rd 2005, H.F.
**
** redefine EC_Run_IdleCB
**
void EC_Run_IdleCB( int theRun_Idle_Flag){
if (theRun_Idle_Flag == 0)
RunIdleStat = 0;
else
RunIdleStat = 1;
}
**
*/
/*****************************************************************************
** This Function will be called by the EtherNet/IP Stack to indicate that the
** Originator is in Run or in Programm Mode.
** The User should decide what to do in this case.
** Normally this is used to set the output data to zero when the Originator is
** in Programm Mode.
**
*****************************************************************************/
void EC_Run_IdleCB( BOOL theRun_Idle_Flag, int theAssemblyInstanceNo ){
/*
** update the selected Run/Idle State
*/
/* ! */
switch( theAssemblyInstanceNo ){
/* ! */
case SY_INST_ID_CONSUMER_101 : RunIdleStat_101 = theRun_Idle_Flag; break;
case SY_INST_ID_PRODUCER_102 : RunIdleStat_102 = theRun_Idle_Flag; break;
case SY_INST_ID_CONFIG_103 : RunIdleStat_103 = theRun_Idle_Flag; break;
case SY_INST_ID_STATUSIN_104 : RunIdleStat_104 = theRun_Idle_Flag; break;
case SY_INST_ID_STATUSOUT_105: RunIdleStat_105 = theRun_Idle_Flag; break;
/* ! */
case SY_INST_ID_CONSUMER_111 : RunIdleStat_111 = theRun_Idle_Flag; break;
case SY_INST_ID_PRODUCER_112 : RunIdleStat_112 = theRun_Idle_Flag; break;
case SY_INST_ID_CONFIG_113 : RunIdleStat_113 = theRun_Idle_Flag; break;
/* ! */
case SY_INST_ID_CONSUMER_121 : RunIdleStat_121 = theRun_Idle_Flag; break;
case SY_INST_ID_PRODUCER_122 : RunIdleStat_122 = theRun_Idle_Flag; break;
case SY_INST_ID_CONFIG_123 : RunIdleStat_123 = theRun_Idle_Flag; break;
/* ! */
case SY_INST_ID_HEARTBEAT : RunIdleStat_Heartbeat = theRun_Idle_Flag; break;
default : break;
}
}
/*****************************************************************************
** This Function will be called by the EtherNet/IP Stack to indicate the
** Assembly's state (Non-Existent, Active or Inactive)
** The User should decide what to do in this case.
** Normally this is not used.
**
*****************************************************************************/
void EC_AssemblyStateCB( int state, int theAssemblyInstanceNo ){
/*
** update the selected Assembly State
** (state: 0 = Non-Existent, 1 = Inactive, 2 = Active)
*/
/* ! */
switch( theAssemblyInstanceNo ){
/* ! */
case SY_INST_ID_CONSUMER_101 : AssemblyStat_101 = state; break;
case SY_INST_ID_PRODUCER_102 : AssemblyStat_102 = state; break;
case SY_INST_ID_CONFIG_103 : AssemblyStat_103 = state; break;
case SY_INST_ID_STATUSIN_104 : AssemblyStat_104 = state; break;
case SY_INST_ID_STATUSOUT_105: AssemblyStat_105 = state; break;
/* ! */
case SY_INST_ID_CONSUMER_111 : AssemblyStat_111 = state; break;
case SY_INST_ID_PRODUCER_112 : AssemblyStat_112 = state; break;
case SY_INST_ID_CONFIG_113 : AssemblyStat_113 = state; break;
/* ! */
case SY_INST_ID_CONSUMER_121 : AssemblyStat_121 = state; break;
case SY_INST_ID_PRODUCER_122 : AssemblyStat_122 = state; break;
case SY_INST_ID_CONFIG_123 : AssemblyStat_123 = state; break;
/* ! */
case SY_INST_ID_HEARTBEAT : AssemblyStat_Heartbeat = state; break;
default : break;
}
}
/*
** end edits: September,23rd 2005, H.F.
*/
/*****************************************************************************
******************************************************************************
******************************************************************************
** This Function will be called by the EtherNet/IP Stack to inform the User of new status.
** The User should decide what to do in this case.
** Normally this is used to check if there is at least one exclusive owner I/O connection.
**
******************************************************************************
*/
void EC_Get_StatusCB( int theStatus ){
CON_FLAG = (theStatus & 0x0001);
}
/*****************************************************************************
******************************************************************************
******************************************************************************
*/
int EC_User_InitCB( void ){
/*
** the user has to initialize his application here.
**
** - set identity information
** - set timer tick period
** - retrieve the Input and Output pointers of the build in assembly object
** - create user defined assembly objects
** - create user defined classes and their instances
** - check integrity of the things he has done
**
*****************************************************************************/
#define CHECK(a) if( (a) ) { DBLN(EC_ErrorText( gECIError )); return -1; };
/* ! set Identity information */
EC_ProductCode = 200; /* 200 = 0xC8 */
EC_ProductType = 12; /* 12 = 0x0C */
EC_SerialNumber = 4711; /* 4711 = 0x1267 */
EC_VendorId = 1;
EC_MajorRev = 1;
EC_MinorRev = 2;
strcpy( EC_ProductName, "ENetIP EC" );
/* ! Build Userdefined Assembly Object Instances */
/*#define CONFORMANCE_TEST */
#ifdef CONFORMANCE_TEST
CHECK( EC_CreateUserDefinedAssembly( 1 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( 1, CONSUMER, &gAssembly_ConData_101, gAssembly_ConDataSize_101 ) );
#else
CHECK( EC_CreateUserDefinedAssembly( 12 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_CONSUMER_101, CONSUMER, &gAssembly_ConData_101, gAssembly_ConDataSize_101 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_PRODUCER_102, PRODUCER, &gAssembly_ProData_102, gAssembly_ProDataSize_102 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_CONFIG_103, CONFIG, &gAssembly_ConfigData_103, gAssembly_ConfigDataSize_103 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_STATUSIN_104, STATUSIN, &gAssembly_StatusInData_104, gAssembly_StatusInSize_104 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_STATUSOUT_105, STATUSOUT, &gAssembly_StatusOutData_105, gAssembly_StatusOutSize_105 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_CONSUMER_111, CONSUMER, &gAssembly_ConData_111, gAssembly_ConDataSize_111 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_PRODUCER_112, PRODUCER, &gAssembly_ProData_112, gAssembly_ProDataSize_112 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_CONFIG_113, CONFIG, &gAssembly_ConfigData_113, gAssembly_ConfigDataSize_113 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_CONSUMER_121, CONSUMER, &gAssembly_ConData_121, gAssembly_ConDataSize_121 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_PRODUCER_122, PRODUCER, &gAssembly_ProData_122, gAssembly_ProDataSize_122 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_CONFIG_123, CONFIG, &gAssembly_ConfigData_123, gAssembly_ConfigDataSize_123 ) );
CHECK( EC_CreateUserDefinedAssemblyInstance( SY_INST_ID_HEARTBEAT, CONSUMER, &gAssembly_HeartbeatData, gAssembly_HeartbeatSize ) );
#endif
/* ! Build User defined Classes */
CHECK( EC_CreateUserDefined( 2 ) );
/* ! Create first Class */
CHECK( EC_CreateClass( 0x300/*ClassCode*/, 0/*Attributes*/, 3/*Instances*/ ) );
/* ! Create first Class first Instance */
CHECK( EC_CreateInstance( 0x300/*ClassCode*/, 1/*InstanceCode*/, 3/*Attributes*/ ) );
CHECK( EC_CreateInstanceAttribute( 0x300/*ClassCode*/, 1/*InstanceCode*/, 0x01/*AttributeCode*/, 0/* GET/SET */, &gClass_768_Instance_1_Attributes.itsAttribute1, sizeof(gClass_768_Instance_1_Attributes.itsAttribute1) ) );
CHECK( EC_CreateInstanceAttribute( 0x300/*ClassCode*/, 1/*InstanceCode*/, 0x02/*AttributeCode*/, 1/* ReadOnly */, &gClass_768_Instance_1_Attributes.itsAttribute2, sizeof(gClass_768_Instance_1_Attributes.itsAttribute2) ) );
CHECK( EC_CreateInstanceAttribute( 0x300/*ClassCode*/, 1/*InstanceCode*/, 0x03/*AttributeCode*/, 0/* GET/SET */, &gClass_768_Instance_1_Attributes.itsAttribute3, sizeof(gClass_768_Instance_1_Attributes.itsAttribute3) ) );
/* ! Create first Class second Instance */
CHECK( EC_CreateInstance( 0x300/*ClassCode*/, 2/*InstanceCode*/, 3/*Attributes*/ ) );
CHECK( EC_CreateInstanceAttribute( 0x300/*ClassCode*/, 2/*InstanceCode*/, 0x01/*AttributeCode*/, 0/* GET/SET */, &gClass_768_Instance_2_Attributes.itsAttribute1, sizeof(gClass_768_Instance_1_Attributes.itsAttribute1) ) );
CHECK( EC_CreateInstanceAttribute( 0x300/*ClassCode*/, 2/*InstanceCode*/, 0x02/*AttributeCode*/, 1/* ReadOnly */, &gClass_768_Instance_2_Attributes.itsAttribute2, sizeof(gClass_768_Instance_1_Attributes.itsAttribute2) ) );
CHECK( EC_CreateInstanceAttribute( 0x300/*ClassCode*/, 2/*InstanceCode*/, 0x03/*AttributeCode*/, 0/* GET/SET */, &gClass_768_Instance_2_Attributes.itsAttribute3, sizeof(gClass_768_Instance_1_Attributes.itsAttribute3) ) );
/* ! Create first Class third Instance */
CHECK( EC_CreateInstance( 0x300/*ClassCode*/, 3/*InstanceCode*/, 3/*Attributes*/ ) );
CHECK( EC_CreateInstanceAttribute( 0x300/*ClassCode*/, 3/*InstanceCode*/, 0x01/*AttributeCode*/, 0/* GET/SET */, &gClass_768_Instance_3_Attributes.itsAttribute1, sizeof(gClass_768_Instance_1_Attributes.itsAttribute1) ) );
CHECK( EC_CreateInstanceAttribute( 0x300/*ClassCode*/, 3/*InstanceCode*/, 0x02/*AttributeCode*/, 1/* ReadOnly */, &gClass_768_Instance_3_Attributes.itsAttribute2, sizeof(gClass_768_Instance_1_Attributes.itsAttribute2) ) );
CHECK( EC_CreateInstanceAttribute( 0x300/*ClassCode*/, 3/*InstanceCode*/, 0x03/*AttributeCode*/, 0/* GET/SET */, &gClass_768_Instance_3_Attributes.itsAttribute3, sizeof(gClass_768_Instance_1_Attributes.itsAttribute3) ) );
/* ! Create second Class */
CHECK( EC_CreateClass( 0x301/*ClassCode*/, 0/*Attributes*/, 1/*Instances*/ ) );
/* ! Create second Class first instance */
CHECK( EC_CreateInstance( 0x301/*ClassCode*/, 1/*InstanceCode*/, 3/*Attributes*/ ) );
CHECK( EC_CreateInstanceAttribute( 0x301/*ClassCode*/, 1/*InstanceCode*/, 0x01/*AttributeCode*/, 0/* GET/SET */, &gClass_769_Instance_1_Attributes.itsAttribute1, sizeof(gClass_769_Instance_1_Attributes.itsAttribute1) ) );
CHECK( EC_CreateInstanceAttribute( 0x301/*ClassCode*/, 1/*InstanceCode*/, 0x02/*AttributeCode*/, 0/* GET/SET */, &gClass_769_Instance_1_Attributes.itsAttribute2, sizeof(gClass_769_Instance_1_Attributes.itsAttribute2) ) );
CHECK( EC_CreateInstanceAttribute( 0x301/*ClassCode*/, 1/*InstanceCode*/, 0x03/*AttributeCode*/, 1/* ReadOnly */, &gClass_769_Instance_1_Attributes.itsAttribute3, sizeof(gClass_769_Instance_1_Attributes.itsAttribute3) ) );
/* ! Check Integrity of the defined Classes */
CHECK( EC_CheckIntegrity( ) );
/* ! */
return 0;
#undef CHECK
}
/*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -