Thread sub mit statischem Speicher (28 answers)
Opened by worst_case at 2019-01-26 20:27

worst_case
 2019-01-27 12:04
#189620 #189620
User since
2007-08-18
46 Artikel
BenutzerIn
[default_avatar]
Hallo,

hier einmal ein komplettes Beispiel was ich will

Code: (dl )
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;
}


Die Funktion "timeon" soll später in die "database_tools"
Term::ANSIColor qw(:constants) kommt wieder raus und ist nur zum testen.

Wenn ich nun die Funktion timeon wieder (andere Parameter) starten will, werden die gleichen Werte wie beim ersten verwendet, daher brauche ich eine Kopie der Funktion mit eigenem Speicherbereich.

Ich hoffe ich konnte es etwas besser erklären.

Danke

View full thread sub mit statischem Speicher