Vai al contenuto
PLC Forum


Comunicazione Con Convertitore Seriale 485 232


g3nti

Messaggi consigliati

Buongiorno sto cercando di far comunicare un plc m340 e un serial converter 485/232 ( transCOM XC2-23-48) il collegamento tra la serial del plc e l'ingresso 232-485 del converter dovrebbe essere corretto in quanto i due device si vedono, o almeno quando invio un comando dal converter, il plc riceve qualcosa. per la comunicazione utilizzo input_char e write_char, ma non riesco a decifrare la stringa che mi viene inviata, vedo caratteri strani e indecifrabili. qualche idea a riguardo? grazie in anticipo

Link al commento
Condividi su altri siti


Cosa ci devi fare con questa connessione ?

Che tipo di protocollo utilizzi (es. modbus) ?

Che tipo di cpu controllore hai ?

bigalex :blink:

Modificato: da bigalex
Link al commento
Condividi su altri siti

devo comunicare con il plc da un computer

il setup è quello e non posso modificarlo.

protocollo character mode

la cpu dovrebbe essere p342020

la situazione è la seguente

PC rs 232 <-> serial converter 232/485 <-> M340 p342020

Link al commento
Condividi su altri siti

Il settaggio della porta seriale è corretto su entrambi i dispositivi?

Se ti colleghi con hyperterminal (e configuri la porta seriale esattamente come quella del PLC) vedi qualcosa oppure no?

Hai accesso al programma del PLC e puoi fare modifiche (e puoi controllare la corretta configurazione della porta)?

Hai verificato nel PC che la porta comm virtuale sia quella che tu credi di usare (i.e. il convertitore quando viene inserito nel PC attiva la COM4)?

Nelle proprietà della porta comm del PC come hai impostato il FIFO oppure no ? In alcuni casi occorre disabilitarlo ....

Se non hai accesso al programma del PLC .... stiamo (stai) perdendo tempo :toobad:

Modificato: da max.riservo
Link al commento
Condividi su altri siti

Il programma plc devo scriverlo io

pc e plc hanno la stessa configurazione della com,

COM5

rate 19200

parity None

Byte size 8

Stop bit 1

uso Portmon per monitorare la seriale e viene inviato

ho provato a disabilitare il FIFO sul pc ma niente da fare ricevo sempre caratteri strani.

il fatto è che plc e convertitore si parlano ma non si capiscono :)

Link al commento
Condividi su altri siti

Non trovo info sul convertitore 232/485 Come commuta la direzione il convertitore 485 ? automatico ?

Da PLC riesci a fargli trasmettere un carattere in continuo (Io uso la U miauscola che genera un'onda quadra che commuta ad ogni bit) se hai un oscilloscopio puoi controllare

Come fai a dire che plc e convertitore si parlano vedi lampeggiare i led ?

Link al commento
Condividi su altri siti

Il programma plc devo scriverlo io

pc e plc hanno la stessa configurazione della com,

COM5

rate 19200

parity None

Byte size 8

Stop bit 1

uso Portmon per monitorare la seriale e viene inviato

ho provato a disabilitare il FIFO sul pc ma niente da fare ricevo sempre caratteri strani.

il fatto è che plc e convertitore si parlano ma non si capiscono :smile:

Presumo che tu abbia configutato la porta seriale del PLC in modalità caratteri.

Prova a scrivere una semplice routine (nel PLC) che invia in maniera temporizzata (i.e. 1 volta al secondo) una semplice word che contiene un numero intero a tua scelta .... quindi verifica cosa visualizzi tramite Portmon / Hyperterminal

Se riesci a visualizzare correttamente il numero, prova ad incrementarlo ad ogni trasmissione.

Con che programma (lato PC) intendi accedere al PLC ?

Link al commento
Condividi su altri siti

Presumo che tu abbia configutato la porta seriale del PLC in modalità caratteri.

Esatto

Prova a scrivere una semplice routine (nel PLC) che invia in maniera temporizzata (i.e. 1 volta al secondo) una semplice word che contiene un numero intero a tua scelta .... quindi verifica cosa visualizzi tramite Portmon / Hyperterminal

Se riesci a visualizzare correttamente il numero, prova ad incrementarlo ad ogni trasmissione.

Provo immediatamente

Con che programma (lato PC) intendi accedere al PLC ?

Unity pro 7

Link al commento
Condividi su altri siti

Unity pro 7

Scusa Unity Pro è il software di programmazione dell' M340 . <_<

Max.riservo credo si riferisca al software che intendi utilizzare per l'applicativo che deve comunicare con l'M340.

bigalex :blink:

Link al commento
Condividi su altri siti

Uso un software fornitomi dal cliente del quale non so praticamente niente.

ad oggi sono riuscito a leggere dal plc una stringa inviata da hyperteminal con il seguente programma

t_1s (IN:=test_1_s, PT:=t#1s) ;

pippo_Q:=t_1s.Q;
INPUT_CHAR(ADDM('0.0.0.sys'), 1, 1, management_table_R, returned_string_READ);
if returned_string_READ <> '' AND returned_string_READ <> appoggio_res then
appoggio_res:=returned_string_READ;
end_if;
if RE(pippo_Q) then
PRINT_CHAR(ADDM('0.0.0.sys'), appoggio_res, management_table_W);
end_if;
test_1_s:=not t_1s.Q;

quello che mi aspetterei da queste due righe stupide (per voi) è che leggendo "A" mi scriva "A" sulla seriale. ma non invia niente. wallbash.gif wallbash.gif wallbash.gif wallbash.gif wallbash.gif

Link al commento
Condividi su altri siti

Proviamo a seguire un metodo ragionevole invece di andare per (pessimi) tentativi .....

1) - Il cavo di connessione per la seriale 'famolo' semplice ovvero PIN 2, PIN3 e PIN 5 (della seriale ovviamente - TX,RX GND) abbinali ai piedini complementari della porta del PLC (lascio a te il compito di trovare la piedinatura corretta). Importante : il TX (PC) devi collegarlo al RX (PLC), l' RX (PC) devi collegarlo al TX (PLC) - GND con GND. Con questo cavo basilare NON hai i controlli hardware sul flusso di dati e NON devi abilitarli;

2) - Configuri la porta del PC e del PLC nella stessa identica maniera(i.e. 19200,8,N,1). Configura la porta del PLC in modalità caratteri;

3) - Scrivi nel PLC un semplice programma che ad evento temporizzato (i.e. ogni secondo) ti invia sulla porta seriale (tramite PRINTCHAR) un numero intero che si incrementa ad ogni invio (ovvero una word - 16 bit - che è l' unità di misura minima per la comunicazione) e verifichi se riesci a leggere sul PC tramite hyperterminal (ovviamente configurato per leggere dalla seriale virtuale e con gli stessi parametri di comunicazione impostati per la porta del PLC). Fino a che NON riesci a leggere correttamente il numero (i) è inutile sprecare energie in altre prove : devi trovare dove è l' inghippo (errata configurazione delle seriali, cavo sbagliato, sw nel plc sbagliato, convertitore seriale 'problematico', etc ...). PERCHE' cominciare con la trasmissione dal PLC e non viceversa ? Semplice : perchè per la trasmissione (senza flusso di controllo) NON dovresti avere problemi nell' invio (ovvero non dovresti avere problemi legati a timeout / disponibilità della porta a trasmettere). La ricezione dal PLC implica SEMPRE la gestione del timeout quindi, se possibile, conviene affrontarla DOPO aver avuto la certezza che la comunicazione seriale funziona !

4) - Adesso che sai che la comunicazione seriale funziona in una direzione puoi implentare la ricezione nel PLC : e qui non ti resta che leggere l' . dove tutto è spiegato egregiamente ! Sommariamente devi gestire il timeout che implica che NON puoi mandare in esecuzione una INPUTCHAR se prima NON è terminata la INPUTCHAR precedente (la gestione della comunicazione seriale - TCP/IP è ASINCRONA rispetto al ciclo di esecuzione del programma);

5) - Prima di perdere troppo tempo : fatti dare dal tuo Cliente le specifiche del protocollo che vuole utilizzare con il suo SW (sei sicuro che si tratti di un protocollo ASCII ?) Ricordati : due apparecchiature che utilizzano due protoccoli differenti NON si capiranno mai

INPUT_CHAR(ADDM('0.0.0.sys'), 1, 1, management_table_R, returned_string_READ);

Sei sicuro che sia corretto l' indirizzamento della seriale ? Non ho il mauale sotto mano quindi NON riesco a darti uan certezza ma ho qulache dubbio .....

Link al commento
Condividi su altri siti

Capisco che il codice che ho scritto non sia il codice piu figo che sia stato scritto su un plc , sono alle prime armi e chiedo umilmente scusa per questo.

ad ora la connessione tra plc e serial converter sono corrette, D1 D0 e GND correttamente collegati all'ingresso in 485 del converter. Da PC con hyperterminal leggo e scrivo da e al plc. Ho fatto un ciclo ad 1 secondo scrivendo un numero incrementale e funziona, scrivo da HyperTerminal e leggo correttamente sul plc.

l'lindirizzo della seriale corretto è ( suppongo) 0.0.0 perchè se metto altro non funziona piu niente.

purtroppo sul video usa read e write_var perchè usa modbus_tcp e non character mode

t_1s (IN:=test_1_s, PT:=t#1s) ;

RE_READ:=t_1s.Q;
if RE(RE_READ) then
INPUT_CHAR(ADDM('0.0.0'), 1, READ_length, management_table_R, returned_string_READ);
IF (%MW70.0) THEN
SET(%MW70.1);
RE_WRITE := %MW70.1;
PRINT_CHAR(ADDM('0.0.0'), 'pong', management_table_W);
END_IF;
end_if;

sto facendo un semplice ping-pong tra plc e computer

questo è il codice che mi sta funzionando al momento, copiato dalla guida di unity pro. Il problema oltre a non aver capito come scrivere una volta finita la lettura, è che 'returned_string_READ' contiene "PONG"

Link al commento
Condividi su altri siti

(*Stampa Etichetta*)
IF Cmd_Print AND NOT TB_SC_Zebra[0].0 THEN

	TB_Sc_Zebra[0]:=0;
	TB_Sc_Zebra[1]:=0;
	TB_Sc_Zebra[2]:=0;
	TB_Sc_Zebra[3]:=100;
	
	PRINT_CHAR(ADR :=ADDM('0.0.0'), EMIS := Buffer_Zebra, GEST := TB_SC_Zebra);
	
	SET (Print_In_Progress);
	RESET (Cmd_Print);
END_IF;
IF Print_In_Progress AND NOT TB_SC_Zebra[0].0 THEN

	IF TB_SC_Zebra[1]=0 THEN
		(*print OK*)
		INC (TB_CT_Zebra[1]);
	ELSE
		(*errore print*)
		INC (TB_CT_Zebra[2]);
	END_IF;
	RESET (PRint_In_Progress);
END_IF;

Questo è il codice che utilizzo per inviare dei caratteri ad una stampante seriale .......

Cmd_Print e Print_In_Progress sono variabili bool (o ebool).

TB_Sc_Zebra è un array di 4 interi (corrisponde al tuo management_table_W).

Quando invii dei caratteri attivi il bit Print_in_Progress (e la funzione print_char alza il bit di scambio attivita TB_SC_Zebra[0].0), prima di effettuare una nuova trasmissione devi attendere che il bit di scambio di attività sia ritonato a zero.

La variabile TB_SC_Zebra[1]=0 indica che la trasmissione è stata eseguita correttamente.

Per la ricezione l' approccio è molto simile : devi attendere che il bit di attività ritoni a zero pirma di effettuare una una ricezione.

Ti consiglio di interbloccare la ricezione e la trasmissione in modo da avere solo una funzione alla volta in esecuzione.

Capisco che il codice che ho scritto non sia il codice piu figo che sia stato scritto su un plc , sono alle prime armi e chiedo umilmente scusa per questo.

Non devi scusarti di nulla, come scriviamo il codice è molto soggettivo .... spero di averti fatto comprendere che devi gestire i bi di attività degli scambi con la seriale.

l'lindirizzo della seriale corretto è ( suppongo) 0.0.0 perchè se metto altro non funziona piu niente.

Effettivamente è corretto ..... sorry

Link al commento
Condividi su altri siti

Grazie max.riservo, sono riuscito ad effettuare correttamente una lettura e successiva scrittura interbloccando le due, il primo giro funziona perfettamente ma nel secondo mi trovo a leggere la stringa che ho inviato come risposta e appesa la stringa inviata dal pc ( E. se in risposta mando 'pippo' al secondo giro leggerò 'pippo$10$20%20', leggerò meglio la documentazione. grazie ancora

Link al commento
Condividi su altri siti

Probabilmente devi solo ripulire l' area di ricezione dati prima di effettuare la INPUT_CHAR come devi ripulirla prima di effettuare l' invio (PRINT_CHAR) ....

Come da mio codice : gestisci dei contatori per vedere l' esecuzione delle funzioni (contatore totale invii, contatore invii OK e contatore invii NonOK - stessa principi per la ricezione). Dovrebbe essere un ulteriore strumento di debug

Link al commento
Condividi su altri siti

  • 8 months later...

Chiedo scusa se riapro un post di febbraio, ma sono tornato a mettere mano sul convertitore 232 485 . 
Come detto nei post precedenti sono riuscito a leggere un messaggio inviato da un pc via 232 sul mio M340 usando rs485. Interbloccando le richieste funziona se il messaggio lo scrivo io

es. leggo ping e rispondo pong

Il problema è che l'applicativo con cui devo comunicare mi scrive di continuo con loop da 500ms il seguente messaggio

97  2.27.20  #############  IRP_MJ_WRITE  Serial0  Length 12: 10 02 FF 01 02 00 0F 00 10 03 89 5A 
97  2.27.20  SUCCESS  
98  2.27.20  #########.exe  IRP_MJ_READ  Serial0  Length 80
98  2.27.20  SUCCESS  Length 16: 10 02 00 01 06 00 1A 00 02 40 00 00 10 03 71 DA 
99  2.27.21  #########.exe  IRP_MJ_READ  Serial0  Length 80
99  2.27.21  SUCCESS  Length 0: 
100  2.27.21  #########.exe  IRP_MJ_WRITE  Serial0  Length 12: 10 02 FF 01 02 00 0F 00 10 03 89 5A 
100  2.27.21  SUCCESS  
101  2.27.21  #########.exe  IRP_MJ_READ  Serial0  Length 80
101  2.27.21  SUCCESS  Length 16: 10 02 00 01 06 00 1A 00 02 40 00 00 10 03 71 DA 
102  2.27.21  #########.exe  IRP_MJ_READ  Serial0  Length 80
102  2.27.21  SUCCESS  Length 0: 

e sul plc leggo

 

'$01$01$01$04$08$L$10$03$05z$10$02ÿ$01$08'

 

non so piu che pesci prendere, ho anche provato a cambiare il converter seriale ma il risultato non cambia, ho provato a modificare le impostazioni del converter ma niente.  Il converter che utilizzo è TRANSCOM RS232-RS485 Model XC2-23-48

 

grazie in anticipo

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