SECoP Motor

Here is an example for a VmExecutor speaking to a SECoP motor server. Notice that the following properties have to be supplied:

#!/bin/env python 
"""
Properties
  Motorname: drv       (e.g.)
  Hostname:  haspp99eh (where the SECoP server runs)
  Port:      5000

The corresponding entry in /online_dir/online.xml

<device>
 <name>secop_drv</name>
 <type>type_tango</type>
 <module>motor_tango</module>
 <device>p99/secop_motor/exp.01</device>
 <control>tango</control>
 <hostname>haspp99:10000</hostname>
</device>


"""
import socket, select
import sys, inspect, json
import PyTango, HasyUtils

class VM:
    #
    # init_device
    #
    def __init__( self):
        self.parent = inspect.currentframe().f_back.f_locals['self']
        try: 
            self.motorName = HasyUtils.getDeviceProperty( self.parent.get_name(), "Motorname")[0]
            self.host = HasyUtils.getDeviceProperty( self.parent.get_name(), "Hostname")[0]
            self.port = int( HasyUtils.getDeviceProperty( self.parent.get_name(), "Port")[0])
        except Exception as e: 
            print( "secopMotor.py: expecting the properties: Motorname, Hostname, Port")
            sys.exit( 255)
        self.sckt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)            
        self.sckt.connect(( self.host, self.port))

        self.UnitLimitMin = 0
        self.UnitLimitMax = 200

        return
    #
    #
    #
    def writeRead( self, msg):
        #
        # sends a messages, reads the reply and returns a result
        #
        self.sckt.send( msg + "\n")
        buffer = ""
        while( 1):
            infds, outfds, errfds = select.select( [self.sckt], [], [], 0.12)
            if len( infds) == 0:
                break
            buffer = buffer + self.sckt.recv( 1024)

        lst = buffer.split( ' ')
        com = ”.join( lst[2:]).strip()
        res = json.loads( com)
        argout = ""
        if type( res) is list:
            if type( res[0]) is list:
                argout = res[0][0]
            else:
                argout = res[0]
        return argout
    #
    # dev_state
    #
    def dev_state( self):
        msg = "read %s:status"  % self.motorName
        res = self.writeRead( msg)
        if res == 100: 
            argout = PyTango.DevState.ON
        elif res == 300:
            argout = PyTango.DevState.MOVING
        elif res == 400:
            argout = PyTango.DevState.ALARM
        return argout
    #
    # Position
    #
    def read_Position( self):
        msg = "read %s:value" % self.motorName
        res = self.writeRead( msg)
        return res

    def write_Position( self, argin):
        msg = "change %s:target %s" % ( self.motorName, repr( argin))
        buffer = self.writeRead( msg)
        #
        # reply for a move to 33: [33.0, {"t": 1635954831.2276042}]
        #
        return 1
    #
    # UnitLimitMax
    #
    def read_UnitLimitMax( self):
        return self.UnitLimitMax 

    def write_UnitLimitMax( self, argin):
        self.UnitLimitMax = argin
    #
    # UnitLimitMin
    #
    def read_UnitLimitMin( self):
        return self.UnitLimitMin

    def write_UnitLimitMin( self, argin):
        self.UnitLimitMin = argin
    #
    # CwLimit, CcwLimit
    #
    def read_CwLimit( self):
        return 0
    def read_CcwLimit( self):
        return 0

    def StopMove( self):
        msg = "do %s:stop" % self.motorName
        buffer = self.writeRead( msg)
        return 1