Vai al contenuto
PLC Forum


"Clonare" comunicazione seriale


Wimatech

Messaggi consigliati

Ciao a tutti, è da un po che lavoro con un sensore che comunica via rs232, il produttore del sensore mi ha fornito una libreria "dll" che aggiungendola ad un mio sfw scritto in vb.net mi permette di connettermi e leggere il valore che mi fornisce il sensore.

Ora vorrei costruire un dispositivo che sia portatile e senza bisogno del pc ho quindi chiesto al fornitore info per collegarlo ad arduino ma non mi risponde.

A questo punto ho collegato sulla seriale1 di un arduino mega un apposito shield con max232 e ho fatto uno sketch che stampa sulla seriale ciò che riceve dalla seriale 1, ho fatto dei test inviandogli dei testi e li visualizza correttamente:

 

  if(Serial1.available()){
    char c = Serial1.read();
    Serial.print("Ricevuto :");Serial.println(c);    
    delay(5);
  }

 

Poi ho aperto il programmino che uso normalmente per collegarmi col sensore è ho inviato i comandi per aprire la porta e leggere la misura:

Apertura porta:
ClsRiftek.RF60x_OpenPort_PROXY(CmbCom.Text, CmbBoude.Text, hRF60x)

Lettura misura:
ClsRiftek.RF60x_Measure_PROXY(hRF60x, 1, Misura_ABS)

Con:

CmbCom.Text=Nome della porta    ovviamente noto

CmbBoude.Text=BaudeRate          ovviamente noto

hRF60x    è un intero che mi viene restituito del sensore e che devo utilizzare per fare le letture, a quanto ho capito è una specie di indice

Misura_ABS   è un long ed è il valore che voglio ottenere

 

Il problema è che quando ci provo sul monitor seriale di arduino visualizzo a malapena un quadrattino la mia idea, visto che il produttore non mi da udienza era di andare a vedere cosa esce dalla seriale e provare poi a "clonare" ciò che esce per provare a leggere il valore utilizzando arduino.

Qualcuno mi sa dire se è una cosa fattibile o se sto semplicemente sbattendo inutilmente la testa contro il muro?????

Grazie 

Link al commento
Condividi su altri siti


Purtroppo i comadi di seriale di arduino non sono quelli del VB o del "C".

Dovresti "sniffare" la comunicazione seriale tra PC e sensore, tramite un programma tipo Hyperterminal collegato ad una porta di un PC; in questo modo puoi risalire ai codici dei comandi inviati ed alle risposte.

Poi i comandi li puoi inviare tramite "Serial.write()" ed otteenre le risposte con  "Serial.read()"

 

Perchè non scrivi il tipo di sensore che stai usando (marca, modello, altro), magari sarebbe più facile darti qualche informazione.

Link al commento
Condividi su altri siti

Ciao,

se hai un pc con due seriali lo interponi tra il pc di controllo e il distanziometro.

ti scrivi "due" righe di codice in vbnet una che legge quello che scrive il pc al distanziometro lo mette a video e lo riscrive al distanziometro e un'altra che legge quello che risponde il distanziometro lo mette a video e lo riscrive al pc. Così facendo hai la sequenzialità di comandi e risposte tra pc e distanziometro e viceversa..

Sennò usi un analizzatore di protocollo da 5000€ :)

 

 

Modificato: da drn5
Link al commento
Condividi su altri siti

OK allora ricapitolando...

Il programmino in VB che semplicemente invia e riceve dalla 232 l'ho già fatto e funziona, almeno con arduino quindi qualcosa vede.

ho purtroppo un solo adattatore USB/RS232 ma oggi pomeriggio vado in negozio a vedere se ne hanno un secondo alla peggio domani me ne faccio spedire un altro (mitico amazon prime).

 

POI:

collego i due adattatori tra loro e al pc supponiamo com2 e com3

da com2 usando il programma che comunica col laser lancio il comando per aprire la porta e connettere

da com3 guardo cosa viene spedito

successivamente mi collego al sensore e provo ad inviare ciò che ho letto precedentemente e vedo se il sensore mi risponde e cosa mi risponde

poi ripeto l'operazione col comando di lettura del valore

3 ore fa, drn5 ha scritto:

Ciao,

se hai un pc con due seriali lo interponi tra il pc di controllo e il distanziometro.

ti scrivi "due" righe di codice in vbnet una che legge quello che scrive il pc al distanziometro lo mette a video e lo riscrive al distanziometro e un'altra che legge quello che risponde il distanziometro lo mette a video e lo riscrive al pc. Così facendo hai la sequenzialità di comandi e risposte tra pc e distanziometro e viceversa..

Sennò usi un analizzatore di protocollo da 5000€ :)

 

 

L'idea dell'analizzatore onestamente non mi piace molto soprattutto per i 5k

Link al commento
Condividi su altri siti

Si cosy facendo dovresti vedere.

Però se usi Hyperterminal, che è un software gratuito scaricabile in rete, fai quasi quello che fa un analizzatore di rete. L'ideale sarebbe disporre di un vecchio PC con porta RS232 e connettere questa porta in parallelo alla linea PC---Sensore. io tengo appositamente un vecchio PC proprio per queste cose.

Link al commento
Condividi su altri siti

Il problema di hyper terminal e che vedi solo i caratteri stampabili, se ti arriva qualcosa di strano fai fatica a decifrarlo.

Ci sono tools gratis che ti scrivono il valore in decimale o esadecimale oppure lo puoi fare con VB, ogni carattere ricevuto ti scriva il codice 

Link al commento
Condividi su altri siti

9 ore fa, max.bocca ha scritto:

Ci sono tools gratis che ti scrivono il valore in decimale o esadecimale oppure lo puoi fare con VB, ogni carattere ricevuto ti scriva il codice 

 

Per quello lo fa anche arduino

Link al commento
Condividi su altri siti

Buonasera a tutti, oggi ho fatto un po di test e gli sviluppi sono questi:

 

1) Ho connesso 2 adattatori usb/232 al pc sul primo invio i comandi (apri porta) e (leggi valore) utilizzando il sfw che funziona col laser sul secondo metto in ascolto un programmino fatto da me in vb che legge e stampa a monitor ma visualizzo solo dei ?

 

2) Ho ripetuto il test precedente mettendo Hyperterminal in ascolto ma visualizzo solo degli smile seguiti da alcuni caratteri strani tipo ü

 

3) Ho scaricato ed installato Serial Port Monitor, ho collegato il laser ad uno dei due adattatori e ho avviato il sfw mettendolo in ascolto del traffico dati della porta in questione, a monitor ora mi vengono visualizzati una marea di dati che purtroppo faccio molta fatica ad interpretare, mi sapete dare una dritta?

Allego i dati visualizzati:

 

Apertura porta:

[05/08/2020 19:05:47] 
1 IRP_MJ_CREATE - Opens a COM port (COM5) 
    STATUS_SUCCESS 
        Opened by: 
            C:\Users\WILLIAM\Desktop\riftek\Scanner Laser 2013\rf 4 dotnet\WindowsApplication1\bin\Debug\WindowsApplication1.vshost.exe 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
3 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_GET_BAUD_RATE - Returns the baud rate that is currently set for a COM port 
            BaudRate - 9600 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
5 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_GET_LINE_CONTROL - Request returns information about the line control set for a COM port 
            StopBits   - 0 (1 stop bit) 
            Parity     - 2 (EVEN_PARITY) 
            WordLength - 8 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
7 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_GET_CHARS - Request returns the special characters that Serial uses with handshake flow control 
            EofChar   - 26 
            ErrorChar - 0 
            BreakChar - 0 
            EventChar - 26 
            XonChar   - 17 
            XoffChar  - 19 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
9 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_GET_HANDFLOW - Request returns information about the configuration of the handshake flow control set for a COM port 
            ControlHandShake - 0x00  
            FlowReplace      - 0x00  
            XonLimit         - 2048 
            XoffLimit        - 512 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
11 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_GET_BAUD_RATE - Returns the baud rate that is currently set for a COM port 
            BaudRate - 9600 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
13 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_GET_LINE_CONTROL - Request returns information about the line control set for a COM port 
            StopBits   - 0 (1 stop bit) 
            Parity     - 2 (EVEN_PARITY) 
            WordLength - 8 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
15 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_GET_CHARS - Request returns the special characters that Serial uses with handshake flow control 
            EofChar   - 26 
            ErrorChar - 0 
            BreakChar - 0 
            EventChar - 26 
            XonChar   - 17 
            XoffChar  - 19 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
17 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_GET_HANDFLOW - Request returns information about the configuration of the handshake flow control set for a COM port 
            ControlHandShake - 0x00  
            FlowReplace      - 0x00  
            XonLimit         - 2048 
            XoffLimit        - 512 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
19 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_SET_BAUD_RATE - Request sets the baud rate on a COM port. Serial verifies the specified baud rate 
            BaudRate - 9600 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
21 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_CLR_RTS - Request clears the RTS control signal  
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
23 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_CLR_DTR - Request clears the DTR control signal.  
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
25 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_SET_LINE_CONTROL - Request sets the line control register 
            StopBits   - 0 (1 stop bit) 
            Parity     - 2 (EVEN_PARITY) 
            WordLength - 8 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
27 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_SET_CHARS - Request sets the special characters that Serial uses for handshake flow control 
            EofChar   - 26 
            ErrorChar - 0 
            BreakChar - 0 
            EventChar - 26 
            XonChar   - 17 
            XoffChar  - 19 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
29 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_SET_HANDFLOW - Request sets the configuration of handshake flow control 
            ControlHandShake - 0x00  
            FlowReplace      - 0x00  
            XonLimit         - 2048 
            XoffLimit        - 512 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
31 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_SET_TIMEOUTS - Request sets the timeout value's that the driver uses with read and write requests 
            ReadIntervalTimeout         - 300 
            ReadTotalTimeoutMultiplier  - 300 
            ReadTotalTimeoutConstant    - 800 
            WriteTotalTimeoutMultiplier - 0 
            WriteTotalTimeoutConstant   - 0 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
33 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_SET_QUEUE_SIZE - Request sets the size of the internal receive buffer 
            InSize  - 1024 
            OutSize - 1024 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
35 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_PURGE - Request cancels the specified requests and deletes data from the specified buffers 
            Flags - 0x0000000c 
---------------------------------------------------------------------------------- 
[05/08/2020 19:05:47] 
37 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM5) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_SET_WAIT_MASK - Request configures Serial to notify a client after the occurrence of any one of a specified set of wait events 
            Mask - 0x00000005 (EV_RXCHAR | EV_TXEMPTY) 
---------------------------------------------------------------------------------- 

 

 

Se può aiutare ad interpretare i dati posso dire che:

 

Il comando di apertura porta:     ClsRiftek.RF60x_OpenPort_PROXY("COM5:", 9600, Label1.Text)    restituisce in label1 il valore 1568

Il comando di lettura valore :      ClsRiftek.RF60x_Measure_PROXY(Label1.Text, 1, Label2.Text)     ho passato il valore precedente 1568 e in label2 ha restituito la lettura di 4560

 

 

 

 

opengrid.PNG

 

 

 

Modificato: da Wimatech
Link al commento
Condividi su altri siti

Ho dato una veloce lettura al manuale e, a parere mio, non è necessario sniffare la comunicazione perchè i comandi e le risposte sono bene descritti.

Mi pareva strano che ilproduttore vendesse un sensore senza fornire dati per la comunicazione.

Bisogna solo studiarsi il manuale e fare delle prove pratiche.

Link al commento
Condividi su altri siti

 

2 ore fa, Livio Orsini ha scritto:

Ho dato una veloce lettura al manuale e, a parere mio, non è necessario sniffare la comunicazione perchè i comandi e le risposte sono bene descritti.

Mi pareva strano che ilproduttore vendesse un sensore senza fornire dati per la comunicazione.

Bisogna solo studiarsi il manuale e fare delle prove pratiche.

 

presumo che lei stia parlando di questa parte di manuale:

Cattura.PNG

Link al commento
Condividi su altri siti

 

Io ho provato anche in vb ad inviare ad esempio il comando 01h che serve ad identificare il dispositivo in questo modo:

SerialPort1.WriteLine("01h")

ovviamente dopo aver aperto la porta ma sicuramente sbaglio qualcosa anche perchè so molto poco in comunicazione seriale, mi sapete dare una dritta?

Cattura2.PNG

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