Suppose that there are several PCs at a beamline and a particular virtual motor macro is used at each of these PCs. Instead of copying the virtual motor macro to the each /online_dir, it is preferable to maintain the macro at a central place on a network file system and let the local virtual motor macros invoke the central script.
This is a solution. Each /online_dir contains the script vm1.pl:
#!/usr/bin/perl -w # # file name: /online_dir/vm1.pl # $status = eval `cat /centralPlace/vm1_central.pl`;
And on /centralPlace we have the script vm1_central.pl which happens to be exactly the former vm1.pl:
#!/usr/bin/perl -w
#
# file name: /online_dir/vm1.pl
#
# This script is a template for a virtual motor.
#
my ($method, $value_new) = @ARGV;
Util::log( "this is vm1_central, $method $value_new");
my $status = 1;
if( $method eq "set_position")
{
$status = Spectra::move( exp_mot15 => $value_new);
}
elsif( $method eq "get_position")
{
$SYM{RETURN_VALUE} = Spectra::gmup( "exp_mot15");
}
elsif( $method eq "get_limit_min")
{
$SYM{RETURN_VALUE} = Spectra::gmuli( "exp_mot15");
}
elsif( $method eq "get_limit_max")
{
$SYM{RETURN_VALUE} = Spectra::gmula( "exp_mot15");
}
elsif( $method eq "exec_stop")
{
Spectra::stop_move( "exp_mot15");
}
elsif( $method eq "calibration")
{
$status = Spectra::calibrate( name => "exp_mot15",
unit => $value_new,
noconfirm => 1);
}
else
{
Spectra::error( "vm1: failed to identify $method");
$status = 0;
goto finish;
}
finish:
$status;