Module Templates

To interface with Piper a task requires two files. (1) A variable file where the Module and ModuleInferace is decalared and (2) the action file either in ST or C depending on the task which the interface is added. Once these two files are added, call the action in task cyclic code.

Variable

This file contains the Module Fub and ModuleInterface structure declarations.

(* PiperModuleTemplate.var *)
VAR
	ModuleInterface : Module_Interface_typ;
	Module : Piper_Module_Fub;
END_VAR

Interface

This file is where the module interfaces with Piper. States can be uncommented as needed.

ST

// In cyclic code of module
// Call PiperModuleInterface to interface with the rest of the machine
PiperModuleInterface;
// PiperModuleInterface.st
ACTION PiperModuleInterface:

	//Give this module a name so it is easier to debug
	ModuleInterface.ModuleName:=	'Name';

	//Add a module to the Piper
	Module.ModuleInterface:=	ADR(ModuleInterface);
	Module.Piper:= 	ADR(gMachine);
	Module();

	// Handle any machine states that this module needs to respond to
	CASE ModuleInterface.PiperState OF
//		MACH_ST_BOOTING:		
//		MACH_ST_CLEARING:
//		MACH_ST_STOPPED:
//		MACH_ST_STARTING:
//		MACH_ST_IDLE:
//		MACH_ST_SUSPENDED:
//		MACH_ST_EXECUTE:
//		MACH_ST_STOPPING:
//		MACH_ST_ABORTING:
//		MACH_ST_ABORTED:
//		MACH_ST_HOLDING:
//		MACH_ST_HELD:
//		MACH_ST_UNHOLDING:
//		MACH_ST_SUSPENDING:
//		MACH_ST_UNSUSPENDING:
//		MACH_ST_RESETTING:
//		MACH_ST_COMPLETING:
//		MACH_ST_COMPLETE:
		
		MACH_ST_BYPASSED:
		
		ELSE
			ModuleInterface.ModuleResponse:=	ModuleInterface.PiperState;
		
	END_CASE

END_ACTION

C

// In cyclic code of module
// Call PiperModuleInterface to interface with the rest of the machine
PiperModuleInterface();
// PiperModuleInterface.c
#include <bur/plctypes.h>
#ifdef _DEFAULT_INCLUDES
#include <AsDefault.h>
#endif

#include <string.h>

void PiperModuleInterface() {

	// Give this module a name so it is easier to debug
	strcpy(ModuleInterface.ModuleName, "Name");

	// Add a module to the Piper
	Module.ModuleInterface = &ModuleInterface;
	Module.Piper = &gMachine;
	Piper_Module_Fub(&Module);

	// Handle any machine states that this module needs to respond to
	switch (ModuleInterface.PiperState) {
		
		//case MACH_ST_BOOTING:
		//case MACH_ST_STOPPED:
		//case MACH_ST_RESETTING:
		//case MACH_ST_IDLE:
		//case MACH_ST_STARTING:
		//case MACH_ST_EXECUTE:
		//case MACH_ST_COMPLETING:
		//case MACH_ST_COMPLETE:
		//case MACH_ST_HOLDING:
		//case MACH_ST_HELD:
		//case MACH_ST_UNHOLDING:
		//case MACH_ST_SUSPENDING:
		//case MACH_ST_SUSPENDED:
		//case MACH_ST_UNSUSPENDING:
		//case MACH_ST_STOPPING:
		//case MACH_ST_ABORTING:
		//case MACH_ST_ABORTED:
		//case MACH_ST_CLEARING:

		case MACH_ST_BYPASSED: break;

		default: ModuleInterface.ModuleResponse = ModuleInterface.PiperState;
		
	} // switch(PiperState)
		
} // PiperModuleInterface()