The following code gives an example of Modbus I/O. It shows how a Beckhoff motor is implemented as a virtual motor.
#!/usr/bin/perl -w
#
# file name:
# /online_dir/vm4.pl
#
# the X motor
#
use Spectra;
my ($method, $value_new) = @ARGV;
my $status = 1;
#
# the controller has a time-out after 10s, be sure to re-open the Modbus
#
Spectra::modbuClose( "hasa106bc01");
if( "$method" eq "set_position")
{
my $ziel = $value_new;
Spectra::modbusWrite( "hasa106bc01", 0x4002, ($ziel & 0xffff, $ziel >> 16));
Spectra::modbusWrite( "hasa106bc01", 0x4000, 1);
my $count = 0;
delete $Spectra::SYM{ INTERRUPT_SCAN};
while( 1)
{
my @data = Spectra::modbusRead( "hasa106bc01", 0x4004, 2);
my $pos = $data[0] + ($data[1] << 16);
last if( Spectra::key() == 32);
last if( $Spectra::SYM{ INTERRUPT_SCAN});
last if( $pos == $ziel);
Util::refresh() if( !($count++ % 10));
}
Spectra::modbusWrite( "hasa106bc01", 0x4000, 2);
goto finish;
}
if( "$method" eq "get_position")
{
my @data = Spectra::modbusRead( "hasa106bc01", 0x4004, 2);
my $pos = $data[0] + ($data[1] << 16);
$SYM{RETURN_VALUE} = $pos;
goto finish;
}
if( "$method" eq "get_limit_min")
{
$SYM{RETURN_VALUE} = 0;
goto finish;
}
if( "$method" eq "get_limit_max")
{
$SYM{RETURN_VALUE} = 1000000;
goto finish;
}
finish:
$status;