Comandare i deviatoi tramite software

Torna alla pagina CONTROLLO

 

Introduzione

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:


Il progetto Comanda Deviatoi

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:


Prime prove

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.


Il programma

Per prima cosa connettiamo la porta seriale del pc alla centralina ed eseguiamo i seguenti passi:

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.


Connettiamo la porta seriale

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


Controlli

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


Bottone di comando 'Uscita'

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.


Bottone di comando 'Apri'

Iniziamo a personalizzare alcune sue proprietà:

  1. (Name): inserire cmdApri;
  2. Caption: inserire Apri Comunicazione.
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.


Bottoni di comando 'Deviato' e 'Corretto'

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:

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:

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!


Estensioni

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.


Eseguibile

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.


Altre centraline

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.

 

Märklin

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:

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.


Conclusione

A conclusione del progetto appena generato vale la pena di evidenziare:

  1. la facilità di programmazione della centralina Intellibox;
  2. la possibilità di eseguire comandi direttamente dalla centralina e parallelamente da software;
  3. la verifica incrociata degli esiti;
  4. la possibilità di estendere i comandi imparati in corrispondenza di un’architettura più complessa;
  5. il considerare il progetto COMDEV come un mattone base per costruzioni molto più complesse.

Torna all'inizio pagina

Torna alla pagina CONTROLLO