Modbus example: configuration of a motor

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;