Vai al contenuto
PLC Forum


parametrizzare modbus su di una 314C2PN/DP


meccanico1

Messaggi consigliati

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

Link al commento
Condividi su altri siti

  • 1 year later...

ifachsoftware

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

Link al commento
Condividi su altri siti

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 

Link al commento
Condividi su altri siti

ifachsoftware

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 .......

Link al commento
Condividi su altri siti

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...