Tango Control System 使用的第一步就是创建Device Server,创建Device Server的方法有2种,一种是通过Pogo创建模板之后进行完善,一种是不通过Pogo直接在代码中实现。此篇介绍不通过Pogo创建Device Server。
直接通过代码实现的优点在于精简和自由,往往代码量轻微,但是其要求对于库的使用要非常熟练,新手建议使用Pogo来创建模板。
一个完整的Device Server要有以下内容:
1.attribute:设备必有的元素,如温度,这是给客户所需要的元素
2.command:设备功能接口,如开机等,提供给客户能够操作的接口
3.state:一般设备都是状态机模式
完整的Attribute,可以设置其名称,数据类型,单位,上下限,以及其是可读\写权限等。
完整的命令,包括是否有参数传递,以及返回值。
设备一般最基本有2个状态,OFF和ON,如果设备比较复杂会有其他状态,例如Alarm。
import time
import numpy
from tango import AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt
from tango.server import Device, attribute, command, pipe, device_property
class PowerSupply(Device):
voltage = attribute(label="Voltage", dtype=float,
display_level=DispLevel.OPERATOR,
access=AttrWriteType.READ,
unit="V", format="8.4f",
doc="the power supply voltage")
current = attribute(label="Current", dtype=float,
display_level=DispLevel.EXPERT,
access=AttrWriteType.READ_WRITE,
unit="A", format="8.4f",
min_value=0.0, max_value=8.5,
min_alarm=0.1, max_alarm=8.4,
min_warning=0.5, max_warning=8.0,
fget="get_current",
fset="set_current",
doc="the power supply current")
noise = attribute(label="Noise",
dtype=((int,),),
max_dim_x=1024, max_dim_y=1024)
info = pipe(label='Info')
host = device_property(dtype=str)
port = device_property(dtype=int, default_value=9788)
def init_device(self):
Device.init_device(self)
self.__current = 0.0
self.set_state(DevState.STANDBY)
def read_voltage(self):
self.info_stream("read_voltage(%s, %d)", self.host, self.port)
return 9.9, time.time(), AttrQuality.ATTR_WARNING
def get_voltage(self):
# self.info_stream("read_voltage(%s, %d)", self.host, self.port)
# return 9.99, time.time(), AttrQuality.ATTR_WARNING
return self.__voltage
def set_voltage(self, voltage):
# should set the power supply current
self.__voltage = voltage
def get_current(self):
return self.__current
def set_current(self, current):
# should set the power supply current
self.__current = current
def read_info(self):
return 'Information', dict(manufacturer='Tango',
model='PS2000',
version_number=123)
@DebugIt()
def read_noise(self):
return numpy.random.random_integers(1000, size=(100, 100))
@command
def TurnOn(self):
# turn on the actual power supply here
self.set_state(DevState.ON)
@command
def TurnOff(self):
# turn off the actual power supply here
self.set_state(DevState.OFF)
@command(dtype_in=float, doc_in="Ramp target current",
dtype_out=bool, doc_out="True if ramping went well, "
"False otherwise")
def Ramp(self, target_current):
# should do the ramping
return True
if __name__ == "__main__":
PowerSupply.run_server()