Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ver. 0.7
12 Maggio 2019
http://linuxcnc.org/docs/devel/html/hal/intro.html
http://linuxcnc.org/docs/devel/html/hal/basic-hal.html
http://linuxcnc.org/docs/devel/html/hal/tutorial.html
http://linuxcnc.org/docs/devel/html/hal/rtcomps.html
http://linuxcnc.org/docs/devel/html/gui/pyvcp.html
http://linuxcnc.org/docs/html/ladder/ladder-intro.html
http://linuxcnc.org/docs/devel/html/ladder/classic-ladder.html
http://linuxcnc.org/docs/devel/html/ladder/ladder-examples.html
Introduzione HAL
Sommario
HAL sta per Hardware Abstraction Layer. Al livello più alto è semplicemente un modo per
consentire a un certo numero di blocchi di costruzione di essere caricati e interconnessi per
assemblare un sistema complesso. La parte hardware è perché HAL è stato originariamente
progettato per semplificare la configurazione di LinuxCNC per un'ampia varietà di dispositivi
hardware. Molti degli elementi costitutivi sono driver per dispositivi hardware. Tuttavia,
HAL può fare molto di più che configurare semplicemente i driver hardware.
1.4. analisi
Pochissime macchine funzionano correttamente la prima volta. Durante il test, il costruttore
può utilizzare un tester per vedere se un finecorsa funziona o per misurare la tensione
continua che passa in un servomotore. Può collegare un oscilloscopio per controllare la messa
a punto di un'unità o per cercare il rumore elettrico. Potrebbe trovare un problema che
richiede di cambiare lo schema elettrico; forse una parte deve essere collegata in modo
diverso o sostituita con qualcosa di completamente diverso.
HAL fornisce gli equivalenti software di un voltmetro, oscilloscopio, generatore di segnale e
altri strumenti necessari per testare e sintonizzare un sistema. Gli stessi comandi utilizzati
per costruire il sistema possono essere utilizzati per apportare modifiche in base alle esigenze.
1.5. Sommario
Questo documento è rivolto a persone che già sanno come fare questo tipo di integrazione del
sistema hardware, ma che non sanno come connettere l'hardware a LinuxCNC.
Il design hardware tradizionale come descritto sopra finisce sul bordo del controllo
principale. Fuori dal controllo ci sono un sacco di scatole relativamente semplici, collegate
insieme per fare tutto il necessario. Dentro, il controllo è un grande mistero - un'enorme
scatola nera che speriamo funzioni…
HAL estende questo tradizionale metodo di progettazione hardware all'interno della grande
scatola nera. Rende i driver di dispositivo e persino alcune parti interne del controller in
scatole nere più piccole che possono essere interconnesse e persino sostituite proprio come
l'hardware esterno. Consente allo schema di cablaggio del sistema di mostrare parte del
controller interno, anziché solo una grande scatola nera. E, cosa più importante, consente
all'Integratore di testare e modificare il controller usando gli stessi metodi che userebbe sul
resto dell'hardware.
Termini come motori, amplificatori ed encoder sono familiari alla maggior parte degli
integratori di macchine. Quando parliamo di usare un cavo schermato a otto conduttori extra
flessibile per collegare un encoder alla scheda di ingresso del servo nel computer, il lettore
capisce immediatamente di cosa si tratta e viene indirizzato alla domanda, che tipo di
connettori avrò bisogno per collegare ciascuna estremità. Lo stesso tipo di pensiero è
essenziale per l'HAL, ma la sequenza di specifici pensieri potrebbe richiedere un po' di tempo
per andare a regime. L'uso delle parole HAL può sembrare un po' strano all'inizio, ma il
concetto di lavorare da una connessione all'altra è lo stesso.
Questa idea di estendere lo schema elettrico all'interno del controller è ciò che HAL è tutto.
Se hai dimestichezza con l'idea di interconnettere le scatole nere hardware, probabilmente
non avrai problemi a usare l'HAL per interconnettere le scatole nere del software.
2. Concetti HAL
Questa sezione è un glossario che definisce i termini chiave HAL ma è leggermente diversa da
un glossario tradizionale perché questi termini non sono disposti in ordine alfabetico. Sono
organizzati dalla loro relazione o flusso nel mondo di HAL.
Componente
Quando abbiamo parlato della progettazione hardware, abbiamo fatto riferimento ai
singoli pezzi come parti , blocchi predefiniti , scatole nere , ecc. L'equivalente HAL è
un componente o componente HAL. (Questo documento usa il componente HAL
quando è probabile che ci sia confusione con altri tipi di componenti, ma normalmente
usa solo componenti ). Un componente HAL è un pezzo di software con input, output e
comportamento ben definiti, che possono essere installati e interconnessi secondo
necessità.
Parametro
Molti componenti hardware hanno regolazioni che non sono collegate ad altri
componenti ma devono comunque essere accessibili. Ad esempio, i servoamplificatori
hanno spesso potenziometri per consentire regolazioni di taratura e punti di prova in
cui è possibile collegare un misuratore o un mirino per visualizzare i risultati di
sintonizzazione. I componenti HAL possono anche avere tali elementi, che sono
indicati come parametri. Esistono due tipi di parametri: i parametri di input sono
equivalenti ai potenziometri: sono valori che possono essere regolati dall'utente e
rimangono fissi una volta impostati. I parametri di uscita non possono essere regolati
dall'utente - sono equivalenti ai punti di test che consentono il monitoraggio dei
segnali interni.
Pin
I componenti hardware hanno terminali che vengono utilizzati per interconnetterli.
L'equivalente HAL è un pin o un pin HAL. (Il pin HAL viene utilizzato quando
necessario per evitare confusione.) Tutti i pin HAL hanno un nome e i nomi dei pin
vengono utilizzati quando li si interconnette. I pin HAL sono entità software che
esistono solo all'interno del computer.
Physical Pin
Molti dispositivi I / O hanno pin o terminali fisici reali che si collegano all'hardware
esterno, ad esempio i pin di un connettore di una porta parallela. Per evitare
confusione, questi sono indicati come pin fisici. Queste sono le cose che sporgono nel
mondo reale.
Signal
In una macchina fisica, i terminali di componenti hardware reali sono interconnessi da
fili. L'equivalente HAL di un filo è un signal (segnale) o un segnale HAL. I segnali
HAL collegano i pin HAL come richiesto dal costruttore della macchina. I segnali HAL
possono essere scollegati e ricollegati a piacere (anche mentre la macchina è in
funzione).
Type
Quando si utilizza l'hardware reale, non si collegherà un'uscita relè a 24 volt
all'ingresso analogico +/- 10 V di un servoamplificatore. I pin HAL hanno le stesse
restrizioni, che si basano sul loro tipo. Sia i pin che i segnali hanno tipi e i segnali
possono essere collegati solo a pin dello stesso tipo. Attualmente ci sono 4 tipi, come
segue:
bit - un singolo valore VERO / FALSO o ON / OFF
float - un valore in virgola mobile a 64 bit, con circa 53 bit di risoluzione e oltre
1000 bit di intervallo dinamico.
u32 - un intero senza segno a 32 bit, i valori legali sono compresi tra 0 e
4.294.967.295
s32 - un intero con segno a 32 bit, valori legali da -2,147,483,647 a
+2,147,483,647
Function
I componenti hardware reali tendono ad agire immediatamente sui loro input. Ad
esempio, se cambia la tensione di ingresso a un servoamplificatore, anche l'uscita
cambia automaticamente. Tuttavia i componenti software non possono agire
automaticamente. Ogni componente ha un codice specifico che deve essere eseguito
per svolgere il compito di quel componente. In alcuni casi, quel codice viene
semplicemente eseguito come parte del componente. Tuttavia, nella maggior parte dei
casi, specialmente nei componenti in tempo reale, il codice deve essere eseguito in una
sequenza specifica ed a intervalli specifici. Ad esempio, gli input dovrebbero essere
letti prima che i calcoli vengano eseguiti sui dati di input e le uscite non dovrebbero
essere scritte fino a quando non vengono eseguiti i calcoli. In questi casi, il codice è
reso disponibile al sistema sotto forma di una o più function (funzioni). Ogni funzione
è un blocco di codice che esegue un'azione specifica. L'integratore di sistema può
utilizzare i thread per pianificare una serie di funzioni da eseguire in un ordine
particolare ed a intervalli di tempo specifici.
Thread
Un thread è un elenco di funzioni eseguite a intervalli specifici come parte di
un'attività in tempo reale. Quando un thread viene creato per la prima volta, ha un
intervallo di tempo specifico (periodo), ma nessuna funzione. Le funzioni possono
essere aggiunte al thread e verranno eseguite nell'ordine ogni volta che il thread viene
eseguito.
Ad esempio, supponiamo di avere un componente parport denominato hal_parport. Quel
componente definisce uno o più pin HAL per ogni pin fisico. I pin sono descritti nella sezione
doc di quel componente: i loro nomi, come ogni pin, si riferiscono al pin fisico, sono invertiti,
puoi cambiare polarità, ecc. Ma questo da solo non prende i dati dai pin HAL ai pin fisici . Ci
vuole del codice per farlo, ed è qui che le funzioni entrano in scena. Il componente parport
ha bisogno di almeno due funzioni: una per leggere i pin di input fisici e aggiornare i pin
HAL, l'altra per prendere i dati dai pin HAL e scriverli sui pin di output fisici. Entrambe
queste funzioni fanno parte del driver parport.
3. Componenti HAL
Ogni componente HAL è un pezzo di software con input, output e comportamenti ben
definiti, che possono essere installati e interconnessi secondo necessità. Questa sezione
elenca alcuni dei componenti disponibili e una breve descrizione di ciò che ciascuno fa. I
dettagli completi per ciascun componente sono disponibili più avanti in questo documento.
1. Comandi HAL
Informazioni più dettagliate possono essere trovate nella pagina man di halcmd: run man
halcmd in una finestra di terminale.
Per visualizzare la configurazione HAL e controllare lo stato dei pin e dei parametri,
utilizzare la finestra Configurazione HAL nel menu Macchina in AXIS. Per vedere lo stato di
un pin aprire la scheda Watch e fare clic su ciascun pin che si desidera guardare e verrà
aggiunto alla finestra di controllo.
Figura 1. Finestra di configurazione HAL
1.1. loadrt
Il comando loadrt carica un componente HAL in realtime. Le funzioni dei componenti in
realtime devono essere aggiunte a un thread per essere aggiornati alla velocità del thread.
Non è possibile caricare un componente dello spazio utente nello spazio tempo reale.
La sintassi e un esempio:
loadrt <componente> <opzioni>
1.2. addf
Aggiunge funzione functname al thread nomefile. L'impostazione predefinita è aggiungere la
funzione nell'ordine in cui si trova nel file. Se la posizione è specificata, aggiunge la funzione
a quel punto nel thread. Posizione negativa indica la posizione rispetto alla fine della thread.
Ad esempio 1 è l'inizio del thread, -1 è la fine del thread, -3 è terzo a partire dalla fine.
E' importante caricar alcune funzioni in un certo ordine, come le funzioni di lettura e scrittura
di parport. Il nome della funzione è solitamente il nome del componente più un numero.
Nell'esempio seguente viene caricato il componente or2 e la funzione show mostra il nome
della funzione or2
$ halrun
halcmd: loadrt or2
halcmd: show function
Exported Functions:
Owner CodeAddr Arg FP Users Name
00004 f8bc5000 f8f950c8 NO 0 or2.0
È necessario aggiungere una funzione da un componente HAL in tempo reale a un thread per
ottenere la funzione da aggiornare alla velocità del thread.
Di solito ci sono due thread come mostrato in questo esempio. Alcuni componenti utilizzano
la matematica in virgola mobile e devono essere aggiunti a un thread che supporta la
matematica in virgola mobile. FP indica se la matematica in virgola mobile è supportata in
quel thread.
$ halrun
halcmd: loadrt motmod base_period_nsec = 55555 servo_period_nsec = 1000000
num_joints = 3
base-thread (il thread ad alta velocità): questo thread gestisce gli elementi che
richiedono una risposta rapida, come la creazione di impulsi di fase e la lettura e
scrittura della porta parallela. Non supporta la matematica in virgola mobile.
servo-thread (thread a bassa velocità): questo thread gestisce gli elementi che possono
tollerare una risposta più lenta, come il controller di movimento, ClassicLadder e il
gestore dei comandi di movimento. Supporta la matematica in virgola mobile.
La sintassi e un esempio:
addf <funzione> <thread>
1.3. loadusr
Il comando loadusr carica un componente HAL dello spazio utente. Gli spazi programmi
degli utenti sono processi separati, che opzionalmente comunicano con altri componenti HAL
tramite pin e parametri. Non è possibile caricare componenti in tempo reale nello spazio
utente.
Le opzioni possono essere una o più delle seguenti:
-W aspettare che il componente sia pronto. Si presume che il componente abbia lo
stesso nome del primo argomento del comando.
-Wn aspettare il componente, che avrà il <nome> dato. Questo si applica solo se il
<nome> componente ha un'opzione per il nome.
Pin I/O
Un pin I/O come encoder.N.index-enable può essere letto o impostato come consentito dal
componente.
1.5. setp
Il comando setp imposta il valore di un pin o di un parametro. I valori validi dipenderanno
dal tipo di pin o parametro. È un errore se i tipi di dati non corrispondono.
Alcuni componenti hanno parametri che devono essere impostati prima dell'uso. I parametri
possono essere impostati prima dell'uso o durante l'esecuzione secondo necessità. Non è
possibile utilizzare setp su un pin collegato a un segnale.
La sintassi ed un esempio:
setp <pin/nome-parametro> <valore>
1.6. sets
Il comando sets comandi imposta il valore di un segnale.
La sintassi ed un esempio:
sets <nome-segnale> <valore>
sets mysignal 1
È un errore se:
Il nome del segnale non esiste
Se il segnale ha già uno scrittore
Se il valore non è il tipo corretto per il segnale
1.7. unlinkp
Il comando unlinkp scollega un pin dal segnale connesso. Se nessun segnale è stato collegato
al pin prima di eseguire il comando, non accade nulla. Il comando di scollegamento è utile
per la risoluzione dei problemi.
La sintassi ed un esempio:
unlinkp <nome-pin>
unlinkp parport.0.pin-02-out
1.8. Comandi obsoleti
I seguenti comandi sono obsoleti e possono essere rimossi dalle versioni future. Qualsiasi
nuova configurazione dovrebbe utilizzare il comando net . Questi comandi sono inclusi in
modo che le configurazioni precedenti funzionino ancora.
linksp
Il comando linksp crea una connessione tra un segnale e un pin.
La sintassi ed un esempio:
linksp <nome-segnale> <nome-pin>
linksp X-step parport.0.pin-02-out
Il comando linksp è stato sostituito dal comando net .
linkps
Il comando linkps crea una connessione tra un pin e un segnale. È lo stesso di linksp ma gli
argomenti sono invertiti.
La sintassi ed un esempio:
linkps <nome-pin> <nome-segnale>
2. Dati HAL
2.1. bit
Un valore bit è un segnale acceso o spento.
valori bit = true o 1 e false o 0 (True, TRUE, true sono tutti validi)
2.2. float
Un float è un numero in virgola mobile. In altre parole, il punto decimale può muoversi
secondo le necessità.
valori float = un valore in virgola mobile a 64 bit, con circa 53 bit di risoluzione e oltre
1000 bit di intervallo dinamico.
Per maggiori informazioni sui numeri in virgola mobile vedi:
http://en.wikipedia.org/wiki/Floating_point
https://it.wikipedia.org/wiki/Numero_in_virgola_mobile
2.3. s32
Un numero s32 è un numero intero che può avere un valore negativo o positivo.
valori s32 = numeri interi da -2147483648 a 2147483647
2.4. U32
Un numero u32 è un numero intero che è solo positivo.
valori u32 = numeri interi da 0 a 4294967295
3. File HAL
Se hai utilizzato Stepper Config Wizard per generare la tua configurazione, avrai fino a tre file
HAL nella tua directory di configurazione.
my-mill.hal (se la tua configurazione è denominata my-mill ) Questo file viene
caricato per primo e non deve essere modificato se hai utilizzato Stepper Config
Wizard.
custom.hal Questo file viene caricato in seguito e prima che venga caricata la GUI.
Qui è dove metti i tuoi comandi HAL personalizzati che vuoi caricare prima che la GUI
sia caricata.
custom_postgui.hal Questo file viene caricato dopo il caricamento della GUI. Qui è
dove metti i tuoi comandi HAL personalizzati che vuoi caricare dopo che la GUI è stata
caricata. Tutti i comandi HAL che usano i widget pyVCP devono essere posizionati
qui.
4. Componenti HAL
Due parametri vengono aggiunti automaticamente a ciascun componente HAL quando viene
creato. Questi parametri consentono di definire il tempo di esecuzione di un componente.
.tempo
.tmax
Il tempo è il numero di cicli della CPU necessari per eseguire la funzione.
tmax è il numero massimo di cicli della CPU necessari per eseguire la funzione. tmax è un
parametro di lettura / scrittura in modo che l'utente possa impostarlo su 0 per sbarazzarsi
della prima inizializzazione del tempo di esecuzione della funzione.
5. Componenti logici
HAL contiene diversi componenti logici in tempo reale. I componenti logici seguono una
tabella di verità che indica quale sia l'output per ogni dato input. Tipicamente questi sono
manipolatori di bit e seguono le tabelle di verità della porta logica elettrica.
5.1. and2
Il componente and2 è un gate and con due input. La tabella di verità sotto mostra l'output in
base a ciascuna combinazione di input.
Sintassi
and2 [count=N] | [nomi=nome1[, nome2 ...]]
funzioni
and2.n
Pins
and2.N.in0 (bit, in)
and2.N.in1 (bit, in)
and2.N.out (bit, out)
Tabella della verità
in0 in 1 out
falso falso falso
vero falso falso
falso vero falso
vero vero vero
5.2. not
Il not componente è un inverter bit.
Sintassi
not [count=n] | [nomi=nome1 [, nome2 ...]]
funzioni
not.all
not.n
Pins
not.n.in (bit, in)
not.n.out (bit, out)
Tabella della verità
in out
vero falso
falso vero
5.3. or2
Il componente or2 è un gate or a due ingressi.
Sintassi
or2 [count=n] | [nomi=nome1 [, nome2 ...]]
funzioni
or2.n
Pins
or2.n.in0 (bit, in)
or2.n.in1 (bit, in)
or2.n.out (bit, out)
Tabella della verità
in0 in 1 out
vero falso vero
vero vero vero
falso vero vero
falso falso falso
5.4. xor2
Il componente xor2 è un gate xor a due ingressi (or esclusivo).
Sintassi
xor2 [count = n] | [nomi = nome1 [, nome2 ...]]
funzioni
xor2.n
Pins
xor2.n.in0 (bit, in)
xor2.n.in1 (bit, in)
xor2.n.out (bit, fuori)
Tabella della verità
in0 in 1 out
vero falso vero
vero vero falso
falso vero vero
falso falso falso
Nell'esempio precedente una copia di and2 viene caricata nello spazio realtime e aggiunta al
thread del servo. Il pin 11 della porta parallela è collegato al bit in0 del gate and2. Il pin 12 è
collegato al bit in1 del gate and2. Infine colleghiamo il bit and2.out al pin 14 della porta
parallela. Quindi, seguendo la tabella di verità per and2 se il pin 11 e il pin 12 sono attivi,
allora il pin di uscita 14 sarà acceso.
6. Componenti di conversione
6.1. weighted_sum
Il weighted_sum converte un gruppo di bit in un numero intero. La conversione è la somma
dei pesi dei bit attivi più qualsiasi offset. Il peso del m-th bit è 2 ^ m. Questo è simile a un
decimale in codice binario ma con più opzioni. Il bit di attesa interrompe l'elaborazione delle
modifiche di input in modo che la somma non cambi.
La seguente sintassi viene utilizzata per caricare il componente weighted_sum.
loadrt weighted_sum wsum_sizes = size [, size, ...]
Crea gruppi di somma ponderati ciascuno con il numero dato di bit di input (dimensione).
Per aggiornare il weighted_sum è necessario allegare process_wsums a un thread.
addf process_wsums servo-thread
Questo aggiorna il componente weighted_sum.
Nell'esempio seguente, preso dalla finestra Configurazione HAL in Axis, i bit 0 e 2 sono veri e
non vi è alcun offset. Il peso di 0 è 1 e il peso di 2 è 4, quindi la somma è 5.
weighted_sum
Component Pins:
Owner Type Dir Value Name
10 bit In TRUE wsum.0.bit.0.in
10 s32 I/O 1 wsum.0.bit.0.weight
10 bit In FALSE wsum.0.bit.1.in
10 s32 I/O 2 wsum.0.bit.1.weight
10 bit In TRUE wsum.0.bit.2.in
10 s32 I/O 4 wsum.0.bit.2.weight
10 bit In FALSE wsum.0.bit.3.in
10 s32 I/O 8 wsum.0.bit.3.weight
10 bit In FALSE wsum.0.hold
10 s32 I/O 0 wsum.0.offset
10 s32 Out 5 wsum.0.sum
Tutorial di HAL
1. Introduzione
La configurazione si sposta adesso dalla teoria al dispositivo - che è il dispositivo HAL. Per
coloro che conoscono un po' di programmazione per computer, questa sezione è come un
Hello World di HAL. Halrun può essere utilizzato per creare un sistema funzionante. È uno
strumento da riga di comando o file di testo per la configurazione e l'ottimizzazione. I
seguenti esempi illustrano la sua configurazione e il suo funzionamento.
1.1. Notazione
I comandi del terminale vengono visualizzati senza il prompt di sistema, a meno che non si
esegua HAL. La finestra del terminale si trova in Applicazioni / Accessori dalla barra dei
menu principale di Linux.
Completamento scheda
halcmd: loa<TAB>
halcmd: load
halcmd: loadrt
halcmd: loadrt deb<TAB>
halcmd: loadrt debounce
2. Un semplice esempio
2.1. Caricamento di un componente
Per questo tutorial, assumeremo che tu abbia installato correttamente LinuxCNC. In tal caso,
tutto ciò che devi fare è caricare i moduli RTOS e RTAPI richiesti in memoria. Basta eseguire
il seguente comando da una finestra di terminale:
Caricamento HAL
halrun
halcmd:
Con il sistema operativo in tempo reale e RTAPI caricato, possiamo passare al primo
esempio. Si noti che il prompt viene ora visualizzato come halcmd:. Questo perché i
comandi successivi saranno interpretati come comandi HAL, non comandi di shell.
Per il primo esempio, useremo un componente HAL chiamato siggen , che è un semplice
generatore di segnali. Una descrizione completa del componente siggen è disponibile nella
sezione Siggen del manuale. È un componente in tempo reale, implementato come modulo
del kernel di Linux. Per caricare siggen usa il comando HAL loadrt .
Caricamento siggen
halcmd: loadrt siggen
Mostra componenti
halcmd: show comp
Dato che halcmd stesso è un componente HAL, verrà sempre visualizzato nell'elenco. Il
numero dopo halcmd nell'elenco dei componenti è l'ID del processo. È possibile eseguire più
di una copia di halcmd contemporaneamente (ad esempio in finestre diverse), quindi il PID
viene aggiunto alla fine del nome per renderlo univoco. L'elenco mostra anche il componente
siggen che abbiamo installato nel passaggio precedente. Il RT sotto Type indica che siggen è
un componente in tempo reale. L' user in Type indica che si tratta di un componente dello
spazio utente.
Successivamente, vediamo quali pin siggen si rendono disponibili:
Mostra pin
Questo comando visualizza tutti i pin nell'HAL corrente. Un sistema complesso potrebbe
avere dozzine o centinaia di pin. Ma al momento ci sono solo undici pin. Di questi pin otto
sono in virgola mobile, due sono bit (booleani) e uno un intero con segno a 32 bit. Sette
forniscono i dati in uscita dal componente siggen e quattro vengono utilizzati per trasferire le
impostazioni verso il componente. Poiché non abbiamo ancora eseguito il codice contenuto
all'interno del componente, alcuni pin hanno un valore pari a zero.
Il prossimo passo è guardare i parametri:
Mostra parametri
halcmd: show param
Parameters:
Owner Type Dir Value Name
4 s32 RW 0 siggen.0.update.tmax
4 bit RO FALSE siggen.0.update.tmax-increased
Il comando show param mostra tutti i parametri nell'HAL. In questo momento ogni
parametro ha il valore predefinito che è stato dato quando il componente è stato caricato.
Notare la colonna con l'etichetta Dir. I parametri etichettati -W sono quelli scrivibili che non
vengono mai modificati dal componente stesso, ma sono destinati a essere modificati
dall'utente per controllare il componente. Vedremo come farlo più tardi. I parametri
etichettati R- sono parametri di sola lettura. Possono essere modificati solo dal componente.
Infine, i parametri con etichetta RW sono parametri di lettura-scrittura. Ciò significa che
vengono modificati dal componente, ma possono anche essere modificati dall'utente. Nota: i
parametri siggen.0.update.tmax e siggen.0.update.tmax-increased sono a scopo di debug e
non saranno trattati in questa sezione.
La maggior parte dei componenti in tempo reale esportano una o più funzioni per eseguire
effettivamente il codice in tempo reale che contengono. Vediamo quale funzioni siggen
esporta:
Mostra funzioni
halcmd: show funct
Exported Functions:
Owner CodeAddr Arg FP Users Name
00003 f801b000 fae820b8 YES 0 siggen.0.update
Il componente siggen ha esportato una singola funzione. Richiede la virgola mobile. Non è
attualmente collegato a nessun thread, quindi gli users sono zero.
Vediamo se ha funzionato:
Mostra thread
halcmd: show thread
Realtime Threads:
Period FP Name ( Time, Max-Time )
999855 YES test-thread ( 0, 0 )
Aggiungi funzione
halcmd: addf siggen.0.update test-thread
Fino ad ora abbiamo usato halcmd solo per guardare l'HAL. Tuttavia, questa volta abbiamo
usato il comando addf (add function) per modificare effettivamente qualcosa nell'HAL .
Abbiamo detto a halcmd di aggiungere la funzione siggen.0.update al thread -thread-test, e
se guardiamo di nuovo l'elenco dei thread, vediamo che è riuscito:
halcmd: show thread
Realtime Threads:
Period FP Name ( Time, Max-Time )
999855 YES test-thread ( 0, 0 )
1 siggen.0.update
È necessario un ulteriore passaggio prima che il componente siggen inizi a generare segnali.
Quando l'HAL viene avviato per la prima volta, i thread non sono effettivamente in
esecuzione. Questo per consentire all'utente di configurare completamente il sistema prima
dell'avvio del codice in tempo reale. Una volta che sei soddisfatto della configurazione, puoi
iniziare il codice in tempo reale come questo:
halcmd: start
Component Pins:
Owner Type Dir Value Name
4 float IN 1 siggen.0.amplitude
4 bit OUT FALSE siggen.0.clock
4 float OUT -0.7862885 siggen.0.cosine
4 float IN 1 siggen.0.frequency
4 float IN 0 siggen.0.offset
4 bit IN FALSE siggen.0.reset
4 float OUT -0.212 siggen.0.sawtooth
4 float OUT 0.6178596 siggen.0.sine
4 float OUT -1 siggen.0.square
4 float OUT -0.576 siggen.0.triangle
4 s32 OUT 2292 siggen.0.update.time
10 s32 OUT 2292 test-thread.time
E guardiamo di nuovo:
halcmd: show pin
Component Pins:
Owner Type Dir Value Name
4 float IN 1 siggen.0.amplitude
4 bit OUT TRUE siggen.0.clock
4 float OUT 0.8542775 siggen.0.cosine
4 float IN 1 siggen.0.frequency
4 float IN 0 siggen.0.offset
4 bit IN FALSE siggen.0.reset
4 float OUT 0.826 siggen.0.sawtooth
4 float OUT -0.5198173 siggen.0.sine
4 float OUT 1 siggen.0.square
4 float OUT 0.652 siggen.0.triangle
4 s32 OUT 2343 siggen.0.update.time
10 s32 OUT 2343 test-thread.time
Abbiamo fatto due comandi pin show in rapida successione, e puoi vedere che le uscite non
sono più zero. Le uscite seno, coseno, a dente di sega (sawtooth) e triangolo (triangle)
cambiano costantemente. Anche l'uscita quadrata (square) funziona, tuttavia passa
semplicemente da +1.0 a -1.0 ogni ciclo.
Imposta il pin
halcmd: setp siggen.0.amplitude 5
Controllare nuovamente i parametri e i pin
Parameters:
Owner Type Dir Value Name
Owner Type Dir Value Name
4 s32 RW 8541 siggen.0.update.tmax
4 bit RO FALSE siggen.0.update.tmax-increased
10 s32 RW 8541 test-thread.tmax
Component Pins:
Owner Type Dir Value Name
4 float IN 5 siggen.0.amplitude
4 bit OUT FALSE siggen.0.clock
4 float OUT 4.842916 siggen.0.cosine
4 float IN 1 siggen.0.frequency
4 float IN 0 siggen.0.offset
4 bit IN FALSE siggen.0.reset
4 float OUT -4.6 siggen.0.sawtooth
4 float OUT 1.243449 siggen.0.sine
4 float OUT -5 siggen.0.square
4 float OUT 4.2 siggen.0.triangle
4 s32 OUT 3021 siggen.0.update.time
10 s32 OUT 3021 test-thread.time
Si noti che il valore del parametro siggen.0.amplitude è stato modificato in 5 e che i pin ora
hanno valori maggiori.
Salva in un file
halcmd: save all saved.hal
Esci da HAL
halcmd: exit
Si noti che non esiste un comando di start in saved.hal. È necessario scriverlo nuovamente
(oppure modificare saved.hal per aggiungerlo lì).
Rimozione di HAL
halrun -U
3. Halmeter
È possibile creare sistemi HAL molto complessi senza mai utilizzare un'interfaccia grafica.
Tuttavia, c'è qualcosa di soddisfacente nel vedere il risultato del tuo lavoro. Il primo e più
semplice strumento GUI per l'HAL è Halmeter. È un programma molto semplice che è
l'equivalente HAL del pratico multimetro Fluke (o simulatore analogico Simpson per i vecchi
temporizzatori).
Utilizzeremo nuovamente il componente siggen per verificare l'halmeter. Se hai appena
terminato l'esempio precedente, puoi caricare siggen utilizzando il file salvato. Altrimenti
possiamo caricarlo proprio come facevamo prima:
halrun
halcmd: loadrt siggen
halcmd: loadrt threads name1=test-thread period1=1000000
halcmd: addf siggen.0.update test-thread
halcmd: start
halcmd: setp siggen.0.amplitude 5
Avvio Halmeter
halcmd: loadusr halmeter
La prima finestra che vedrai è la finestra Select Item to Probe (Seleziona oggetto da
Esaminare) .
Questa finestra di dialogo ha tre schede. La prima scheda mostra tutti i pin HAL nel sistema.
Il secondo mostra tutti i segnali e il terzo visualizza tutti i parametri. Vorremmo prima
esaminare il pin siggen.0.cosine , quindi fare clic su di esso e quindi fare clic sul pulsante
Close (Chiudi) . La finestra di selezione della sonda si chiuderà e il misuratore assomiglierà
alla seguente figura.
Figura 2. Halmeter
Per cambiare il display del misuratore, premere il pulsante Select che riporta la finestra Select
item to probe (Seleziona oggetto da Esaminare).
Dovresti vedere il valore cambiare mentre siggen genera la sua onda di coseno. L'halmeter
aggiorna il suo display circa 5 volte al secondo.
Per spegnere l'halmeter, fai clic sul pulsante di uscita.
Se si desidera guardare più di un pin, segnale o parametro alla volta, è possibile avviare più
halmeters. La finestra dell’ halmeter è stata intenzionalmente realizzata in modo molto
piccolo in modo da poterli visualizzare sullo schermo in una volta sola.
4. Esempio di Stepgen
Fino ad ora abbiamo caricato solo un componente HAL. Ma l'idea alla base dell'HAL è quella
di consentire di caricare e connettere un numero di componenti semplici per creare un
sistema complesso. Il prossimo esempio userà due componenti.
Prima di iniziare a costruire questo nuovo esempio, vogliamo iniziare con una lavagna pulita.
Se hai appena terminato uno degli esempi precedenti, dobbiamo rimuovere tutti i
componenti e ricaricare le librerie RTAPI e HAL.
halcmd: exit
Il primo comando carica due generatori di passi, entrambi configurati per generare step di
tipo 0. Il secondo comando carica il nostro vecchio amico siggen, e il terzo crea due thread,
uno fast (veloce) con un periodo di 100 microsecondi e uno slow (lento) con un periodo di
tempo 1 millisecondo. Il thread veloce non supporta le funzioni in virgola mobile.
Come prima, possiamo usare halcmd show per dare un'occhiata all'HAL. Questa volta
abbiamo molti più pin e parametri rispetto a prima:
halcmd: show pin
Component Pins:
Owner Type Dir Value Name
11 s32 OUT 0 fast.time
7 float IN 1 siggen.0.amplitude
7 bit OUT FALSE siggen.0.clock
7 float OUT 0 siggen.0.cosine
7 float IN 1 siggen.0.frequency
7 float IN 0 siggen.0.offset
7 bit IN FALSE siggen.0.reset
7 float OUT 0 siggen.0.sawtooth
7 float OUT 0 siggen.0.sine
7 float OUT 0 siggen.0.square
7 float OUT 0 siggen.0.triangle
7 s32 OUT 0 siggen.0.update.time
12 s32 OUT 0 slow.time
4 s32 OUT 0 stepgen.0.counts
4 bit OUT FALSE stepgen.0.dir
4 bit IN FALSE stepgen.0.enable
4 float OUT 0 stepgen.0.position-fb
4 bit OUT FALSE stepgen.0.step
4 float IN 0 stepgen.0.velocity-cmd
4 s32 OUT 0 stepgen.1.counts
4 bit OUT FALSE stepgen.1.dir
4 bit IN FALSE stepgen.1.enable
4 float OUT 0 stepgen.1.position-fb
4 bit OUT FALSE stepgen.1.step
4 float IN 0 stepgen.1.velocity-cmd
4 s32 OUT 0 stepgen.capture-position.time
4 s32 OUT 0 stepgen.make-pulses.time
4 s32 OUT 0 stepgen.update-freq.time
Parameters:
Owner Type Dir Value Name
11 s32 RW 0 fast.tmax
7 s32 RW 0 siggen.0.update.tmax
7 bit RO FALSE siggen.0.update.tmax-increased
12 s32 RW 0 slow.tmax
4 u32 RW 0x00000001 stepgen.0.dirhold
4 u32 RW 0x00000001 stepgen.0.dirsetup
4 float RO 0 stepgen.0.frequency
4 float RW 0 stepgen.0.maxaccel
4 float RW 0 stepgen.0.maxvel
4 float RW 1 stepgen.0.position-scale
4 s32 RO 0 stepgen.0.rawcounts
4 u32 RW 0x00000001 stepgen.0.steplen
4 u32 RW 0x00000001 stepgen.0.stepspace
4 u32 RW 0x00000001 stepgen.1.dirhold
4 u32 RW 0x00000001 stepgen.1.dirsetup
4 float RO 0 stepgen.1.frequency
4 float RW 0 stepgen.1.maxaccel
4 float RW 0 stepgen.1.maxvel
4 float RW 1 stepgen.1.position-scale
4 s32 RO 0 stepgen.1.rawcounts
4 u32 RW 0x00000001 stepgen.1.steplen
4 u32 RW 0x00000001 stepgen.1.stepspace
4 s32 RW 0 stepgen.capture-position.tmax
4 bit RO FALSE stepgen.capture-position.tmax-increased
4 s32 RW 0 stepgen.make-pulses.tmax
4 bit RO FALSE stepgen.make-pulses.tmax-increased
4 s32 RW 0 stepgen.update-freq.tmax
4 bit RO FALSE stepgen.update-freq.tmax-increased
comando net
halcmd: net X-vel <= siggen.0.cosine
Signals:
Type Value Name (linked to)
float 0 X-vel <== siggen.0.cosine
Quando un segnale è collegato a uno o più pin, il comando show elenca i pin immediatamente
successivi al nome del segnale. La freccia mostra la direzione del flusso di dati - in questo
caso, i flussi di dati vanno dal pin siggen.0.cosine al segnale X-vel. Ora colleghiamo l' X-vel
all'ingresso di velocità di un generatore di impulsi di passo.
halcmd: net X-vel => stepgen.0.velocity-cmd
Possiamo anche collegare il segnale dell'asse Y Y-vel . È progettato per funzionare dall'uscita
sinusoidale del generatore di segnali all'ingresso del generatore di impulsi del secondo stadio.
Il seguente comando realizza in una riga i due comandi netti ottenuti per X-vel .
halcmd: net Y-vel siggen.0.sine => stepgen.1.velocity-cmd
Signals:
Type Value Name (linked to)
float 0 X-vel <== siggen.0.cosine
==> stepgen.0.velocity-cmd
float 0 Y-vel <== siggen.0.sine
==> stepgen.1.velocity-cmd
Il comando show sig chiarisce esattamente come i dati attraversano l'HAL. Ad esempio, il
segnale X-vel proviene da pin siggen.0.cosine e passa al pin stepgen.0.velocity-cmd.
Exported Functions:
Owner CodeAddr Arg FP Users Name
00004 f9992000 fc731278 YES 0 siggen.0.update
00003 f998b20f fc7310b8 YES 0 stepgen.capture-position
00003 f998b000 fc7310b8 NO 0 stepgen.make-pulses
00003 f998b307 fc7310b8 YES 0 stepgen.update-freq
In generale, dovrai fare riferimento alla documentazione di ciascun componente per vedere
quali sono le sue funzioni. In questo caso, la funzione siggen.0.update viene utilizzata per
aggiornare le uscite del generatore di segnali. Ogni volta che viene eseguito, calcola i valori
delle uscite seno, coseno, triangolo e quadrato. Per ottenere segnali uniformi, deve essere
eseguito a intervalli specifici.
Le altre tre funzioni sono correlate ai generatori di impulsi di passo.
Il primo, stepgen.capture_position, viene utilizzato per il feedback di posizione. Cattura il
valore di un contatore interno che conta gli impulsi di passo mentre vengono generati.
Supponendo che non ci siano step mancanti, questo contatore indica la posizione del motore.
La funzione principale per il generatore di impulsi di passo è stepgen.make_pulses. Ogni
volta che viene eseguito make_pulses , decide se è il momento di fare un passo, e in tal caso
imposta le uscite di conseguenza. Per gli impulsi graduali regolari, dovrebbe funzionare il più
frequentemente possibile. Poiché ha bisogno di correre così velocemente, make_pulses è
altamente ottimizzato ed esegue solo alcuni calcoli. A differenza degli altri, non ha bisogno di
matematica in virgola mobile.
L'ultima funzione, stepgen.update-freq, è responsabile del ridimensionamento e di altri
calcoli che devono essere eseguiti solo quando il comando di frequenza cambia.
Ciò che questo significa per il nostro esempio è che vogliamo eseguire siggen.0.update a una
velocità moderata per calcolare i valori seno e coseno. Immediatamente dopo aver eseguito
siggen.0.update, vogliamo eseguire stepgen.update_freq per caricare i nuovi valori nel
generatore di impulsi di passo. Infine, dobbiamo eseguire stepgen.make_pulses il più
velocemente possibile per impulsi regolari. Poiché non usiamo il feedback sulla posizione,
non è necessario eseguire stepgen.capture_position.
Eseguiamo le funzioni aggiungendole ai thread. Ogni thread viene eseguito a una velocità
specifica. Vediamo quali thread abbiamo a disposizione.
halcmd: show thread
Realtime Threads:
Realtime Threads:
Period FP Name ( Time, Max-Time )
1000000 YES slow ( 0, 0 )
100000 NO fast ( 0, 0 )
I due thread sono stati creati quando abbiamo caricato i threads. Il primo, slow , viene
eseguito ogni millisecondo ed è in grado di eseguire funzioni in virgola mobile. Lo useremo
per siggen.0.update e stepgen.update_freq. Il secondo thread è fast , che viene eseguito ogni
100 microsecondi e non supporta il punto mobile. Lo useremo per stepgen.make_pulses. Per
collegare le funzioni al thread corretto, usiamo il comando addf. Specifichiamo prima la
funzione, seguita dal thread.
halcmd: addf siggen.0.update slow
halcmd: addf stepgen.update-freq slow
halcmd: addf stepgen.make-pulses fast
Dopo aver dato questi comandi, possiamo eseguire nuovamente il comando show thread per
vedere cosa è successo.
halcmd: show thread
Realtime Threads:
Period FP Name ( Time, Max-Time )
1000000 YES slow ( 0, 0 )
1 siggen.0.update
2 stepgen.update-freq
100000 NO fast ( 0, 0 )
1 stepgen.make-pulses
Ora ogni thread è seguito dai nomi delle funzioni, nell'ordine in cui verranno eseguite le
funzioni.
4.5. Avvio!
Ora abbiamo tutto configurato e pronto per l'avvio. Proprio come nel primo esempio,
usiamo il comando start .
halcmd: start
Anche se non sembra accadere nulla, all'interno del computer il generatore di impulsi di
passo sta sfogliando gli impulsi di passo, variando da 10 KHz in avanti a 10 KHz in
retromarcia e viceversa. Più avanti in questo tutorial vedremo come far uscire quei segnali
interni per far funzionare i motori nel mondo reale, ma prima vogliamo esaminarli e vedere
cosa sta succedendo.
5. Halscope
L'esempio precedente genera alcuni segnali molto interessanti. Ma gran parte di ciò che
accade è troppo veloce per essere visto con l'halmeter. Per dare un'occhiata più da vicino a
cosa sta succedendo all'interno dell'HAL, vogliamo un oscilloscopio. Fortunatamente HAL ne
ha uno, chiamato halscope.
Halscope ha due parti: una parte in tempo reale che viene caricata come modulo del kernel e
una parte utente che fornisce la GUI e il display. Tuttavia, non devi preoccuparti di questo,
perché la porzione dello spazio utente richiederà automaticamente che venga caricata la parte
in tempo reale. Si noti inoltre che la prima volta che si esegue halscope in una directory viene
visualizzato un messaggio di warning che avverte che il file autosave.halscope non può essere
aperto.
Avvio di Halscope
halcmd: loadusr halscope
halcmd: halscope: config file 'autosave.halscope' could not be opened
Per scegliere un segnale, basta fare clic su di esso. In questo caso, vogliamo che il canale 1
mostri il segnale X-vel . Fare clic sulla scheda Segnali quindi fare clic su X-vel e la finestra di
dialogo si chiude e il canale è ora selezionato.
Il pulsante del canale 1 viene premuto e il numero del canale 1 e il nome X-vel appaiono sotto
la fila di pulsanti. Quella visualizzazione indica sempre il canale selezionato - è possibile
avere molti canali sullo schermo, ma quello selezionato viene evidenziato e i vari controlli
come la posizione verticale e la scala funzionano sempre su quella selezionata.
Figura 7. Halscope
Per aggiungere un segnale al canale 2, fare clic sul pulsante 2 . Quando viene visualizzata la
finestra di dialogo, fai clic sulla scheda Segnali , quindi fai clic su Y-vel . Vogliamo anche
guardare le uscite a onda quadrata e triangolare. Non ci sono segnali collegati a quei pin,
quindi usiamo invece la scheda Pins. Per il canale 3, selezionare siggen.0.triangle e per il
canale 4, selezionare siggen.0.square .
La casella Selected Channel (Canale selezionato) in basso ti dice che la traccia viola è quella
attualmente selezionata, il canale 4, che sta visualizzando il valore del pin siggen.0.square .
Prova a fare clic sui pulsanti dei canali da 1 a 3 per evidenziare le altre tre tracce.
Se il componente scope_rt non è già stato caricato, halscope lo caricherà e richiederà 80000
campioni totali, in modo che durante il campionamento di 4 canali alla volta ci saranno
20000 campioni per canale. (Se scope_rt è già stato caricato, l'argomento numerico di
halscope non avrà alcun effetto).
Descrizioni dei componenti HAL
Sommario
1. Stepgen
2. PWMgen
3. Encoder
4. PID
5. Simulated Encoder
6. Debounce
7. Siggen
8. lut5
1. Stepgen
Questo componente fornisce una generazione basata su software di impulsi di passo in
risposta a comandi di posizione o di velocità. In modalità posizione, ha un loop di posizione
pre-calibrato, quindi la calibrazione PID non è necessaria. In modalità velocità, guida un
motore alla velocità comandata, rispettando i limiti di velocità e accelerazione. È un
componente solo in tempo reale e, a seconda della velocità della CPU, ecc., è in grado di
raggiungere velocità massime tra i 10kHz fino a 50kHz. Il diagramma a blocchi del
generatore di impulsi di passo mostra tre diagrammi a blocchi, ciascuno dei quali è un
generatore di impulsi a singola fase. Il primo diagramma è per il tipo di step 0, (passo e
direzione). Il secondo è per il tipo di step 1 (su / giù o pseudo-PWM) e il terzo è per i tipi di
step da 2 a 14 (vari schemi di stepping). I primi due diagrammi mostrano il controllo della
modalità di posizione, mentre il terzo mostra la modalità di velocità. La modalità di controllo
e il tipo di passo sono impostati in modo indipendente e qualsiasi combinazione può essere
selezionata.
Diagramma a blocchi generatore impulsi
Installazione
halcmd: loadrt stepgen step_type=<type-array> [ctrl_type=<ctrl_array>]
<type-array> è una serie di numeri decimali separati da virgola. Ogni numero fa sì che
venga caricato un generatore di impulsi a singola fase, il valore del numero determina il tipo
di passo. <ctrl_array> è una serie separata da virgola di caratteri p o v , per specificare la
posizione o la modalità di velocità. ctrl_type è facoltativo, se omesso, tutti i generatori di
passi saranno in modalità posizione.
Per esempio:
halcmd: loadrt stepgen step_type=0,0,2 ctrl_type=p,p,v
installerà tre generatori a step. I primi due usano il tipo di passo 0 (passo e direzione) e
funzionano in modalità posizione. L'ultimo utilizza il tipo di passo 2 (quadratura) e funziona
in modalità velocità. Il valore predefinito per <config-array> è 0,0,0 che installerà tre
generatori di tipo 0 (passo / dir). Il numero massimo di generatori di passi è 8 (come definito
da MAX_CHAN in stepgen.c). Ogni generatore è indipendente, ma tutti sono aggiornati dalla
stessa funzione allo stesso momento. Nelle seguenti descrizioni, <chan> è il numero di un
generatore specifico. Il primo generatore è il numero 0.
Rimozione
halcmd: unloadrt stepgen
pins
Ogni generatore di impulsi di passo avrà solo alcuni di questi pin, a seconda del tipo di passo
e del tipo di controllo selezionato.
parametri
Il tipo di step 1 ha due uscite, su e giù. Gli impulsi appaiono su uno o l'altro, a seconda della
direzione di marcia. Ogni impulso è lungo steplen ns e gli impulsi sono separati da almeno
stepspace ns. La frequenza massima è uguale a quella del tipo di passo 0. Se maxfreq è
impostato su un valore superiore al limite, verrà abbassato. Se maxfreq è zero, rimarrà zero
ma la frequenza di uscita sarà ancora limitata.
Step Tipo 2 - 14
I tipi di step da 2 a 14 sono basati sullo stato e hanno da due a cinque uscite. Ad ogni step, un
contatore di stati viene incrementato o decrementato. Il due e tre fasi, quattro fasi e cinque
fasi mostrano i modelli di uscita in funzione del contatore di stati. La frequenza massima è
1.000.000.000 divisa per steplen, e come nelle altre modalità, maxfreq verrà abbassato se è
superiore al limite.
Tipi di step a due e tre fasi
Tipi di step a quattro fasi
2. PWMgen
Questo componente fornisce una generazione basata su software di forme d'onda PWM
(Pulse Width Modulation) e PDM (Pulse Density Modulation). È un componente in tempo
reale e, a seconda della velocità della CPU, ecc., è capace di frequenze PWM da poche
centinaia di Hertz a una risoluzione piuttosto buona, circa 10 KHz con risoluzione limitata.
Installazione
loadrt pwmgen output_type=<config-array>
<Config-array> è una serie di numeri decimali separati da virgola. Ogni numero causa il
caricamento di un singolo generatore PWM, il valore del numero determina il tipo di uscita.
Il seguente esempio installerà tre generatori PWM. Non esiste alcun valore predefinito, se
<config-array> non è specificato, nessun generatore PWM verrà installato. Il numero
massimo di generatori di frequenza è 8 (come definito da MAX_CHAN in pwmgen.c). Ogni
generatore è indipendente, ma tutti sono aggiornati dalla stessa funzione (s) allo stesso
tempo. Nelle seguenti descrizioni, <chan> è il numero di un generatore specifico. Il primo
generatore è il numero 0.
Esempio
loadrt pwmgen output_type=0,1,2
Rimozione
unloadrt pwmgen
Tipi di output
Il generatore PWM supporta tre diversi tipi di output .
Uscita tipo 0 - Solo pin di uscita PWM. Sono accettati solo comandi positivi, i valori
negativi sono considerati zero (e saranno influenzati dal parametro min-dc se è diverso
da zero).
Uscita tipo 1 - PWM / PDM e pin di direzione. Gli input positivi e negativi verranno
emessi come PWM positivi e negativi. Il pin di direzione è falso per i comandi positivi
e vero per i comandi negativi. Se il controllo richiede PWM positivo sia per CW che
per CCW, utilizzare il componente abs per convertire il segnale PWM in valore positivo
quando viene immesso un input negativo.
Uscita tipo 2 : pin UP e DOWN. Per i comandi positivi, il segnale PWM appare
sull'uscita superiore e l'uscita giù rimane falsa. Per i comandi negativi, il segnale PWM
appare sull'uscita giù e l'uscita su rimane falsa. Il tipo di uscita 2 è adatto per la guida
della maggior parte dei ponti H.
Pins
Ogni generatore PWM avrà i seguenti pin:
Ogni generatore PWM avrà anche alcuni di questi pin, a seconda del tipo di output
selezionato:
(bit) pwmgen. <chan>.pwm - PWM (o PDM) output, (solo tipi di output 0 e 1).
(bit) pwmgen. <chan>.dir - Output di direzione (solo tipo di output 1).
(bit) pwmgen. <chan>.up - Uscita PWM / PDM per valore di input positivo (solo tipo
di output 2).
(bit) pwmgen. <chan>.down - Uscita PWM / PDM per valore di ingresso negativo
(solo tipo di uscita 2).
parametri
funzioni
Il componente esporta due funzioni. Ogni funzione agisce su tutti i generatori PWM -
l'esecuzione di generatori diversi in thread diversi non è supportata.
3. Encoder
Questo componente fornisce il conteggio basato su software di segnali da encoder in
quadratura. È un componente solo in tempo reale e, a seconda della velocità della CPU, della
latenza e così via, è in grado di ottenere frequenze di conteggio massimo di 10 kHz fino a un
massimo di 50 kHz.
Il thread di base dovrebbe essere 1/2 della velocità di conteggio per tenere conto della
variazione del rumore e della temporizzazione. Ad esempio se si dispone di un encoder a 100
impulsi per giro sul mandrino e il numero massimo di giri / min è 3000, il thread di base
massima deve essere di 25 us. Un encoder a 100 impulsi per giro avrà 400 conteggi. La
velocità del mandrino di 3000 RPM = 50 RPS (giri al secondo). 400 * 50 = 20.000 conteggi
al secondo o 50 us tra i conteggi.
Il Diagramma a blocchi del contatore dell'encoder è uno schema a blocchi di un canale di un
contatore dell'encoder.
Installazione
halcmd: loadrt encoder [num_chan=<contatori>]
<contatori> è il numero di contatori dell'encoder che si desidera installare. Se numchan non
viene specificato, verranno installati tre contatori. Il numero massimo di contatori è 8 (come
definito da MAX_CHAN in encoder.c). Ogni contatore è indipendente, ma tutti sono
aggiornati dalla stessa funzione (s) allo stesso tempo. Nelle seguenti descrizioni, <chan> è il
numero di un contatore specifico. Il primo contatore è il numero 0.
Rimozione
halcmd: unloadrt encoder
Pins
parametri
funzioni
Il componente esporta due funzioni. Ogni funzione agisce su tutti i contatori dell'encoder -
l'esecuzione di contatori diversi in thread diversi non è supportata.
4. PID
Questo componente fornisce loop di controllo Proporzionale / Integrale / Derivativo. È un
componente solo in tempo reale. Per semplicità, questa discussione presuppone che stiamo
parlando di anelli di posizione, tuttavia questo componente può essere utilizzato per
implementare altri circuiti di feedback quali velocità, altezza torcia, temperatura, ecc. Il
diagramma a blocchi del loop PID è uno schema a blocchi di un singolo anello PID .
Figura 3. Diagramma a blocchi del loop PID
Installazione
halcmd: loadrt pid [num_chan=<loops>] [debug=1]
<loops> è il numero di loop PID che si desidera installare. Se numchan non è specificato,
verrà installato un ciclo. Il numero massimo di loop è 16 (come definito da MAX_CHAN in
pid.c). Ogni loop è completamente indipendente. Nelle seguenti descrizioni, <loopnum> è il
numero di loop di un loop specifico. Il primo ciclo è il numero 0.
Se viene specificato debug = 1 , il componente esporterà alcuni pin aggiuntivi che potrebbero
essere utili durante il debug e l'ottimizzazione. Per impostazione predefinita, i pin aggiuntivi
non vengono esportati, per risparmiare spazio nella memoria condivisa ed evitare di
ingombrare l'elenco dei pin.
Rimozione
halcmd: unloadrt pid
Pins
I tre pin più importanti sono
Per un loop di posizione, il comando e il feedback sono in unità di posizione. Per un asse
lineare, questo potrebbe essere pollici, mm, metri o qualsiasi cosa sia rilevante. Allo stesso
modo, per un asse angolare, potrebbe essere gradi, radianti, ecc. Le unità del pin di uscita
rappresentano la modifica necessaria per far corrispondere il feedback al comando. In
quanto tale, per un loop di posizione, l' output è una velocità, in pollici/sec, mm/sec,
gradi/sec, ecc. Le unità di tempo sono sempre secondi e le unità di velocità corrispondono
alle unità di posizione. Se il comando e il feedback sono espressi in metri, l'output è espresso
in metri al secondo.
Ogni loop ha due pin che vengono utilizzati per monitorare o controllare il funzionamento
generale del componente.
Pin utilizzati per segnalare la saturazione. La saturazione si verifica quando l'uscita del
blocco PID è al suo limite massimo o minimo.
I guadagni, i limiti e le altre caratteristiche sintonizzabili del loop sono disponibili come pin
in modo che possano essere regolati dinamicamente per ulteriori possibilità di accordatura
avanzate.
funzioni
Il componente esporta una funzione per ogni loop PID. Questa funzione esegue tutti i calcoli
necessari per il ciclo. Poiché ogni loop ha una propria funzione, i singoli loop possono essere
inclusi in thread diversi ed eseguiti a velocità diverse.
Se vuoi capire l'esatto algoritmo usato per calcolare l'output del loop PID, fai riferimento alla
figura PID Loop Block Diagram , i commenti all'inizio di emc2 / src / hal / components /
pid.c , e ovviamente al codice. I calcoli del ciclo si trovano nella funzione C calc_pid () .
5. Encoder simulato
L'encoder simulato è esattamente questo. Produce impulsi in quadratura con un impulso
indice, ad una velocità controllata da un pin HAL. Utile principalmente per i test.
Installazione
halcmd: loadrt sim-encoder num_chan=<numero>
<numero> è il numero di encoder che si desidera simulare. Se non specificato, verrà
installato un codificatore. Il numero massimo è 8 (come definito da MAX_CHAN in
sim_encoder.c).
Rimozione
halcmd: unloadrt sim-encoder
Pins
Nota che gli impulsi per giro non sono gli stessi conteggi per giro. Un impulso è un ciclo di
quadratura completo. La maggior parte dei contatori dell'encoder conta quattro volte durante
un ciclo completo.
funzioni
Il componente esporta due funzioni. Ogni funzione ha effetto su tutti gli encoder simulati.
(funct) sim-encoder.make-impules - Funzione ad alta velocità per generare impulsi in
quadratura (senza virgola mobile).
(funct) sim-encoder.update-speed - Funzione a bassa velocità per leggere la velocità ,
eseguire il ridimensionamento e impostare i make-impules .
6. Debounce
Debounce è un componente in tempo reale in grado di filtrare le anomalie create dai contatti
degli interruttori meccanici. Può anche essere utile in altre applicazioni in cui gli impulsi
brevi devono essere rifiutati.
Installazione
halcmd: loadrt debounce cfg=<config-string>
<config-string> è una serie di numeri decimali separati da virgola. Ogni numero installa un
gruppo di filtri antirimbalzo identici, il numero determina quanti filtri ci sono nel gruppo.
Per esempio:
halcmd: loadrt debounce cfg=1,4,2
installerà tre gruppi di filtri. Il gruppo 0 contiene un filtro, il gruppo 1 ne contiene quattro e il
gruppo 2 contiene due filtri. Il valore predefinito per <config-string> è "1" che installerà un
singolo gruppo contenente un singolo filtro. Il numero massimo di gruppi 8 (come definito
da MAX_GROUPS in debounce.c). Il numero massimo di filtri in un gruppo è limitato solo
dallo spazio di memoria condiviso. Ogni gruppo è completamente indipendente. Tutti i filtri
in un singolo gruppo sono identici e sono tutti aggiornati con la stessa funzione allo stesso
tempo. Nelle seguenti descrizioni, <G> è il numero del gruppo e <F> è il numero del filtro
all'interno del gruppo. Il primo filtro è il gruppo 0, il filtro 0.
Rimozione
halcmd: unloadrt debounce
Pins
Ogni singolo filtro ha due pin.
parametri
Ogni gruppo di filtri ha un parametro
(s32) debounce.<G>.delay - Ritarda il filtro per tutti i filtri nel gruppo <G> .
Il ritardo del filtro è espresso in unità di periodi di thread. Il ritardo minimo è zero. L'output
di un filtro di ritardo zero segue esattamente il suo input - non filtra nulla. Con l'aumentare
del ritardo, vengono rifiutati i glitch più lunghi. Se il ritardo è 4, tutti i glitch inferiori o
uguali a quattro periodi di thread verranno rifiutati.
funzioni
Ogni gruppo di filtri ha una funzione, che aggiorna tutti i filtri in quel gruppo
simultaneamente. Diversi gruppi di filtri possono essere aggiornati da diversi thread in
periodi diversi.
funzioni
8. lut5
Il componente lut5 è un componente logico a 5 input basato su una tabella di ricerca.
Funzione di calcolo
Per calcolare il numero esadecimale della funzione partendo dall'alto, metti un 1 o 0 per
indicare se quella riga sarebbe vera o falsa. Quindi annota tutti i numeri nella colonna di
output partendo dall'alto e scrivendoli da destra a sinistra. Questo sarà il numero binario.
Usando una calcolatrice con funzione di programmatore come quella di Linux inserisci il
numero binario e poi convertilo in esadecimale e questo sarà il valore per la funzione.
0 0 0 1 1 1
Guardando la colonna di output del nostro esempio vogliamo che l'output sia attivo quando
Bit 0 o Bit 0 e Bit1 sono accesi e nient'altro. Il numero binario è b1010 (ruota l'uscita di 90
gradi CW). Inserire questo numero nella calcolatrice, quindi cambiare la visualizzazione in
esadecimale e il numero necessario per la funzione è 0xa. Il prefisso esadecimale è 0x .
Pannello di controllo virtuale Python
PyVCP
Sommario
1. Introduzione
2. Costruzione del pannello
3. Sicurezza
4. AXIS
5. Stand Alone
6. Widget
6.1. Sintassi
6.2. Note generali
6.3. Etichetta
6.4. Multi_Label
6.5. LED
6.6. Pulsanti
6.7. Numero visualizzazioni
6.8. Numero di ingressi
6.9. Immagini
6.10. Contenitori
1. Introduzione
PyVCP - Pannello di controllo virtuale Python
<pyvcp>
<label text="This is a LED indicator"/>
<led/>
</pyvcp>
PyVCP creerà il pannello per te, che include due widget, un'etichetta con il testo This is a LED
indicator e un LED, utilizzato per visualizzare lo stato di un segnale HAL BIT. Creerà anche
un componente HAL chiamato mypanel (tutti i widget in questo pannello sono connessi ai
pin che iniziano con mypanel). Poiché nessun tag <halpin> era presente nel tag <led>,
PyVCP assegnerà automaticamente il pin HAL per il widget LED mypanel.led.0.
Per un elenco di widget e relativi tag e opzioni, consultare il riferimento del widget di seguito.
Una volta creato il pannello, il collegamento dei segnali HAL ai pin PyVCP viene eseguito con
halcmd:
3. Sicurezza
Le parti dei file PyVCP sono valutate come codice Python e possono compiere qualsiasi azione
disponibile per i programmi Python. Utilizza solo file .xml PyVCP provenienti da un'origine di
cui ti fidi.
4. AXIS
Poiché AXIS utilizza lo stesso toolkit GUI (Tkinter) come PyVCP, è possibile includere un
pannello PyVCP sul lato destro della normale interfaccia utente AXIS. Un tipico esempio è
spiegato di seguito.
Inserisci il tuo file PyVCP XML descrivendo il pannello nella stessa directory in cui si trova il
tuo file .ini. Diciamo che vogliamo visualizzare la velocità corrente del mandrino usando un
widget Barra. Inserire quanto segue in un file chiamato spindle.xml:
<pyvcp>
<label>
<text>"Velocità del mandrino:"</text>
</label>
<bar>
<halpin>"spindle-speed"</halpin>
<max_>5000</ max_>
</bar>
</pyvcp>
Qui abbiamo creato un pannello con un widget Label e una barra, specificato che il pin HAL
collegato alla barra deve essere denominato spindle speed e impostare il valore massimo della
barra su 5000 (vedi il riferimento del widget sotto per tutte le opzioni). Per rendere AXIS
comprensivo di questo file e chiamarlo all'avvio, è necessario specificare quanto segue nella
sezione [DISPLAY] del file .ini:
PYVCP = spindle.xml
Per rendere il nostro widget efficace per visualizzare la velocità del mandrino, ha bisogno di
essere collegato al segnale HAL appropriato. Un file .hal che verrà eseguito dopo l'avvio di
AXIS e PyVCP può essere specificato nella sezione [HAL] del file .ini:
POSTGUI_HALFILE = spindle_to_pyvcp.hal
5. Stand Alone
Questa sezione descrive come i pannelli PyVCP possono essere visualizzati da soli con o senza
il controller macchina di LinuxCNC.
Per caricare un pannello PyVCP stand-alone con LinuxCNC usa questi comandi:
Potresti usarlo se volessi un pannello mobile o un pannello con un GUI diversa da AXIS.
● -Wn panelname - fa in modo che HAL attenda il completamento del caricamento del
componente panelname (diventa pronto in HAL) prima di elaborare più comandi
HAL. Questo è importante perché i pannelli PyVCP esportano pin HAL e altri
componenti HAL avranno bisogno di essere già presenti per connettersi ad essi.
Notare la W maiuscola e la minuscola n. Se si utilizza l'opzione -Wn, è necessario
utilizzare l'opzione -c per denominare il pannello.
● pyvcp <-g> <-c> panel.xml - crea il pannello con la geometria opzionale e/o
panelname dal file del pannello xml. Il file panel.xml può avere qualsiasi nome che
termina con .xml. Il file .xml è il file che descrive come costruire il pannello. È
necessario aggiungere il nome del percorso se il pannello non si trova nella directory in
cui si trova lo script HAL.
● -g <WxH> <+ X + Y> - specifica la geometria da utilizzare durante la costruzione del
pannello. La sintassi è larghezza x altezza +XAnchor +YAnchor. È possibile impostare
la dimensione o la posizione o entrambi. Il punto di ancoraggio è l'angolo in alto a
sinistra del pannello. Un esempio è -g 250x500 + 800 + 10 Imposta il pannello a 250
pixel di larghezza, a 500 pixel di altezza e lo posiziona a X800 Y10.
● -c panelname - dice a PyVCP come chiamare il componente e anche il titolo della
finestra. Il nome del pannello può essere un nome qualsiasi senza spazi.
Per caricare un pannello PyVCP stand-alone senza LinuxCNC, utilizzare questo comando:
Il comando loadusr viene utilizzato quando si carica anche un componente che impedirà a
HAL di chiudersi fino al completamento. Se hai caricato un pannello e caricato Classic Ladder
utilizzando loadusr -w classicladder, CL avrebbe mantenuto HAL aperto (e il pannello)
finché non hai chiuso CL. Il -Wn sopra significa attendere che il componente -Wn "nome" sia
pronto. (il nome può essere qualsiasi nome. Nota la lettera maiuscola e la lettera minuscola
n.) Il -c indica a PyVCP di creare un pannello con il nome panelname utilizzando le
informazioni in panel_file_name.xml. Il nome panel_file_name.xml può essere qualsiasi
nome ma deve terminare in .xml - è il file che descrive come compilare il pannello. È
necessario aggiungere il nome del percorso se il pannello non si trova nella directory in cui si
trova lo script HAL.
waituser panelname
6. Widget
I segnali HAL sono disponibili in due varianti, bit e numeri. I bit sono segnali off/on. I
numeri possono essere float, s32 o u32. Per ulteriori informazioni sui tipi di dati HAL,
consultare la HAL Data sezione. Il widget PyVCP può visualizzare il valore del segnale con un
indicatore widget o modificare il valore del segnale con un widget di controllo. Quindi ci sono
quattro classi di widget PyVCP che è possibile collegare a un segnale HAL. Una quinta classe
di widget detti helper ti consente di organizzare ed etichettare il tuo pannello.
1. Widget per indicare bit: led, rectled
2. Widget per controllare bit: segnali di bottone, checkbutton, radiobutton
3. Widgets indicanti numero: segnali numero, s32, u32, barre, quadranti
4. Widgets per controllare valori numerici: i segnali spinbox, scala, jogwheel
5. WidgetHelper: hbox , vbox, table, label, labelframe
6.1. Sintassi
Ogni widget è descritto brevemente, seguito dal markup utilizzato e da una schermata. Tutti i
tag all'interno del tag del widget principale sono facoltativi.
Al momento sono supportate sia una sintassi basata su tag sia una sintassi basata su attributi.
Ad esempio, i seguenti frammenti XML sono trattati in modo identico:
<led halpin="my-led"/>
e
<led> <halpin>"my-led"</ halpin> </ led>
Quando viene utilizzata la sintassi basata sugli attributi, vengono utilizzate le seguenti regole
per trasformare il valore degli attributi in un valore Python:
Quando si usa la sintassi basata su tag, il testo all'interno del tag è sempre valutata come
un'espressione Python.
Commenti
Modifica il file XML con un editor di testo. Nella maggior parte dei casi puoi fare clic destro
sul file e selezionare Apri con editor di testo o simile.
Colori
I colori possono essere specificati usando i colori X11 rgb per nome gray75 o hex #0000ff.
Una lista completa si trova qui http: // sedition.com/perl/rgb.html.
I pin HAL
I pin HAL forniscono un mezzo per collegare il widget a qualcosa. Una volta creato un pin
HAL per il tuo widget, puoi collegarlo a un altro pin HAL con un comando net in un file .hal.
Per maggiori informazioni sul net comando vedi la sezione HAL Commands.
<label>
<text>"This is a Label:"</text>
<font>("Helvetica", 20)</font>
</label>
6.4. Multi_Label
Se più di un pin della legenda è TRUE, verrà visualizzata la legenda con il numero più alto
VERO.
Se viene creato un pin di disabilitazione con <disable_pin> True </ disable_pin> e quel pin
è impostato su true, le etichette modificabili diventano grigio.
<multilabel>
<legends>["Label1","Label2","Label3","Label4",
"Label5","Label6"]</legends>
<font>("Helvetica", 20)</font>
<disable_pin>True</disable_pin>
</multilabel>
pyvcp.multilabel.0.disable
pyvcp.multilabel.0.legend0
pyvcp.multilabel.0.legend1
pyvcp.multilabel.0.legend2
pyvcp.multilabel.0.legend3
pyvcp.multilabel.0.legend4
pyvcp.multilabel.0.legend5
Se hai più di una multilabel, i pin creati incrementerebbero il numero come questo
pyvcp.multilabel.1.legend1.
6.5. LED
Un LED è utilizzato per indicare lo stato di un bit halpin. Il colore del LED sarà on_color
quando halpin è true, altrimenti off_color.
LED rotondo
<led>
<halpin>"my-led"</halpin>
<dimension>50</dimension>
<on_color>"green"</on_color>
<off_color>"red"</off_color>
</led>
LED rettangolare
<vbox>
<relief>RIDGE</relief>
<bd>6</bd>
<rectled>
<halpin>"my-led"</halpin>
<height>"50"</height>
<width>"100"</width>
<on_color>"green"</on_color>
<off_color>"red"</off_color>
</rectled>
</vbox>
Il codice sopra riportato ha prodotto questo esempio. Mostra anche un box verticale con
rilievo.
Un pulsante viene utilizzato per controllare un pin BIT. Il pin verrà impostato su True
quando il pulsante viene premuto e tenuto premuto, e verrà impostato su False quando il
pulsante viene rilasciato. I pulsanti possono utilizzare le seguenti varianti opzionali.
Pulsante di Testo
Un pulsante di testo controlla un bit halpin. Il halpin è falso finché non viene premuto il
pulsante, altrimenti è vero. Il pulsante è un pulsante momentaneo.
Il pulsante di testo ha un pin di disabilitazione opzionale che viene creato quando si aggiunge
<disable_pin> True </disable_pin>.
<button>
<halpin>"ok-button"</halpin>
<text>"OK"</ text>
</button>
<button>
<halpin>"abort-button"</halpin>
<text>"Abort"</text>
</button>
Un pulsante di controllo controlla un bit halpin. Il halpin verrà impostato su True quando il
pulsante è selezionato e False quando il pulsante è deselezionato. Il check button è un
pulsante di attivazione/disattivazione del tipo. I Checkbuttons possono essere impostati
inizialmente come TRUE o FALSE nel campo di inizializzazione. Viene anche creato
automaticamente un pin chiamato changepin, che può commutare il Checkbutton tramite
HAL, se il valore collegato viene modificato, per aggiornare il display da remoto.
<checkbutton>
<halpin>"coolant-chkbtn"</halpin>
<text>"Coolant"</text>
<initval>1</initval>
</checkbutton>
<checkbutton>
<halpin>"chip-chkbtn"</halpin>
<text>"Chips "</text>
<initval>0</initval>
</checkbutton>
Il codice sopra riportato ha prodotto questo esempio. Il pulsante di controllo del refrigerante
è controllato. Nota gli spazi extra nel testo Chips per mantenere allineati i checkbutton.
Un radiobutton imposterà solo uno degli halpins a True. Gli altri pin sono impostati su False.
Può essere impostato il campo di inizializzazione per scegliere la selezione predefinita quando
viene visualizzato il pannello. Solo un pulsante di opzione può essere impostato su TRUE (1)
o solo il set di pin di numero più alto TRUE avrà quel valore.
<radiobutton>
<choices>["one", "two", "three"]</choices>
<halpin>"my-radio"</halpin>
<initval>0</initval>
</radiobutton>
Number (Numero)
<number>
<halpin>"my-number"</halpin>
<font>("Helvetica", 24)</font>
<format>"+ 4.4f"</format>
</number>
● <font> - è una specifica per un tipo e dimensione di carattere. Un font che mostrerà
almeno la dimensione 200 è di tipo 10 courier, quindi per un widget Number molto
grande è possibile specificare:
Il widget numero s32 mostra il valore di un numero s32. La sintassi è la stessa del number
tranne il nome che è <s32>. Assicurati che la larghezza sia sufficientemente ampia da coprire
il numero più grande che prevedi di utilizzare.
<s32>
<halpin>"my-number"</halpin>
<font>("Helvetica",24)</font>
<format>"6d"</format>
<width>6</width>
</s32>
Numero u32
Il widget numero u32 mostra il valore di un numero u32. La sintassi è uguale al number
tranne il nome che è <u32>.
Bar (Barra)
Un widget bar mostra il valore di un segnale FLOAT sia graficamente utilizzando una barra di
visualizzazione che numericamente. Il colore della barra può essere impostato come un colore
nel suo intervallo (predefinito usando fillcolor) o impostato per cambiare il colore in base al
valore del halpin (deve essere impostato range1, range2 range3, se si desidera solo 2
intervalli, impostare 2 di loro allo stesso colore).
<bar>
<halpin>"my-bar"</halpin>
<min_>0</min_>
<max_>150</max_>
<bgcolor>"gray"</bgcolor>
<fillcolor>"red"</fillcolor>
<range1>0,100, "green"</range1>
<range2>101,135, "orange"</range2>
<range3>136, 150, "red"</range3>
</bar>
Meter
Spinbox
Spinbox controlla un pin FLOAT. Aumenta o diminuisce il valore del pin premendo sulle
frecce o puntando verso la casella di selezione e ruotando la rotellina del mouse. Se il campo
param_pin è impostato su TRUE (1), verrà creato un pin che può essere utilizzato per
impostare la casella di selezione su un valore iniziale e per modificare a distanza il suo valore
senza input HID.
<spinbox>
<halpin>"my-spinbox"</halpin>
<min_>-12</min_>
<max_>33</max_>
<initval>0</initval>
<resolution>0.1</resolution>
<format>"2.3f"</format>
<font>("Arial", 30)</font>
<param_pin>1</param_pin>
</spinbox>
Scale controlla un float o un pin s32. Aumenta o diminuisce il valore del pin sia trascinando il
cursore, sia indicando la scala e ruotando la rotellina del mouse. Il halpin avrà sia -f che -i
aggiunti ad esso per formare i pin float e s32. width è la larghezza del cursore in verticale e
l'altezza del cursore in orientamento orizzontale. Se il campo param_pin è impostato su
TRUE (1), verrà creato un pin che può essere utilizzato per impostare la casella di selezione su
un valore iniziale e per modificare a distanza il suo valore senza input HID.
<scale>
<font>("Helvetica", 16)</font>
<width>"25"</width>
<halpin>"my-hscale"</halpin>
<resolution>0.1</resolution>
<orient>HORIZONTAL</orient>
<initval>-15</initval>
<min_>-33</min_>
<max_>26</max_>
<param_pin>1</param_pin>
</scale>
<scale>
<font>("Helvetica", 16)</font>
<width>"50"</width>
<halpin>"my-vscale"</halpin>
<resolution>1</resolution>
<orient>VERTICAL</orient>
<min_>100</min_>
<max_>0</max_>
<param_pin>1</param_pin>
</scale>
Dial
Il dial produce un float di HAL e reagisce sia alla rotellina del mouse che al trascinamento.
Doppio clic sinistro per aumentare la risoluzione e doppio clic destro per ridurre la
risoluzione di una cifra. L'output è limitato dai valori minimo e massimo. Il <cpr> è il
numero di segni di graduazione all'esterno dell'anello (attenzione ai numeri alti). Se il campo
param_pin è impostato su TRUE (1), verrà creato un pin che può essere utilizzato per
impostare la casella di selezione su un valore iniziale e per modificare a distanza il suo valore
senza input HID.
<dial>
<dimension>200</dimension>
<cpr>100</cpr>
<min_>-15</min_>
<max_>15</max_>
<text>"Dial"</text>
<initval>0</initval>
<resolution>0.001</resolution>
<halpin>"anaout"</halpin>
<dialcolor>"yellow"</dialcolor>
<edgecolor>"green"</edgecolor>
<dotcolor>"black"</dotcolor>
<param_pin>1</param_pin>
</dial>
Jogwheel
Jogwheel simula un jogwheel reale emettendo un pin FLOAT che conta su o giù mentre la
ruota viene girata, sia trascinando un movimento circolare, o facendo ruotare la rotella del
mouse.
<jogwheel>
<halpin>"my-wheel"</halpin>
<cpr>45</cpr>
<size>250</size>
</jogwheel>
Le immagini visualizzate usano solo il formato immagine .gif. Tutte le immagini devono avere
la stessa dimensione. Le immagini devono trovarsi nella stessa directory del file ini (o nella
directory corrente se in esecuzione dalla riga di comando con halrun / halcmd).
Bit di immagine
L' image_bit alterna tra due immagini impostando il halpin su true o false.
Questo esempio è stato prodotto dal codice precedente. Utilizzando i due file immagine
fwd.gif e rev.gif. FWD viene visualizzato quando selectimage è false e REV viene visualizzato
quando selectimage è true.
Immagine u32
L' image_u32 è lo stesso di image_bit tranne che hai essenzialmente un numero illimitato di
immagini e selezioni l'immagine impostando la halpin su un valore intero con 0 per la prima
immagine nella lista delle immagini e 1 per la seconda immagine, ecc.
6.10. Contenitori
I contenitori sono widget che contengono altri widget. I contenitori sono usati per
raggruppare altri widget.
Borders
I contenitori sono specificati con due tag usati insieme. Il tag <relief> specifica il tipo di
bordo e <bd> specifica la larghezza del bordo.
● <relief> type </relief> - Dove type è FLAT, SUNKEN, RAISED, GROOVE, o RIDGE
● <bd> n </bd> - Dove n è la larghezza del bordo.
<hbox>
<button>
<relief>FLAT</relief>
<text>"FLAT"</text>
<bd>3</bd>
</button>
<button>
<relief >SUNKEN</relief>
<text>"SUNKEN"</text>
<bd>3</bd>
</button>
<button>
< relief >RAISED</relief>
<text>"RAISED"</text>
<bd>3</ bd>
</button>
<button>
<relief>GROOVE</relief>
<text>"GROOVE"</text>
<bd>3</bd>
</button>
<button>
<relief>RIDGE</ relief>
<text>"RIDGE"</text>
<bd>3</bd>
</button>
</hbox>
Il codice sopra riportato ha prodotto questo esempio.
Fill
Il riempimento del contenitore è specificato con il tag <boxfill fill = "" /> . Le voci valide sono
none, x, y ed entrambi. Il riempimento x è un riempimento orizzontale e il riempimento y è
un riempimento verticale
Anchor
Le ancore del contenitore sono specificate con il tag <boxanchor anchor = "" />. L'ancora
specifica dove posizionare ogni schiavo nel suo complesso. Le voci valide sono center, n, s, e,
w, per centro, nord, sud, est e ovest. Anche le combinazioni come sw, se, nw e ne sono valide.
Expand
L’espansione del contenitore è specificata con il tag booleano <boxexpand expand = "" />. Le
voci valide sono yes, no.
Hbox
Usa una Hbox quando vuoi raggruppare i widget orizzontalmente uno accanto all'altro.
<hbox>
<relief>RIDGE</relief>
<bd>6</ bd>
<label> <text>"a hbox:"</text> </label>
<LED> </LED>
<number> </number>
<bar> </bar>
</hbox>
Vbox
Usa una Vbox quando vuoi impilare verticalmente i widget uno sopra l'altro.
<vbox>
<relief>RIDGE</relief>
<bd>6</bd>
<label> <text>"a vbox:"</text> </label>
<LED> </LED>
<number> </number>
<bar> </bar>
</vbox>
All'interno di una Vbox, puoi usare i tag <boxfill fill = "" />, <boxanchor anchor = "" /> e
<boxexpand expand = "" /> per scegliere come comportarsi quando gli oggetti nella casella
viene ridimensionata. Il valore predefinito è fill = "x", anchor = "center", expand = "yes" per
un Hbox.
Labelframe
Una tabella è un contenitore che consente il layout in una griglia di righe e colonne. Ogni riga
viene avviata da un tag <tablerow />. Un widget contenuto può estendersi su righe o colonne
attraverso l'uso del tag <tablespan rows = cols = /> . I lati delle celle a cui i widget contenuti
"attaccano" possono essere impostati mediante l'uso del tag <tablesticky sticky = /> . Una
tabella si espande sulle sue righe e colonne flessibili.
Esempio:
Tabs
<tabs>
<names> ["spindle", "green eggs"]</names>
</tabs>
<tabs>
<name>["Spindle", "Green Eggs", "Ham"]</name>
<vbox>
<label>
<text>"Spindle speed:"</text>
</label>
<bar>
<halpin>"spindle-speed"</halpin>
<max_>5000</max_>
</bar>
</vbox>
<vbox>
<label>
<text>"(this is the green eggs tab)"</text>
</label>
</vbox>
<vbox>
<label>
<text>"(this tab has nothing on it)"</text>
</label>
</vbox>
</tabs>
Il codice sopra riportato ha prodotto questo esempio mostrando ogni scheda selezionata.
Introduzione al Classicladder
Sommario
1. Storia
2. Introduzione
3. Esempio
4. Circuito di accensione / spegnimento di base
1. Storia
Classic Ladder è un'implementazione gratuita di un interprete ladder, rilasciato sotto licenza
LGPL. È stato scritto da Marc Le Douarain.
Descrive l'inizio del progetto sul suo sito web:
Ho deciso di programmare un linguaggio ladder solo a scopo di test all'inizio del febbraio
2001. Era previsto che avrei dovuto partecipare a un nuovo prodotto dopo aver lasciato
l'azienda in cui lavoravo in quel momento. E stavo pensando che avere un linguaggio ladder
in quei prodotti potesse essere una buona opzione da considerare. E così ho iniziato a
codificare le prime linee per calcolare un ramo con elementi minimi e visualizzarlo
dinamicamente con Gtk, per vedere se la mia prima idea di realizzare tutto questo funziona.
E così velocemente ho scoperto che è avanzato abbastanza bene, ho continuato con elementi
più complessi: timer, pioli multipli, ecc ...
Voila, ecco questo lavoro ... e altro: ho continuato ad aggiungere funzionalità da allora.
da "Genesis" sul sito web di Classic Ladder
- Marc Le Douarain
Classic Ladder è stato adattato per funzionare con HAL di LinuxCNC e attualmente viene
distribuito insieme a LinuxCNC. Se ci sono problemi / problemi / bug, segnalali al progetto
LinuxCNC Machine Controller.
2. Introduzione
La logica ladder o il linguaggio di programmazione Ladder è un metodo per disegnare
schemi logici elettrici. Ora è un linguaggio grafico molto popolare per la programmazione di
controllori logici programmabili (PLC). È stato originariamente inventato per descrivere la
logica creata dai relè. Il nome si basa sull'osservazione che i programmi in questa lingua
ricordano le scale, con due binari verticali e una serie di pioli (rung) orizzontali tra di loro.
In Germania e altrove in Europa, lo stile è quello di disegnare i binari orizzontalmente lungo
la parte superiore e inferiore della pagina mentre i pioli vengono disegnati verticalmente da
sinistra a destra.
Un programma in logica ladder, chiamato anche schema ladder, è simile a uno schema per
un insieme di circuiti relè. La logica ladder è utile perché un'ampia varietà di ingegneri e
tecnici può comprenderla e usarla senza ulteriore addestramento a causa della somiglianza
con i circuiti reali.
La logica ladder è ampiamente utilizzata per programmare i PLC, dove è richiesto il controllo
sequenziale di un processo o di un'operazione di produzione. La logica ladder è utile per
sistemi di controllo semplici ma critici o per rielaborare i vecchi circuiti relè cablati. Poiché i
controllori logici programmabili sono diventati più sofisticati, è stato utilizzato anche in
sistemi di automazione molto complessi.
La logica ladder può essere pensata come un linguaggio basato su regole, piuttosto che un
linguaggio procedurale. Un rung nella scala rappresenta una regola. Se implementate con
relè e altri dispositivi elettromeccanici, le varie regole vengono eseguite contemporaneamente
e immediatamente. Quando implementate in un controllore logico programmabile, le regole
vengono generalmente eseguite sequenzialmente dal software, in un ciclo. Eseguendo il ciclo
abbastanza velocemente, in genere molte volte al secondo, si ottiene l'effetto di un'esecuzione
simultanea e immediata.
La logica ladder segue questi passaggi generali per il funzionamento.
Leggi gli input
Risolvi logica
Aggiorna uscite
3. Esempio
I componenti più comuni di ladder sono i contatti (input), che di solito sono NC
(normalmente chiuso) o NO (normalmente aperto) e bobine (uscite).
il contatto NO
il contatto NC
la bobina (uscita)
Naturalmente ci sono molti altri componenti per un linguaggio a scala completa, ma la
comprensione di questi ti aiuterà a cogliere il concetto generale.
La scala è composta da uno o più pioli (rung). Questi pioli sono tracce orizzontali (che
rappresentano i fili), con componenti su di essi (input, output e altro), che vengono valutati
da sinistra a destra.
Questo esempio è il ramo più semplice:
L'ingresso a sinistra, B0, un contatto normalmente aperto, è collegato alla bobina (uscita) a
destra, Q0. Ora immagina che venga applicata una tensione all'estremità più a sinistra,
perché l'ingresso B0 diventa vero (ad esempio, l'ingresso è attivato o l'utente ha premuto il
contatto NO). La tensione ha un percorso diretto per raggiungere la bobina (uscita) a destra,
Q0. Di conseguenza, la bobina Q0 (uscita) passerà da 0 / off / false a 1 / on / true. Se l'utente
rilascia B0, l'uscita Q0 torna rapidamente a 0 / off / false.
Come prima, quando l'utente preme il pulsante B0, la bobina Q0 si accende. E quando la
bobina Q0 si accende, l'interruttore Q0 si accende. Ora succede la parte interessante.
Quando l'utente rilascia il pulsante B0, la bobina Q0 non si ferma come prima. Questo
perché l'interruttore Q0 di questo circuito tiene premuto il pulsante dell'utente. Quindi
vediamo che l'interruttore Q0 sta ancora tenendo accesa la bobina Q0 dopo che il pulsante di
avvio è stato rilasciato.
Questo tipo di contatto su una bobina o un relè, utilizzato in questo modo, viene spesso
chiamato contatto di ritenuta , poiché tiene sulla bobina a cui è associato. Viene anche
occasionalmente chiamato un contatto di tenuta , e quando è attivo si dice che il circuito è
sigillato .
Sfortunatamente, il nostro circuito finora ha un piccolo uso pratico, perché, anche se
abbiamo un pulsante di avvio o di avvio sotto forma di pulsante B0, non abbiamo modo di
chiudere questo circuito una volta avviato. Ma è facile da risolvere. Tutto ciò di cui abbiamo
bisogno è un modo per interrompere la potenza della bobina Q0. Quindi aggiungiamo un
pulsante normalmente chiuso (NC) appena prima della bobina Q0.
Ecco come sarebbe:
Ora abbiamo aggiunto o fermato il pulsante B1. Se l'utente lo spinge, il contatto dal piolo
alla bobina è interrotto. Quando la bobina Q0 perde potenza, scende a 0 / off / false.
Quando la bobina Q0 si spegne, commuta anche Q0, quindi il contatto di tenuta è interrotto
o il circuito non è chiuso. Quando l'utente rilascia il pulsante di arresto , il contatto viene
ripristinato dal ramo alla bobina Q0, ma il ramo si è spento, quindi la bobina non ritorna.
Questo circuito è stato usato per decenni praticamente su ogni macchina che ha un motore
trifase controllato da un contattore, quindi era inevitabile che sarebbe stato adottato da
programmatori ladder / PLC. È anche un circuito molto sicuro, nel senso che se start e stop
vengono entrambi premuti contemporaneamente, la funzione stop prevale sempre.
Questo è il componente base di gran parte della programmazione ladder, quindi se sei nuovo,
faresti bene ad assicurarti di capire come funziona questo circuito.
Programmazione di ClassicLadder
Sommario
1. Concetti ladder
2. Lingue
3. Componenti
3.1. File
3.2. Modulo Realtime in tempo reale
3.3. Variabili
4. Caricamento del modulo utente di Classic Ladder
5. GUI Classic Ladder - L’ interfaccia utente di ClassicLadder
5.1. Gestione delle sezioni (Section Manager)
5.2. Sezione Display (Section Display )
5.3. Le finestre delle Variabili (Variable Windows)
5.4. La finestra dei Simboli (Symbol Window)
5.5. La finestra dell'Editor (Editor Window)
5.6. La finestra di configurazione (Config Window)
6. Oggetti Ladder
6.1. CONTATTI
6.2. TIMER IEC
6.3. TIMER T
6.4. MONOSTABLES
6.5. CONTATORI (COUNTERS)
6.6. CONFRONTARE (COMPARE)
6.7. ASSEGNAZIONE VARIABILI
6.8. COILS
7. Variabili classicladder
8. Programmazione GRAFCET
9. Modbus
9.1. Impostazioni MODBUS
9.2. MODBUS Informazioni
9.3. Errori di comunicazione
9.4. Errori MODBUS
10.Impostazione di Classic Ladder
10.1. Aggiungere moduli
10.2. Aggiunta della logica ladder
1. Concetti ladder
Classic Ladder è un tipo di linguaggio di programmazione originariamente implementato su
PLC industriali (si chiama Programmazione ladder). Si basa sul concetto di contatti relè e
bobine e può essere utilizzato per costruire controlli logici e funzioni in un modo che è
familiare a molti integratori di sistemi. Il ladder (scala) consiste di pioli (rung) che possono
avere rami e assomiglia a un circuito elettrico. È importante sapere come vengono valutati i
programmi ladder durante l'esecuzione.
Sembra naturale che ogni riga venga valutata da sinistra a destra, quindi la riga successiva in
basso, ecc., Ma non funziona in questo modo nella logica ladder. La logica ladder analizza i
rami della scala 3 volte per modificare lo stato delle uscite.
gli input sono letti e aggiornati
la logica è interpretata
vengono impostate le uscite
Ciò può confondere in un primo momento se l'output di una riga viene letto dall'input di un
altro ramo. Ci sarà una scansione prima che il secondo input diventi vero dopo che l'uscita è
stata impostata.
Un'altra regola con la programmazione ladder è la regola "Last One Wins". Se hai lo stesso
output in diverse posizioni del tuo ladder, lo stato dell'ultimo sarà quello a cui è impostato
l'output.
2. Lingue
La modalità più comune utilizzata quando si lavora con Classic Ladder è ladder . Classic
Ladder supporta anche il Diagramma funzionale sequenziale (Grafcet).
3. Componenti
Ci sono 2 componenti in Classic Ladder.
Il modulo in tempo reale classicladder_rt
La user space module di ClassicLadder (inclusa una GUI)
3.1. File
In genere i componenti ladder classici vengono inseriti nel file custom.hal se si lavora da una
configurazione generata da Stepconf. Questi non devono essere inseriti nel file
custom_postgui.hal o il menu dell'editor Ladder sarà disattivato.
Nota I file Ladder (.clp) non devono contenere spazi vuoti nel nome.
3.3. Variabili
È possibile configurare il numero di ciascun tipo di oggetto ladder durante il caricamento del
modulo in tempo reale di Classic Ladder. Se non si configura il numero di oggetti ladder,
Classic Ladder utilizzerà i valori predefiniti.
Tabella 1. Conteggio Variabili predefinito
È possibile caricare solo un file .clp. Se hai bisogno di dividere la tua scala usa
Nota Sections.
Per caricare un file ladder:
loadusr classicladder myladder.clp
Opzioni di caricamento della scala classica
--nogui - (carica senza l'editor ladder) normalmente usato dopo che il debug è
terminato.
--modbus_port = port - (carica il numero della porta modbus)
--modmaster - (inizializza il master MODBUS) dovrebbe caricare il programma
ladder allo stesso tempo o TCP è la porta predefinita.
--modslave - (inizializza lo slave MODBUS) solo TCP
Per utilizzare Classic Ladder con HAL senza LinuxCNC:
loadusr -w classicladder
L'opzione -w dice a HAL di non chiudere l'ambiente HAL fino a quando non viene
completato il caricamento del Classic Ladder.
Se si carica per la prima volta il programma ladder con l'opzione --nogui , quindi si carica
nuovamente Classic Ladder senza opzioni, la GUI visualizzerà l'ultimo programma ladder
caricato.
In AXIS è possibile caricare la GUI da File / Ladder Editor ...
6. Oggetti ladder
6.1. CONTATTI
Rappresentazione di interruttori o contatti relè. Sono controllati dalla lettera e dal numero
variabile assegnati a loro.
La lettera variabile può essere B, I o Q e il numero può essere fino a un numero di tre cifre es.
%I2, %Q3 o %B123. La variabile I è controllata da un pin di ingresso HAL con un numero
corrispondente. La variabile B è per i contatti interni, controllata da una bobina B con un
numero corrispondente. La variabile Q è controllata da una bobina Q con un numero
corrispondente. (come un relè con più contatti). Ad esempio se HAL pin classicladder.0.in-
00 è vero allora %I0 NO il contatto sarebbe attivo (chiuso, vero, come lo vuoi chiamare). Se
la bobina %B7 è eccitata (attiva, vera, ecc.), allora il contatto NO B7 sarebbe attivo. Se la
bobina %Q1 è eccitata allora il contatto % Q1 NO sarà attivo (e il pin HAL classicladder.0.out-
01 sarebbe vero).
NO contatto (Normalmente aperto) Quando la variabile è falsa, l'interruttore è
disattivato.
6.3. TIMER
Rappresenta i timer per il conto alla rovescia. Questo è deprecato e sostituito da
temporizzatori IEC.
I timer hanno 4 contatti.
E - enable (input) avvia il timer quando è true, reimposta quando diventa falso
C - control (input) deve essere acceso per il timer da eseguire (in genere connettersi a
E)
D - done (output) true quando il timer è scaduto e fino a quando E rimane true
R - running (output) true quando il timer è in esecuzione
La base del timer può essere multipli di millisecondi, secondi o minuti.
Esistono anche variabili per i timer che possono essere lette e / o scritte per confrontare o
utilizzare blocchi.
% Txx.R - Timer xx in esecuzione (booleano, sola lettura)
% Txx.D - Timer xx done (Booleano, sola lettura)
% Txx.V - Timer xx valore corrente (numero intero, sola lettura)
% Txx.P - Timer xx preset (intero, lettura o scrittura)
6.4. monostabili
Rappresenta i timer one-shot originali. Questo è ora deprecato e sostituito da temporizzatori
IEC.
I monostables hanno 2 contatti, I e R.
I - input (input) avvierà il timer mono in esecuzione.
R - running (output) sarà vero mentre il timer è in esecuzione.
Il contatto I è sensibile al segnale in salita, ovvero inizia il timer solo quando si passa da falso
a vero (o viceversa). Mentre il timer è in esecuzione, il contatto I può cambiare senza alcun
effetto sul timer in esecuzione. R sarà vero e rimarrà vero fino a quando il timer non avrà
completato il conteggio a zero. La base del timer può essere multipla di millisecondi, secondi
o minuti.
Esistono anche variabili per monostables che possono essere lette e / o scritte in comparativi
o blocchi operativi.
% Mxx.R - Monostabile xx in esecuzione (booleano, sola lettura)
% Mxx.V - Valore attuale monostabile xx (intero, sola lettura)
% Mxx.P - Preimpostazione monostabile xx (intero, lettura o scrittura)
6.5. CONTATORI
Rappresenta i contatori su/giù.
Ci sono 7 contatti:
R - reset (input) resetterà il conteggio a 0.
P - preset (input) imposterà il conteggio al numero preimpostato assegnato dal menu
di modifica.
U -up count (input) aggiungerà uno al conteggio.
D -down count (input) sottrarrà uno dal conteggio.
E - under flow (output) sarà true quando il conteggio passa da 0 a 9999.
D - done (output) sarà vero quando il conteggio è uguale al preset.
F - overflow (output) sarà vero quando il conteggio passa da 9999 a 0.
I contatti di conteggio avanti e indietro sono sensibili ai cambi, ovvero contano solo quando
il contatto cambia da falso a vero (o disattivato se preferisci).
L'intervallo è compreso tra 0 e 9999.
Esistono anche variabili per contatori che possono essere letti e / o scritti in comparativi o
blocchi operativi.
% Cxx.D - Counter xx done (Boolean, sola lettura)
% Cxx.E - Counter xx overflow vuoto (booleano, sola lettura)
% Cxx.F - Contatore xx overflow completo (booleano, sola lettura)
% Cxx.V - Valore corrente contatore xx (intero, lettura o scrittura)
% Cxx.P - Preset contatore xx (intero, lettura o scrittura)
6.6. COMPARE
Per confronto aritmetico. Variabile % XXX = a questo numero (o al numero valutato)
Il blocco compare è vero quando il confronto è vero. Puoi usare la maggior parte dei simboli
matematici:
+, -, *, /, = (simboli matematici standard)
<(minore di),> (maggiore di), <= (minore o uguale),> = (maggiore o uguale), <> (non
uguale)
(,) separare nell'esempio di gruppi % IF1 = 2, e % IF2 <5 in pseudo-codice si traduce
in se % IF1 è uguale a 2 e % IF2 è minore di 5, quindi il confronto è vero. Notare la
virgola che separa i due gruppi di comparazioni.
^ (esponente),% (modulo), & (e), | (o),. -
ABS (assoluto), MOY (medio francese), AVG (medio)
Ad esempio ABS (% W2) = 1, MOY (% W1,% W2) <3.
Nessuno spazio è consentito nell'equazione di confronto. Ad esempio% C0.V>% C0.P è
un'espressione di confronto valida mentre% C0.V>% CO.P non è un'espressione valida.
C'è una lista di Variabili nella pagina che può essere usata per leggere e scrivere sugli oggetti
ladder. Quando viene aperto un nuovo blocco di confronto, assicurati di eliminare il simbolo
# quando inserisci un confronto.
Per scoprire se la variabile di parola # 1 è inferiore a 2 volte il valore corrente del contatore #
0, la sintassi sarebbe:
%W1<2*%C0.V
Per scoprire se S32in bit 2 è uguale a 10 la sintassi sarebbe:
%EW2=10
Nota: Compare usa il segno uguale semplice e non il doppio uguale a cui i programmatori
sono abituati.
7. Variabili ClassicLadder
Queste variabili sono usate in COMPARE o OPERATE per ottenere informazioni, o cambiare
le specifiche, di oggetti ladder come cambiare un preset del contatore, o vedere se un timer
viene eseguito nel programma.
Elenco di variabili:
% Bxxx - Memoria bit xxx (Boolean)
% Wxxx - Memoria word xxx (numero intero con segno a 32 bit)
% IWxxx - Memoria word xxx (S32 in pin)
% QWxxx - Memoria word xxx (S32 out pin)
% IFxx - Memoria word xx (Float in pin) (convertita in S32 in Classic Ladder)
% QFxx - Memoria word xx (Float out pin) (convertita in S32 in Classic Ladder)
% Txx.R - Timer xx in esecuzione (booleano, solo lettura utente)
% Txx.D - Timer xx done (Boolean, solo lettura utente)
% Txx.V - Timer xx valore corrente (intero, solo lettura utente)
% Txx.P - Timer xx preset (intero)
% TMxxx.Q - Timer xxx done (Boolean, read write)
% TMxxx.P - Timer xxx preset (intero, lettura scrittura)
% TMxxx.V - Valore xxx del timer (numero intero, scrittura lettura)
% Mxx.R - Monostabile xx in esecuzione (booleano)
% Mxx.V - Valore corrente monostabile xx (intero, solo lettura utente)
% Mxx.P - preset monostabile xx (intero)
% Cxx.D - Counter xx done (Boolean, solo lettura utente)
% Cxx.E - Counter xx overflow vuoto (booleano, solo lettura utente)
% Cxx.F - Contatore xx overflow completo (booleano, solo lettura utente)
% Cxx.V - Contatore xx valore attuale (numero intero)
% Cxx.P - Counter xx preset (intero)
% Ixxx - Ingresso fisico xxx (booleano) (bit di input HAL)
% Qxxx - Uscita fisica xxx (Boolean) (bit di uscita HAL)
% Xxxx - Attività del passo xxx (linguaggio sequenziale)
% Xxxx.V - Tempo di attività in secondi del passo xxx (linguaggio sequenziale)
% Exx - Errori (booleano, leggere scrivere (verrà sovrascritto))
Variabili indicizzate o vettoriali : si tratta di variabili indicizzate da un'altra variabile.
Alcuni potrebbero chiamare queste variabili vettoriali. Esempio: %W0 [%W4] => se
%W4 è uguale a 23 corrisponde a %W23
8. Programmazione GRAFCET
Questa è probabilmente la caratteristica meno utilizzata e più poco
avvertimento conosciuta di Classic Ladder. La programmazione sequenziale viene
utilizzata per assicurarsi che una serie di eventi ladder avvengano sempre
in un ordine prestabilito. I programmi sequenziali non funzionano da
soli. C'è sempre un programma ladder che controlla le variabili. Ecco le
regole base per i programmi sequenziali:
Regola 1: Situazione iniziale - La situazione iniziale è caratterizzata dalle fasi iniziali
che sono per definizione nello stato attivo all'inizio dell'operazione. Ci deve essere
almeno un passo iniziale.
Regola 2: R2, Cancellazione di una transizione: una transizione è abilitata o
disabilitata. Si dice che sia abilitato quando tutti i passi immediatamente precedenti
collegati al suo simbolo di transizione corrispondente sono attivi, altrimenti è
disabilitato. Una transizione non può essere cancellata a meno che non sia abilitata e
la sua condizione di transizione associata sia vera.
Regola 3: R3, Evoluzione delle fasi attive - La cancellazione di una transizione porta
simultaneamente allo stato attivo dei passaggi immediatamente successivi e allo stato
inattivo dei passaggi immediatamente precedenti.
Regola 4: R4, cancellazione simultanea delle transizioni - Tutte le transizioni
cancellate simultaneamente vengono cancellate simultaneamente.
Regola 5: R5, Attivazione e disattivazione simultanea di una fase - Se durante
l'operazione, una fase viene simultaneamente attivata e disattivata, viene data priorità
all'attivazione.
Questa è la finestra dell'editor SEQUENTIAL A partire dall'immagine in alto a sinistra:
Freccia selettore, Gomma Passo ordinario, Passo iniziale (iniziale) Transizione, passaggio e
transizione Transizione Link-lato negativo, Transizione Link-Upside Pass-through Link-
Downside, Pass-through Link -Posta commento link a salto laterale [mostra programma
sequenziale]
STEP ORDINARIO - ha un numero univoco per ognuno
STEP INIZIALE - un programma sequenziale deve averne uno. Questo è dove il
programma inizierà.
TRANSIZIONE : mostra la variabile che deve essere vera affinché il controllo passi al
passaggio successivo.
PASSO E TRANSIZIONE - Combinati per comodità
TRANSITION LINK-DOWNSIDE - divide il flusso logico in una delle due possibili
linee in base a quale dei prossimi passi è vero per primo (Think OR logic)
TRANSITION LINK = UPSIDE : combina due (OR) linee logiche in una
PASS-TRAMITE LINK-DOWNSIDE - divide il flusso logico in due righe che
ENTRAMBI devono essere true per continuare (Think AND logic)
PASS-ATTRAVERSO LINK-UPSIDE : combina due linee logiche (logica AND)
concomitanti
JUMP LINK : collega passaggi non sottostanti come collegare l'ultimo passaggio al
primo
COMMENT BOX - utilizzato per aggiungere commenti
Per utilizzare i collegamenti, è necessario disporre di passaggi già inseriti. Seleziona il tipo di
collegamento, quindi seleziona i due passaggi o le transazioni una alla volta. Ci vuole pratica!
Con programmazione sequenziale: la variabile% Xxxx (ad esempio% X5) viene utilizzata per
verificare se un passaggio è attivo. La variabile% Xxxx.V (ad esempio% X5.V) viene utilizzata
per verificare quanto tempo è stato attivo il passaggio. Le variabili% X e% Xv sono utilizzate
nella logica LADDER. Le variabili assegnate alle transizioni (ad esempio% B) controllano se
la logica passerà al passaggio successivo. Dopo che un passaggio è diventato attivo, la
variabile di transizione che ne ha causato l'attivazione non ne ha più il controllo. L'ultimo
passaggio deve riportare JUMP LINK solo alla fase iniziale.
9. Modbus
Cose da considerare:
Modbus è un programma per gli utenti in modo che possa avere problemi di latenza
su un computer molto carico.
Modbus non è adatto per eventi in tempo reale difficili come il controllo della
posizione dei motori o per controllare l'arresto di emergenza.
La GUI di Classic Ladder deve essere in esecuzione affinché Modbus sia in esecuzione.
Modbus non è completamente finito quindi non esegue tutte le funzioni modbus.
Per far inizializzare MODBUS devi specificarlo durante il caricamento del programma dello
spazio utente di Classic Ladder.
Caricamento Modbus
loadusr -w classicladder --modmaster myprogram.clp
L'opzione -w fa in modo che HAL attenda fino alla chiusura di Classic Ladder prima di
chiudere la sessione in tempo reale. Classic Ladder carica anche uno slave Modbus TCP se si
aggiunge --modserver sulla riga di comando.
Funzioni Modbus
1 - leggere bobine
2 - leggi gli input
3 - leggi i registri di attesa
4 - leggere i registri di input
5 - scrivere bobine singole
6 - scrivere un registro singolo
8 - test dell'eco
15 - scrivere più bobine
16 - scrivere registri multipli
Se non si specifica un - modmaster durante il caricamento del programma utente di Classic
Ladder, questa pagina non verrà visualizzata.
Figura 9. I / O di configurazione
Figura 10. Config Coms
PORTA SERIALE - Per IP bianco. Per seriale la posizione / nome del driver seriale es.
/ dev / ttyS0 (o / dev / ttyUSB0 per un convertitore da USB a seriale).
VELOCITÀ SERIALE - Dovrebbe essere impostato su velocità per cui lo slave è
impostato per - 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
sono supportati.
PAUSA DOPO TRASMISSIONE - Metti in pausa (in millisecondi) dopo la
trasmissione e prima di ricevere risposta, alcuni dispositivi richiedono più tempo (ad
esempio convertitori da USB a seriale).
PAUSA INTER-FRAME - Pausa (millisecondi) dopo aver ricevuto risposta dallo slave.
Questo imposta il ciclo di lavoro delle richieste (è una pausa per CIASCUNA richiesta).
RICHIESTA LUNGHEZZA TIMEOUT - Lunghezza (millisecondi) di tempo prima che
decidiamo che lo slave non ha risposto.
MODBUS ELEMENT OFFSET - utilizzato per bilanciare i numeri degli elementi di 1
(per le differenze di numerazione dei produttori).
DEBUG LEVEL - Impostare questo su 0-3 (0 per interrompere la stampa delle
informazioni di debug oltre agli errori di mancata risposta).
LEGGI COILS / INPUTS MAP TO - Seleziona quali variabili che leggeranno bobine /
ingressi verranno aggiornate. (B o Q).
WRITE COILS MAP TO TO - Seleziona le variabili che scrivono bobine aggiornate.da
(B, Q, o I).
LEGGI REGISTRI / HOLDING - Seleziona quali variabili che leggeranno i registri
verranno aggiornate. (W o QW).
WRITE REGISTERS MAP TO - Seleziona le variabili da cui leggere i registri che
verranno aggiornati da. (W, QW o IW).
SLAVE ADDRESS - Per seriale il numero ID di slave normalmente impostabile sul
dispositivo slave (in genere 1-256) Per IP l'indirizzo IP slave più facoltativamente il
numero di porta.
ACCESSO TIPO - Seleziona il codice funzione MODBUS da inviare allo slave (ad es.
Quale tipo di richiesta).
COILS / INPUT - Gli ingressi e le bobine (bit) vengono letti da / scritti su variabili I, B
o Q (selezione dell'utente).
REGISTERS (WORDS) - Registers (Words / Numbers) mappano a variabili IW, W o
QW (selezione dell'utente).
1 ° ELEMENTO MODBUS - L'indirizzo (o numero di registro) del primo elemento di
un gruppo. (ricordarsi di impostare correttamente MODBUS ELEMENT OFFSET).
NUMERO DI ELEMENTI - Il numero di elementi in questo gruppo.
LOGICA - Qui puoi invertire la logica.
1st% I% Q IQ WQ MAPPED - Questo è il numero iniziale di% B,% I,% Q,% W,% IW
o% QW variabili mappate sul / dal gruppo di elementi modbus (a partire dal primo
modbus numero di elemento).
Nell'esempio sopra: numero di porta - per il mio computer / dev / ttyS0 era la mia porta
seriale.
La velocità seriale è impostata su 9600 baud.
L'indirizzo slave è impostato su 12 (sul mio VFD posso impostarlo da 1 a 31, il che significa
che posso parlare con un massimo di 31 VFD su un sistema).
La prima riga è impostata per 8 bit di input a partire al primo numero registro (registro 1).
Così registrare i numeri 1-8 sono mappato su variabili %B di classico Ladder a partire % B1 e
termina alle % B8.
La seconda linea è impostata per registrare 2 bit di uscita a partire dal nono numero (registro
9) così registrare numeri 9-10 vengono mappati sulla variabili %Q di Classic Ladder a partire
da % Q9 termina % Q10.
La terza riga è impostata per scrivere 2 registri (16 bit ciascuno) a partire da 0 numero
(registro 0) cosi registrare numeri 0-1 vengono mappati sulla variabili %W di classico Ladder
a partire da % W0 termina % W1 di registro.
È facile fare un errore "off-by-one" poiché a volte gli elementi modbus vengono referenziati a
partire da uno piuttosto che da 0 (in realtà dallo standard come dovrebbe essere!) È possibile
utilizzare il pulsante di opzione offset dell'elemento modbus per aiutare con questo.
I documenti per il tuo dispositivo slave modbus ti diranno come sono configurati i registri,
non esiste un modo standard.
I livelli SERIAL PORT, PORT SPEED, PAUSE e DEBUG sono modificabili per le modifiche
(quando si chiudono i valori della finestra di configurazione vengono applicati, anche se i
pulsanti Radio si applicano immediatamente).
Per utilizzare la funzione eco selezionare la funzione eco e aggiungere il numero slave che si
desidera testare. Non è necessario specificare alcuna variabile.
Il numero 257 verrà inviato al numero di slave specificato e lo slave dovrà inviarlo indietro.
per vedere il messaggio è necessario avere Classic Ladder in esecuzione su un terminale.
1. Contatore ciclico
Per avere un contatore che si avvolge devi usare il pin preimpostato e il pin di reset. Quando
crei il contatore, imposta il preset sul numero che desideri raggiungere prima di eseguire il
wrapping attorno a 0. La logica è se il valore del contatore è sopra la preselezione, quindi
resettare il contatore e se il underflow è attivo, quindi impostare il valore del contatore sul
valore preimpostato. Come si può vedere nell'esempio quando il valore del contatore è
maggiore del contatore preimpostato, il reset del contatore viene attivato e il valore è ora 0.
L'uscita di underflow% Q2 imposterà il valore del contatore sul valore preimpostato durante
il conteggio all'indietro.