Nilan Integer Temperaturformat

Hallo Forum,

Habe hier einen Nilan VP18 compact per Modbus RTU in IP Symcon eingebunden, es funktioniert
an sich ganz gut, bis auf das, daß der Nilan manche Variablen im Hintergrund interaktiv ändert,
zB wenn ich die Lüfterstufe ändere, ändert sich die Variable für den Betriebsmodus mit, ich brauche also für jede Lüfterstufe eine andere Betriebsmodusvariable…
Das ist nun aber nicht der Grund für meine Frage.

Nilan gibt die Temperaturwerte als Integer aus, und leider im vierstelligen Format.
22,5 Grad werden als 2250 ausgegeben usw…
Wie bringe ich nun Webfront dazu, den Wert quasi dividiert durch Hundert auszugeben.
(Fließkomma wird ja von Nilan nicht verwendet, das macht die Sache nicht leichter.)
Gibt es da die Möglichkeit eines Scripts das mir den Wert für die Ausgabe modifiziert ?
Wenn ja wie soll das aussehen ? - bin leider kein php Auskenner !

Hallo,

dein erstes Problem verstehe ich nicht, liegt evtl. daran, dass ich die Hardware nicht habe --> genauer beschreiben.

Zu deiner Integer-Temperatur-Variable, versuch mal folgendes:

  1. Eine Float variable anlegen.
  2. Ein Script anlegen mit folgendem Inhalt:
<?

$VarIdNilan = 12345 ; //Id der Variable mit der Temperatur, die als Integer vorliegt
$VarIdGleitkomma = 54321 ; //Id einer Float variable, die du vorher angelegt hast


$VarValNilan = GetValueInteger ($VarIdNilan);
$VarValGleitkomma = $VarValNilan / 100;

SetValueFloat ($VarIdGleitkomma, $VarValGleitkomma);

?>

  1. Ereignis hinzufügen --> ausgelöstes Ereignis --> deine „Quelle-Variable“ raussuchen --> „Bei Variablenänderung“

Gruß

Julian

Hallo,
Beschreibt das Problem mit dem Betriebsmodus doch mal genauer.
Ich habe die Vp18 mittlerweile zu ca. 80% integriert. Kann mir aber noch nicht ganz vorstellen, wos da genau haken soll ?
Gruss
Hilli

@Inspra:

Danke für den Code !, werde es in einer ruhigen Stunde ausprobieren !

@Hilli75:

zB.:
Wenn ich die Lüfterstufe auf Lese/Schreibadresse 1003 auf 3 stehen habe, bekomme ich auf Adresse 1002 für den Betriebsmodus „Auto“ den Lese/Schreib-Wert 196611 geliefert (DWORD)
Wenn ich nun die Lüfterstufe auf 2 ändere, bekomme ich beim gleichen Betriebsmodus „Auto“ den Lese/Schreib - Wert 131075.

Kannst Du das reproduzieren ?

Beim Einlesen von z.b. 1002 darfst du nicht Dword einlesen, sonst liest du Register 1003 mit ein.
1 Register = 1 Word. --> DWord = 2 Register.

Leg die Modbusinstanz für 1002 Lesen als Word 16 bit unsigned an, dann wirst du den richtigen Wert einlesen.

Schwieriger wird es beim Schreiben ins Register.
Mit IPS kann man leider nur Dword mit Funtioncode 16 schreiben.
D.h. Man muss immer das „nächste“ Register einlesen , und dem zum schreiben gewünschten Wert „addieren“.
Oder man schreibt sich eine Funtion, welche direkt über die Com Schnittstelle auf die gewünschte Adresse einen Wert schreibt. Kann ich gerne hier einstellen, falls erwünscht.
Gruß
Hilli

@Hilli75

Ok, scheint an der Konfiguration zu liegen !
Kannst du mir bitte das mit dem Schreiben durch ein Beispiel verdeutlichen ?

Wenn ich das halbwegs verstanden habe, kann man in Webfront hier nicht einfach eine Reihe Buttons mit den Parametern anlegen,
über die man zugleich die Werte liest und schreibt, sondern muß wohl zwei getrennte Instanzen-Zeilen mit einmal lesen und einmal schreiben anlegen.
Stimmt das ?
lg
Gerald

Guten Morgähn,

ja stimmt genau.
z.B.: Warmwassertemperatur oben einstellen.

1 x Modbusinstanz für Lesen (WORD, 1700, 1700)
1 x Modbusinstanz für Schreiben (DWORD, 1700, 1700)

Hier siehst du auch das Problem beim Schreiben des 1700 Registers. DWORD.

Vorher kurz zur Erklärung :
Die Nilan unterstützt nur folgende Modbus Functions :
03 Read Holding Register.(LESE Register auslesen)
04 Read Input Register. (SCHREIB Register auslesen)
16 Write Multiple Register (in mehrere SCHREIB Register schreiben)

IP SYMCON kann leider mit Funktion Code 16 nur DWORD Werte schreiben.
Oder anders rum, wenn du in der Modbusinstanz erreichen willst, das der Wert mit Function Code 16 geschrieben wird mußt du als Einheit DWORD wählen.

Dword ist ein 32bit Wert. Ein Register hat aber nur 16 bit.

Als Beispiel:

Du willst eine Wassertemperatur oben von 45 Grad per Modubus einstellen.
Du schreibst also den Wert 45 als DWORD an die Adresse 1700.
45 Grad als 16 bit Hex : 002D
45 Grad als 32 bit Hex : 0000002D
In der Splitter Instanz MODBUS RTU/TCP ist eingestellt LSW/MSW für 32bite Werte vertauschen -->
der Wert der an die Adresse 1700 gesendet wird ist 002D0000.
Dieser Wert ist also zu Groß für ein Register. Hier paßt nur 002D rein, die 0000 werden daher in Register 1701 geschrieben.

Abhilfe :
-Man kann vorm Schreiben in 1700 das Register 1701 auslesen, den Wert zum Schreibwert hinzufügen und dann den Gesamtwert ins 1700er schreiben.

<?

$reg1700 = getvalue(26199 /*[Nilan\Information\Wasser oben\Wasser oben]*/)*100;
$reg1701 = getvalue(14247 /*[Nilan\Information\Wasser unten\Wasser Unten]*/)*100;
$hex0 = dechex($reg1700);
$hex1 = dechex($reg1701);
$hex0 = str_pad($hex0, 4 ,'0', STR_PAD_LEFT); //führende Null hinzufügen
$hex1 = str_pad($hex1, 4 ,'0', STR_PAD_LEFT); //führende Null hinzufügen
$hex=$hex1.$hex0;
$wert=hexdec($hex);
?>

-Eine Funktion schreiben, welche die Daten vorbereitet und an die RS485 Schnittstelle sendet, und auf die Modbusfunktionen von IPSYMCON gänzlich verzichtet.

<?
function crc16($string,$length=0){
    $auchCRCHi=array(    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
                0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
                0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
                0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
                0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
                0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
                0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
                0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
                0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
                0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
                0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
                0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
                0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
                0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
                0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
                0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
                0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
                0x40);
    $auchCRCLo=array(    0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
                0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
                0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
                0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
                0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
                0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
                0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
                0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
                0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
                0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
                0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
                0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
                0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
                0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
                0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
                0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
                0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
                0x40);
    $string1 = preg_replace("/([0-9A-Fa-f]{2})/e", "chr(0x\\1)", $string);
    $string = $string1;
    $length        =($length<=0?strlen($string):$length);
    $uchCRCHi    =0xFF;
    $uchCRCLo    =0xFF;
    $uIndex        =0;
    for ($i=0;$i<$length;$i++){
        $uIndex        =$uchCRCLo ^ ord(substr($string,$i,1));
        $uchCRCLo    =$uchCRCHi ^ $auchCRCHi[$uIndex];
        $uchCRCHi    =$auchCRCLo[$uIndex] ;
    }
    
    $st1 = dechex($uchCRCLo);
    $st2 = dechex($uchCRCHi);
    $St3 = str_pad($st1, 2 ,'0', STR_PAD_LEFT);
    $St4 = str_pad($st2, 2 ,'0', STR_PAD_LEFT);
    return($St3.$St4)  ;
}

  
  $test1="";
  
  $Adresse_hex = str_pad(dechex($adresse), 4 ,'0', STR_PAD_LEFT);
  $Wert_hex = str_pad(dechex($Wert), 4 ,'0', STR_PAD_LEFT);
  $Comstring_ohneCRC = "1E"."10".$Adresse_hex."000102".$Wert_hex;
  
 
  $ID=11418 /*[Serial Port]*/;
  $CRC = crc16($Comstring_ohneCRC);
  $Comstring=$Comstring_ohneCRC.$CRC;
 
  for($i=0;$i<strlen($Comstring);$i+=2) $test1 .= chr(hexdec(substr($Comstring,$i,2)));

  COMPort_SendText($ID,$test1);
  													
 
?>

Aufgerufen wird die Funktion : IPS_RunScriptex(ID des Modbusscripts ,array(„adresse“ => 1700, „Wert“ => 45));

Falls jemand mitliest und andere Lösungen weiß bitte mitteilen.

Wünsch einen schönen Tag

Na da hab ich jetzt ja ganz schön zu tun!
Muß einmal ausprobieren, ob ich das alles hinkriege.
Danke Hilli für die ausführliche Anleitung inkl Scripts !

gerald

Kein Problem.

Wenn noch Fragen auftauchen einfach melden.