⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecsample.c

📁 基于EthernetIP协议的应用程序,可以读取AB公司Controllogix系列Ethernetip协议PLC数据. 此软件代码可用于工业控制.
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* ! */
	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 + -