From dd2bca071052ed15dc036a2b33b97d975f7ab225 Mon Sep 17 00:00:00 2001 From: Jan Michel Date: Mon, 5 Jun 2023 16:23:58 +0200 Subject: [PATCH] Various additions to power scripts - reuse existing TCP connection - add powerboard_status to see all settings of a power board - add reverse lookup for powerboard outputs -> mbo addresses --- scripts/MDC.pm | 38 ++++++++++++ scripts/MDCPower.pm | 26 +++++--- scripts/mdc_voltage.pl | 8 +-- scripts/powerboard_status.pl | 115 +++++++++++++++++++++++++++++++++++ 4 files changed, 175 insertions(+), 12 deletions(-) create mode 100755 scripts/powerboard_status.pl diff --git a/scripts/MDC.pm b/scripts/MDC.pm index e12786e..1f1fd57 100644 --- a/scripts/MDC.pm +++ b/scripts/MDC.pm @@ -108,6 +108,44 @@ sub get_power_output { return($hostname,-1,-1); } + + +############################################################################### +#get the MBO a power output is connected to. +#returns (boardaddress) +############################################################################### +sub get_connected_board { + my ($h,$b,$o) = @_; + + my $pd_p; + my $pd_s; + + open FILE, "../installation/powerdistributor_positions.db" or die $!."\npowerdistributor_positions.db not found."; + while (my $a = ) { + if(my @values = $a =~ /^\s*(\d)\s+(\d)\s+(\d+)/) { + $pd_p = shift @values; + $pd_s = shift @values; + $id = shift @values; + last if "mdcpd".$id eq $h; + } + } + close FILE; + + + open FILE, "../installation/power_outputs.db" or die $!."\npower_outputs.db not found."; + while (my $a = ) { + if(my @values = $a =~ /^\s*(\d)\s+(\d)\s+(\d+)\s+(\d)\s+(\d)/) { + if($values[0] == $pd_p && $values[1] == $pd_s && $values[3] == $b && $values[4] == $o) { + return(get_address($pd_p,$pd_s,$values[2],5)); + } + } + } + + close FILE; + + return(-1); + } + 1; diff --git a/scripts/MDCPower.pm b/scripts/MDCPower.pm index 8b4ab65..4ff4602 100644 --- a/scripts/MDCPower.pm +++ b/scripts/MDCPower.pm @@ -12,8 +12,8 @@ use IO::Handle; use Time::HiRes qw( usleep); my $powerboard_registers = { - 'switch' => 0, - 'adjust' => 1, + 'switch' => 0, 'sw' => 0, + 'adjust' => 1, 'adj' => 1, 'vin' => 2, 'cin' => 3, 'curr' => 3, 'current' => 3, 'temp' => 4, @@ -166,9 +166,11 @@ sub powerboard_command { my $cmd = sprintf("%s%02x%01x%01x%01x%04x",$rw,$board&0xfF,$output,$channel,$command,$value&0xFFFF); my $ret = powerboard_SendCmd($host,$cmd); +# print $ret."\n"; return -7 unless defined $ret; return -8 unless length($ret)==10; - return -9 unless substr($ret,0,1) eq 'A'; + return -9 if substr($ret,0,3) eq 'Can'; + return -10 unless substr($ret,0,1) eq 'A'; my $answ = hex(substr($ret,6)); @@ -176,14 +178,14 @@ sub powerboard_command { return 1; } elsif($rw eq 'W') { - return -10; + return -11; } else { if($command == 0) { #Active $ret = $answ & 1; } if($command == 1) { #Level Select - $ret = $answ & 1; + $ret = $answ & 7; } if($command == 2) { #Input Voltage $ret = ($answ&0xFFFF)*417/27*2.5/1000; @@ -205,17 +207,25 @@ sub powerboard_command { return $ret; } + +my $port; +my $portHost = 0; ############################################################################### #RX/TX subroutine. not to be called directly ############################################################################### sub powerboard_SendCmd { my ($device,$c) = @_; - my $port = IO::Socket::INET->new(PeerAddr => $device, PeerPort => 2323, Proto => "tcp", Type => SOCK_STREAM, Timeout => 1, Blocking => 0) - or return "Can't bind to $device: $@\n"; + unless ($portHost eq $device && $port->connected()) { + $port->close() if $port; + $port = IO::Socket::INET->new(PeerAddr => $device, PeerPort => 2323, Proto => "tcp", Type => SOCK_STREAM, Timeout => 1, Blocking => 0) + or (print "Can't bind to $device: $@\n" and return); + } + $portHost = $device; + $c .= "\n"; print $port "$c"; my $x = ""; - for my $i (0..20) { + for my $i (0..40) { $x .= <$port>//''; if($x && (substr($x,-1) eq "\n" || substr($x,-1) eq "\r" || length($x)>=10) ) { chomp $x; diff --git a/scripts/mdc_voltage.pl b/scripts/mdc_voltage.pl index 46c30c2..f7d2496 100755 --- a/scripts/mdc_voltage.pl +++ b/scripts/mdc_voltage.pl @@ -119,10 +119,10 @@ elsif(defined $board && !defined $channel) { printf("%04x\t%u\t%u\n\n",$board,$v1,$v2); if(defined $load) { - MDCPower::set_voltage($board,0,$v1,0); - die "Setting voltage failed $_" unless $_ == 1; - MDCPower::set_voltage($board,1,$v2,0); - die "Setting voltage failed $_" unless $_ == 1; + my $ret = MDCPower::set_voltage($board,0,$v1,0); + die "Setting voltage failed $ret" unless $ret == 1; + $ret = MDCPower::set_voltage($board,1,$v2,0); + die "Setting voltage failed $ret" unless $ret == 1; } } diff --git a/scripts/powerboard_status.pl b/scripts/powerboard_status.pl new file mode 100755 index 0000000..527eaa0 --- /dev/null +++ b/scripts/powerboard_status.pl @@ -0,0 +1,115 @@ +#!/usr/bin/perl -w +use warnings; +no warnings "portable"; +use Getopt::Long; +use Data::Dumper; +use Time::HiRes qw(usleep); +use lib '.'; +use MDC; +use MDCPower; +no warnings 'numeric'; + +my $help; +my $board; +my $plane; +my $sector; +Getopt::Long::Configure(qw(gnu_getopt)); +GetOptions( + 'help|h' => \$help, + 'board|b=s' => \$board, + 'plane|p=s' => \$plane, + 'sector|s=s' => \$sector, + ); + +if($help) { +print < 0x8fff)) { + die "Wrong board address (8e00 - 8fff)\n"; + } +if(defined $plane && ($plane < 0 || $plane > 3)) { + die "Wrong plane number\n"; + } +if(defined $sector && ($sector < 0 || $sector > 5)) { + die "Wrong sector number\n"; + } + +my $host; +$board = MDC::get_address($plane,$sector,0,5) if defined $plane; +($host) = MDC::get_power_output($board) if defined $board; + +if(!defined $host || $host == -1) { + die "Powerboard not found\n"; + } + +my $data; + + +$data->[4]{temp} = MDCPower::powerboard_command($host,-1,0,0,"temp"); +for my $b (0..3) { + $data->[$b]{curr} = MDCPower::powerboard_command($host,$b,0,0,"curr"); + $data->[$b]{vin} = MDCPower::powerboard_command($host,$b,0,0,"vin"); + $data->[$b]{temp} = MDCPower::powerboard_command($host,$b,0,0,"temp"); + + for my $o (0..3) { + $data->[$b]{vout}[$o] = MDCPower::powerboard_command($host,$b,$o,0,"vout"); + $data->[$b]{switch}[$o] = MDCPower::powerboard_command($host,$b,$o,0,"switch"); + for my $c (0..1) { + $data->[$b]{adjust}[$o][$c] = MDCPower::powerboard_command($host,$b,$o,$c,"adjust"); + } + } + } + +my ($mdcp,$mdcs) = MDC::get_position($board); + +printf("\nMDC Powerboard \t Plane $mdcp \t Sector $mdcs\n"); + +my $t = sprintf("%.1f",$data->[4]{temp}); +printf("\t Board $host\t Temperature %s\n\n",$data->[4]{temp}<0?'--':$t); + +print("Board\tInput\tVoltage\tCurrent\tTemp\n"); +for my $b (0..3) { + my $a1 = sprintf("%.2f",$data->[$b]{vin}); + my $a2 = sprintf("%.2f",$data->[$b]{curr}); + my $a3 = sprintf("%.1f",$data->[$b]{temp}); + + printf("$b\t\t%s\t%s\t%s\n",$data->[$b]{vin}<0?'--':$a1, + $data->[$b]{curr}<0?'--':$a2, + $data->[$b]{temp}<0?'--':$a3); + } +print("\n\n"); +print("Output\tVoltage\tSet1\tSet2\tAddr\n"); + +for my $b (0..3) { + for my $o (0..3) { + my $a1 = sprintf("%.2f",$data->[$b]{vout}[$o]); + if ($data->[$b]{switch}[$o]==0) {$data->[$b]{vout}[$o] = -20;} + my $a2 = sprintf("%i",$data->[$b]{adjust}[$o][0]); + my $a3 = sprintf("%i",$data->[$b]{adjust}[$o][1]); + my $a4 = sprintf("%04x",MDC::get_connected_board($host,$b,$o)); + + printf("$b $o\t%s\t%s\t%s\t%.4s\n",$data->[$b]{vout}[$o]<0?'--':$a1 + ,$data->[$b]{adjust}[$o][0]<0?'--':$a2 + ,$data->[$b]{adjust}[$o][1]<0?'--':$a3 + ,$a4 + ); + } + } -- 2.43.0