mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-01-31 06:39:11 +00:00
44_S7:new attribute receiveTimeoutMs
git-svn-id: https://svn.fhem.de/fhem/trunk@14257 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
7bdca8c0c1
commit
fe36c9b731
@ -1,5 +1,6 @@
|
|||||||
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
||||||
# Do not insert empty lines here, update check depends on it.
|
# Do not insert empty lines here, update check depends on it.
|
||||||
|
- feature: 44_S7: new attribute receiveTimeoutMs
|
||||||
- feature: 38_CO20: introduced state reading
|
- feature: 38_CO20: introduced state reading
|
||||||
- change: 73_NUKIBridge,74_NUKIDevice: fix Perlwarnings
|
- change: 73_NUKIBridge,74_NUKIDevice: fix Perlwarnings
|
||||||
- bugfix: 38_CO20: fixed definition with serial number
|
- bugfix: 38_CO20: fixed definition with serial number
|
||||||
|
@ -57,7 +57,7 @@ sub S7_Initialize($) { #S5_OK
|
|||||||
$hash->{SetFn} = "S7_Set";
|
$hash->{SetFn} = "S7_Set";
|
||||||
|
|
||||||
$hash->{AttrFn} = "S7_Attr";
|
$hash->{AttrFn} = "S7_Attr";
|
||||||
$hash->{AttrList} = "MaxMessageLength Intervall " . $readingFnAttributes;
|
$hash->{AttrList} = "MaxMessageLength Intervall receiveTimeoutMs " . $readingFnAttributes;
|
||||||
|
|
||||||
# $hash->{AttrList} = join( " ", @areasconfig )." PLCTime";
|
# $hash->{AttrList} = join( " ", @areasconfig )." PLCTime";
|
||||||
}
|
}
|
||||||
@ -157,6 +157,8 @@ sub S7_reconnect($) { #S5 OK
|
|||||||
my $hash = shift @_;
|
my $hash = shift @_;
|
||||||
S7_disconnect($hash) if ( defined( $hash->{S7PLCClient} ) );
|
S7_disconnect($hash) if ( defined( $hash->{S7PLCClient} ) );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if ( $hash->{S7TYPE} eq "S5" ) {
|
if ( $hash->{S7TYPE} eq "S5" ) {
|
||||||
$hash->{S7PLCClient} = S5Client->new();
|
$hash->{S7PLCClient} = S5Client->new();
|
||||||
}
|
}
|
||||||
@ -239,7 +241,7 @@ sub S7_Define($$) { # S5 OK
|
|||||||
$hash->{LocalTSAP} = $LocalTSAP;
|
$hash->{LocalTSAP} = $LocalTSAP;
|
||||||
$hash->{RemoteTSAP} = $RemoteTSAP;
|
$hash->{RemoteTSAP} = $RemoteTSAP;
|
||||||
$hash->{maxPDUlength} = $PDUlength; #initial PDU length
|
$hash->{maxPDUlength} = $PDUlength; #initial PDU length
|
||||||
|
$hash->{receiveTimeoutMs} = 500; #default receiving timeout = 500ms
|
||||||
Log3 $name, 4,
|
Log3 $name, 4,
|
||||||
"S7: define $name PLC_address=$PLC_address,LocalTSAP=$LocalTSAP, RemoteTSAP=$RemoteTSAP ";
|
"S7: define $name PLC_address=$PLC_address,LocalTSAP=$LocalTSAP, RemoteTSAP=$RemoteTSAP ";
|
||||||
|
|
||||||
@ -325,7 +327,21 @@ sub S7_Attr(@) {
|
|||||||
|
|
||||||
Log3( $name, 3, "$name S7_Attr: setting Intervall= $aVal" );
|
Log3( $name, 3, "$name S7_Attr: setting Intervall= $aVal" );
|
||||||
}
|
}
|
||||||
|
} elsif ($aName eq "receiveTimeoutMs") {
|
||||||
|
if ( $aVal > 100 && $aVal < 10000) {
|
||||||
|
|
||||||
|
$hash->{receiveTimeoutMs} = $aVal;
|
||||||
|
|
||||||
|
Log3( $name, 3, "$name S7_Attr: setting receiveTimeoutMs= $aVal" );
|
||||||
|
|
||||||
|
#reconnect with the new receiving timeout
|
||||||
|
|
||||||
|
$hash->{S7PLCClient}->setRecvTimeout($hash->{receiveTimeoutMs}) if ( defined( $hash->{S7PLCClient} ) );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
###########
|
###########
|
||||||
|
|
||||||
if ( $aName eq "WriteInputs-Config"
|
if ( $aName eq "WriteInputs-Config"
|
||||||
@ -1101,158 +1117,218 @@ sub S7_readFromPLC($) { #S5 OK
|
|||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
=item summary basic interface to a SIEMENS S7 / S5
|
=item summary basic interface to a SIEMENS S7 / S5
|
||||||
=item summary_DE Schnittstelle zu einer Siemens S7 / S5
|
=item summary_DE Schnittstelle zu einer Siemens S7 / S5
|
||||||
=begin html
|
=begin html
|
||||||
|
|
||||||
<a name="S7"></a>
|
<p><a name="S7"></a></p>
|
||||||
<h3>S7</h3>
|
<h3>S7</h3>
|
||||||
<ul>
|
<ul>
|
||||||
This module connects a SIEMENS PLC (Note: also SIEMENS Logo is supported).
|
|
||||||
The TCP communication module is based on settimino (http://settimino.sourceforge.net)
|
|
||||||
|
|
||||||
You can found a german wiki here: httl://www.fhemwiki.de/wiki/S7
|
|
||||||
|
|
||||||
<br><br>
|
|
||||||
For the communication the following modules have been implemented:
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>S7 … sets up the communication channel to the PLC</li>
|
<ul>This module connects a SIEMENS PLC (S7,S5,SIEMENS Logo!). The TCP communication (S7, Siemens LOGO!) module is based on settimino (http://settimino.sourceforge.net). The serial Communication is based on a libnodave portation.</ul>
|
||||||
<li>S7_ARead … Is used for reading integer Values from the PLC</li>
|
|
||||||
<li>S7_AWrite … Is used for write integer Values to the PLC</li>
|
|
||||||
<li>S7_DRead … Is used for read bits </li>
|
|
||||||
<li>S7_DWrite … Is used for writing bits.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
</ul>
|
||||||
<br>
|
<p> </p>
|
||||||
Reading work flow:
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
The S7 module reads periodically the configured DB areas from the PLC and stores the data in an internal buffer. Then all reading client modules are informed. Each client module extracts his data and the corresponding readings are set.
|
|
||||||
<brl>
|
|
||||||
<brl>
|
|
||||||
Writing work flow:
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
At the S7 module you need to configure the PLC writing target. Also the S7 module holds a writing buffer. Which contains a master copy of the data needs to send.
|
|
||||||
<br>
|
|
||||||
(Note: after configuration of the writing area a copy from the PLC is read and used as initial fill-up of the writing buffer)
|
|
||||||
<br>
|
|
||||||
Note: The S7 module will send always the whole data block to the PLC.
|
|
||||||
When data on the clients modules is set then the client module updates the internal writing buffer on the S7 module and triggers the writing to the PLC.
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<a name="S7define"></a>
|
|
||||||
<b>Define</b>
|
|
||||||
<ul>
|
<ul>
|
||||||
<code>define <name> S7 <PLC_address> <rack> <slot> [<Interval>] </code><br><br>
|
<ul>You can found a german wiki here: httl://www.fhemwiki.de/wiki/S7</ul>
|
||||||
|
</ul>
|
||||||
<code>define logo S7 10.0.0.241 2 0 </code><br>
|
<p><br /><br /></p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>PLC_address … IP address of the S7 PLC (For S5 see below)</li>
|
<ul>For the communication the following modules have been implemented:
|
||||||
<li>rack … rack of the PLC</li>
|
<ul>
|
||||||
<li>slot … slot of the PLC</li>
|
<li>S7 … sets up the communication channel to the PLC</li>
|
||||||
<li>Interval … Intervall how often the modul should check if a reading is required</li>
|
<li>S7_ARead … Is used for reading integer Values from the PLC</li>
|
||||||
<br>
|
<li>S7_AWrite … Is used for write integer Values to the PLC</li>
|
||||||
|
<li>S7_DRead … Is used for read bits</li>
|
||||||
|
<li>S7_DWrite … Is used for writing bits.</li>
|
||||||
</ul>
|
</ul>
|
||||||
Note: For Siemens logo you should use a alternative (more simply configuration method):<br>
|
|
||||||
define logo S7 LOGO7 10.0.0.241
|
|
||||||
<br>
|
|
||||||
Note: For Siemens S5 you must use a alternative (more simply configuration method):<br>
|
|
||||||
define logo S7 S5 /dev/tty1
|
|
||||||
|
|
||||||
in this case the PLC_address is the serial port number
|
|
||||||
</ul>
|
</ul>
|
||||||
|
</ul>
|
||||||
<br><br>
|
<p><br /><br /></p>
|
||||||
<b>Attr</b><br>
|
<ul>
|
||||||
The following attributes are supported:<br>
|
<ul>Reading work flow:</ul>
|
||||||
|
</ul>
|
||||||
|
<p><br /><br /></p>
|
||||||
|
<ul>
|
||||||
|
<ul>The S7 module reads periodically the configured DB areas from the PLC and stores the data in an internal buffer. Then all reading client modules are informed. Each client module extracts his data and the corresponding readings are set. Writing work flow:</ul>
|
||||||
|
</ul>
|
||||||
|
<p><br /><br /></p>
|
||||||
|
<ul>
|
||||||
|
<ul>At the S7 module you need to configure the PLC writing target. Also the S7 module holds a writing buffer. Which contains a master copy of the data needs to send.</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>(Note: after configuration of the writing area a copy from the PLC is read and used as initial fill-up of the writing buffer)</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>Note: The S7 module will send always the whole data block to the PLC. When data on the clients modules is set then the client module updates the internal writing buffer on the S7 module and triggers the writing to the PLC.</ul>
|
||||||
|
</ul>
|
||||||
|
<p><br /><br /><a name="S7define"></a><strong>Define</strong><code>define <name> S7 <PLC_address> <rack> <slot> [<Interval>] </code><br /><br /><code>define logo S7 10.0.0.241 2 0 </code></p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<li>PLC_address … IP address of the S7 PLC (For S5 see below)</li>
|
||||||
|
<li>rack … rack of the PLC</li>
|
||||||
|
<li>slot … slot of the PLC</li>
|
||||||
|
<li>Interval … Intervall how often the modul should check if a reading is required</li>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul>Note: For Siemens logo you should use a alternative (more simply configuration method):</ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul><code>define logo S7 LOGO7 10.0.0.241</code></ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul>Note: For Siemens S5 you must use a alternative (more simply configuration method):</ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul>define logo S7 S5 /dev/tty1 in this case the PLC_address is the serial port number</ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p><br /><br /><strong>Attr</strong></p>
|
||||||
|
<ul>
|
||||||
|
<ul>The following attributes are supported:</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
<ul>
|
<ul>
|
||||||
<li>MaxMessageLength</li>
|
<li>MaxMessageLength</li>
|
||||||
<br>
|
<li>receiveTimeoutMs</li>
|
||||||
MaxMessageLength ... restricts the packet length if lower than the negioated PDULength. This could be used to increate the processing speed. 2 small packages may be smaler than one large package
|
<li>Intervall</li>
|
||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>MaxMessageLength ... restricts the packet length if lower than the negioated PDULength. This could be used to increate the processing speed. 2 small packages may be smaler than one large package</ul>
|
||||||
|
<ul>receiveTimeoutMs ... timeout in ms for TCP receiving packages. Default Value 500ms. </ul>
|
||||||
|
<ul>Intervall ... polling intervall in s </ul>
|
||||||
|
</ul>
|
||||||
|
|
||||||
=end html
|
=end html
|
||||||
|
|
||||||
=begin html_DE
|
=begin html_DE
|
||||||
|
|
||||||
|
|
||||||
<a name="S7"></a>
|
<p><a name="S7"></a></p>
|
||||||
<h3>S7</h3>
|
<h3>S7</h3>
|
||||||
<ul>
|
<ul>
|
||||||
This module connects a SIEMENS PLC (Note: also SIEMENS Logo is supported).
|
|
||||||
The TCP communication module is based on settimino (http://settimino.sourceforge.net)
|
|
||||||
|
|
||||||
You can found a german wiki here: httl://www.fhemwiki.de/wiki/S7
|
|
||||||
|
|
||||||
<br><br>
|
|
||||||
For the communication the following modules have been implemented:
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>S7 … sets up the communication channel to the PLC</li>
|
<ul>This module connects a SIEMENS PLC (S7,S5,SIEMENS Logo!). The TCP communication (S7, Siemens LOGO!) module is based on settimino (http://settimino.sourceforge.net). The serial Communication is based on a libnodave portation.</ul>
|
||||||
<li>S7_ARead … Is used for reading integer Values from the PLC</li>
|
|
||||||
<li>S7_AWrite … Is used for write integer Values to the PLC</li>
|
|
||||||
<li>S7_DRead … Is used for read bits </li>
|
|
||||||
<li>S7_DWrite … Is used for writing bits.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
</ul>
|
||||||
<br>
|
<p> </p>
|
||||||
Reading work flow:
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
The S7 module reads periodically the configured DB areas from the PLC and stores the data in an internal buffer. Then all reading client modules are informed. Each client module extracts his data and the corresponding readings are set.
|
|
||||||
<brl>
|
|
||||||
<brl>
|
|
||||||
Writing work flow:
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
At the S7 module you need to configure the PLC writing target. Also the S7 module holds a writing buffer. Which contains a master copy of the data needs to send.
|
|
||||||
<br>
|
|
||||||
(Note: after configuration of the writing area a copy from the PLC is read and used as initial fill-up of the writing buffer)
|
|
||||||
<br>
|
|
||||||
Note: The S7 module will send always the whole data block to the PLC.
|
|
||||||
When data on the clients modules is set then the client module updates the internal writing buffer on the S7 module and triggers the writing to the PLC.
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<a name="S7define"></a>
|
|
||||||
<b>Define</b>
|
|
||||||
<ul>
|
<ul>
|
||||||
<code>define <name> S7 <PLC_address> <rack> <slot> [<Interval>] </code><br><br>
|
<ul>You can found a german wiki here: httl://www.fhemwiki.de/wiki/S7</ul>
|
||||||
|
</ul>
|
||||||
<code>define logo S7 10.0.0.241 2 0 </code><br>
|
<p><br /><br /></p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>PLC_address … IP address of the S7 PLC (For S5 see below)</li>
|
<ul>For the communication the following modules have been implemented:
|
||||||
<li>rack … rack of the PLC</li>
|
<ul>
|
||||||
<li>slot … slot of the PLC</li>
|
<li>S7 … sets up the communication channel to the PLC</li>
|
||||||
<li>Interval … Intervall how often the modul should check if a reading is required</li>
|
<li>S7_ARead … Is used for reading integer Values from the PLC</li>
|
||||||
<br>
|
<li>S7_AWrite … Is used for write integer Values to the PLC</li>
|
||||||
|
<li>S7_DRead … Is used for read bits</li>
|
||||||
|
<li>S7_DWrite … Is used for writing bits.</li>
|
||||||
</ul>
|
</ul>
|
||||||
Note: For Siemens logo you should use a alternative (more simply configuration method):<br>
|
|
||||||
define logo S7 LOGO7 10.0.0.241
|
|
||||||
<br>
|
|
||||||
Note: For Siemens S5 you must use a alternative (more simply configuration method):<br>
|
|
||||||
define logo S7 S5 /dev/tty1
|
|
||||||
|
|
||||||
in this case the PLC_address is the serial port number
|
|
||||||
</ul>
|
</ul>
|
||||||
|
</ul>
|
||||||
<br><br>
|
<p><br /><br /></p>
|
||||||
<b>Attr</b><br>
|
<ul>
|
||||||
The following attributes are supported:<br>
|
<ul>Reading work flow:</ul>
|
||||||
|
</ul>
|
||||||
|
<p><br /><br /></p>
|
||||||
|
<ul>
|
||||||
|
<ul>The S7 module reads periodically the configured DB areas from the PLC and stores the data in an internal buffer. Then all reading client modules are informed. Each client module extracts his data and the corresponding readings are set. Writing work flow:</ul>
|
||||||
|
</ul>
|
||||||
|
<p><br /><br /></p>
|
||||||
|
<ul>
|
||||||
|
<ul>At the S7 module you need to configure the PLC writing target. Also the S7 module holds a writing buffer. Which contains a master copy of the data needs to send.</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>(Note: after configuration of the writing area a copy from the PLC is read and used as initial fill-up of the writing buffer)</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>Note: The S7 module will send always the whole data block to the PLC. When data on the clients modules is set then the client module updates the internal writing buffer on the S7 module and triggers the writing to the PLC.</ul>
|
||||||
|
</ul>
|
||||||
|
<p><br /><br /><a name="S7define"></a><strong>Define</strong><code>define <name> S7 <PLC_address> <rack> <slot> [<Interval>] </code><br /><br /><code>define logo S7 10.0.0.241 2 0 </code></p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<li>PLC_address … IP address of the S7 PLC (For S5 see below)</li>
|
||||||
|
<li>rack … rack of the PLC</li>
|
||||||
|
<li>slot … slot of the PLC</li>
|
||||||
|
<li>Interval … Intervall how often the modul should check if a reading is required</li>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul>Note: For Siemens logo you should use a alternative (more simply configuration method):</ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul><code>define logo S7 LOGO7 10.0.0.241</code></ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul>Note: For Siemens S5 you must use a alternative (more simply configuration method):</ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
|
<ul>define logo S7 S5 /dev/tty1 in this case the PLC_address is the serial port number</ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p><br /><br /><strong>Attr</strong></p>
|
||||||
|
<ul>
|
||||||
|
<ul>The following attributes are supported:</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>
|
||||||
<ul>
|
<ul>
|
||||||
<li>MaxMessageLength</li>
|
<li>MaxMessageLength</li>
|
||||||
<br>
|
<li>receiveTimeoutMs</li>
|
||||||
MaxMessageLength ... restricts the packet length if lower than the negioated PDULength. This could be used to increate the processing speed. 2 small packages may be smaler than one large package
|
<li>Intervall</li>
|
||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<p> </p>
|
||||||
|
<ul>
|
||||||
|
<ul>MaxMessageLength ... restricts the packet length if lower than the negioated PDULength. This could be used to increate the processing speed. 2 small packages may be smaler than one large package</ul>
|
||||||
|
<ul>receiveTimeoutMs ... timeout in ms for TCP receiving packages. Default Value 500ms. </ul>
|
||||||
|
<ul>Intervall ... polling intervall in s </ul>
|
||||||
|
</ul>
|
||||||
=end html_DE
|
=end html_DE
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
@ -419,6 +419,14 @@ sub PutFloatAt {
|
|||||||
return $self->setFloatAt( $Buffer, $index, $value );
|
return $self->setFloatAt( $Buffer, $index, $value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------------------------------------------------------
|
||||||
|
sub setRecvTimeout {
|
||||||
|
|
||||||
|
my ( $self, $newRecvTimeout ) = @_;
|
||||||
|
|
||||||
|
$self->{RecvTimeout} = $newRecvTimeout;
|
||||||
|
}
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
|
|
||||||
sub version {
|
sub version {
|
||||||
@ -427,6 +435,8 @@ sub version {
|
|||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub getErrorStr {
|
sub getErrorStr {
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -453,4 +463,4 @@ sub getErrorStr {
|
|||||||
</ul>
|
</ul>
|
||||||
=end html_DE
|
=end html_DE
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
Loading…
Reference in New Issue
Block a user