MODBUS Device anlegen

Ich habe einen Bodenfeuchtesensor der über RS485 MODBUS angesteuert werden kann. Es gibt in IPS ein ModBus Device. Muss ich wirklich für jede Adresse ein separates Device anlegen? Das wäre sehr umständlich.
Die Daten stehen in 2 Registern und werden mit Funktion 04 ausgelesen?

Ja, wobei du nur ein Gerät hast, welches auch nur eine Adresse hat. Und entsprechend brauchst du nur ein Modbus Gateway mit der Adresse.
Bei den Registern brauchst du pro Register ein Modbus-Device.

Warum? Wie viele Werte kann so ein Sensor den haben?

Was soll uns diese Frage sagen?
Wenn du eine Doku von den Registern hast, dann hast du die Daten doch.
Michael

Der Sensor hat mehrere Werte die auf 4 Bytes Verteilt sind. Aus jeweils 2 Bytes berechnet sich der Wert. In dem Falle Bodenfeuchte und Temperatur.

Dann sind das genau zwei Instanzen.
Was ist daran jetzt aufwendig?
Michael

4 Instanzen da es ja 4 Register sind, und ich habe 4 Sensoren.
das sind dann 16 :slight_smile:

Die verschiedenen Datentypen ausprobiert?
Größere Einheiten werden über ein Register und mehreren aufeinander folgenden Bytes ausgelesen. Wenn der Wert falsch ist, den Swap im Modbus-Gateway ausprobieren.
Es sollte nur eine Instanz für Feuchtigkeit und eine für Temperature nötig sein.

:roll_eyes:
Michael

@ zman0801
Für mich wäre zum besseren Verständnis ein PDF mit Modbusadressen interessant.
Dann könnte ich mal Beispiele ausprobieren und zeigen.
Gruß Helmut

Fix ein Skript geschrieben. Fertig.

Ich habe jetzt ein Script ohne Modbus Instanz geschrieben. Funktioniert ,fertig :slight_smile:

Aha,
ein Script das Modbusdaten bearbeitet welche keine Modbusinstanz haben, würde mich interessieren wie man Das denn macht.

Ich mache es über einen UDP Socket über einen RS485 Wifi Server HF2211S. Es geht aber auch über einen seriellen Port.

<?php
function CalcModbusCRC($string) {
  $crc = 0xFFFF;
  for ($x = 0; $x < strlen ($string); $x++) {
    $crc = $crc ^ ord($string[$x]);
    for ($y = 0; $y < 8; $y++) {
      if (($crc & 0x0001) == 0x0001) {
        $crc = (($crc >> 1) ^ 0xA001);
      } else { $crc = $crc >> 1; }
    }
  }
  $arCRC["L"] = ($crc & 0x00FF);
  $arCRC["H"] = (($crc & 0xFF00) >> 8);
  $arCRC["DEC"] = (($crc & 0x00FF) << 8) + (($crc & 0xFF00) >> 8);
  $arCRC["CRC_LH"] = chr($arCRC["L"]).chr($arCRC["H"]);
  $arCRC["CRC_HL"] = chr($arCRC["H"]).chr($arCRC["L"]);
  return $arCRC;
}


$data = chr(0x0B).chr(0x04).chr(0x00).chr(0x00).chr(0x00).chr(0x03);
$data = $data.CalcModbusCRC($data)["CRC_LH"];
$ID_SOCKET = 16126;
USCK_SendText($ID_SOCKET, $data );
?>

Empfangen geht so…

<?php
include(IPS_GetScriptIDByName("include_Modbus",12998 ).".ips.php");

if ($_IPS['SENDER'] == "RegisterVariable") {
    $ID_RegVar = IPS_GetParent($_IPS['SELF']);
    $Len = strlen($_IPS['VALUE']);
    $Data = $_IPS['VALUE'];
    $DeviceID = ord($Data[0]);
    $FunctionID = ord($Data[1]);
    $AnzahlBytes = ord($Data[2]);
    if (($AnzahlBytes > 0) and ($FunctionID == 4)) {
        //print_r("Device ".$DeviceID."\n");
        //print_r("Function ".$FunctionID."\n");
        //print_r("AnzahlBytes ".$AnzahlBytes."\n");
        $Len = 3 + $AnzahlBytes + 2;
        if (strlen($Data) >= $Len) {
            $Data=substr($Data,0,$Len);
            $crc = (ord($Data[$Len-2]) << 8) + ord($Data[$Len-1]);
        }
        if ($crc == CalcModbusCRC(substr($Data,0,$Len-2))["DEC"]) {
            if ($DeviceID == 11) {
                setvaluefloat(31874, ((ord($Data[5]) * 256) + ord($Data[6])) / 100);
                setvaluefloat(51920, ((ord($Data[3]) * 256) + ord($Data[4])) / 100 );
            }
        }
    }
    RegVar_SetBuffer($ID_RegVar, "");  
}
?>

Nur noch eine Frage: lag es daran, dass Du dieses Interface hattest oder an was anderem, dass Du keine Modbus INstance nehmen wolltest?
Da hättest Du nix mit CRC und so’n tütelüt machen brauchen :wink:

Ich hätte so viele Instanzen anlegen müssen. Dann hätte jede Instanz selbst das Register abgefragt. Da die Werte in unterschiedlichen Registern stehen und von unterschiedlichen Instanzen abgefragt werden weiß ich nicht ob die Werte dann zueinander gehören um z.B. die Bodenfeuchte zu berechnen. Dann hab ich es lieber selbst programmiert und weiß das die Werte zusammen gehören da sie dann garantiert aus einem Datensatz stammen.