2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-09 20:57:11 +00:00

44_S7_ARead: supports for Logo7 and Logo8 short notations AI,AQ,AM,NAI,NAQ

git-svn-id: https://svn.fhem.de/fhem/trunk@14456 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
charlie71 2017-06-03 06:49:05 +00:00
parent f74c3ba12f
commit 92ec898c4f
3 changed files with 270 additions and 65 deletions

View File

@ -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

View File

@ -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 <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {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 <name> S7_ARead {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_ARead {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_ARead {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_ARead {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_ARead {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> S7_ARead {AI|AM|AQ|NAI|NAQ}";
Log3 undef, 2, $msg;
return $msg;
}
}
else {
my $msg =
"wrong syntax : define <name> S7_ARead {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {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 <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float} \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_ARead {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float} \n Only for Logo7 or Logo8:\n define <name> S7_ARead {AI|AM|AQ|NAI|NAQ}";
Log3 undef, 2, $msg;
return $msg;
}
}
$hash->{AREA} = $area;
@ -445,4 +546,4 @@ newValue = &lt;multiplicator&gt; * Value + &lt;offset&gt;
</ul>
=end html_DE
=cut
=cut

View File

@ -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 <name> S7_AWrite {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {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 <name> S7_AWrite {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_AWrite {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_AWrite {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_AWrite {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> S7_DRead {AI|AM|AQ|NAI|NAQ}";
Log3 undef, 2, $msg;
return $msg;
}
}
else {
my $msg =
"wrong syntax : define <name> S7_AWrite {inputs|outputs|flags|db} <DB> <address> \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {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 <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float} \n Only for Logo7 or Logo8:\n define <name> 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 <name> S7_AWrite {inputs|outputs|flags|db} <DB> <start> {u8|s8|u16|s16|u32|s32|float} \n Only for Logo7 or Logo8:\n define <name> 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;