The following code shows how a Beckhoff motor is configured using the Modbus interface:
#!/usr/bin/env perl
#
# Usage: run bc9000_config.pl [destination]
#
use strict;
use Spectra;
my $status = 1;
my $base = 0x4000;
Spectra::modbusClose( "hasa106bc01");
Spectra::modbusWrite( "hasa106bc01", $base, 2); # halt
Spectra::modbusWrite( "hasa106bc01", $base + 0x10, 100); # base, 0 - 2047, microsteps/sec
Spectra::modbusWrite( "hasa106bc01", $base + 0x11, 1000); # slew, 0 - 2047, microsteps/sec
Spectra::modbusWrite( "hasa106bc01", $base + 0x12, 1000); # accel, 0 - 2047
Spectra::modbusWrite( "hasa106bc01", $base + 0x18, 4); # microstepping
# 1 - 6, microsteps/vollschritt, 4 -> 2**4
Spectra::modbusWrite( "hasa106bc01", $base + 0x1, 3); # reset, uebernahme
Spectra::wait( 0.1);
goto finish if( !defined( $ARGV[0]));
my $ziel = $ARGV[0];
Spectra::modbusWrite( "hasa106bc01", $base + 0x2, ($ziel & 0xffff, $ziel >> 16)); # zielposition
Spectra::modbusWrite( "hasa106bc01", $base, ( 1));
print "\033[2J";
while( 1)
{
my @data = Spectra::modbusRead( "hasa106bc01", $base + 0x4, 2);
my ($status) = Spectra::modbusRead( "hasa106bc01", $base + 0x8, 1);
my $pos = $data[0] + ($data[1] << 16);
print sprintf "\033[2;5f pos %7d, status 0x%02x \n", $pos, $status;
last if( Spectra::key() == 32);
last if( $pos == $ziel);
}
Spectra::modbusWrite( "hasa106bc01", $base, ( 2)); # halt
finish:
return $status;