Vai al contenuto
PLC Forum


Comunicazione In Modbus Con Tesysu


antoniovalenti

Messaggi consigliati

antoniovalenti

Salve, sto cercando di far copmunicare un TesysU con comunicatore MODBUS, con una CPU di tipo premium attraverso un SCP114, inserita nello slot della CPU.

Premesso che non ho mai utilizato il MODBUS, vorrei capire come utilizare la funzione READ_VAR.

Dalla guida in linea ho capito come impostare l'indirizzo attraverso il blocco ADDR, infatti lanciando la READ_VAR, mi si accende il led di comunbicazione del Tesys, sulla READ_VAR ho impostato il tipo di dati che vogli leggre (%MW), il registro di partenza e quanti registri voglio leggere, ma non riesco a leggere i valori.

Ho capito che bisogna inviare anche dei codici in base al tipo di funzione, ma non ho capito come.

Grazie

Link al commento
Condividi su altri siti


ho capito che non hai capito tante cose, ma ti suggerirei di postare le righe di programma che non funzionano e ragionare su quelle insieme al forum.

Inoltre stai usando PL7 o Unity Pro ?

Hai un solo tesys o quanti? sulla stessa rete o su diverse reti?

Link al commento
Condividi su altri siti

antoniovalenti

Intanto grazie per la risposta, i TESYSU sono circa 20, collegati alla stessa rete, sto utilizando UNITY.

Per quando riguarda ill programma ho solo inserito la READ_VAR collegata al blocco ADDR, per far partire la funzione ho messo in AND un bit di attivazione con il bit della word di gestione che mi dice che lo scambio è terminato.

Tutto questo in LD.

Link al commento
Condividi su altri siti

antoniovalenti

Vediamo se ho fatto qualche passo avanti:

- Il codice funzione (3,6, ecc) è raprresentato da quallo che metto in OBJECT_TYPE, es '%MW' corrisponde a 3

- Le prime 2 word della tabella di gestione, sono solo in lettura

- La terza word è il tempo di TIMEOUT della comunicazione

- La quarta word della tabella di gestione reppresenta il numero di byte che vado a leggere, quindi se ho 2 word devo

impostarlo a 4?

Quindi se non ho capito male, per fare una prova potrei forzare i valori nelle due word derlla tabella e vedere se riesco a leggere i reggistri ?

Link al commento
Condividi su altri siti

antonio, intanto credo che 20 tesys sulla stessa rete sia un tantino troppi, ma magari non hai bisogno di elevate prestazioni.

Se non ricordo male

la word 3 (time-out) deve avere un valore significativo per esempio 3, 4, 5, 10 ecc. (con base 100msec) altrimenti la comunicazione non si interrompe fino a che non va a buon fine.

la word 4 corrisponde al numero di byte della richiesta (stringa di comando modbus) che non ricordo se sia 10 o 12.

Certo che ci sono molti altri collegamenti pre-definiti con tesys che ti avrebbero risparmiato queste "fatiche"! (vedi I/o scanning +ethernet+gateway, vedi advantys con modulo modbus apposito per tesysU, vedi collegamento parallelo veloce con DI/DO, vedi CanOpen)

Link al commento
Condividi su altri siti

antoniovalenti

Lo so, il fatto è che le apparecchiature che mi sono ritrovato sono queste, non le ho scelto io!

Per quanto riguarda le prestezioni, non ho bisogno di "grandi" tempi di risposta.

Per il resto, ragionando su un solo Tesys, non ho capito se basta lanciare la READ_VAR per leggere i registri che mi servono (dal manuale delle variabili di comunicazione del TESYS, sono quelli dopo il 450) oppure bisogna scrivere una parte di codice.

Un'altra cosa che non capito, ho letto nel manuale che i registri di uno slave possono essere massimo 256, mentre nella tabella dei TESYS sono moltidi più.

Forse mi sono incasinato un po troppo!!

Link al commento
Condividi su altri siti

Per il resto, ragionando su un solo Tesys, non ho capito se basta lanciare la READ_VAR per leggere i registri che mi servono (dal manuale delle variabili di comunicazione del TESYS, sono quelli dopo il 450) oppure bisogna scrivere una parte di codice.

se le word sono contigue ed il numero di quelle contigue è minore di 120 fai tutto con una sola chiamata altrimenti devi farne due. Tuttavia non credo proprio ti serva tutto. Quindi innanzitutto scegli i registri da leggere. Poi verifica che gli indirizzi di questi registri sia entro le 120 word contigue. Se così non fosse dovrai programmare ulteriori chiamate.

i registri di uno slave possono essere massimo 256

non registri ma byte. Si intende che per una richiesta modbus si prevede massimo questo numero di byte. Tieni il massimo di word a 120 o se vuoi arrotonda a 100 per semplicità e ragiona in questo modo.

Quindi se per esempio devi leggere anche solo 2 word con questi indirizzi : 400450 e 400580, sei costretto a fare due richieste distinte.

Mentre se per esempio devi leggere anche solo 2 word con questi indirizzi : 400450 e 400560, puoi fare un'unica richiesta di 110 parole (ed estrarrai solo i due registri che ti servono).

Quindi sei riuscito a leggere dal tesys ??

Link al commento
Condividi su altri siti

antoniovalenti

Pultroppo rientro solo domani quindi non posso fare prove in questo momento.

Quindi riassumendo se devo leggere il registro 450 e il 451, devo impostare la READ_VAR come segue:

- OBJ = '%MW'

- NUM = 450 che sarebbe il registro dal quale comincio a leggere

- NB = 2 che è il numero di registri che voglio leggere

- RECP = %MW20:2 il che significa che mi ritrovero i valori nella word 20 e nella 21

- GEST= per es %MW10:4 e quindi il bit che mi dice che la comunicazione e terminata sarà il %MW10.0 e dovrò impostare

nella %MW12 il timeout per esempio 2 (200ms), e nella %MW13 12 che è il numero di caratteri della stringa di

comando.

A parte il bit di abilitazione della funzione, questo dovrebbe bastare, per leggere i due registri che mi servono

Grazie domani sono in officina tutto il giorno e provo!!

Modificato: da antoniovalenti
Link al commento
Condividi su altri siti

sul Tesys U, a prescindere dal comunicatore, devi leggere il REG 455 (stato e % assorbimento bit da 8 - 14).

I registri in scrittura sono il 704 ed il 703.

Il 704 è il registro di comando, il 703 è il registro di diagnostica e reset allarmi

Su Unity, dalla versione 4.1, se non erro, c'è una libreria di gestione Tesys U che è indipendente dal bus di comunicazione. Per quanto riguarda la Read_Var:

ti consiglio di impostare solamente il timeout, nell'ultima word, la funzione ti restituirà automaticamente il numero di byte ricevuti

Link al commento
Condividi su altri siti

Esempio Read Var - Write Var con indice

if not Bit_Tx then

contatore:=contatore+1;

if contatore>=NSlave + 1 Or contatore<0 then

contatore:=1;

end_if;

BufferIndirizzo:=IndSlave[contatore];

MOVE_INT_ARINT (IN := 0, (* Azzeramento buffer RX/TX *)

OUT => Buffer_RX_TX);

Rendiconto[3]:=0; (* Azzeramento word RX/TX scambio dati *)

If BitSpecificaFunzione[contatore] THEN

WRITE_VAR (ADR := ADDR(BufferIndirizzo),

OBJ := TipoRichiestaModBus[contatore],

NUM := Offset_MB[contatore],

NB := Numero_Registri[contatore],

EMIS := Buffer_RX_TX,

GEST := Rendiconto);

Else

READ_VAR (ADR := ADDR(BufferIndirizzo),

OBJ := TipoRichiestaModBus[contatore],

NUM := Offset_MB[contatore],

NB := Numero_Registri[contatore],

GEST := Rendiconto,

RECP => Buffer_RX_TX);

End_if;

set(Bit_Tx);

else

if not Rendiconto[0].0 Then

If Rendiconto[1]<>0 Then (* Errore trasmissione *)

Rendiconti_Slave[contatore]:=Rendiconto[1];

ELSE

(* Trasmissione corretta -- azzeramento errore *)

Rendiconti_Slave[contatore]:=0;

end_if;

reset(Bit_Tx);

If Not BitSpecificaFunzione[contatore] Then (* Solo in lettura *)

Dati[contatore]:=Buffer_RX_TX;

end_if;

end_if;

end_if;

Link al commento
Condividi su altri siti

verifica se funziona perchè non ho (almeno io) molto tempo per seguire e capire tutto il codice.

Sembra che potrebbe andare.

Intanto la tua flag Bit_Tx equivale "praticamente" a rendiconto[0].0 (va be ma è solo una osservazione gratuita ed ininfluente)

Mi domando però dove inizializzi l'array "Rendiconto" ? vedo che azzeri sempre solo il rendiconto[3]. Dove configuri il time-out (rendiconto[2])?

In sostanza prima di eseguire una Write_Var o Read_Var dovresti azzerare tutto l'array rendiconto e quindi impostare rendiconto[2] e solo per la read_var impostare anche rendiconto[3] (numero di byte della richiesta).

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