Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 31

Thema: Datenübertragung zwischen Siemens und Rockwell

  1. #11
    Registriert seit
    05.11.2010
    Beiträge
    35
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    PN/DP
    Bei der Simatic ist es selbstverständlich dein Floatwert, der 4 Bytes die in einer DB belegt, binär, hexadezimal, dezimal oder als Gleitkommazahl anzuzeigen.
    Bei der AB Steuerung ist ein DINT-Wert dezimal und der bleibt so. Um eine Gleitkommazahl zu kriegen musst du die Umrechnung selber vornehmen.
    Siehe: http://de.wikipedia.org/wiki/IEEE_75...92_Dezimalzahl

    Oder kennst du vielleicht eine Funktion bei RSLogix 5000, die DINT nach Float und umgekehrt wandelt?

  2. #12
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.293
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard

    Es ist nicht direkt DINT, sondern eher DWORD. Um Real-Zahlen zu speichern reicht es nicht, wenn man es in ein DWORD schiebt. Eine Real-Zahl kann ja vor dem Komma und nach dem Komma ganz viele Stellen haben. Und es wird immer als DWORD gespeichert. Also musste man sich ein Format überlegen, sodass es immer in ein DWORD passt. Und das ist das IEEE754-Format. In diesem Format speichert das Simatic. Der S7-Programmierer merkt davon, was im Hintergund passiert, natürlich nichts, solange er in seiner Siemens-Welt bleibt. Erst wenn er mit anderen Herstellern Daten austauschen will, fällt es auf. Das hatte ich auch schonmal, wo ich Real-Zahlen zwischen einer S7 und einer Phoenix ILC hin und her transferieren musste.
    Somit hab ich mir diese beiden Bausteine geschrieben:

    REAL_TO_IEEE754 sieht dann so aus:
    Code:
    REAL_TO_BUF_1(REQ:=xReq,BUF_FORMAT:=FALSE,BUF_OFFS:=DINT#0,BUF_CNT:=DINT#4,SRC:=IN,BUFFER:=aTmp);
    IN := REAL_TO_BUF_1.SRC;
    aTmp := REAL_TO_BUF_1.BUFFER;
        
    IF IN <> rINLast THEN
        xReq := TRUE;
    END_IF;
        
    IF REAL_TO_BUF_1.DONE THEN
        xReq := FALSE;
    END_IF;
        
    dwTmp.B0 := aTmp[0];
    dwTmp.B1 := aTmp[1];
    dwTmp.B2 := aTmp[2];
    dwTmp.B3 := aTmp[3];
        
    OUT := dwTmp;
        
    rINLast := IN;
    Und IEEE754_TO_REAL sieht so aus:
    Code:
    BUF_TO_REAL_1(REQ:=xReq,BUF_FORMAT:=FALSE,BUF_OFFS:=DINT#0,BUF_CNT:=DINT#4,BUFFER:=aTmp,DST:=OUT);
    aTmp := BUF_TO_REAL_1.BUFFER;
    OUT:=BUF_TO_REAL_1.DST;
          
    IF IN <> dwINLast THEN
        xReq := TRUE;
    END_IF;
          
    IF BUF_TO_REAL_1.DONE THEN
        xReq := FALSE;
    END_IF;
          
    aTmp[0] := IN.B0;
    aTmp[1] := IN.B1;
    aTmp[2] := IN.B2;
    aTmp[3] := IN.B3;
          
    dwINLast := IN;
    Als Datentyp musst du dannoch diesen hier anlegen:
    Code:
    TYPE
        ARRAY_OF_BYTE_0_3 : ARRAY [0..3] OF BYTE;
    END_TYPE
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  3. #13
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Auf der Siemens-Seite packst Du einen 32-Bit-REAL-Wert in 4 Bytes und sendest diese zur AB-Steuerung.
    Auf der Rockwell-Seite müßtest Du doch dann den (binären) Inhalt der empfangenen 4 Bytes nach der Byte-Vertauschung auch direkt als REAL-Wert interpretieren und nicht als DINT.

    Wie kommst Du auf DINT? Wo kommt Dein DINT her?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #14
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.622
    Danke
    377
    Erhielt 799 Danke für 642 Beiträge

    Standard

    REALs in Siemens S7 und Rockwell Controllogix sind beide IEE754 REALs.
    Konvertierung soll also nicht notwendig sein, vielleicht ausser umtauschen von die bytes, wegen Little Endian und Big Endian (S7 / Controllogix).
    Jesper M. Pedersen

  5. #15
    Registriert seit
    05.11.2010
    Beiträge
    35
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Jesper,

    Von der Siemens Steuerung habe ich z.B. einen Realwert 50,3 geschickt
    Auf der Rockwell habe ich 4 SINTs bekommen. Richtig gedreht und einen binären Wert 2#0100_0010_0100_1001_0011_0011_0011_0011 bekommen.
    Dezimal entspricht das dem Wert: L#1112093491
    Wie bekomme ich daraus den Wert 50.3 auf der Rockwellsteuerung ohne Umrechnung??

    Die Rockwellsteuerung ist eine Compactlogix, wenn das von Bedeutung ist.

    Miro
    Geändert von miroblaz (08.11.2013 um 00:23 Uhr)

  6. #16
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von Mobi Beitrag anzeigen
    Es ist nicht direkt DINT, sondern eher DWORD. Um Real-Zahlen zu speichern reicht es nicht, wenn man es in ein DWORD schiebt. Eine Real-Zahl kann ja vor dem Komma und nach dem Komma ganz viele Stellen haben. Und es wird immer als DWORD gespeichert. Also musste man sich ein Format überlegen, sodass es immer in ein DWORD passt. Und das ist das IEEE754-Format. In diesem Format speichert das Simatic. Der S7-Programmierer merkt davon, was im Hintergund passiert, natürlich nichts, solange er in seiner Siemens-Welt bleibt. Erst wenn er mit anderen Herstellern Daten austauschen will, fällt es auf. Das hatte ich auch schonmal, wo ich Real-Zahlen zwischen einer S7 und einer Phoenix ILC hin und her transferieren musste.
    Somit hab ich mir diese beiden Bausteine geschrieben:

    REAL_TO_IEEE754 sieht dann so aus:
    Code:
    REAL_TO_BUF_1(REQ:=xReq,BUF_FORMAT:=FALSE,BUF_OFFS:=DINT#0,BUF_CNT:=DINT#4,SRC:=IN,BUFFER:=aTmp);
    IN := REAL_TO_BUF_1.SRC;
    aTmp := REAL_TO_BUF_1.BUFFER;
        
    IF IN <> rINLast THEN
        xReq := TRUE;
    END_IF;
        
    IF REAL_TO_BUF_1.DONE THEN
        xReq := FALSE;
    END_IF;
        
    dwTmp.B0 := aTmp[0];
    dwTmp.B1 := aTmp[1];
    dwTmp.B2 := aTmp[2];
    dwTmp.B3 := aTmp[3];
        
    OUT := dwTmp;
        
    rINLast := IN;
    Und IEEE754_TO_REAL sieht so aus:
    Code:
    BUF_TO_REAL_1(REQ:=xReq,BUF_FORMAT:=FALSE,BUF_OFFS:=DINT#0,BUF_CNT:=DINT#4,BUFFER:=aTmp,DST:=OUT);
    aTmp := BUF_TO_REAL_1.BUFFER;
    OUT:=BUF_TO_REAL_1.DST;
          
    IF IN <> dwINLast THEN
        xReq := TRUE;
    END_IF;
          
    IF BUF_TO_REAL_1.DONE THEN
        xReq := FALSE;
    END_IF;
          
    aTmp[0] := IN.B0;
    aTmp[1] := IN.B1;
    aTmp[2] := IN.B2;
    aTmp[3] := IN.B3;
          
    dwINLast := IN;
    Als Datentyp musst du dannoch diesen hier anlegen:
    Code:
    TYPE
        ARRAY_OF_BYTE_0_3 : ARRAY [0..3] OF BYTE;
    END_TYPE
    Wozu muß dieser Datentyp angelegt werden???*
    Ohne die zugehörigen Deklarationen sieht der Code einfach nur verworren aus...
    Mobi, kann es sein, daß Du damit REAL-to-STRING- und STRING-to-REAL-Wandlungen machst oder meinst? Das war hier irgendwie gar nicht gefragt...

    PS:
    Ein REAL-Wert wird "eher wie" im REAL-Format gespeichert. Zufällig belegt das REAL-Format genausoviel Speicherplatz wie ein DWORD - mehr haben diese Datentypen nicht miteinander zu tun...

    Gesendet von Harald's Galaxy Tab
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #17
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von miroblaz Beitrag anzeigen
    Von der Siemens Steuerung habe ich z.B. einen Realwert 50,3 geschickt
    Auf der Rockwell habe ich 4 SINTs bekommen. Richtig gedreht und einen binären Wert 2#0100_0010_0100_1001_0011_0011_0011_0011 bekommen.
    Dezimal entspricht das dem Wert: L#1112093491
    Wie bekomme ich daraus den Wert 50.3 auf der Rockwellsteuerung ohne Umrechnung??
    Na, ist doch bereits alles bestens! In der Ansicht als REAL-Wert ist 2#0100_0010_0100_1001_0011_0011_0011_0011 = 50.3

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #18
    Registriert seit
    05.11.2010
    Beiträge
    35
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Na klar. In Simatic. Versuch es mal mit RSLogix so darzustellen.

  9. #19
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #20
    Registriert seit
    05.11.2010
    Beiträge
    35
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Den Rechner implementiere ich in meine CompactLogix

Ähnliche Themen

  1. Unterschied zwischen Siemens und SEW Servomotoren
    Von Sven14 im Forum SEW-EURODRIVE
    Antworten: 16
    Letzter Beitrag: 11.08.2011, 12:10
  2. Antworten: 3
    Letzter Beitrag: 04.05.2011, 09:31
  3. Kommunikation zwischen Siemens- und Hima-CPU
    Von Kalle85 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 17.08.2009, 12:37
  4. Antworten: 10
    Letzter Beitrag: 21.01.2008, 09:01
  5. Antworten: 3
    Letzter Beitrag: 27.04.2006, 13:00

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •