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