Si propone un programma di test utile per comandare direttamente i deviatoi impiegando un comune pc. Apprendendo le tecniche qui esposte e negli esempi successivi si potranno affrontare progetti più impegnativi.
Scarica il progetto ComDev.zip.
Le caratteristiche fondamentali della connessione tra centralina e pc possono essere così riassunte:
Abbiamo battezzato il progetto che proponiamo con il nome di Comanda Deviatoi. Esso ci permetterà di connetterci dal pc alla centralina, di effettuare delle prove di funzionamento in modo diretto e di ottenere anche un programma eseguibile. La figura che segue rappresenta graficamente ciò che ci prefiggiamo di ottenere. Con il click del mouse effettuato su controlli di tipo bottone di comando mostrati sul display del pc muoviamo gli aghi di uno o più deviatoi nelle posizioni di corretto tracciato o di deviata:
Gli aghi sono mossi da un comune elettromagnete a doppia bobina. Per questo genere di motorizzazioni, abbiamo a disposizione diversi decoder. Lungo il doppino digitale possiamo connettere decoder di natura differente, purchè accettino il medesimo protocollo di trasmissione. E’ quello che poi è capitato al nostro plastico. Poichè le novità sono diventate disponibili durante il suo allestimento, abbiamo impiegato una serie di decoder di vario tipo. Nel nostro esempio utilizziamo l’articolo 66001 di Modeltreno che è un po’ datato, ma di facile programmazione:

Esso permette di comandare quattro uscite con quattro indirizzi a partire da uno pre-programmato in modo molto semplice grazie a otto microswitch in esso contenuti. Le sue uscite sono a contatto pulsante, cioè il contatto tra il centrale (giallo) e una delle due posizioni laterali è temporaneo. Questo permette di preservare gli elettromagneti di fabbricazione meno recente, che non erano dotati di fine corsa, e se venivano tenuti continuamente sotto tensione, bruciavano l’avvoglimento. Al suo posto si può impiegare anche un decoder come il più recente 67200 Uhlenbrock, che può comandare due elettromagneti con due indirizzi distinti e ha i contatti temporanei in modo del tutto analogo al precedente:

Lo schema assume il seguente aspetto:
Se l’assorbimento di corrente da parte dell’elettromagnete fosse elevato, o se volessimo collegare più di un deviatoio alla stessa uscita, la corrente fornita dal bus della centralina non sarebbe sufficiente. In questo caso lo schema diventerebbe il seguente dove si utilizza un’alimentazione indipendente per gli elettromagneti:
Prima di collegare il decoder alla centralina occorre assegnargli il suo indirizzo, l’identificatore che permette alla centralina di pilotarlo. Assegniamo al decoder l’indirizzo ‘1’ e per fare questo occorre spostare in posizione ON i microswitch delle posizioni 2, 3, 5 e 7 secondo lo schema seguente:
Si rimanda alla tabella di pag. 71 del manuale della centralina per la codifica completa di tutti i possibili decoder per dispositivi elettromagnetici. Per prima cosa si effettuano le prove di funzionamento dei componenti impiegando direttamente la centralina, al parti di quanto visto nel capitolo precedente.
Per prima cosa connettiamo la porta seriale del pc alla centralina ed eseguiamo i seguenti passi:
Aprire un nuovo progetto VB da cui generare alla fine il programma eseguibile COMDEV.exe (COManda DEViatoio);
Impiegare il controllo MSCOMM32.OCX, ovvero il driver d’interfaccia alla porta seriale;
Inserire i bottoni di comando per muovere gli aghi.
Diamo al progetto il nome Comdev e con il comando Ok chiudiamo la scheda. Salviamo ora il progetto attivando dal menù File la voce Salva progetto con nome…; similmente a quanto abbiamo visto per il caso della form, diamo un nome fisico coerente con il nome che abbiamo assegnato e otteniamo il file Comdev.vbp.
A questo punto dobbiamo inserire nella nostra scheda la connessione software alla porta seriale per potere poi comunicare con essa. Per fare questo occorre includere nel progetto un componente standard di Windows che attiva il collegamento; si tratta del componente Microsoft Comm Control contenuto nel file di sistema MSCOMM32.OCX che ha nome Microsoft Comm Control 6.0. VB non presenta questo componente tra quelli immediatamente disponibili, occorre riferirlo esplicitamente. Dal menù Progetto si seleziona la voce Componenti e dalla lista sconfinata che viene presentata si seleziona l’oggetto in questione:
Se state impiegando una versione precedente del programma VB questo componente sarà identificato da una versione differente rispetto a quella indicata in figura; il comportamento non dovrebbe differire. Confermata l’inclusione, nella lista dei componenti utilizzabili presenti a sinistra dello schermo compare ora anche il simbolo degli oggetti di comunicazione rappresentato da un telefono su un modem:
Trasciniamo con il mouse l’oggetto sulla form frmMain:
Definiamo le caratteristiche della porta seriale. VB assegna al controllo appena inserito il nome Mscomm1. Selezionando le proprietà (sempre con il tasto funzione F4), compare la scheda di selezione dove possiamo assegnare tutti gli attributi propri della porta seriale. Occorre effettuare gli assegnamenti in accordo con quanto descritto nel manuale d’uso della centralina; gli attributi sono suddivisi in sotto schede identificate dalle linguette (tabs) presenti nella parte superiore. Per quanto riguarda gli attributi di tipo Generale occorre attenersi a quanto indicato in figura:
Si noti che l’identificatore della porta seriale ‘CommPort’ è relativo alla configurazione del vostro pc. Se nel vostro caso la porta è già connessa a una periferica esterna, per esempio alcuni tipi di mouse, avrete quasi sicuramente una seconda porta seriale a disposizione e in questo caso occorrerà indicare il valore ‘2’. Rispetto ai ‘Settings’, si tenga conto che per default la centralina è tarata a 2400 baud e tale valore è riproposto anche per il controllo MScomm1 del pc. E’ possibile aumentare questo valore perché le porte seriali funzionano oggi tranquillamente con baud rate molto maggiori, a 9600 e a 19200; se volete allora modificare questo valore, ricordatevi di modificare anche la velocità di ricezione della centralina. I valori modificati restano in memoria anche quando spegnerete la centralina. Se la velocità della centralina sarà tarata differentemente dal valore impostato per la seriale del pc, la comunicazione non sarà possibile. Per quanto riguarda gli attributi di tipo Buffer inserite i valori seguenti:
Infine per quanto riguarda i valori di tipo Hardware, inserite i valori seguenti:
La porta seriale è così presente nel progetto ed è configurata pronta per essere attivata dal programma in esecuzione. Si noti che il simbolo del controllo della seriale è visibile in ambiente di sviluppo, ma quando il programma è in esecuzione non sarà visibile (ma è presente e, soprattutto, funziona).
Passiamo allora all’inserimento nella form dei bottoni che effettueranno le operazioni richieste dal nostro progetto. Ci occorre inserire 4 bottoni di comando ai quali dare nomi opportuni e premendo i quali vogliamo ottenere i seguenti effetti:
|
1 |
Uscita |
chiusura della scheda e termine del programma |
|
2 |
Apri |
apertura della connessione alla porta seriale |
|
3 |
Deviato |
muovi gli aghi del deviatoio in posizione deviata |
|
4 |
Corretto |
muovi gli aghi del deviatoio in posizione corretta |
Per trattare il controllo di uscita e lo script del suo evento di click si rimanda alla pagina ‘Comporre un progetto Visual Basic’. Inseriamo nella form anche gli altri tre bottoni di comando che ci servono; per ciascuno di essi assegniamo le opportune proprietà di (Name) e Caption. Completiamo le procedure associate ai rispettivi eventi di click inserendo le istruzioni che vediamo in dettaglio nel seguito.
Iniziamo a personalizzare alcune sue proprietà:
Per quanto riguarda il caso del bottone di apertura della comunicazione verso la
porta seriale avremo:
Private
Sub cmdApri_Click()
Me.MSComm1.PortOpen = True
End Sub
Il prefisso Me sta ad indicare l’appartenenza alla form corrente e avremmo potuto anche scrivere:
Private
Sub cmdApri_Click()
frmMain.MSComm1.PortOpen = True
End Sub
L’istruzione apre il canale di comunicazione tra la centralina e il pc. Attenzione, la centralina dovrebbe essere accesa prima di avviare il programma.
I due script che seguono ci permettono di muovere gli aghi del deviatoio. I comandi che inseriamo rispettano il protocollo di comunicazione e sono tutti descritti a pag. 70 del manuale d’uso. Nel caso dei comandi di output, occorre spedire alla centralina una coppia di istruzioni dove:
La prima definisce il comando; nel nostro caso il comando di spostamento aghi da trasmettere può assumere i valori convenzionali: 33 = corretto tracciato; 34 = ramo deviato;
La seconda definisce l’indirizzo e quindi l’ente connesso che deve compiere il comando; nel caso del deviatoio si tenga presente che ci stiamo indirizzando alla terza connessione del primo decoder da cui l’indirizzo assoluto dell’output assume il valore ‘3’.
Se connettiamo un vecchio deviatoio con le bobine che rimangono eccitate, cioè senza fine-corsa, è bene fare seguire alle istruzioni descritte una ulteriore istruzione di reset dell’output, che è il comando convenzionale ‘32’ il quale è generalizzato e non richiede l’indirizzo a cui destinarlo. Gli script associati agli eventi assumono allora la forma seguente:
Private
Sub cmdCorretto_Click()
Me.MSComm1.Output = Chr$(33)
Me.MSComm1.Output = Chr$(3)
Me.MSComm1.Output = Chr$(32)
End Sub
Private
Sub cmdDeviato_Click()
Me.MSComm1.Output = Chr$(34)
Me.MSComm1.Output = Chr$(3)
Me.MSComm1.Output = Chr$(32)
End Sub
Proviamo il funzionamento di questi comandi; mandando in esecuzione il programma avremo una scheda fatta più o meno così :
Si noti che tramite trascinamento abbiamo spostato i bottoni in modo ordinato; si noti inoltre che li abbiamo tutti dimensionati allo stesso modo utilizzando i comandi dimensionali e di allineamento presenti nella toolbar dell’ambiente di sviluppo. I bottoni da premere sono nell’ordine:
Apri Connessione;
Corretto e Deviato alternativamente.
Se per errore premiamo uno dei due bottoni di comando per lo scambio prima dell’apertura della comunicazione verso la porta, il programma va in errore perché cerca di trasmettere un segnale attraverso la porta chiusa. Per evitare questo errore, facciamo in modo che l’evento di click non sia efficace se l’apertura della comunicazione non è ancora avvenuta; aggiungiamo una istruzione all’evento (l’esempio è per il bottone Corretto, ma anche per il bottone Deviato valgono le stesse considerazioni):
Private
Sub cmdCorretto_Click()
If Me.MSComm1.PortOpen = False Then Exit Sub
Me.MSComm1.Output = Chr$(33)
Me.MSComm1.Output = Chr$(3)
Me.MSComm1.Output = Chr$(32)
End Sub
E’ possibile che la connessione fisica alle bobine del deviatoio sia invertita rispetto alle posizioni previste; è sufficiente invertire i collegamenti dei poli laterali tra le bobine e il decoder. E’ interessante notare che possiamo verificare contemporaneamente anche sul display della centralina l’effetto del comando proveniente dal pc. Esso si comporta infatti come se avessimo premuto i bottoni rosso-verdi sulla centralina; possiamo anche comandare in parallelo lo scambio sia dalla centralina, sia dal programma. Questa funzionalità aggiunge grande potenza alla verifica nel corso dei test. Inoltre, mentre mandiamo in esecuzione il programma e comandiamo il deviatoio, la centralina può contemporaneamente pilotare le locomotive!
Cimentiamoci allora ad effettuare qualche variante. Si colleghi un secondo deviatoio a un’altra uscita del decoder:
Si inseriscono nel progetto altri due bottoni di comando per comandare i suoi aghi. Occorre modificare il titolo dei bottoni che comandano i deviatoi per distinguere l’indirizzo in accordo alla connessione del decoder:
Analogamente è possibile connettere altri dispositivi, quali uno sganciatore elettromagnetico, aggiungere il suo bottone di comando al progetto, indirizzare correttamente il dispositivo e farlo funzionare. In questo caso, trattandosi di un relè classico singolarmente eccitabile, possiamo comandare due sganciatori con un unico indirizzo:
E’ normale pensare di rappresentare sulla form il sinottico del nostro impianto e porre un bottone in corrispondenza di ogni dispositivo che si vuole comandare. Vedremo come fare questo in uno dei prossimi passi.
Se tutto va bene, siamo in grado ora di produrre il programma eseguibile. Il programma sarà mandato in esecuzione come un qualsiasi altro programma installato sul pc, non ci sarà bisogno di avviare VB per eseguirlo. Dal menù File si seleziona la voce Crea Comdev.exe… e VB genera l’eseguibile nella cartella corrente. Una volta compilato il programma, si può trascinare la sua icona sul desktop e otterremo così un comodo link per mandarlo in esecuzione tutte le volte che vorremo. L’ambiente VB serve solo per quando sviluppiamo e proviamo il software o vogliamo modificare un programma.
Se avete a disposizione altre centraline, è importante notare come possiamo mantenere in buona parte la logica appena descritta. In generale, le impostazioni che abbiamo date alla connessione alla porta seriale valgono per tutte le centraline. Mentre per la centralina Intellibox ho effettuato i testi di persona, nei casi che sono descritti di seguito si tenga conto che mi sono attenuto alle istruzioni ricavate dai manuali e dalle informazioni reperite sulle pagine di Internet. Pertanto, nel fare i test di prova ci può essere qualche scostamento.
Per quanto riguarda la centralina ‘Märklin Central Unit’ (art. 6027) e i suoi decoder (art. K83 o 6083) il programma funziona senza nessuna modifica.
FMZ
La centralina FMZ di Fleischmann (art. 6800) è programmabile, questo significa che indipendentemente dal pc si possono registrare sequenze di comandi e memorizzarli. Per comandare i deviatoi si associa il decoder (art. 6850) che al pari di quanto visto per il 66001 permette di comandare quattro coppie di dispositivi a parità di indirizzo. Nel caso dei dispositivi elettromagnetici, il protocollo di comunicazione segue la seguente sintassi:
“E” xxx “E” s1s2
Dove:
così, se assegnamo al decoder l’indirizzo 1, per comandare lo scambio connesso all’uscita 3 in posizione deviata o corretta dovremo così correggere gli script associati all’evento click del bottone comando:
Private
Sub cmdCorretto_Click()
If Me.MSComm1.PortOpen = False Then Exit Sub
Me.MSComm1.Output = "E"
Me.MSComm1.Output = Chr$(1)
Me.MSComm1.Output = "E"
Me.MSComm1.Output = Chr$(0)
Me.MSComm1.Output = Chr$(3)
End Sub
Private
Sub cmdDeviato_Click()
If Me.MSComm1.PortOpen = False Then Exit Sub
Me.MSComm1.Output = "E"
Me.MSComm1.Output = Chr$(1)
Me.MSComm1.Output = "E"
Me.MSComm1.Output = Chr$(1)
Me.MSComm1.Output = Chr$(3)
End Sub
Zimo
Il sistema Zimo è altamente professionale, e quindi tecnicamente molto più complesso. I componenti interessati a COMDEV sono la centralina ‘MX1 Command Station’ e i decoder della serie MX8 (vi sono alcune varianti sia per quantità di dispositivi collegabili, sia per i tipi di motore del deviatoio). La documentazione completa si trova all’indirizzo web:
http://www.zimo.at/web2007/index2.htm
In ogni caso, tenendo presente che l’interfaccia seriale è settabile alla velocità di 9600 baud, il protocollo di trasmissione segue la sintassi:
"M"; address prefix; accessory decoder address; data byte; CHR$(13)
Dove:
M = sta per dispositivo elettromagnetico;
address prefix = ["N" | "M"] a seconda del tipo di decoder connesso (nel nostro caso “N”);
accessory decoder address = indirizzo (nel nostro caso 1);
data byte = comando da effettuare; è costituito da un solo carattere (o byte); il byte a sua volta è composto da 8 bit; i singoli bit sono numerati da sinistra a destra secondo la convenzione 76543210; la posizione 7 vale 1 se siamo in modalità DCC; le posizioni 6,5,4 valgono tutte e tre 0; la posizione 3 è lo stato di deviato o corretto (0 o 1); le posizioni 2,1,0 combinate danno il numero in cui è connesso il deviatoio (nel nostro caso essendo alla posizione 3, questi tre bit valgono nell’ordine 0,1,1); ); gli 8 per la posizione corretta assumono il valore complessivo 10000011 che tradotto in decimale vale 131; per la posizione deviata assumono il valore complessivo 10001011 che tradotto in decimale vale 139; Chr$(13) = è l’istruzione di ‘a capo’ e conclude il comando. Per orientare gli aghi l’evento di click si traduce in:
Private
Sub cmdCorretto_Click()
If Me.MSComm1.PortOpen = False Then Exit Sub
Me.MSComm1.Output = "M"
Me.MSComm1.Output = "N"
Me.MSComm1.Output = Chr$(1)
Me.MSComm1.Output = Chr$(131)
Me.MSComm1.Output = Chr$(13)
End Sub
Private
Sub cmdDeviato_Click()
If Me.MSComm1.PortOpen = False Then Exit Sub
Me.MSComm1.Output = "M"
Me.MSComm1.Output = "N"
Me.MSComm1.Output = Chr$(1)
Me.MSComm1.Output = Chr$(139)
Me.MSComm1.Output = Chr$(13)
End Sub
Lenz
Nel caso della Lenz ci troviamo ad avere un adattatore contenente l’interfaccia per il pc (art. LI100) da connettere alla centralina LZ100 Command Station, mentre i decoder sono costituiti dall’art. LS-100/110. Questi componenti sono un po’ più complessi dei normali decoder visti finora, infatti si possono programmare le loro uscite come singolo impulso di tensione, come tensione continua oppure come controllo lampeggiante. Pilotano così ogni tipo di dispositivo, ma nel caso di scambi funzionanti a motore è necessario un ulteriore componente intermedio, l’adattatore LA010. Tra loro si differenziano per la presenza nel caso del LS-100 delle connessioni al bus di retroazione. Il protocollo di comunicazione in questo caso deve tenere conto della complessità di questi decoder. Esso è costituito da quattro caratteri (o byte) secondo la seguente sintassi:
"082"; dato1; dato2; terminatore
Il byte iniziale indica che si tratta di un comando destinato ai decoder per segnali e deviatoi (dire 82 equivale a dire la lettera ‘R’ maiuscola); il secondo carattere (dato1) contiene l’indirizzo del dcecoder che, a differenza di quanto visto in precedenza, è conteggiato a partire da zero; il terzo carattere (dato2) contiene il comando da eseguire che è espresso in modo del tutto analogo al caso Zimo, con il terzo bit che indica la posizione degli aghi. Per orientare gli aghi l’evento di click si traduce in:
Private
Sub cmdCorretto_Click()
If Me.MSComm1.PortOpen = False Then Exit Sub
Me.MSComm1.Output = "R"
Me.MSComm1.Output = Chr$(0)
Me.MSComm1.Output = Chr$(131)
Me.MSComm1.Output = Chr$(13)
End Sub
Private
Sub cmdDeviato_Click()
If Me.MSComm1.PortOpen = False Then Exit Sub
Me.MSComm1.Output = "R"
Me.MSComm1.Output = Chr$(0)
Me.MSComm1.Output = Chr$(139)
Me.MSComm1.Output = Chr$(13)
End Sub
A queste istruzioni va fatto seguito introducendo i controlli relativi al tipo d’uso del decoder come descritto sopra, ma la faccenda diventa un po’ complessa da trattare in questa sede.
A
conclusione del progetto appena generato vale la pena di evidenziare: