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

Ergebnis 1 bis 4 von 4

Thema: Structured Text Konvertierung Datentypen Unsigned 32-bit Codesys Modbus

  1. #1
    Registriert seit
    28.10.2015
    Beiträge
    30
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Ich habe ein Modbus-Profil, das für Register 40149 mit U32-Bit beschreibbar ist.
    Ich verwende den WagoLibModbus_IP_01, als Modbus API in Codesys.
    Mein Ansatz ist folgender:

    Transmit_Data: ARRAY [0..1] OF WORD;


    (* Datentyp S32 bzw DINT in 2 MODBUS-Register konvertieren *)
    di:=-2000;
    Transmit_Data[0] := DWORD_TO_WORD(SHR(DINT_TO_DWORD(di),16));
    Transmit_Data[1] := DINT_TO_WORD(di);





    KOMMU_E2(
    xCONNECT:= TRUE ,
    strIP_ADDRESS:= '192.168.2.13',
    wPORT:= 502 ,
    bUNIT_ID:= 3,
    bFUNCTION_CODE:= 16#10,
    wWRITE_ADDRESS:= 40149 ,
    wWRITE_QUANTITY:= 2,
    ptSEND_DATA:= ADR(Transmit_Data),
    xSEND:= xSend
    );



    (* erneutes Senden, nachdem der vorherige Sendevorgang für Zeit x abgeschlossen ist *)
    TON1(IN:= NOT xSend
    , PT:= T#10s);
    xSend:= TON1.Q;


    Funktioniert aber leider nicht. Der Datentyp DINT das 32 Bit Unsigned ist kann ich nicht in zwei Word-Arrays transformieren und das Modbus-Gerät akzeptiert es auch nicht.

    Ideen ?
    Zitieren Zitieren Structured Text Konvertierung Datentypen Unsigned 32-bit Codesys Modbus  

  2. #2
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard

    was funktioniert nicht? Das Senden oder das Packen in die Array Elemente?

    Ich kenne die Wago Lib nicht, kann mir aber vorstellen, dass es auch an wWrite_Quantity liegen könnte, dass da Bytes als Länge eingetragen sein sollten. xxSend würde ich auch zum Test mal fest auf TRUE setzen und in das Array die Bytes 1,2,3 4 reinpacken.
    Als Freelancer immer auf der Suche nach interessanten Projekten.

  3. #3
    sadik ist offline Benutzer
    Themenstarter
    Registriert seit
    28.10.2015
    Beiträge
    30
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Anscheinend akzeptiert das Gerät das Datentyp nicht, also irgendwo mache ich den Fehler bei der korrekten Darstellung einer Unsigned 32 Bit.
    Laut Modbus-Profil erwartet der Register 40149 U32Bit, also 40149 ist 16-bit und 40150 (16-Bit) werden als ein Datenblock gesehen.
    Ich habe das mal mit nodejs gemacht und schicke es als octetstream z.B die Zahl 2000 ist octettstream: geschickt funktioniert.
    Also 2000 ist codiert : 0x00 ,0x00, 0x07, 0xd0 und es funktioniert.

  4. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.314
    Danke
    932
    Erhielt 3.329 Danke für 2.688 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von sadik Beitrag anzeigen
    Ich habe das mal mit nodejs gemacht und schicke es als octetstream z.B die Zahl 2000 ist octettstream: geschickt funktioniert.
    Also 2000 ist codiert : 0x00 ,0x00, 0x07, 0xd0 und es funktioniert.
    Das scheint mir ein Little/Big-Endian-Problem zu sein.

    Wenn Deine SPS Big Endian hat dann sollte es so funktionieren:
    Code:
    di := 2000;
    
    KOMMU_E2(
      xCONNECT       := TRUE,
      strIP_ADDRESS  := '192.168.2.13',
      wPORT          := 502,
      bUNIT_ID       := 3,
      bFUNCTION_CODE := 16#10,
      wWRITE_ADDRESS := 40149,
      wWRITE_QUANTITY:= 2,
      ptSEND_DATA    := ADR(di),
      xSEND          := xSend
    );
    Wenn Deine SPS Little Endian hat dann vor dem Senden die Reihenfolge der 4 Bytes umdrehen:
    Code:
    dwBig : DWORD;
    
    di := 2000;
    dwBig :=    (ROL(DINT_TO_DWORD(di),8) AND 16#00FF00FF)
             OR (ROR(DINT_TO_DWORD(di),8) AND 16#FF00FF00);
    
    KOMMU_E2(
      xCONNECT       := TRUE,
      strIP_ADDRESS  := '192.168.2.13',
      wPORT          := 502,
      bUNIT_ID       := 3,
      bFUNCTION_CODE := 16#10,
      wWRITE_ADDRESS := 40149,
      wWRITE_QUANTITY:= 2,
      ptSEND_DATA    := ADR(dwBig),
      xSEND          := xSend
    );
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Programmierung mit ST (Structured Text)
    Von DerBenutzer im Forum Programmierstrategien
    Antworten: 5
    Letzter Beitrag: 19.12.2014, 19:26
  2. Studienprojekt Structured Text Interpreter
    Von antidose im Forum Hochsprachen - OPC
    Antworten: 1
    Letzter Beitrag: 11.02.2014, 16:39
  3. Structured Text FB Einbindung
    Von onikos im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 15.01.2014, 19:27
  4. Structured Text (ST)
    Von nourdine im Forum PC- und Netzwerktechnik
    Antworten: 6
    Letzter Beitrag: 29.11.2009, 17:13
  5. Structured Text RSLogix
    Von kammi-kaze im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 20.07.2009, 15:01

Lesezeichen

Berechtigungen

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