A trivial example

In the following example, the virtual motor is directly coupled to another motor.

#!/usr/bin/env python

import PyTango

class VM:
    #
    # init_device
    #
	def __init__( self):
		self.ResultSim = None
		self.PositionSim = None
		self.proxies = []
		self.proxies.append( PyTango.DeviceProxy( "p111/motor/exp.01"))
		return
	#
	# dev_state
	#
	def dev_state( self):
		argout = PyTango.DevState.ON
		#
		# if one device is in FAULT the VM is in FAULT too
		#
		for proxy in self.proxies:
			if proxy.state() == PyTango.DevState.FAULT:
				argout = PyTango.DevState.FAULT
				break
		if argout == PyTango.DevState.ON:
			#
			# if one device is MOVING the VM is MOVING too
			#
			for proxy in self.proxies:
				if proxy.state() == PyTango.DevState.MOVING:
					argout = PyTango.DevState.MOVING
					break
			
		return argout
	#
	# Position
	#
	def read_Position( self):
		return self.proxies[0].read_attribute( "Position").value

	def write_Position( self, argin):
		if( argin < self.proxies[0].UnitLimitMin or
			argin > self.proxies[0].UnitLimitMax):
			PyTango.Except.throw_exception(
				"vm1",
				"requested position outside limits %g %g " % (self.proxies[0].UnitLimitMin,
															  self.proxies[0].UnitLimitMax),
				"VmExecutor")
		
		self.proxies[0].write_attribute( "Position", argin)	
		return 1
	#
	# UnitLimitMax
	#
	def read_UnitLimitMax( self):
		return self.proxies[0].UnitLimitMax

	def write_UnitLimitMax( self, argin):
		self.UnitLimitMax = argin
	#
	# UnitLimitMin
	#
	def read_UnitLimitMin( self):
		return self.proxies[0].UnitLimitMin

	def write_UnitLimitMin( self, argin):
		self.UnitLimitMin = argin
	#
	# CwLimit, CcwLimit
	#
	def read_CwLimit( self):
		return self.proxies[0].CwLimit
	def read_CcwLimit( self):
		return self.proxies[0].CcwLimit
	#	
	# PositionSim	
	#	
	def read_PositionSim( self):
		if self.PositionSim is None:
			PyTango.Except.throw_exception( "vm1", "PositionSim is undefined", "VmExecutor")
		return self.PositionSim

	def write_PositionSim( self, argin):
		self.PositionSim = argin
		self.ResultSim = []
		self.ResultSim.append( "x: %g " % argin)

	def read_ResultSim( self):
		if self.ResultSim is None:
			PyTango.Except.throw_exception( "vm1", "ResultSim is undefined", "VmExecutor")
		return self.ResultSim

	def StopMove( self):
		return self.proxies[0].StopMove()