Skip to content
Snippets Groups Projects
Commit 90479642 authored by Claudio Scafuri's avatar Claudio Scafuri :speech_balloon:
Browse files

initial release

parent 5515395c
No related branches found
No related tags found
No related merge requests found
.pydevproject
.project
.cproject
.settings
obj
bin
core*
*~
*.pyc
*.so
*.so*
.pylintrc
.metadata
.idea
.cvsignore
.nse_depinfo
software
oldsrc
CVS
*-srv
src/ChangeLog
test/*.csv
Makefile 0 → 100644
NAME = idhelical-srv
MAIN = IdHelical.py
DIRNAME = $(NAME:-srv=)
MODNAME = $(MAIN:.py=)
PY_FILES += $(wildcard src/*.py)
default: bin ${PY_FILES}
@cp ${PY_FILES} bin/${DIRNAME}
@echo "#!/usr/bin/env python3\nimport sys\nsys.path.append(sys.path[0]+'/${DIRNAME}')\nfrom ${MODNAME} import main\nif __name__ == '__main__':\n main()\n" > bin/${NAME}
@chmod +x bin/${NAME} bin/${DIRNAME}/${MAIN}
bin:
@test -d $@ || mkdir -p $@/${DIRNAME}
clean:
@rm -fr bin/ src/*~
.PHONY: clean
......@@ -2,4 +2,4 @@
Tango simulator for helical undulator
Main attributes : Gap, Phase, Tapring, Offset.
\ No newline at end of file
Main attributes : Gap, Phase, Tapering, Offset.
#
# Resource backup , created Thu Mar 10 16:39:48 CET 2022
#
#---------------------------------------------------------
# SERVER idhelical-srv/lh, IdHelical device declaration
#---------------------------------------------------------
idhelical-srv/lh/DEVICE/IdHelical: "lh/insertion_device/id_lh.02"
# --- lh/insertion_device/id_lh.02 attribute properties
#---------------------------------------------------------
# CLASS IdHelical properties
#---------------------------------------------------------
# CLASS IdHelical attribute properties
# -*- coding: utf-8 -*-
#
# This file is part of the IdHelical project
#
#
#
# Distributed under the terms of the GPL license.
# See LICENSE.txt for more info.
""" TANGO Device Server
simulator for helical insertion device.
Use for testing tango - bcs bridge and supervisor, FERMI ID
"""
# PyTango imports
import tango
from tango import DebugIt
from tango.server import run
from tango.server import Device
from tango.server import attribute, command
from tango.server import device_property
from tango import AttrQuality, DispLevel, DevState
from tango import AttrWriteType, PipeWriteType
# Additional import
# PROTECTED REGION ID(IdHelical.additionnal_import) ENABLED START #
import movethread
# PROTECTED REGION END # // IdHelical.additionnal_import
__all__ = ["IdHelical", "main"]
class IdHelical(Device):
"""
simulator for helical insertion device.
Use for testing tango - bcs bridge and supervisor, FERMI ID
**Properties:**
- Device Property
NumAxes
- number of mechanical axes , 6, 4, or 2
- Type:'DevLong'
MaxGap
- gap value for rest position
- Type:'DevDouble'
"""
# PROTECTED REGION ID(IdHelical.class_variable) ENABLED START #
# PROTECTED REGION END # // IdHelical.class_variable
# -----------------
# Device Properties
# -----------------
NumAxes = device_property(
dtype='DevLong',
default_value=6
)
MaxGap = device_property(
dtype='DevDouble',
default_value=190.0
)
# ----------
# Attributes
# ----------
Gap = attribute(
dtype='DevDouble',
access=AttrWriteType.READ_WRITE,
label="gap",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
max_value=190,
min_value=10.0,
doc="magnetic gap of id",
)
Offset = attribute(
dtype='DevDouble',
access=AttrWriteType.READ_WRITE,
label="offset",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
max_value=1,
min_value=-1,
doc="vertical offset of id",
)
Phase = attribute(
dtype='DevDouble',
access=AttrWriteType.READ_WRITE,
label="phase",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
max_value=27.0,
min_value=-27.0,
doc="carriage magnetic phase",
)
Tapering = attribute(
dtype='DevDouble',
access=AttrWriteType.READ_WRITE,
label="taper",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
max_value=10,
min_value=-10,
doc="magnetic tapering of id",
)
GapSetPoint = attribute(
dtype='DevDouble',
label="gap set point",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
max_value=190,
min_value=10.0,
doc="set point of magnetic gap of id",
)
OffsetSetPoint = attribute(
dtype='DevDouble',
label="offset set point",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
max_value=1,
min_value=-1,
doc="set point of offset of id",
)
TaperingSetPoint = attribute(
dtype='DevDouble',
label="tapering set point",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
max_value=1,
min_value=-1,
doc="set point of magnetic tapering of id",
)
PhaseSetPoint = attribute(
dtype='DevDouble',
label="phase set point",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
max_value=27.5,
min_value=-27-5,
doc="set point of carriage magnetic phase",
)
GapOffTapPha = attribute(
dtype=('DevDouble',),
access=AttrWriteType.READ_WRITE,
max_dim_x=4,
label="GapOffTapPha",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
doc="Gap\nOffset\nTapering\nPhase",
)
GapLimits = attribute(
dtype=('DevDouble',),
max_dim_x=2,
label="GapLimits",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
doc="Gap Low Limits\nHigh Limits",
)
OffsetLimits = attribute(
dtype=('DevDouble',),
max_dim_x=2,
label="OffsetLimits",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
doc="Low Limits\nHigh Limits",
)
TaperingLimits = attribute(
dtype=('DevDouble',),
max_dim_x=2,
label="tapering limits",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
doc="Low Limit\nHigh Limit",
)
PhaseLimits = attribute(
dtype=('DevDouble',),
max_dim_x=2,
label="PhaseLimits",
unit="mm",
standard_unit="1",
display_unit="mm",
format="%6.3f",
doc="Low Limits\nHigh Limits",
)
# ---------------
# General methods
# ---------------
def init_device(self):
"""Initialises the attributes and properties of the IdHelical."""
Device.init_device(self)
# PROTECTED REGION ID(IdHelical.init_device) ENABLED START #
self.set_state(tango.DevState.INIT)
self._enabled = True
self._gap = 100.0
self._offset = 0.0
self._phase = 0.0
self._tapering = 0.0
self._gap_set_point = self._gap
self._offset_set_point = self._offset
self._tapering_set_point = self._tapering
self._phase_set_point = self._phase
self._stat_rf = (False, False)
self._gap_off_tap_pha = [100.0, 0.0, 0.0, 0.0]
self._gap_limits = (self.Gap.get_min_value(), self.Gap.get_max_value())
self._offset_limits = (self.Offset.get_min_value(), self.Offset.get_max_value())
self._tapering_limits = (self.Tapering.get_min_value(), self.Tapering.get_max_value())
self._phase_limits = (self.Phase.get_min_value(), self.Phase.get_max_value())
self.ready = True
self.moving = False
self.do_stop = False
self.set_state(tango.DevState.ON)
self.set_status('ON and ready')
# PROTECTED REGION END # // IdHelical.init_device
def always_executed_hook(self):
"""Method always executed before any TANGO command is executed."""
# PROTECTED REGION ID(IdHelical.always_executed_hook) ENABLED START #
# PROTECTED REGION END # // IdHelical.always_executed_hook
def delete_device(self):
"""Hook to delete resources allocated in init_device.
This method allows for any memory or other resources allocated in the
init_device method to be released. This method is called by the device
destructor and by the device Init command.
"""
# PROTECTED REGION ID(IdHelical.delete_device) ENABLED START #
# PROTECTED REGION END # // IdHelical.delete_device
# ------------------
# Attributes methods
# ------------------
def read_Gap(self):
# PROTECTED REGION ID(IdHelical.Gap_read) ENABLED START #
"""Return the Gap attribute."""
return self._gap
# PROTECTED REGION END # // IdHelical.Gap_read
def write_Gap(self, value):
# PROTECTED REGION ID(IdHelical.Gap_write) ENABLED START #
"""Set the Gap attribute."""
if not (self._enabled and self.ready):
msg = "gap request for " + str(value) + " RESPINTA"
tango.Except.throw_exception(
"Rejected request", msg, "HelicalID.write_Gap()"
)
self._gap_set_point = value
self.set_state(tango.DevState.MOVING)
self.moving = True
self.ready = False # NOT ready
self.set_status("moving and not ready")
moveth = movethread.movethread(self)
moveth.start()
# PROTECTED REGION END # // IdHelical.Gap_write
def is_Gap_allowed(self, attr):
# PROTECTED REGION ID(IdHelical.is_Gap_allowed) ENABLED START #
if attr==attr.READ_REQ:
return self.get_state() not in [DevState.FAULT,DevState.UNKNOWN]
else:
return True
# PROTECTED REGION END # // IdHelical.is_Gap_allowed
def read_Offset(self):
# PROTECTED REGION ID(IdHelical.Offset_read) ENABLED START #
"""Return the Offset attribute."""
return self._offset
# PROTECTED REGION END # // IdHelical.Offset_read
def write_Offset(self, value):
# PROTECTED REGION ID(IdHelical.Offset_write) ENABLED START #
"""Set the Offset attribute."""
if not (self._enabled and self.ready):
msg = "offset request for " + str(value) + " RESPINTA"
tango.Except.throw_exception(
"Rejected request", msg, "HelicalID.write_Offset()"
)
self._offset_set_point = value
self.set_state(tango.DevState.MOVING)
self.moving = True
self.ready = False # NOT ready
self.set_status("moving and not ready")
moveth = movethread.movethread(self)
moveth.start()
# PROTECTED REGION END # // IdHelical.Offset_write
def is_Offset_allowed(self, attr):
# PROTECTED REGION ID(IdHelical.is_Offset_allowed) ENABLED START #
if attr==attr.READ_REQ:
return self.get_state() not in [DevState.FAULT,DevState.UNKNOWN]
else:
return True
# PROTECTED REGION END # // IdHelical.is_Offset_allowed
def read_Phase(self):
# PROTECTED REGION ID(IdHelical.Phase_read) ENABLED START #
"""Return the Phase attribute."""
return self._phase
# PROTECTED REGION END # // IdHelical.Phase_read
def write_Phase(self, value):
# PROTECTED REGION ID(IdHelical.Phase_write) ENABLED START #
"""Set the Phase attribute."""
if not (self._enabled and self.ready):
msg = "phase request for " + str(value) + " RESPINTA"
tango.Except.throw_exception(
"Rejected request", msg, "HelicalID.write_Phase()"
)
self._phase_set_point = value
self.set_state(tango.DevState.MOVING)
self.moving = True
self.ready = False # NOT ready
self.set_status("moving and not ready")
moveth = movethread.movethread(self)
moveth.start()
# PROTECTED REGION END # // IdHelical.Phase_write
def is_Phase_allowed(self, attr):
# PROTECTED REGION ID(IdHelical.is_Phase_allowed) ENABLED START #
if attr==attr.READ_REQ:
return self.get_state() not in [DevState.FAULT,DevState.UNKNOWN]
else:
return True
# PROTECTED REGION END # // IdHelical.is_Phase_allowed
def read_Tapering(self):
# PROTECTED REGION ID(IdHelical.Tapering_read) ENABLED START #
"""Return the Tapering attribute."""
return self._tapering
# PROTECTED REGION END # // IdHelical.Tapering_read
def write_Tapering(self, value):
# PROTECTED REGION ID(IdHelical.Tapering_write) ENABLED START #
"""Set the Tapering attribute."""
if not (self._enabled and self.ready):
msg = "tapering request for " + str(value) + " RESPINTA"
tango.Except.throw_exception(
"Rejected request", msg, "HelicalID.write_Tapering()"
)
self._tapering_set_point = value
self.set_state(tango.DevState.MOVING)
self.moving = True
self.ready = False # NOT ready
self.set_status("moving and not ready")
moveth = movethread.movethread(self)
moveth.start()
# PROTECTED REGION END # // IdHelical.Tapering_write
def is_Tapering_allowed(self, attr):
# PROTECTED REGION ID(IdHelical.is_Tapering_allowed) ENABLED START #
if attr==attr.READ_REQ:
return self.get_state() not in [DevState.FAULT,DevState.UNKNOWN]
else:
return True
# PROTECTED REGION END # // IdHelical.is_Tapering_allowed
def read_GapSetPoint(self):
# PROTECTED REGION ID(IdHelical.GapSetPoint_read) ENABLED START #
"""Return the GapSetPoint attribute."""
return self._gap_set_point
# PROTECTED REGION END # // IdHelical.GapSetPoint_read
def is_GapSetPoint_allowed(self, attr):
# PROTECTED REGION ID(IdHelical.is_GapSetPoint_allowed) ENABLED START #
return self.get_state() not in [DevState.FAULT,DevState.UNKNOWN]
# PROTECTED REGION END # // IdHelical.is_GapSetPoint_allowed
def read_OffsetSetPoint(self):
# PROTECTED REGION ID(IdHelical.OffsetSetPoint_read) ENABLED START #
"""Return the OffsetSetPoint attribute."""
return self._offset_set_point
# PROTECTED REGION END # // IdHelical.OffsetSetPoint_read
def is_OffsetSetPoint_allowed(self, attr):
# PROTECTED REGION ID(IdHelical.is_OffsetSetPoint_allowed) ENABLED START #
return self.get_state() not in [DevState.FAULT,DevState.UNKNOWN]
# PROTECTED REGION END # // IdHelical.is_OffsetSetPoint_allowed
def read_TaperingSetPoint(self):
# PROTECTED REGION ID(IdHelical.TaperingSetPoint_read) ENABLED START #
"""Return the TaperingSetPoint attribute."""
return self._tapering_set_point
# PROTECTED REGION END # // IdHelical.TaperingSetPoint_read
def is_TaperingSetPoint_allowed(self, attr):
# PROTECTED REGION ID(IdHelical.is_TaperingSetPoint_allowed) ENABLED START #
return self.get_state() not in [DevState.FAULT,DevState.UNKNOWN]
# PROTECTED REGION END # // IdHelical.is_TaperingSetPoint_allowed
def read_PhaseSetPoint(self):
# PROTECTED REGION ID(IdHelical.PhaseSetPoint_read) ENABLED START #
"""Return the PhaseSetPoint attribute."""
return self._phase_set_point
# PROTECTED REGION END # // IdHelical.PhaseSetPoint_read
def is_PhaseSetPoint_allowed(self, attr):
# PROTECTED REGION ID(IdHelical.is_PhaseSetPoint_allowed) ENABLED START #
return self.get_state() not in [DevState.FAULT,DevState.UNKNOWN]
# PROTECTED REGION END # // IdHelical.is_PhaseSetPoint_allowed
def read_GapOffTapPha(self):
# PROTECTED REGION ID(IdHelical.GapOffTapPha_read) ENABLED START #
"""Return the GapOffTapPha attribute."""
return self._gap_off_tap_pha
# PROTECTED REGION END # // IdHelical.GapOffTapPha_read
def write_GapOffTapPha(self, value):
# PROTECTED REGION ID(IdHelical.GapOffTapPha_write) ENABLED START #
"""Set the GapOffTapPha attribute."""
if not (self._enabled and self.ready):
msg = "GapOffTapPha request for " + str(value) + " RESPINTA"
tango.Except.throw_exception(
"Rejected request", msg, "HelicalID.write_GapOffTapPha()"
)
self._gap_set_point = value[0]
self._offset_set_point = value[1]
self._tapering_set_point = value[2]
self._phase_set_point = value[3]
self.set_state(tango.DevState.MOVING)
self.moving = True
self.ready = False # NOT ready
self.set_status("moving and not ready")
moveth = movethread.movethread(self)
moveth.start()
# PROTECTED REGION END # // IdHelical.GapOffTapPha_write
def read_GapLimits(self):
# PROTECTED REGION ID(IdHelical.GapLimits_read) ENABLED START #
"""Return the GapLimits attribute."""
return self._gap_limits
# PROTECTED REGION END # // IdHelical.GapLimits_read
def read_OffsetLimits(self):
# PROTECTED REGION ID(IdHelical.OffsetLimits_read) ENABLED START #
"""Return the OffsetLimits attribute."""
return self._offset_limits
# PROTECTED REGION END # // IdHelical.OffsetLimits_read
def read_TaperingLimits(self):
# PROTECTED REGION ID(IdHelical.TaperingLimits_read) ENABLED START #
"""Return the TaperingLimits attribute."""
return self._tapering_limits
# PROTECTED REGION END # // IdHelical.TaperingLimits_read
def read_PhaseLimits(self):
# PROTECTED REGION ID(IdHelical.PhaseLimits_read) ENABLED START #
"""Return the PhaseLimits attribute."""
return self._phase_limits
# PROTECTED REGION END # // IdHelical.PhaseLimits_read
# --------
# Commands
# --------
@command(
)
@DebugIt()
def MoveMaxGap(self):
# PROTECTED REGION ID(IdHelical.MoveMaxGap) ENABLED START #
"""
go to max gap , rest position
:return:None
"""
valin = [self.Gap.get_max_value(), 0.0, 0.0, 0.0 ]
self.write_GapOffTapPha(valin)
# PROTECTED REGION END # // IdHelical.MoveMaxGap
@command(
dtype_in='DevVarDoubleArray',
doc_in="gap, taper, phase",
)
@DebugIt()
def SetGapTapPha(self, argin):
# PROTECTED REGION ID(IdHelical.SetGapTapPha) ENABLED START #
"""
set new working point in one go
:param argin: 'DevVarDoubleArray'
gap, taper, phase
:return:None
"""
valin = [argin[0], 0.0, argin[1], argin[2] ]
self.write_GapOffTapPha(valin)
# PROTECTED REGION END # // IdHelical.SetGapTapPha
@command(
)
@DebugIt()
def Stop(self):
# PROTECTED REGION ID(IdHelical.Stop) ENABLED START #
"""
Stop movement
:return:None
"""
if self.moving:
self.do_stop = True
return
# PROTECTED REGION END # // IdHelical.Stop
# ----------
# Run server
# ----------
def main(args=None, **kwargs):
"""Main function of the IdHelical module."""
# PROTECTED REGION ID(IdHelical.main) ENABLED START #
return run((IdHelical,), args=args, **kwargs)
# PROTECTED REGION END # // IdHelical.main
if __name__ == '__main__':
main()
<?xml version="1.0" encoding="ASCII"?>
<pogoDsl:PogoSystem xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pogoDsl="http://www.esrf.fr/tango/pogo/PogoDsl">
<classes name="IdHelical" pogoRevision="9.6">
<description description="simulator for helical insertion device.&#xA;Use for testing tango - bcs bridge and supervisor, FERMI ID" title="TANGO Device Server" sourcePath="/home/claudio/src/gitlab/dt/ds/idhelical/src" language="PythonHL" filestogenerate="XMI file,Code files,Protected Regions" license="GPL" copyright="" hasMandatoryProperty="false" hasConcreteProperty="true" hasAbstractCommand="false" hasAbstractAttribute="false">
<inheritances classname="Device_4Impl" sourcePath=""/>
<identification contact="at elettra.trieste.it - claudio.scafuri" author="claudio.scafuri" emailDomain="elettra.trieste.it" classFamily="Simulators" siteSpecific="" platform="All Platforms" bus="Not Applicable" manufacturer="none" reference=""/>
</description>
<deviceProperties name="NumAxes" description="number of mechanical axes , 6, 4, or 2">
<type xsi:type="pogoDsl:IntType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>6</DefaultPropValue>
</deviceProperties>
<deviceProperties name="MaxGap" description="gap value for rest position">
<type xsi:type="pogoDsl:DoubleType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>190.0</DefaultPropValue>
</deviceProperties>
<commands name="State" description="This command gets the device state (stored in its &lt;i>device_state&lt;/i> data member) and returns it to the caller." execMethod="dev_state" displayLevel="OPERATOR" polledPeriod="0">
<argin description="none.">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="State Code">
<type xsi:type="pogoDsl:StateType"/>
</argout>
<status abstract="true" inherited="true" concrete="true" concreteHere="false"/>
</commands>
<commands name="Status" description="This command gets the device status (stored in its &lt;i>device_status&lt;/i> data member) and returns it to the caller." execMethod="dev_status" displayLevel="OPERATOR" polledPeriod="0">
<argin description="none.">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="Status description">
<type xsi:type="pogoDsl:ConstStringType"/>
</argout>
<status abstract="true" inherited="true" concrete="true" concreteHere="false"/>
</commands>
<commands name="MoveMaxGap" description="go to max gap , rest position&#xA;" execMethod="move_max_gap" displayLevel="OPERATOR" polledPeriod="0">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="SetGapTapPha" description="set new working point in one go&#xA;" execMethod="set_gap_tap_pha" displayLevel="OPERATOR" polledPeriod="0">
<argin description="gap, taper, phase">
<type xsi:type="pogoDsl:DoubleArrayType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="Stop" description="Stop movement&#xA;" execMethod="stop" displayLevel="OPERATOR" polledPeriod="0">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<attributes name="Gap" attType="Scalar" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="1" maxY="1">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="magnetic gap of id" label="gap" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="190" minValue="10.0" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>FAULT</readExcludedStates>
<readExcludedStates>UNKNOWN</readExcludedStates>
</attributes>
<attributes name="Offset" attType="Scalar" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="1" maxY="1">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="vertical offset of id" label="offset" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="1" minValue="-1" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>FAULT</readExcludedStates>
<readExcludedStates>UNKNOWN</readExcludedStates>
</attributes>
<attributes name="Phase" attType="Scalar" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="1" maxY="1" allocReadMember="false" isDynamic="false">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="carriage magnetic phase" label="phase" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="27.0" minValue="-27.0" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>FAULT</readExcludedStates>
<readExcludedStates>UNKNOWN</readExcludedStates>
</attributes>
<attributes name="Tapering" attType="Scalar" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="1" maxY="1" allocReadMember="false" isDynamic="false">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="magnetic tapering of id" label="taper" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="10" minValue="-10" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>FAULT</readExcludedStates>
<readExcludedStates>UNKNOWN</readExcludedStates>
</attributes>
<attributes name="GapSetPoint" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="1" maxY="1">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="set point of magnetic gap of id" label="gap set point" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="190" minValue="10.0" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>FAULT</readExcludedStates>
<readExcludedStates>UNKNOWN</readExcludedStates>
</attributes>
<attributes name="OffsetSetPoint" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="1" maxY="1">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="set point of offset of id" label="offset set point" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="1" minValue="-1" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>FAULT</readExcludedStates>
<readExcludedStates>UNKNOWN</readExcludedStates>
</attributes>
<attributes name="TaperingSetPoint" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="1" maxY="1">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="set point of magnetic tapering of id" label="tapering set point" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="1" minValue="-1" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>FAULT</readExcludedStates>
<readExcludedStates>UNKNOWN</readExcludedStates>
</attributes>
<attributes name="PhaseSetPoint" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="1" maxY="1">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="set point of carriage magnetic phase" label="phase set point" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="27.5" minValue="-27-5" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>FAULT</readExcludedStates>
<readExcludedStates>UNKNOWN</readExcludedStates>
</attributes>
<attributes name="GapOffTapPha" attType="Spectrum" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="4" maxY="1" allocReadMember="false" isDynamic="false">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Gap&#xA;Offset&#xA;Tapering&#xA;Phase" label="GapOffTapPha" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="GapLimits" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="2" maxY="1">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Gap Low Limits\nHigh Limits" label="GapLimits" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="OffsetLimits" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="2" maxY="1">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Low Limits\nHigh Limits" label="OffsetLimits" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="TaperingLimits" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="2" maxY="1" allocReadMember="false" isDynamic="false">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Low Limit&#xA;High Limit" label="tapering limits" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="PhaseLimits" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="2" maxY="1">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Low Limits\nHigh Limits" label="PhaseLimits" unit="mm" standardUnit="1" displayUnit="mm" format="%6.3f" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<states name="ON" description="">
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</states>
<states name="FAULT" description="">
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</states>
<states name="UNKNOWN" description="">
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</states>
<states name="MOVING" description="">
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</states>
<preferences docHome="./doc_html" makefileHome="/usr/local/tango-9.3.4/share/pogo/preferences"/>
</classes>
</pogoDsl:PogoSystem>
import tango
import time
from tango import DebugIt
from tango.server import run
from tango.server import Device
from tango.server import attribute, command
from tango.server import device_property
from tango import AttrQuality, DispLevel, DevState
from tango import AttrWriteType, PipeWriteType
import threading
class movethread(threading.Thread):
def __init__(self, master):
threading.Thread.__init__(self)
self.master = master
# do simulated movement
def run(self):
gap_moving = False
phase_moving = False
tapering_moving = False
offset_moving = False
moving = True
while moving:
if self.master._gap_set_point != self.master._gap:
delta = self.master._gap_set_point - self.master._gap
if delta >= -1.0 and delta <= 1.0:
self.master._gap = self.master._gap_set_point
gap_moving = False
elif delta < -1.0:
self.master._gap -= 1.0
gap_moving = True
elif delta > 1.0:
self.master._gap += 1.0
gap_moving = True
if self.master._phase_set_point != self.master._phase:
delta = self.master._phase_set_point - self.master._phase
if delta >= -1.0 and delta <= 1.0:
self.master._phase = self.master._phase_set_point
phase_moving = False
elif delta < -1.0:
self.master._phase -= 1.0
phase_moving = True
elif delta > 1.0:
self.master._phase += 1.0
phase_moving = True
if self.master._tapering_set_point != self.master._tapering:
delta = self.master._tapering_set_point - self.master._tapering
if delta >= -0.01 and delta <= 0.01:
self.master._tapering = self.master._tapering_set_point
tapering_moving = False
elif delta < -0.01:
self.master._tapering -= 0.01
tapering_moving = True
elif delta > 0.01:
self.master._tapering += 0.01
tapering_moving = True
if self.master._offset_set_point != self.master._offset:
delta = self.master._offset_set_point - self.master._offset
if delta >= -0.01 and delta <= 0.01:
self.master._offset = self.master._offset_set_point
offset_moving = False
elif delta < -0.01:
self.master._offset -= 0.01
offset_moving = True
elif delta > 0.01:
self.master._offset += 0.01
offset_moving = True
self.master._gap_off_tap_pha[0] = self.master._gap
self.master._gap_off_tap_pha[1] = self.master._offset
self.master._gap_off_tap_pha[2] = self.master._tapering
self.master._gap_off_tap_pha[3] = self.master._phase
moving = gap_moving or offset_moving or tapering_moving or phase_moving
if not moving or self.master.do_stop:
self.master.set_state(tango.DevState.ON)
self.master.ready = True # ready
self.master.moving = False
self.master.set_status("ON and ready")
self.master.do_stop = False
moving = False #handle do_stop
else:
self.master.set_state(tango.DevState.MOVING)
self.master.set_status("moving")
self.master.ready = False # not ready
self.master.moving = True
time.sleep(1)
return
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment