Belimo Modbus TCP S7-315-2 PN

ChristianTsch

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,
wir haben ein neues Ventil, welches als Kommunikations-Protokoll Modbus TCP verwendet. Dieses würden ich gerne in unsere S7-315-2 PN/DP einbinden. Ich habe schon eine Verbindung herstellen können, aber nur mit den Bausteinen von Siemens („MODBUSPN“). Da diese viel Geld kosten, wollte ich fragen, ob jemand weiß, wie es mit dem FB65 funktioniert. Für jeden Vorschlag bin ich dankbar.
 
Natürlich kannst du selbst programmieren. Modbus ist keine Raketenwissenschaft. Du schickst dem Slave ein Telegramm mit dem Request und bekommst ein Telegramm als Antwort in dem deine Daten stehen.

Hier hat Yaskawa (ehemals Vipa) das ab Seite 50 sehr gut beschrieben:


Im Anhang ein Beispiel (um ein Janitza UMG511 über Modbus auszulesen).
 

Anhänge

  • UMG511.txt
    11,1 KB · Aufrufe: 30
Natürlich kannst du selbst programmieren. Modbus ist keine Raketenwissenschaft. Du schickst dem Slave ein Telegramm mit dem Request und bekommst ein Telegramm als Antwort in dem deine Daten stehen.

Hier hat Yaskawa (ehemals Vipa) das ab Seite 50 sehr gut beschrieben:


Im Anhang ein Beispiel (um ein Janitza UMG511 über Modbus auszulesen).


falsches Handbuch, hier das Richtige:


Warum kann ich denn meinen Beitrag nicht editieren?!?
 
Dummer Vorschlag:

1. S7-1211 kaufen (ca. 140€) diese per PN als I-Device an die 300er dran.
2. Die kostenlosen Modus-FBs in der 1200er nutzen.
3. Profit?!
 
Ist auch meistens mein Vorschlag, eine S7-1200 als Modbus Gateway anstatt MODBUSPN auf S7-300 zu verwenden. Hier dürfte sogar eine Logo als Modbus Gateway ausreichen.

Harald
Dummer Vorschlag:

1. S7-1211 kaufen (ca. 140€) diese per PN als I-Device an die 300er dran.
2. Die kostenlosen Modus-FBs in der 1200er nutzen.
3. Profit?!
Vielen Dank für Eure Vorschläge. Natürlich haben wir auch schon darüber nachgedacht, falls die Programmierung nicht klappt. Sollte es mit der Programmierung gehen kann man zusätzlich Geld sparen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du baust lieber eine zusätzliche Hardware ein anstatt ein paar Zeilen zu coden?!?

So wirst du nie eine richtige Wildsau werden !!!
Nein, das ist mein Vorschlag an Christian. Von den Leuten, die hier nach Selbstprogrammierung von Modbus-Client oder -Server fragen, kommt irgendwie nie eine Erfolgs-Rückmeldung...

Harald
 
Nein, das ist mein Vorschlag an Christian. Von den Leuten, die hier nach Selbstprogrammierung von Modbus-Client oder -Server fragen, kommt irgendwie nie eine Erfolgs-Rückmeldung...
Also bist du der Meinung, dass es einfacher ist, sich
- eine zusätzliche Steuerung zu kaufen
- die neue Steuerung elektrisch in das bestehende System zu integrieren (verdrahten)
- sich die dazugehörige Entwicklungssoftware zu kaufen
- sich die neue Entwicklungssoftware zu installieren
- sich in dieses neue System einzuarbeiten
- sich dann mit der Netzwerkkommunikation dieser Steuerung zu befassen
- sich mit den Eigenheiten der Modbus-Bausteine dieser Steuerung zu befassen
- sich damit zu befassen, eine I-Device (wie hier empfohlen) Kommunikation zwischen der neuen und alten Steuerung aufzubauen um die Daten auszutauschen

als die paar Bytes des Modbus-Protokolls in der Steuerung die man kennt zu programmieren?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe die Modbusanbindung unserer Belimo Ventile mit VB .net programmiert.

Da unsere Linien jeweils in einem VLAN sind, und wir ein übergeordnetes System benötigten,
war das für uns die beste Lösung.

Ich kann leider den Code nicht veröffentlichen - aber die Library ist folgende:

Hoffe, es hilft.
 
(* Modbus Master for BELIMO V025R+VAC*) TYPE UDT3 VERSION : 0.1 STRUCT WORD[0]: WORD; WORD[1]: WORD; WORD[2]: WORD; WORD[3]: WORD; WORD[4]: WORD; WORD[5]: WORD; WORD[6]: WORD; WORD[7]: WORD; END_STRUCT ; END_TYPE FUNCTION_BLOCK FB1 TITLE = 'BLMOPN' NAME : BLMOPN FAMILY : '' AUTHOR : CT VERSION : '1.0' VAR_INPUT RESTART : BOOL; TCON_PAR : TCON_PAR; PollCyle : TIME; END_VAR VAR_OUTPUT CONNECTED : BOOL; ERROR : BOOL; END_VAR VAR_TEMP i : INT; RET : INT; DATA : BYTE; END_VAR VAR U3: UDT3; TCON : TCON; TSEND : TSEND; TRCV : TRCV; TRCV2 : TRCV; TDISCON : TDISCON; TON_CON : TON; TON_SEND : TOF; TON_State : TON; PulsePosConn : BOOL; PulseNegConn : BOOL; EdgeFlagPos : BOOL; EdgeFlagNeg : BOOL; FG_TRCV : BOOL; FG_TSND : BOOL; Count : INT := 1; HEADER : ARRAY[0..10] OF BYTE; REGS : ARRAY[0..255] OF BYTE; (*********************************************************) (* Build the ModbusTCP Request *) (*********************************************************) KOMTEL : STRUCT HEADER_TI : WORD := 1; HEADER_PI : WORD := 0; HEADER_LFL : BYTE := 0; HEADER_HFL : BYTE := 6; SLAVE : BYTE := 7; FUNCTIONCODE : BYTE := 3; STARTREG : INT := 0; NOOFREGS : INT := 8; END_STRUCT; END_VAR BEGIN (*********************************************************) (* Establish connection *) (*********************************************************) TCON(REQ := RESTART, ID := TCON_PAR.id, CONNECT := TCON_PAR); IF TCON.DONE THEN CONNECTED := TRUE; END_IF; TON_CON(IN := CONNECTED, PT := T#2s); (*********************************************************) (* Send data over existing connection *) (*********************************************************) TSEND.LEN := 12; IF TON_CON.Q THEN TON_SEND(IN := NOT TON_SEND.Q AND NOT TRCV2.NDR, PT := PollCyle); FG_TSND := NOT TON_SEND.Q ; TSEND(REQ := FG_TSND, ID := TCON_PAR.id, LEN := TSEND.LEN, DATA := KOMTEL); END_IF; (*********************************************************) (* Send Error *) (*********************************************************) IF TSEND.ERROR THEN ERROR := TRUE; END_IF; IF TSEND.DONE THEN ERROR := FALSE; END_IF; (*********************************************************) (* Receive Header *) (*********************************************************) IF CONNECTED THEN TRCV(EN_R := NOT FG_TRCV, ID := TCON_PAR.ID, LEN := 9, DATA := HEADER); IF TRCV.NDR THEN FG_TRCV := TRUE; END_IF; (*********************************************************) (* Recieve Registers *) (*********************************************************) TRCV2(EN_R := FG_TRCV, ID := TCON_PAR.ID, LEN := 0, DATA := REGS); IF TRCV2.NDR THEN (* Copy Registers to DB*) CASE (BYTE_TO_INT(HEADER[1])) OF 7: ret := SFC20(SRCBLK := REGS,DSTBLK := U3); END_CASE; FG_TRCV := FALSE; END_IF; END_IF; IF ERROR OR NOT CONNECTED THEN (*Error: Set all values to 0 if Device is not reachable*) DATA := 0; END_IF; END_FUNCTION_BLOCK
 
@ChristianTsch
Nimm zum Posten von Code besser nicht die ICODE-Tags ("Inline-Code"), sondern die CODE-Tags (im Beitragseditor ganz rechts "Code"), dann wird das Posting besser lesbar und sieht so aus:

Code:
(* Modbus Master for BELIMO V025R+VAC*)

TYPE UDT3
VERSION : 0.1


  STRUCT  
   WORD[0]: WORD;
 WORD[1]: WORD;
 WORD[2]: WORD;
 WORD[3]: WORD;
 WORD[4]: WORD;
 WORD[5]: WORD;
 WORD[6]: WORD;
 WORD[7]: WORD;

  END_STRUCT ; 
END_TYPE




FUNCTION_BLOCK FB1
TITLE = 'BLMOPN'
NAME    : BLMOPN
FAMILY  : ''
AUTHOR  : CT
VERSION : '1.0'

VAR_INPUT
  RESTART : BOOL;
  TCON_PAR : TCON_PAR;
  PollCyle : TIME;
END_VAR
VAR_OUTPUT
  CONNECTED : BOOL;
  ERROR : BOOL;
END_VAR 
VAR_TEMP
  i : INT;
  RET : INT;
  DATA : BYTE;
 END_VAR
VAR
  U3: UDT3;
  TCON : TCON;
  TSEND : TSEND;
  TRCV : TRCV;
  TRCV2 : TRCV;
  TDISCON : TDISCON;
  TON_CON : TON;
  TON_SEND : TOF;
  TON_State : TON;
  PulsePosConn : BOOL;
  PulseNegConn : BOOL;
  EdgeFlagPos : BOOL;
  EdgeFlagNeg : BOOL;
  FG_TRCV : BOOL;
  FG_TSND : BOOL;
  Count : INT := 1;
  HEADER : ARRAY[0..10] OF BYTE;
  REGS : ARRAY[0..255] OF BYTE;
(*********************************************************) 
(*  Build the ModbusTCP Request                          *)
(*********************************************************)

  KOMTEL : STRUCT  
    HEADER_TI  : WORD := 1;
    HEADER_PI  : WORD := 0;
    HEADER_LFL : BYTE := 0;
    HEADER_HFL : BYTE := 6;
    SLAVE : BYTE := 7;
    FUNCTIONCODE : BYTE := 3;
    STARTREG : INT := 0;
    NOOFREGS : INT := 8;
END_STRUCT;
  
END_VAR

BEGIN


(*********************************************************) 
(* Establish connection                                  *)
(*********************************************************) 
 
 
  TCON(REQ     := RESTART,
       ID      := TCON_PAR.id,
       CONNECT := TCON_PAR);
   
  IF TCON.DONE THEN
    CONNECTED := TRUE;
  END_IF;
 
  TON_CON(IN := CONNECTED,
          PT := T#2s);
    
(*********************************************************)
(* Send data over existing connection                    *) 
(*********************************************************)

  TSEND.LEN := 12;

  IF TON_CON.Q THEN
 
    TON_SEND(IN := NOT TON_SEND.Q AND NOT TRCV2.NDR,
             PT := PollCyle);
           
    FG_TSND := NOT TON_SEND.Q ;
      
    TSEND(REQ  := FG_TSND,
          ID   := TCON_PAR.id,
          LEN  := TSEND.LEN,
          DATA := KOMTEL);
      
  END_IF;
 
(*********************************************************)
(* Send Error                                            *) 
(*********************************************************)

 IF TSEND.ERROR THEN
    ERROR := TRUE;
 END_IF;

 IF TSEND.DONE THEN
    ERROR := FALSE;
 END_IF;
      
 
(*********************************************************)
(* Receive Header                                        *) 
(*********************************************************) 

  IF CONNECTED THEN
     
    TRCV(EN_R := NOT FG_TRCV,
         ID   := TCON_PAR.ID,
         LEN  := 9,
         DATA := HEADER);
      
      IF TRCV.NDR THEN
        FG_TRCV := TRUE;
    END_IF; 
     
(*********************************************************) 
(* Recieve Registers                                     *)
(*********************************************************)

          TRCV2(EN_R := FG_TRCV,
                ID   := TCON_PAR.ID,
                LEN  := 0,
                DATA := REGS);
                                                 
    IF TRCV2.NDR THEN (* Copy Registers to DB*) 
      CASE (BYTE_TO_INT(HEADER[1])) OF
            7: ret :=  SFC20(SRCBLK  := REGS,DSTBLK  := U3);                                   
      END_CASE;                               
      FG_TRCV := FALSE;   
    END_IF;                 
END_IF;

IF ERROR OR NOT CONNECTED THEN (*Error: Set all values to 0 if Device is not reachable*)
  DATA := 0;
 END_IF;
END_FUNCTION_BLOCK
 
Zurück
Oben