www.progettihwsw.com english

Usare la seriale RS232 con VB6: il controllo MSCOMM


E' molto semplice collegarsi e comunicare con la scheda, infatti la scheda con USB viene vista come se fosse una seriale RS232 virtuale e quindi e' possibile comandare la scheda inviando dei semplici comandi usando programmi molto diffusi e molto usati come HiperTerminal hiper terminal
Clicca qui per scaricare il codice sorgente in VB6 per pilotare la scheda USB

Scheda Ethernet con VB6

E' anche disponibile una versione della scheda pilotata dall'ethernet Clicca Qui Scheda Ethernet
Clicca qui per scaricare il codice sorgente in VB6 per pilotare la scheda ethernet

Scheda rele' USB seriale RS232

Rele' USB

E' anche disponibile una versione della scheda pilotata dall'ethernet invece che dall'USB: Clicca Qui Scheda Ethernet

E' molto semplice collegarsi e comunicare con la scheda, infatti la scheda con USB viene vista come se fosse una seriale RS232 virtuale e quindi e' possibile comandare la scheda inviando dei semplici comandi usando programmi molto diffusi e molto usati come HiperTerminal hiper terminal

Usare la seriale RS232 con VB6: il controllo MSCOMM

Per pilotare la scheda rele', la scheda display o la chiave USB per la protezione del software occorre saper gestire una porta seriale RS-232 in quanto la porta USB verra' considerata a tutti gli effetti come una porta seriale virtuale, in pratica andrete a inviare i comandi sulla COM3 invece che sulla COM1
Con Visual Basic viene fornito un componente per la gestione della seriale, l' MSCOMM.OCX.
L'MSCOMM dispone di diverse proprietà, di un solo evento ( OnComm() ) e nessun metodo. Iniziamo col creare un nuovo progetto, rendiamo disponibile il controllo MSCOMM andando sul menù Progetto->Componenti, e selezionando "Microsoft comm control x.x".
Aggiungete quindi il controllo, ora presente nella barra degli strumenti, nel form (Form1) dando vita al controllo MSComm1.
Per questioni didattiche preferisco configurare il controllo a run-time, quindi nell'evento Form_Load() inserite quanto segue:

MSComm1.CommPort = 1 ' Selezioniamo la COM1
MSComm1.Settings = "115200,n,8,1" ' Le impostazioni della seriale
MSComm1.PortOpen = True ' Apriamo la porta.

Impostando la proprietà PortOpen a True si richiede al sistema il permesso d' utilizzo della porta scelta (COM1). Se la porta è disponibile il sistema operativo la assegnerà a noi, diversamente se la porta è già utilizzata da un'altro processo verrà generato un errore intercettabile con l'istruzione ON ERROR.
Per chiudere la porta e rilasciarne il controllo, è sufficiente impostare PortOpen a False.

A questo punto siamo già in grado di inviare dati sulla seriale, per esempio un classico "Ciao Mondo".

MSComm1.Output = "Ciao Mondo"
A questo punto avete tutto il necessario per comunicare con le schede elettroniche, bastera' inviare sulla seriale virtuale il comando corretto. Per essere sicuri che il comando e' stato accettato e interpretato correttamente dalla scheda e' consigliabile anche controllare che la risposta dalla scheda sia conforme al protocollo.

L'evento OnComm()

Il controllo MSCOMM è asincrono, ossia non occorre che il programma dedichi tutto il suo tempo a controllare ciò che accade sulla seriale, è il controllo MSCOMM che si preoccupa di informare il programma di ciò che accade tramite il richiamo dell'evento OnComm() e l'impostazione della proprietà CommEvent. Quindi l'intera intelligenza della comunicazione è da implementare nell'evento OnComm().
Quando viene richiamato l'evento OnComm(), Nella proprietà CommEvents è riportato l'evento accaduto. Esso può assumere uno dei seguenti valori (vedi l'help in linea del VB):

Costanti relative agli errori

comEventBreak 1001 Ricezione di un segnale di interruzione.
comEventFrame 1004 Errore di frame. L'hardware ha individuato un errore di frame.
comEventOverrun 1006 Overrun della porta. L'hardware non ha letto un carattere prima dell'arrivo del successivo e il carattere è andato perduto.
comEventRxOver 1008 Overflow del buffer di ricezione. Spazio esaurito nel buffer di ricezione.
comEventRxParity 1009 Errore di parità. È stato rilevato un errore di parità.
comEventTxFull 1010 Buffer di trasmissione pieno. Spazio esaurito nel buffer di trasmissione durante il tentativo di inserimento di un carattere.
comEventDCB 1011 Errore imprevisto durante il recupero del DCB (Device Control Block) della porta.

Costanti relative agli eventi di seriale

comEvSend 1 Nel buffer di trasmissione è presente un numero di caratteri inferiore a quello definito dalla proprietà Sthreshold.
comEvReceive 2 Numero di caratteri Rthreshold ricevuti. Questo evento viene generato fino a quando non si utilizza la proprietà Input per rimuovere i dati dal buffer di ricezione.
comEvCTS 3 Modifica nella linea CTS (Clear To Send).
comEvDSR 4 Modifica nella linea DSR (Data Set Ready). Questo evento viene generato solo quando DSR cambia da 1 a 0.
comEvCD 5 Modifica nella linea CD (Carrier Detect).
comEvRing 6 Individuato segnale telefonico. È possibile che alcuni UART (universal asynchronous receiver-transmitters) non supportino questo evento.
comEvEOF 7 Ricevuto carattere indicatore di fine file (carattere ASCII 26).

Non è comunque indispensabile la consultazione della proprietà CommEvent che personalmente uso solo nelle comunicazioni seriali complesse; vediamo dunque come implementare una semplice ricezione dati dalla seriale.
Come prima cosa è necessario dire al controllo MSCOMM che desideriamo essere informati della ricezione dei caratteri, impostando la proprietà Rthreshold a 1. Quindi l'apertura della porta la modifichiamo come segue.

Private Sub Form_Load()
     MSComm1.CommPort = 1 ' Selezioniamo la COM1
     MSComm1.Settings = "9600,n,8,1" ' Le impostazioni della seriale
     MSComm1.RThreshold = 1 ' voglio essere informato della ricezione di ogni singolo carattere
     MSComm1.PortOpen = True ' Apriamo la porta.
End Sub

Aggiungete al Form un controllo testo Text1 (fatelo bello grande) ed impostate la proprietà MultiLine a True.
A questo punto aggiungete il seguente codice:

Private Sub MSComm1_OnComm()
    Dim Rx$
    Rx$ = MSComm1.Input ' Leggo il contenuto del buffer di ricezione (e svuoto .Input)
    If Len(Rx$) Then ' Se ho ricevuto qualcosa lo scrivo nella TextBox
        Text1.Text = Text1.Text & Rx$
    End If
End Sub

Nella propriatà Input vengono riportati tutti i caratteri ricevuti. è da notare che la proprietà Input la si può leggere una sola volta in quanto dopo averla letta (ed in questo caso assegnata alla variabile Rx$) viene automaticamente azzerata (="").
Per esempio il seguente codice NON FUNZIONA!
If Len(MSComm1.Input) Then
    Text1.Text = Text1.Text & MSComm1.Input
perche l' IF svuota il contenuto di Input ed alla text box viene appesa una stringa vuota.

Impostando la proprietà Rthreshold a 1 imponiamo al controllo MSCOMM di richiamare l'evento OnComm() alla ricezione di ogni singolo carattere. In ogni caso, visto che la segnalazione non viene data in Interrupt-Time, lo scatenarsi dell'evento OnComm() può avvenire in ritardo se il PC è impegnato in qualche elaborazione, ed è quindi molto probabile che nella proprietà Input sia contenuto più di un carattere.

Per poter anche trasmettere, aggiungete il seguente codice:

Private Sub
    Text1_KeyPress(KeyAscii As Integer)
    MSComm1.Output = Chr$(KeyAscii)
End Sub

Abbiamo così costruito con la TextBox un semplice terminale ASCII.
Il controllo MSCOMM ha un difetto sull'evento OnComm() riscontrabile quando si sta facendo del DEBUG del proprio codice. Se ad esempio si mette in pausa l'esecuzione del programma, e durante l'attesa giungono dei caratteri alla seriale, al riavvio del programma non verrà generato alcun evento per i caratteri già ricevuti.
Una scappatoia per ovviare al problema è quella di aggiungere un TIMER, con una cadenza dell'ordine dei 250-400 mSec,
che si limita a richiamare la funzione MSComm1_OnComm(), compensando così alla mancata generazione (in debug) dell'evento OnComm()
Esempio:

Private Sub Timer1_Timer()
    Call MSComm1_OnComm
End Function

Per ulteriori informazioni potete contattare un tecnico al Tel 0331 730164 o Cell 347-6651065

Il protocollo di comunicazione e' semplicissimo, nell'esempio si nota come basta inviare sulla seriale il valore 0x30 (che corrisponde al tasto 0 della tastiera) per fare accendere il led, il protocollo prevede anche una risposta per dare evidenza che il comando e' stato ricevuto e accettato, infatti la scheda risponde inviando sulla seriale virtuale il carattere A
In fondo alla pagina troverete il protocollo di comunicazione completo, grazie al quale potrete attivare o disattivare i rele' presenti sulla scheda, accendere o spegnere i due led presenti sulla scheda, leggere lo stato dei pulsanti e leggere il valore dei 4 ingressi presenti sulla scheda.
La scheda puo' funzionare sia connessa al computer, ed e' autoalimentata dal BUS USB e quindi non occorrono alimentazioni esterne, ma puo' anche funzionare in modalita' "stand alone" cioe' scollegata dal PC, cioe' come un vero e proprio PLC, se si sceglie di far funzionare la scheda in modalita' "stand alone" occorre prima programmare e memorizzare quale dovra' essere il comportamento della scheda, proprio come si fa con i PLC, che vanno prima programmati, la forte limitazione della scheda e' che come PLC ha un set limitato di possibili comportamenti, ad esempio si puo' programmare la scheda affinche' il rele' 1 si attivi e disattivi seguendo l'ingresso 1 oppure che il rele' 1 si attivi e disattivi seguendo l'ingresso 1 negato e cosi' via, se si sceglie di far lavorare la scheda in modalita' "stand alone" le possibili configurazioni sono limitate e sono presenti nel protocollo di comunicazione in fondo alla pagina.
La scheda puo' essere utilizzata per sostituire un PLC in quanto e' dotata di 4 ingressi e di 4 rele' (fino a 8 ingressi e 8 uscite per ogni scheda).

E' disponibile un programma demo completo di codici sorgenti scritto in VB.NET nel quale si da un esempio di come comandare la scheda. Scarica il programma completo di codice sorgente: CLICCA QUI
Oltre al codice sorgente e ad un programma gia' compilato c'e' un file .inf che non e' nient'altro che il driver che viene richiesto al momento della prima connessione della scheda, infatti quando si connette la scheda la prima volta al PC l'USB riconosce la presenza del nuovo hardware e ne richiede il driver. Bastera' indicare il percorso del file .inf

Trovato nuovo hardware PLC rele' USB


Per ulteriori informazioni scrivere a email hw sw oppure potete contattare un nostro tecnico al Tel 347-6651065

Nell'immagine seguente e' possibile vedere le dimensioni d'ingombro della scheda e il posizionamento dei connettori e dei componenti.

Rele' USB

Impostazioni della seriale virtuale: velocita' = 115200 baud rates , 8bit, nessuna parita', un bit di stop.
Le nostre schede possono anche essere usate come demoboard per microcontrollori della Microchip come il PIC 18F2455 , 18F2550 , 18F4550 , 18F2585 e il PIC 18F2450
Realizziamo modifiche sia all'hardware che al software su richiesta.

Foto scheda elettronica Rele' USB

Disponibile anche una scheda elettronica per pilotare un display alfanumerico dalla porta USB, per maggiori informazioni clicca qui: displayusb.htm

La scheda viene alimentata dalla porta USB, e' comunque possibile alimentarla separatamente dal connettore presente sul lato opposto del connettore USB, non alimentare mai dall'alimentatore esterno se la scheda e' connessa al PC.
Non ci si ritiene responsabili di eventuali danni causati da un incorretto uso della scheda, inoltre e' bene precisare che la scheda puo' essere connessa al PC e quindi occorre prestare particolare attenzione a cio' che si collega alla scheda al fine di evitare danni sia alla scheda che al PC connesso.
La seguente immagine mostra un dettaglio dello schema elettrico, in particolare uno degli otto ingressi optoisolati.

Rele' USB

Se come ingressi si intende usare dei contatti puliti (es. pulsanti, interruttori, fine corsa) occorre specificare in fase d'ordine che la scheda deve avere gli ingressi NON optoisolati, se invece sull'ingresso si intende applicare una tensione (ad esempio proveniente da una fotocellula) allora occorre specificare, in fase d'ordine, che la scheda abbia ingressi optoisolati. E' disponibile anche una scheda con ingressi analogici (4-20mA o 0-10V) per la scheda con ingressi analogici clicca qui
La scheda puo' essere anche ordinata anche in contrassegno, cioe' si riceve un comune pacco postale e si paga in contanti al postino (NO ASSEGNI), oppure e' possibile pagare con bonifico bancario anticipato.
Minimo fatturabile 100 euro
Esistono piu' modelli della scheda, quindi in fase d'ordine occorre specificare a quale modello della scheda si e' interessati



I prezzi sul sito sono IVA esclusa. Sono previsti SCONTI per acquisti superiori a cinque pezzi. Prezzi aggiornati al Dicembre 2023

                
Schede ETHERNET
Prima di procedere con l'acquisto si consiglia di verificare la disponibilita' del materiale inviando un'email PostePay                 


Modello Descrizione Costo Spese spedizione

Schede USB+WiFi
SNT337 USB+WiFi 2R 0IN 2 rele' di potenza 0 ingressi 61 euro 13 euro
SNT337 USB+WiFi 4R 0IN 4 rele' di potenza 0 ingressi 66 euro 13 euro
SNT337 USB+WiFi 4R 4IN 4 rele' di potenza 4 ingressi 81 euro 13 euro
SNT319 USB+WiFi 8R 0IN 8 rele' di potenza 0 ingressi 84 euro 13 euro
SNT319 USB+WiFi 8R 4IN 8 rele' di potenza 4 ingressi 99 euro 13 euro
SNT319 USB+WiFi 8R 8IN 8 rele' di potenza 8 ingressi 114 euro 13 euro
Scheda Ethernet+WiFi Rele' potenza (230V 10A)
SNT335 ETH+WiFi 2R 0IN 2 rele' di potenza 105 euro 13 euro
SNT335 ETH+WiFi 2R 2IN 2 rele' di potenza 2 ingressi 110 euro 13 euro
SNT335 ETH+WiFi 4R 0IN 4 rele' di potenza 115 euro 13 euro
SNT335 ETH+WiFi 4R 4IN 4 rele' di potenza 4 ingressi 130 euro 13 euro
SNT319 ETH+WiFi 8R 0IN 8 rele' di potenza 0 ingressi 130 euro 13 euro
SNT319 ETH+WiFi 8R 4IN 8 rele' di potenza 4 ingressi 145 euro 13 euro
SNT319 ETH+WiFi 8R 8IN 8 rele' di potenza 8 ingressi 160 euro 13 euro
SNT319 ETH+WiFi 0R ANALOG IN 0 rele' ingressi analogici 125 euro 13 euro
SNT319 ETH+WiFi 1R ANALOG IN 1 rele' di potenza ingressi analogici 130 euro 13 euro
SNT319 ETH+WiFi 2R ANALOG IN 2 rele' di potenza ingressi analogici 135 euro 13 euro
SNT319 ETH+WiFi 4R ANALOG IN 4 rele' di potenza ingressi analogici 145 euro 13 euro
SNT319 ETH+WiFi 8R ANALOG IN 8 rele' di potenza ingressi analogici 160 euro 13 euro
SNT335 ETH+WiFi 2R 2RFID 2 rele' di potenza 2 ingressi 2 RFID 120 euro 13 euro
SNT331 ETH+WiFi 4R 4IN 4 rele' di potenza 4 ingressi 130 euro 13 euro
SNT319-320 ETH+WiFi 16R 0IN 16 rele' di potenza 0 ingressi 165 euro 13 euro
SNT319-320 ETH+WiFi 16R 16IN 16 rele' di potenza 16 ingressi 235 euro 13 euro

Per ulteriori informazioni sulle caratteristiche tecniche dei rele' potete consultare il seguente file: scheda_tecnica_rele.pdf
Per bassa potenza intendiamo rele' da 30Vdc/1A , per media potenza intendiamo 250Vac/1A , per alta potenza intendiamo 250Vac/10A
Per ulteriori informazioni potete contattare un nostro tecnico al Tel 0331 730164 , Cell 347-6651065
Per effettuare l'ordine occorre semplicemente inviare un'email a email hw sw e riceverete un preventivo dettagliato e modalita' di pagamento
I costi di spedizione variano a seconda della modalita' scelta, per spedizione celere il costo e' di 13 euro, per spedizione in contrassegno il costo e' di 22 euro
Per acquisti superiori a 5 schede sono previsti sconti

Le schede possono anche essere montate anche su guida DIN (che e' un piccolo supporto di plastica per agganciare la scheda ad una barra DIN), specificare in fase d'ordine, se occorre anche l'aggancio su guida DIN, in quel caso occorre aggiungere il costo del contenitore

8 Relais USB


Sono disponibili anche versioni con display, Clicca qui: scheda display

Display USB rele'

Esempio di scheda ethernet: Clicca qui
Rele' Ethernet


Protocollo di comunicazione per scheda seriale virtuale per SNT084

Invio 0 = 0x30 = 48 => Accende led 1 e risponde "A"
Invio 1 = 0x31 = 49 => risponde dando lo stato degli ingressi es "A01010101Z"
Invio 2 = 0x32 = 50 => Spegne led 1 e risponde "B"
Invio 3 = 0x33 = 51 => Spegne tutti i relay e risponde "W"
Invio 5 = 0x35 = 53 => risponde dando lo stato latchato degli ingressi es "A01010101Z"
Invio 6 = 0x36 = 54 => Accende Rele' 1 e risponde "I"
Invio 7 = 0x37 = 55 => Spegne Rele' 1 e risponde "L"
Invio 8 = 0x38 = 56 => Accende Rele' 2 e risponde "M"
Invio 9 = 0x39 = 57 => Spegne Rele' 2 e risponde "N"
Invio a = 0x61 = 97 => Accende Relay 3 e risponde "O"
Invio b = 0x62 = 98 => Spegne Relay 3 e risponde "P"
Invio c = 0x63 = 99 => Accende Relay 4 e risponde "Q"
Invio d = 0x64 = 100 => Spegne Relay 4 e risponde "R"
Invio e = 0x65 = 101 => se input 1 e' alto risponde "S" altrimenti "T"
Invio f = 0x66 = 102 => se input 2 e' alto risponde "U" altrimenti "V"
Invio g = 0x67 = 103 => se input 3 e' alto risponde "W" altrimenti "Y"
Invio h = 0x68 = 104 => se input 4 e' alto risponde "J" altrimenti "K"
Invio i = 0x69 = 105 => se input 5 e' alto risponde "Z" altrimenti "a"
Invio l = 0x6C = 108 => se input 6 e' alto risponde "b" altrimenti "c"
Invio m = 0x6D = 109 => se input 7 e' alto risponde "d" altrimenti "e"
Invio n = 0x6E = 110 => se input 8 e' alto risponde "f" altrimenti "g"
Invio o = 0x6F = 111 => Accende Rele' 5 e risponde "H"
Invio p = 0x70 = 112 => Spegne Rele' 5 e risponde "B"
Invio q = 0x71 = 113 => Accende Rele' 6 e risponde "D"
Invio r = 0x72 = 114 => Spegne Rele' 6 e risponde "E"
Invio s = 0x73 = 115 => Accende Rele' 7 e risponde "F"
Invio t = 0x74 = 116 => Spegne Rele' 7 e risponde "G"
Invio u = 0x75 = 117 => Accende Rele' 8 e risponde "X"
Invio v = 0x76 = 118 => Spegne Rele' 8 e risponde "m"
Invio A,B,C,D,E,F,G,H => Accende Rele' x e lo spegne dopo un secondo ( esempio funzione apri-porta )
Invio L,M,N,O,P,Q,R,S => riponde dicendo se il rele' x e' acceso o spento
Invio T => accende due rele' contemporaneamente
Invio U => accende tre rele' contemporaneamente
Invio V => spegne due rele' contemporaneamente
Invio W => spegne tre rele' contemporaneamente
Invio k => Legge numero memorizzato in eeprom
Invio x,y,X,Y,4,K,Z,j,|,! => scrive numero in eeprom
Invio " => Legge numero memorizzato in eeprom
Invio =,<,J,?,&,(,),[,],{ => scrive numero in eeprom
Invio * => Accende tutti i rele' contemporaneamente

Invio § => risponde con la data e l'ora di compilazione del firmware (10Lug2011 14:27:01 per SNT035; 10Lug2011 16:04:20 per SNT084 ; 10Lug2011 17:57:43 per SNT035 o SNT037 display ) E' possibile anche leggere il numero di volte che la scheda e' stata accesa
Invio w = 0x77 = 119 => Legge il numero di riavii: Parte bassa
Invio z = 0x7A = 122 => Legge il numero di riavii: Parte alta

Clicca Qui per scaricare il programma per pilotare fino a 8 rele'
Clicca Qui per scaricare un'immagine, in scala 1:1 della scheda a 8 rele'
Protocollo di comunicazione per scheda seriale virtuale per SNT037 SNT035

Invio 0 = 0x30 = 48 => Accende led 1 e risponde "A"
Invio 1 = 0x31 = 49 => Accende led 2 e risponde "B"
Invio 2 = 0x32 = 50 => Spegne led 1 e risponde "C"
Invio 3 = 0x33 = 51 => Spegne led 2 e risponde "D"
Invio 4 = 0x34 = 52 => Se pulsante 1 e' premuto risponde "E" altrimenti risponde "F"
Invio 5 = 0x35 = 53 => Se pulsante 2 e' premuto risponde "G" altrimenti risponde "H"
Invio 6 = 0x36 = 54 => Accende Rele' 1 e risponde "I"
Invio 7 = 0x37 = 55 => Spegne Rele' 1 e risponde "L"
Invio 8 = 0x38 = 56 => Accende Rele' 2 e risponde "M"
Invio 9 = 0x39 = 57 => Spegne Rele' 2 e risponde "N"
Invio a = 0x61 = 97 => Accende Rele' 3 e risponde "O"
Invio b = 0x62 = 98 => Spegne Rele' 3 e risponde "P"
Invio c = 0x63 = 99 => Accende Rele' 4 e risponde "Q"
Invio d = 0x64 = 100 => Spegne Rele' 4 e risponde "R"
Invio e = 0x65 = 101 => Se ingresso 1 e' alto risponde "S" altrimenti risponde "T"
Invio f = 0x66 = 102 => Se ingresso 2 e' alto risponde "U" altrimenti risponde "V"
Invio g = 0x67 = 103 => Se ingresso 3 e' alto risponde "W" altrimenti risponde "Y"
Invio h = 0x68 = 104 => Se ingresso 4 e' alto risponde "J" altrimenti risponde "K"
Invio i = 0x69 = 105 => Leggi quante volte hai riavviato la scheda (parte alta)
Invio l = 0x6C = 108 => Leggi quante volte hai riavviato la scheda (parte bassa)
Invio m = 0x6D = 119 => Azzera il numero di riavvii e risponde con 0x71

RELAYS ETHERNET Leggi l'articolo sulla rivista IoProgrammo numero 136 (Marzo 2009)
USB RELAY USB RELAYS