Vai al contenuto
PLC Forum


parametrizzare modbus su di una 314C2PN/DP


Messaggi consigliati

Inserito:

buona giornata a tutti , sto cercando di fare comunicare una cpu  314C2PN/DP con un drive AKD della Kollmorgen.

Come software uso step7 V5.5 sp1.

Ho scaricato dal sito della siemens i blocchi aggiuntivi e li ho inseriti in un progetto per testare un po' la cosa .

Ho cercati di seguire il manuale della siemens sull'argomento ma non sono riuscito a fare granchè.

Qualcuno potrebbe suggerirmi qualche sito dove io possa trovare qualche istruzione , magari in italiano , da seguire per districarmi un po' in questa faccenda?

grazie mille a tutti

  • 1 year later...

ifachsoftware
Inserita:

Ciao , ti serve il pacchetto della siemens che implementa il modbus Master TCP  (pagando almeno 500€ a licenza) , altrimenti fai come me e ti costruisci il driver ...

Il protocollo è semplice : per esempio questo è la creazione del buffer per scrivere un singolo registro da inviare in TCP :

FUNCTION "MODBUS_PREPARE_WRITE_INT_TO_HR" : "BUFF_8192"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : CR
VERSION : 0.1
//Prepare command for write one INT to one HR area with Modbus command 6
   VAR_INPUT 
      Address : Int;   // Modbus HR address
      Value : Int;   // Value to be written
   END_VAR

   VAR_TEMP 
      Ary_2_Bytes : Array[0..1] of Byte;
   END_VAR


BEGIN
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[0] := 0;       // Transaction ID
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[1] := 0;       // Transaction ID
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[2] := 0;       // Protocol ID (Modbus = 0)
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[3] := 0;       // Protocol ID
	
	// Write follow length
	"INT_TO_ARY_BYTES"(Value := 6,
	                   AryBytes => #Ary_2_Bytes);
	
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[4] := #Ary_2_Bytes[0];       // Length
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[5] := #Ary_2_Bytes[1];       // Length
	
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[6] := 1;       // Unit Identifier
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[7] := 6;       // Function Code 6 = Write Single Register
	
	// Register Address
	"INT_TO_ARY_BYTES"(Value := #Address,
	                   AryBytes => #Ary_2_Bytes);
	
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[8] := #Ary_2_Bytes[0];       
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[9] := #Ary_2_Bytes[1];       
	
	// Register Value
	"INT_TO_ARY_BYTES"(Value := #Value,     
	                   AryBytes => #Ary_2_Bytes);
	
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[10] := #Ary_2_Bytes[0];      // Value
	#MODBUS_PREPARE_WRITE_INT_TO_HR.Buffer[11] := #Ary_2_Bytes[1];      // Value
	
	// Returned length
	#MODBUS_PREPARE_WRITE_INT_TO_HR.UsedData := 12;
END_FUNCTION
TYPE "BUFF_8192"
VERSION : 0.1
   STRUCT
      UsedData : Int;   // Number of  used bytes by buffer
      Buffer : Array[0..8191] of Byte;   // Buffer with data
   END_STRUCT;

END_TYPE
FUNCTION "INT_TO_ARY_BYTES" : Void
TITLE = INT_TO_ARY_BYTES
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : CR
VERSION : 0.1
//Covert integer to array of bytes
   VAR_INPUT 
      Value : Int;
   END_VAR

   VAR_OUTPUT 
      AryBytes : Array[0..1] of Byte;
   END_VAR

   VAR_TEMP 
      wTemp : Word;
   END_VAR


BEGIN
	#wTemp := INT_TO_WORD(#Value);
	
	#AryBytes[0] := WORD_TO_BYTE(SHR(IN := #wTemp AND 16#FF00, N := 8));  // 16#01  502
	#AryBytes[1] := WORD_TO_BYTE(#wTemp AND 16#FF);                       // 16#F6  
END_FUNCTION

 

 

Poi usando i comandi 

 

TCON , TSEND ,  TRCV TDISCON

 

Ti colleghi al dispositivo (TCON) 

Invii il buffer creato (TSEND)

Leggi eventuali risposte (TRCV)

Ti Disconnetti (TDISCON)

 

 

della documentazione sul Modbus TCP la puoi trovare qui  Link

Inserita:

Siccome mi leggo ogni cosa sui protocolli son finito qua ... meglio tardi che mai ifachsoftware , ma spero abbia risolto da dicembre 2015 ad oggi ;) ... comunque anche per me che mastico un po' di modbus, ci impiegherei un pochino a capire come usare il tuo blocco. Premetto che ora non mi serve :D ... e poi vado su Tia dove ci sono blocchetti già pronti oramai 

ifachsoftware
Inserita:

L'esempio allegato ti permette di scrivere il valore Value di tipo intero tramite il function code 6 (Write single register) all'indirizzo Address su un Buffer di tipo BUFF_8192 con cui ti scrive il buffer con i dati ed i caratteri utilizzati da parte del buffer ; tale buffer puo' venire inviato con l'istruzione TSEND.

 

So benissimo che è una discussione vecchia , ma credo che per chi avesse necessità di realizzare la cosa con un 300 e non con un 1200 potrebbe tornare utile.

 

Se avevi la risposta pronta potevi scrivergliela tu nel 2015 .......

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...