1
2
3
4
5
6
7
while(1)
{
if ($x > $y)
{ if (&timer(5) print "Zeit 5sek. sind abgelaufen"; }
sleep 1
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$pid=fork;
exit if $pid;
die "Fehler bei fork: $!" unless defined($pid);
use POSIX;
POSIX::setsid() or die "Konnte keine neue Session starten: $!";
$time_to_die = 0;
sub signal_handler {
$time_to_die=1;
}
$SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&signal_handler;
until ($time_to_die) {
sleep(1);
----- hier dann dein auszuführender code und sprung in die subroutinen..
}
1 2 3 4 5 6 7 8
use 5.010; sub stateful { state $x = 0; say "state is ", $state++; } stateful; # state is 0 stateful; # state is 1
2019-01-27T09:41:09 worst_caseClosure geht nicht, da ich ab dem 2. Aufruf die Parameter der Funktion nicht mehr verändern kann.
2019-01-27T09:41:09 worst_casemy_funktion1(1,100) 1=starte inkrement bis hundert
my_funktion2(1,300) 0=stoppe inkrement bis hundert
my_funktion3(1,100) 1=starte wieder vom internen Wert (state)
inkrement bis hundert
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/perl -w
###########################################################################
# Name : mystoerung
# Funktion : Stoerungen nur ueber die Visualisierung ausloesen
# Version : 0.1
# Datum : 25.01.2019
# Autor : PH
#
###################################################################################################
use strict;
use warnings;
use 5.010;
use tools;
use database_tools;
use Term::ANSIColor qw(:constants);
#print "\033[2J"; #clear the screen
#print "\033[0;0H"; #jump to 0,0
while (1)
{
my $SYS_Stoerung_32_1 = lesen_messwert_dez('SYS_Stoerung_32_1');
my $SYS_stoerung_abstellen = lesen_messwert_real('SYS_stoerung_abstellen');
print "$SYS_Stoerung_32_1\n";
print "$SYS_stoerung_abstellen\n";
if (lesen_messwert_real('SYS_stoerung_abstellen') > 200.0)
{ if(&timeon(1,15)) {setbit_key('SYS_Stoerung_32_1',16) }}
else
{ &timeon(0,0); clrbit_key('SYS_Stoerung_32_1',16) }
sleep 1;
#print "\033[2J"; #clear the screen
#print "\033[0;0H"; #jump to 0,0
}
####################################################################################################
# Parameter 1 = Startbit
# Bit = 0, Timer stoppt
# Bit = 1, Timer laeuft von "0" beginnend
# Bit = 1 -> 0 -> 1, Timer laeuft von "0" beginnend, Timer stoppt, Timer laeuft von "0" beginnend
# Parameter 2 = Verzögerungszeit in Sekunden
# Rückgabewert = 0 -> Zeit ist noch nicht abgelaufen bzw. wurde nicht gestartet
# 1 -> Zeit wurde gestartet und ist abgelaufen.
####################################################################################################
sub timeon
{
my ($start,$verzoegerung_sek) = @_;
my $aktzeit = time;
state $startzeit;
state $endzeit;
state $startflanke;
state $diffzeit;
my $retval;
if ($start)
{
if ($startflanke)
{
if ($aktzeit > $endzeit)
{$retval=1;}
else
{$retval=0; $diffzeit=$aktzeit-$startzeit;}
}
else { $startzeit=$aktzeit; $endzeit=$startzeit+$verzoegerung_sek; $diffzeit=0; $startflanke=1; $retval=0;}
}
else { $startzeit=0; $endzeit=0; $diffzeit=0; $startflanke=0; $retval=0;}
# print "Start:$start\nStartzeit:$startzeit\nEndzeit:$endzeit\nStartflanke:$startflanke\nLaufzeit:$diffzeit\nRetval:$retval\n\n";
return $retval;
}
1 2 3 4 5 6 7 8 9 10
my $t = Timer->new(); # ... $t->start(); # ... if ($t->elapsedSeconds() > 5) { ... } # ... $t->stop(); $t->continue(); $t->waitUntilElapsedSeconds(10); $t->start();
1
2
3
4
5
6
7
8
9
10
my $t = Timer->new();
# ...
$t->start();
# ...
if ($t->elapsedSeconds() > 5) { ... }
# ...
$t->stop();
$t->continue();
$t->waitUntilElapsedSeconds(10);
$t->start();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/usr/bin/perl use strict; use warnings; use 5.010; my $sub_timer = sub { my ($par) = @_; $par->{abgelaufen} ++; say "Pause $par->{abgelaufen}"; sleep 1; }; my %params = ( abgelaufen => 0, ); while ($params{abgelaufen} < 5) { $sub_timer->(\%params); } say "Fertig";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/perl -w
###########################################################################
# Name : mystoerung
# Funktion : Störungen nur über die Visualisierung auslösen
# Version : 0.1
# Datum : 25.01.2019
# Autor : PH
#
###################################################################################################
use strict;
use warnings;
use 5.010;
use tools;
use database_tools;
use Term::ANSIColor qw(:constants);
########################################################################################################################
# Parameter 1 = Startbit
# Bit = 0, Timer stoppt
# Bit = 1, Timer laeuft von "0" beginnend
# Bit = 1 -> 0 -> 1, Timer laeuft von "0" beginnend, Timer stoppt, Timer laeuft von "0" beginnend
# Parameter 2 = Verzögerungszeit in Sekunden
# Rückgabewert = 0 -> Zeit ist noch nicht abgelaufen bzw. wurde nicht gestartet
# 1 -> Zeit wurde gestartet und ist abgelaufen.
########################################################################################################################
my $sub_timer = sub
{
my ($para) = @_;
$para->{aktzeit} = time;
if ($para->{start})
{
if ($para->{startflanke})
{
if ($para->{aktzeit} > $para->{endzeit})
{ $para{retval}=1; }
else
{$para{retval}=0; $para{diffzeit}=$para{aktzeit}-$para{startzeit};}
}
else { $para{startzeit}=$para{aktzeit}; $para{endzeit}=$para{startzeit}+$para{verzoegerung_sek}; $para{diffzeit}=0; $para{startflanke}=1; $para{retval}=0;}
}
else { $para{startzeit}=0; $para{endzeit}=0; $para{diffzeit}=0; $para{startflanke}=0; $para{retval}=0;}
# print "Start:$start\nStartzeit:$startzeit\nEndzeit:$endzeit\nStartflanke:$startflanke\nLaufzeit:$diffzeit\nRetval:$retval\n\n";
return $para{retval};
}
########################################################################################################################
########################################################################################################################
#print "\033[2J"; #clear the screen
#print "\033[0;0H"; #jump to 0,0
## initialisieren Parameter ####
my %params1 = (start=>0,
verzoegerung_sek=>15,
startflanke=>0,
aktzeit=>0,
startzeit=>0,
endzeit=>0,
differenz=0,
retval=0
);
while (1)
{
$sub_timer->(\%params1);
my $SYS_Stoerung_32_1 = lesen_messwert_dez('SYS_Stoerung_32_1');
my $SYS_stoerung_abstellen = lesen_messwert_real('SYS_stoerung_abstellen');
# print "$SYS_Stoerung_32_1\n";
# print "$SYS_stoerung_abstellen\n";
if (lesen_messwert_real('SYS_stoerung_abstellen') > 200.0)
{ $params1{start} =1;
if($params1{retval}) {setbit_key('SYS_Stoerung_32_1',16) }
}
else
{ $params1{start}=0; clrbit_key('SYS_Stoerung_32_1',16) }
sleep 1;
#print "\033[2J"; #clear the screen
#print "\033[0;0H"; #jump to 0,0
}