3964/3964R-Protokoll unter linux / Buderus Logamatic 4000

Hallo community,

kann mir jemand behilflich sein eine serielle Verbindung mit 3964/3964R-Protokoll aufzubauen.
Mein aktuelles Problem ist, daß ich keinen Protokolltreiber für Linux finde.
Hat jemand sowas schon im Einsatz?

Die eigentliche Anwendung dahinter ist die Anbindung meiner Buderus Logamatic 4000 Anbindung über das RS232 Gateway. Hat unter Windows mit einem Protokolltreiber von leaoil gut funktioniert.

VG, Hermann

Das Protokoll 3964 bzw. 3964R ist gewöhnlicherweise ein serielles Siemens-Protokoll zur Kommunikation mit SPS-Steuerungen.
Schau mal nach libnodave. Darüber sollte es funktionieren.

hallo Dieter,

besten Dank für den Tip. Habe libnodave-0.8.5 auf meinem Banana Pi-R1 kompiliert (im Makefile das workaround für Arm Prozessoren auskommentiert)

CFLAGS+=-DARM_FIX

Mein Buderus RS232 Gateway hängt an einem Perle Iolan STS16 (RS232 Server) und wird unter TCP-Port 10001 mit Baudrate 9600, 8,N,1 angesprochen.

Gibt es unter libnodave ein Serverprogramm, welches die Kommunikation über 3964R zwischen meinem Port 10001 (Buderus RS232 Gateway, Perle STS16) und einem lokalen Port am Banana PI (welcher dann durch Symcon ausgewertet werden kann) regelt?

Komme an diesem Punkt irgendwie nicht weiter?

Danke und VG,
Hermann

Hallo zusammen,

Die Frage geht eher an die Entwickler.

Ist es geplant für die Linux Version von Symcon auch ein Modul zur Anbindung von S5 und S7 SPSen zur Verfügung zu stellen?
Falls ja wann und ist es in diesem Zuge auch möglich, das Protokoll 3964/3964R basierend auf eine serielle Schnittstelle mit einzubinden ?

Gruß,
Hermann

libnodave hilft dir hier nicht weiter. Du brauchst von Perle einen Treiber, der dir einen (virtuellen) seriellen Port auf deinem Banana Pi zur Verfügung stellt. Ich glaub bei Perle nennt sich das True Port.

Gruß
Dieter

Hallo Dieter,

danke für die Anmerkung. Das Problem ist nicht der Perle. Es geht hier rein um die Sicherungsschicht.
:

ISO/OSI Modell

7 Anwenderschicht N/A
6 Darstellungsschicht N/A
5 Sitzungsschicht N/A
4 Transportschicht N/A
3 Vermittlungsschicht N/A
2 Sicherungsschicht 3964/3964R
1 Bitübertragungsschicht RS232

Erklärung:
Das Protokoll 3964R (auch DUST genannt) erfüllt die Funktion einer Sicherungsschicht und ist damit kein vollwertiges Protokoll. Es erlaubt die transparente Übertragung von Datenblöcken zwischen zwei Stationen, die Punkt-zu-Punkt verbunden sind. Die Kommunikation erfolgt im halbduplex Modus.

Auf der Bitübertragungsschicht wird das asynchrone Standardverfahren (1 Startbit, 8 Datenbits, 1 Parität und 1 Stoppbit) unter Zuhilfenahme des ISO 7-Bit Zeichensatzes für Steuerzeichen (DLE, STX, ETX etc) verwendet.

Es existieren zwei Ausführungen der Prozedur:

3964
hier wird zur Sicherung der Daten lediglich die Parität herangezogen
3964R
sichert die Daten zusätzlich mit einer Längsparität
Eine weite Verbreitung fand und findet das Protokoll im Prozessautomatisierungsbereich speziell bei Simatic-SPSen zum Datenaustausch zwischen Geräten. 3964R wird auch als Sicherungsschicht bei einer Variante von Sinaut 8FW eingesetzt.

Gruß,
Hermann

Habe jetzt mal mit einer Register variable auf den client socket des buderus gateways mit folgendem skript mitgeloggt.

<?php
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($IPS_SENDER == "RegisterVariable")
{
  // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  $data  = RegVar_GetBuffer($IPS_INSTANCE);
  // neu empfangene Daten an $data anhängen
  $data .= $IPS_VALUE;
  $datahex = ord($IPS_VALUE);
  switch ($datahex) {
    case 2:
        RegVar_SendText($IPS_INSTANCE, chr("16")); // STX -> DLE senden
        break;
    case 3:
      IPS_Sleep(200);
        RegVar_SendText($IPS_INSTANCE, chr("16")); // ETX -> DLE senden
       break;
    }
  $mda = GetValue(54507 /*[Technik\Heizung\mda]*/); // Merker Normalmodus (0) oder Direktmodus (1)
  if ((strlen($data) >= 9 ) and ($mda == 0)) // Merker Daten werden im Normalmodus von der Logamatic empfangen
  {
      // $data in Blöcke von bis zu 9 Zeichen zerlegen
      $datasets = str_split($data, 9);
      // $data leeren
      $data = "";

      // alle Datensätze durcharbeiten
      for ($i = 0; $i < count($datasets); $i++)
      {
         // vollständige Datensätze (genau 9 Zeichen lang) ausgeben
         if (strlen($datasets[$i]) == 9)
         {
         $string[$i]=$datasets[$i];
            $hexstring[$i]='';
            for ($x=0;$x<strlen($string[$i]);$x++)
                {
                 $hexstring[$i].=dechex(ord(substr($string[$i],$x,1)))." ";
                }
          echo "empfangener Datensatz: ".$hexstring[$i]."
";
         }
         else
         {
          // Unvollständige Datensätze in $data schreiben
          $data = $datasets[$i];
         }
      }
  }
  if (($datahex == 172) and ($mda == 1)) // Merker $mda ==1 Direktmodus, alle Datensätze werden von der Logamatic gesendet
  {
      SetValue(54507 /*[Technik\Heizung\mda]*/, 0);
      $array = explode("\x02\xAB\x00", $data);
      //$array = explode("\x10\x03", $array1[1]);
      $dateiname = "test.txt"; // Name der Datei
        $handler = fOpen($dateiname , "a+");
        for ( $x = 0; $x < count ( $array ); $x++ )
        {
          echo $x." : ".str2hex($array[$x])."
";
          $text = ($x." : ".str2hex($array[$x])."
");
          fWrite($handler , $text);
        }
        fClose($handler);
      $data = "";
  }
  // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
  RegVar_SetBuffer($IPS_INSTANCE, $data);
}
function str2hex($string) // Funktion String in Hex umwandeln
    {
        $hex='';
        for ($i=0; $i < strlen($string); $i++)
            {
            $hex .=" ".dechex(ord($string[$i]));
            }
        return $hex;
    }
?>

hier das debugging:


hier der client socket auf den Perle STS16

das sollte demonstrieren, dass meine Kommunikation steht (1. Schicht ISO-OSI Modell)

libnodave dürfte mein Problem lösen können, allerdings habe ich hier keinerlei Erfahrung und bin deswegen auf Euere Hilfe angewiesen …