g3nti Inserito: 28 gennaio 2015 Segnala Share Inserito: 28 gennaio 2015 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 More sharing options...
bigalex Inserita: 28 gennaio 2015 Segnala Share Inserita: 28 gennaio 2015 (modificato) Cosa ci devi fare con questa connessione ? Che tipo di protocollo utilizzi (es. modbus) ? Che tipo di cpu controllore hai ? bigalex Modificato: 28 gennaio 2015 da bigalex Link al commento Condividi su altri siti More sharing options...
g3nti Inserita: 28 gennaio 2015 Autore Segnala Share Inserita: 28 gennaio 2015 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 More sharing options...
g3nti Inserita: 30 gennaio 2015 Autore Segnala Share Inserita: 30 gennaio 2015 Link al commento Condividi su altri siti More sharing options...
max.riservo Inserita: 31 gennaio 2015 Segnala Share Inserita: 31 gennaio 2015 (modificato) 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 Modificato: 31 gennaio 2015 da max.riservo Link al commento Condividi su altri siti More sharing options...
g3nti Inserita: 2 febbraio 2015 Autore Segnala Share Inserita: 2 febbraio 2015 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 More sharing options...
accacca Inserita: 2 febbraio 2015 Segnala Share Inserita: 2 febbraio 2015 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 More sharing options...
max.riservo Inserita: 2 febbraio 2015 Segnala Share Inserita: 2 febbraio 2015 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 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 More sharing options...
g3nti Inserita: 3 febbraio 2015 Autore Segnala Share Inserita: 3 febbraio 2015 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 More sharing options...
bigalex Inserita: 3 febbraio 2015 Segnala Share Inserita: 3 febbraio 2015 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 Link al commento Condividi su altri siti More sharing options...
g3nti Inserita: 3 febbraio 2015 Autore Segnala Share Inserita: 3 febbraio 2015 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. Link al commento Condividi su altri siti More sharing options...
max.riservo Inserita: 3 febbraio 2015 Segnala Share Inserita: 3 febbraio 2015 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 More sharing options...
max.riservo Inserita: 3 febbraio 2015 Segnala Share Inserita: 3 febbraio 2015 Un https://www.youtube.com/watch?v=SQF_o1G684U forse vale più di tante parole .... P.S. - L' indirizzo della seriale on board della CPU BMXP342020 dovrebbe essere '0.0.03' Link al commento Condividi su altri siti More sharing options...
g3nti Inserita: 4 febbraio 2015 Autore Segnala Share Inserita: 4 febbraio 2015 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 More sharing options...
max.riservo Inserita: 4 febbraio 2015 Segnala Share Inserita: 4 febbraio 2015 (*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 More sharing options...
g3nti Inserita: 5 febbraio 2015 Autore Segnala Share Inserita: 5 febbraio 2015 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 More sharing options...
max.riservo Inserita: 5 febbraio 2015 Segnala Share Inserita: 5 febbraio 2015 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 More sharing options...
g3nti Inserita: 5 novembre 2015 Autore Segnala Share Inserita: 5 novembre 2015 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 ioes. leggo ping e rispondo pongIl problema è che l'applicativo con cui devo comunicare mi scrive di continuo con loop da 500ms il seguente messaggio97 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora