diff --git a/fhem/CHANGED b/fhem/CHANGED index a4f6b686f..dd3685364 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # 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. + - feature: 44_S7_ARead: supports for Logo7 and Logo8 short notations + - feature: 44_S7_AWrite: supports for Logo7 and Logo8 short notations - feature: 37_Spotify: specify default device by its name - feature: 98_alarmclock: New feature stop Alarm - bugfix: 98_DOIFtools: fixed empty N_timer diff --git a/fhem/FHEM/44_S7_ARead.pm b/fhem/FHEM/44_S7_ARead.pm index 9bbb58f9f..49e1208ee 100644 --- a/fhem/FHEM/44_S7_ARead.pm +++ b/fhem/FHEM/44_S7_ARead.pm @@ -50,36 +50,137 @@ sub S7_ARead_Define($$) { my ( $name, $area, $DB, $start, $datatype ); $name = $a[0]; - $area = lc $a[2]; - $DB = $a[3]; - $start = $a[4]; - $datatype = lc $a[5]; + if ( uc $a[2] =~ m/^[NA](\d*)/ ) { + my $Offset; + $area = "db"; + $DB = 0; + my $startposition; - if ( $area ne "inputs" - && $area ne "outputs" - && $area ne "flags" - && $area ne "db" ) - { - my $msg = -"wrong syntax: define S7_ARead {inputs|outputs|flags|db} {u8|s8|u16|s16|u32|s32|float}"; + if ( uc $a[2] =~ m/^AI(\d*)/ ) { + $startposition = 2; + + if ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO7" ) { + $Offset = 926; + } + elsif ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO8" ) { + $Offset = 1032; + } + else { + my $msg = +"wrong syntax : define S7_ARead {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_ARead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } + + } + elsif ( uc $a[2] =~ m/^AQ(\d*)/ ) { + $startposition = 2; + + if ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO7" ) { + $Offset = 944; + } + elsif ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO8" ) { + $Offset = 1072; + } + else { + my $msg = +"wrong syntax : define S7_ARead {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_ARead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } + + } + elsif ( uc $a[2] =~ m/^AM(\d*)/ ) { + $startposition = 2; + + if ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO7" ) { + $Offset = 952; + } + elsif ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO8" ) { + $Offset = 1118; + } + else { + my $msg = +"wrong syntax : define S7_ARead {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_ARead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } + } + + elsif ( uc $a[2] =~ m/^NAI(\d*)/ ) { + $startposition = 3; + if ( $hash->{IODev}{S7TYPE} eq "LOGO8" ) { + $Offset = 1262; + } + else { + my $msg = +"wrong syntax : define S7_ARead {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_ARead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } + } + elsif ( uc $a[2] =~ m/^NAQ(\d*)/ ) { + $startposition = 3; + if ( $hash->{IODev}{S7TYPE} eq "LOGO8" ) { + $Offset = 1406; + } + else { + my $msg = +"wrong syntax : define S7_ARead {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_ARead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } + } + else { + my $msg = +"wrong syntax : define S7_ARead {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_ARead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } + + $start = $Offset + ((int( substr( $a[2], $startposition ) ) - 1)*2); + $datatype = "u16"; - Log3 undef, 2, $msg; - return $msg; } + else { + + $area = lc $a[2]; + $DB = $a[3]; + $start = $a[4]; + $datatype = lc $a[5]; - if ( $datatype ne "u8" - && $datatype ne "s8" - && $datatype ne "u16" - && $datatype ne "s16" - && $datatype ne "u32" - && $datatype ne "s32" - && $datatype ne "float" ) - { - my $msg = -"wrong syntax: define S7_ARead {inputs|outputs|flags|db} {u8|s8|u16|s16|u32|s32|float}"; + if ( $area ne "inputs" + && $area ne "outputs" + && $area ne "flags" + && $area ne "db" ) + { + my $msg = +"wrong syntax: define S7_ARead {inputs|outputs|flags|db} {u8|s8|u16|s16|u32|s32|float} \n Only for Logo7 or Logo8:\n define S7_ARead {AI|AM|AQ|NAI|NAQ}"; - Log3 undef, 2, $msg; - return $msg; + Log3 undef, 2, $msg; + return $msg; + } + + if ( $datatype ne "u8" + && $datatype ne "s8" + && $datatype ne "u16" + && $datatype ne "s16" + && $datatype ne "u32" + && $datatype ne "s32" + && $datatype ne "float" ) + { + my $msg = +"wrong syntax: define S7_ARead {inputs|outputs|flags|db} {u8|s8|u16|s16|u32|s32|float} \n Only for Logo7 or Logo8:\n define S7_ARead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } } $hash->{AREA} = $area; @@ -445,4 +546,4 @@ newValue = <multiplicator> * Value + <offset> =end html_DE -=cut \ No newline at end of file +=cut diff --git a/fhem/FHEM/44_S7_AWrite.pm b/fhem/FHEM/44_S7_AWrite.pm index 824c9cb49..30f041dd8 100644 --- a/fhem/FHEM/44_S7_AWrite.pm +++ b/fhem/FHEM/44_S7_AWrite.pm @@ -41,54 +41,156 @@ sub S7_AWrite_Define($$) { my ( $name, $area, $DB, $start, $datatype, $length ); $name = $a[0]; - $area = lc $a[2]; - $DB = $a[3]; - $start = $a[4]; - $datatype = lc $a[5]; + + if ( uc $a[2] =~ m/^[NA](\d*)/ ) { + my $Offset; + $area = "db"; + $DB = 0; + my $startposition; - Log3 $name, 5, "$name S7_AWrite_Define called"; + if ( uc $a[2] =~ m/^AI(\d*)/ ) { + $startposition = 2; + + if ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO7" ) { + $Offset = 926; + } + elsif ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO8" ) { + $Offset = 1032; + } + else { + my $msg = +"wrong syntax : define S7_AWrite {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_DRead {AI|AM|AQ|NAI|NAQ}"; - if ( $area ne "inputs" - && $area ne "outputs" - && $area ne "flags" - && $area ne "db" ) - { - my $msg = -"$name wrong syntax: define S7_AWrite {inputs|outputs|flags|db} {u8|s8|u16|s16|u32|s32|float}"; + Log3 undef, 2, $msg; + return $msg; + } + + } + elsif ( uc $a[2] =~ m/^AQ(\d*)/ ) { + $startposition = 2; + + if ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO7" ) { + $Offset = 944; + } + elsif ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO8" ) { + $Offset = 1072; + } + else { + my $msg = +"wrong syntax : define S7_AWrite {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_DRead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } + + } + elsif ( uc $a[2] =~ m/^AM(\d*)/ ) { + $startposition = 2; + + if ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO7" ) { + $Offset = 952; + } + elsif ( defined($hash->{IODev}{S7TYPE}) && $hash->{IODev}{S7TYPE} eq "LOGO8" ) { + $Offset = 1118; + } + else { + my $msg = +"wrong syntax : define S7_AWrite {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_DRead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } + } + + elsif ( uc $a[2] =~ m/^NAI(\d*)/ ) { + $startposition = 3; + if ( $hash->{IODev}{S7TYPE} eq "LOGO8" ) { + $Offset = 1262; + } + else { + my $msg = +"wrong syntax : define S7_AWrite {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_DRead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } + } + elsif ( uc $a[2] =~ m/^NAQ(\d*)/ ) { + $startposition = 3; + if ( $hash->{IODev}{S7TYPE} eq "LOGO8" ) { + $Offset = 1406; + } + else { + my $msg = +"wrong syntax : define S7_AWrite {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_DRead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } + } + else { + my $msg = +"wrong syntax : define S7_AWrite {inputs|outputs|flags|db}
\n Only for Logo7 or Logo8:\n define S7_DRead {AI|AM|AQ|NAI|NAQ}"; + + Log3 undef, 2, $msg; + return $msg; + } + + $start = $Offset + ((int( substr( $a[2], $startposition ) ) - 1)*2); + $datatype = "u16"; - Log3 $name, 2, $msg; - return $msg; } + else { + + $area = lc $a[2]; + $DB = $a[3]; + $start = $a[4]; + $datatype = lc $a[5]; - if ( $datatype ne "u8" - && $datatype ne "s8" - && $datatype ne "u16" - && $datatype ne "s16" - && $datatype ne "u32" - && $datatype ne "s32" - && $datatype ne "float" ) - { - my $msg = -"$name wrong syntax: define S7_AWrite {inputs|outputs|flags|db} {u8|s8|u16|s16|u32|s32|float}"; + Log3 $name, 5, "$name S7_AWrite_Define called"; - Log3 $name, 2, $msg; - return $msg; + if ( $area ne "inputs" + && $area ne "outputs" + && $area ne "flags" + && $area ne "db" ) + { + my $msg = +"$name wrong syntax: define S7_AWrite {inputs|outputs|flags|db} {u8|s8|u16|s16|u32|s32|float} \n Only for Logo7 or Logo8:\n define S7_AWrite {AI|AM|AQ|NAI|NAQ}"; + + Log3 $name, 2, $msg; + return $msg; + } + + if ( $datatype ne "u8" + && $datatype ne "s8" + && $datatype ne "u16" + && $datatype ne "s16" + && $datatype ne "u32" + && $datatype ne "s32" + && $datatype ne "float" ) + { + my $msg = +"$name wrong syntax: define S7_AWrite {inputs|outputs|flags|db} {u8|s8|u16|s16|u32|s32|float} \n Only for Logo7 or Logo8:\n define S7_AWrite {AI|AM|AQ|NAI|NAQ}"; + + Log3 $name, 2, $msg; + return $msg; + } + + + my $sname = $hash->{IODev}{NAME}; + + if ( $datatype eq "u16" || $datatype eq "s16" ) { + $length = 2; + } + elsif ( $datatype eq "u32" || $datatype eq "s32" || $datatype eq "float" ) { + $length = 4; + } + else { + $length = 1; + } } - AssignIoPort($hash); # logisches modul an physikalisches binden !!! - my $sname = $hash->{IODev}{NAME}; - - if ( $datatype eq "u16" || $datatype eq "s16" ) { - $length = 2; - } - elsif ( $datatype eq "u32" || $datatype eq "s32" || $datatype eq "float" ) { - $length = 4; - } - else { - $length = 1; - } - $hash->{AREA} = $area; $hash->{DB} = $DB; $hash->{ADDRESS} = $start;