PLC con interfaccia USB

  prima parte: hardware seconda parte: programmazione PLC

 

 
Progetto pubblicato sulla rivista Fare Elettronica  

E’ la naturale evoluzione del mini PLC pubblicato qualche anno fa e arricchito di nuove potenzialità tra cui un interfaccia USB in grado di inviare al PC lo stato di tutte le funzioni implementate dal PLC e visualizzate in un’unica schermata.

 

E’ passato molto tempo dall’articolo di Fare Elettronica pubblicato nel numero 220/221 di nove anni fa e nuove esigenze di tipo tecnico/pratiche si sono nel frattempo accumulate e ci hanno obbligato ad integrarle al vecchio progetto in modo da risolvere tutti quei problemi che incontravamo nelle varie applicazioni. È stato questo il motivo che ci ha spinto a riprogettare il tutto sfruttando l’ormai collaudata serie PIC18 di Microchip. In particolare la scelta è caduta su modello che integra l’interfaccia USB di tipo device più famoso, il PIC18F4450. Ovviamente non ci siamo fermati all'aspetto hardware dell'interfaccia USB, abbiamo realizzato un programma in Visual Basic in grado di visualizzare lo stato e i valori di tutte le funzioni del PLC raggruppate in un'unica pagina. Prima di addentrarci nelle nuove funzioni del progetto, vediamo raggruppate tutte le caratteristiche.

16 ingressi virtuali (10 reali)

16 uscite virtuali (12 reali)

16 marker

8 timer da 1-250 secondi o minuti

4 contatori 1-65000 e peso programmabile da 1-100

4 ingressi analogici

interfaccia USB

Le differenze con il modello precedente sono notevoli. Innanzitutto il linguaggio di programmazione è l’ANSI C e come ambiente di sviluppo abbiamo scelto Mikroc di Mikroelektronika il quale, nonostante la complessità del programma, risulta meno ostico e più leggibile rispetto all’assembler. Anche lo scambio di informazioni con il PC attraverso l’USB utilizza la libreria integrata di Mikroc, molto semplice da usare e di facile comprensione anche per chi ha poca esperienza del bus.

Il numero delle ingressi delle uscite è aumentato rispetto al vecchio progetto, sono gestibili fino a 16 ingressi e 16 uscite anche se la mancanza del numero sufficiente di piedini del micro ne limitano il numero a 10 ingressi e 12 uscite. Per chi vuole sperimentare con modelli di PIC dotati di 64 o più piedini, può sfruttare l’intera potenzialità del progetto, oppure studiare un’interfaccia seriale dotata di Shift Register con il CMOS 4094 o i TTL 74HC595 ecc., in pratica vanno modificati solo le due funzioni di aggiornamento ingressi e uscite, a tal scopo vi invitiamo alla lettura della sezione descrittiva del firmware.

Le altre due novità sono la presenza di 4 contatori e 4 ingressi analogici. Mentre gli ingressi analogici devono essere scelti al posto degli ingressi digitali indirizzati da I0 a I3, i contatori possono essere attivati con qualsiasi ingresso.

Come potete osservare si tratta di caratteristiche di tutto rispetto e sono state studiate per impieghi anche al di fuori dell'ambiente domestico, limitati solo dalla fantasia del lettore. Infatti è un progetto che ben si adatta ad applicazioni limitative rispetto all'utilizzo come PLC, ad esempio se abbiamo la necessità di sostituire provvisoriamente un termostato, applicando una sonda termica ad uno degli ingressi analogici con uscita normalizzata 0-10 Volt e poche semplici righe di programmazione, abbiamo realizzato in poco tempo uno strumento in grado di risolvere il problema in maniera immediata.

Proseguendo con gli esempi, potremo avere bisogno di accendere sequenzialmente tutta una serie di dispositivi, a questo problema possono venirci in aiuto i timer del PLC e qualche riga di programma che metta in relazione ogni timer con un’uscita e avremmo risolto brillantemente il problema.

Se dovete controllare e numerare dei contenitori che scorrono su una rulliera è sufficiente applicare una fotocellula in grado di intercettare il passaggio dei contenitori collegandone l'uscita ad uno degli ingressi del PLC, oppure nel caso sorgano dei dubbi sulla metratura di un impianto di trattamento del tessuto o qualsiasi materiale che scorra attraverso dei rulli e volete tenerlo sotto controllo per un certo periodo, installate un sensore induttivo in prossimità di uno dei cilindri solidali al passaggio del materiale in modo da inviare un impulso in un qualsiasi ingresso del PLC ad ogni giro completo del cilindro.

Per questo e per tutte le altre applicazioni vedremo come risolverle con poche righe di programma quando descriveremo la sintassi corretta di programmazione.

Come avrete certamente intuito si tratta di un progetto che si adatta ad un'infinità di applicazioni diverse e, nonostante i suoi limiti, non mancherà di dare soddisfazione a chi si cimenterà nella realizzazione.

 

SCHEMA ELETTRICO

 

La complessità dello schema elettrico è data dal gran numero dei componenti che lo compongono, in realtà sono tutti stadi ripetitivi che possiamo suddividere in ingressi analogici, ingressi digitali, uscite, visualizzazione e programmazione comprendenti pulsanti e display, microcontrollore, alimentatore.

Gli ingressi analogici si differenziano da quelli digitali unicamente dalla presenza del quadruplo amplificatore operazionale MCP6024 la cui scelta è dettata dalla caratteristica rail-to-rail che lo rende idoneo a misurare tensioni in maniera molto precisa anche quando queste si trovano all'estremità superiore o inferiore della tensione di alimentazione dell’operazionale. Per semplicità prendiamo in esame l'ingresso I0 confidando sul fatto che gli altri ingressi presentano la stessa logica di funzionamento. Il segnale in tensione da 0 a 10 Volt viene applicato al morsetto 1 di X2. La presenza della resistenza R1 da 10 KO in serie all'ingresso e della resistenza sempre da 10 KO della rete resistiva RR1 divide per due la tensione applicata al pin 3 di U2. Il diodo zener DZ1 da 5,6V limita la tensione al suo valore di breakdown salvaguardando l'ingresso di U2 da tensioni dannose per integrato. L'uscita di U2 limitata a 5 Volt massimi viene applicata al pin 2 di U1, che corrisponde a RA0 del PIC18F4450 configurato come ingresso analogico solo nel tempo necessario ad analizzare l'eventuale stringa che richieda tale ingresso come analogico, per il restante tempo come ingresso digitale.

In questo modo i primi 4 ingressi possono essere utilizzati indifferentemente come ingressi analogici o digitali. Il funzionamento dei restanti ingressi, solo come digitale, è del tutto identico. Una resistenza in serie all'ingresso limita la tensione, mentre un'altra resistenza collegata come pull-down mantiene il piedino del PIC a massa quando non viene applicata una tensione in ingresso. Il diodo zener limita la tensione ad un valore non superiore ai 5,5 Volt, massima tensione tollerata dal PIC. Per lo zener è accettato qualsiasi valore tra 4 e 5,1 Volt e la tensione applicata ai morsetti di X2 e X3 può andare da 12 a 30 Volt riferito alla massa. Per semplificare la stesura del circuito stampato e per la disposizione interna del PIC di AN0, AN1, AN2, AN3 sono state scelte le porte RA e RE per rilevare lo stato delle ingressi per un totale di 10 pins disponibili.

Contrariamente agli ingressi, per le uscite si è fatto uso di una copia di integrati specializzati per questo tipo di applicazione, vedi U3 e U4 di tipo ULN2803, compatibile con una marea di sigle diverse tra loro equivalenti. Il loro compito è quello di disaccoppiare le uscite del PIC dai carichi applicati alle morsettiere X4, X5 e X6. L'unica nota negativa di questi buffer di potenza è il comune che invece di essere la massa è il positivo di alimentazione.  Esistono dei driver con le uscite idonee a sopportare carichi con la massa comune come UDN2981A, ma sono difficili da trovare e piuttosto costosi. Nonostante l’utilizzo di questi componenti avrebbe avvicinato il nostro progetto allo standard dei PLC, abbiamo dato maggiore peso alla economicità complessiva della scheda finale.

L'alimentazione delle uscite viene applicata al morsetto 5 di X5 e può assumere qualsiasi tensione tra 5 e 30V e sarà la stessa degli utilizzatori. Per esempio se colleghiamo alle uscite due relè, un'elettrovalvola e una lampada, dovranno presentare tutti la stessa tensione di lavoro e lo stesso valore di tensione andrà applicato al morsetto 5 di X5 di potenza sufficiente ad alimentare i utilizzatori. U3 e U4 consentono un prelievo di 300 mA per ogni uscita.

In questo caso sono state sfruttate la porta RB completa e il nible più significativo di RD, per un totale di dodici uscite.

Lo stadio di visualizzazione e programmazione comprende il display, il classico modello LCD da 2 righe per 16 caratteri e da quattro pulsanti. Al fine di risparmiare i piedini del microcontrollore, i quattro pulsanti sono collegati con la stessa linea dati del LCD. Il collegamento del LCD è quello classico a 4 bit, mentre la regolazione del contrasto viene impostato in maniera fissa dal hardware tramite le due resistenze R14 e R15. Tale soluzione può sembrare azzardata in quanto risulterà difficile regolare il contrasto quando l’LCD maturerà qualche anno di funzionamento continuo, del resto l'esperienza ci ha insegnato che i trimmer, in particolare i modelli economici, col tempo possono dare problemi rendendo impossibile la lettura del display.

Facciamo notare la presenza di TR1 che alimenta la retroilluminazione del display solo se richiesta o in fase di programmazione.

Sul microcontrollore U1 c'e ben poco da dire, il quarzo XT1 da 4 MHz assieme ai condensatori C5 e C6 assicurano un clock preciso, il PLL interno del PIC eleva la frequenza di lavoro a 48 MHz.

Il condensatore C7 funge da stabilizzatore al regolatore interno da 3,3V.

L'alimentazione adottata è quella classica il cui componente principale U5 è un comune regolatore di tipo 7805 che fornisce la giusta tensione a U1 e U2. La tensione di alimentazione è collegata alla morsettiera X1 e il diodo D1 è un semplice ma efficace sistema di protezione contro l'inversione di polarità. È consigliabile montare U5 su un dissipatore di calore poiché quando la retroilluminazione è inserita, scalda parecchio.

La scheda può essere alimentata direttamente dalla presa USB, anche se la presenza del diodo D2 abbassa la tensione di lavoro a poco più di 4 Volt rendendo di fatto poco leggibile il display LCD e imprima un errore durante l'eventuale lettura degli ingressi analogici in quanto il micro calcola il rapporto bit/Volt ipotizzando una tensione di alimentazione, quindi di riferimento, di 5 Volt.

 

 MONTAGGIO

 

La scheda di montaggio proposta misura 109 x 71 mm ed è una semplice mono faccia facilmente costruibile con gli strumenti disponibili dall'hobbista. Nulla vieta il montaggio in breadboard soprattutto in una prima fase di testaggio del circuito e capire se può essere utile per un'eventuale applicazione.

Per coloro che optano per la costruzione della scheda con il circuito stampato proposto, consigliamo prima di tutto il montaggio dei numerosi ponticelli, scotto necessario per evitare uno stampato più complesso a doppia faccia. In particolare i due ponticelli tra P4 e P5 si trovano parzialmente sotto U1 e risulterebbe difficile la loro collocazione dopo avere montato lo zoccolo di U1. Continuate con il montaggio degli altri componenti radenti allo stampato, ricordo che gli zener da DZ1 a DZ4 devono avere un valore di 5,6 Volt mentre per gli altri potete usare quello che avete nel cassetto, vanno bene valori tra 4 e 5,1 Volt. La rete resistiva RR1 è facilmente reperibile anche nel surplus e deve avere un valore di 10 K? altrimenti potreste ottenere risultati sbagliati nel caso abbiate la necessità di sperimentare con gli ingressi analogici.

Consigliamo caldamente l'uso degli zoccoli per gli integrati e del connettore per il display, permettono una facile e veloce sostituzione in caso di necessità e il loro riclicaggio in altri progetti. Per quanto riguarda la presa USB J1, si tratta del modello “B” a montaggio orizzontale. Non pensate di sostituirlo con un modello a montaggio verticale poiché i ponticelli e U1 non vi concederanno lo spazio necessario per l'installazione, a meno che non lo collegate con quattro fili volanti. Potete sostituire il tutto con una presa di tipo “A” e relativo cordoncino recuperato da un mouse guasto, collegando i fili originariamente collegati al mouse direttamente allo stampato del PLC. Normalmente la colorazione dei quattro fili del cordoncino che avete a disposizione prevede il rosso come positivo, il nero come GND, il verde come D+ ed infine il bianco come D-.

Come abbiamo anticipato in altra parte dell’articolo, il classico trimmer di regolazione del contrasto del display è stato sostituito da due resistenze. Potrebbe essere necessario ritoccare il valore di una resistenza nel caso sia difficoltosa la visualizzazione del LCD. In particolare diminuendo il valore di R15 il contrasto aumenta e viceversa.

 

COLLAUDO

 

Prima di infilare gli integrati nei zoccoli, conviene alimentare la scheda con una tensione non superiore ai 12 Volt seguendo la giusta polarità alla morsettiera X1. Con un tester controllate che la tensione in uscita al regolatore U5 sia di 5 Volt. Se la tensione misurata è precisa e stabile, togliete tensione e montate gli integrati nei relativi zoccoli e il display nel proprio connettore e ridate tensione. Se tutto procede per il meglio, il display deve indicare per circa due secondi la scritta “Fare Elettronica” e quindi la pagina iniziale con lo stato delle ingressi e delle uscite.

I   0123456789abcd

Q 0123456789abcd

Ovviamente, per orrenere ciò, il micro deve essere programmato con il file “PLC_USB_V10.hex” scaricabile dal sito della rivista alla sezione download.

Con uno spezzone di filo di rame collegate uno qualsiasi delle ingressi al positivo di alimentazione di almeno 12 Volt, per esempio la stessa alimentazione della scheda. Il display tramuta in asterisco il relativo numero d'ingresso. Nell'esempio sotto riportato è stato collegato l'ingresso I3.

I   012*456789abcd

Q 0123456789abcd

Possiamo a questo punto provare con gli altri ingressi, senza ottenere nessun tipo di variazione sul uscite in quanto non è stato ancora inserita nessuna stringa di programma.

Possiamo però a familiarizzare con il nostro progetto premendo il pulsante P2 (DOWN) e visualizzare lo stato dei 16 Marker.

M  01234567

     89abcdef

Il pulsante P2 ci permette di navigare all'interno di una funzione, mentre il P1 di cambiare funzione.

Una fase successiva è quella di visualizzare lo stato dei timer premendo brevemente il pulsante P1. La prima pagina ci mostra i timer da T0 a T3

T0:__0< T1:__0<

T2:__0< T3:__0<

mentre premendo P2 cambiamo pagina del LCD e vedere lo stato dei restanti timer da T4 a T7.

T4:__0< T5:__0<

T6:__0< T7:__0<

Proseguiamo con il pulsante P1 e vedere i quattro contatori raggruppati in un'unica pagina.

C0:____0 C1:____0

C2:____0 C3:____0

l'ultima funzione riguarda gli ingressi analogici, anch'essi raggruppati in un'unica pagina.

A0:_0,00 A1:_0,00

A2:_0,00 A3:_0,00

Terminata la spiegazione sulla sezione visualizzatrice, vediamo brevemente come entrare nella fase di programmazione. Essendo l'argomento piuttosto complesso e articolato, rimandiamo al prossimo articolo tutti i chiarimenti del caso.

Per entrare nella fase di programmazione, è sufficiente premere e tenere premuto il pulsante P3 (SET) per circa 3 secondi. La fase di programmazione ci viene segnalata dal LCD mostrandoci una stringa vuota il cui numero è successivo all'ultima stringa in memoria. Nel nostro caso, essendo la memoria di programma vuota, ci mostrerà la stringa numero #00

00 I.0 & I.0 =Q0

navigare all'interno della stringa è molto semplice, i pulsanti P1 e P2 incrementano o decrementano il valore evidenziato, il P3 cambia campo, infine il pulsante P4 ci permette di ritornare alla fase operativa in qualsiasi momento.

A titolo informativo, durante la fase di programmazione, è possibile cancellare o una o più stringhe di programma o l'intera area di memoria e ricominciare da capo.

L'ultima funzione che analizzeremo in queste pagine riguarda la gestione della retroilluminazione del display LCD, che seppure di secondaria importanza può risultare utile in certe applicazioni. A tale funzione si accede premendo e tenendo premuto, il pulsante P4 per circa 3 secondi. La pagina della funzione è la seguente

Gest.retroil.LCD

Quando richiesto

e le opzioni disponibili, premendo il pulsante P1, sono

Quando richiesto

Sempre acceso

Sempre spento

“Quando richiesto” accende la retroilluminazione unicamente nel caso venga premuto un qualsiasi pulsante e la mantiene attiva per una quindicina di secondi dopo di che la spegne. Inoltre la mantiene accesa durante tutta la fase di programmazione e la gestione della retroilluminazione. L'opzione “Sempre accesa” la mantiene costantemente accesa, mentre “Sempre spenta” ne impedisce in qualsiasi modo l'accensione. Premendo pulsante P4 ritorniamo alla fase operativa.

Generalmente la prima soluzione contribuisce ad ottenere il giusto compromesso tra praticità e risparmio energetico, la seconda può essere utile nel contribuire ad ottenere la migliore visibilità di alcuni parametri visualizzati dal display soprattutto durante il primo avviamento di un'automazione ed infine la terza per migliorare il consumo di corrente del PLC alimentato a batterie, per esempio in un'applicazione la qui alimentazione deriva dal fotovoltaico ad isola o comunque da batteria.

Un'ultima annotazione importante, durante la fase di programmazione e di gestione della retroilluminazione, il PLC non elabora nessuna stringa.

 

FIRMWARE

 

Come potrete intuire sia il programma interprete che quello di gestione delle varie funzioni del PLC è piuttosto complesso, vediamo di chiarirne il funzionamento.

Iniziamo con la gestione della programmazione delle stringhe e concentriamo la nostra attenzione sul file “Program.h”. Le due funzioni principali a cui dobbiamo porre la massima attenzione sono “Stringa_program (riga_program);” e “Program ();”. Mentre la prima serve esclusivamente a visualizzare la stringa in processo sul LCD, la seconda ha il compito di gestire completamente la modifica della stringa visualizzata. Sia la parte numerica, come il numero di stringa o l'indirizzo dell’operando, che quell'informativa come il tipo di operando o l'operazione, vengono gestiti ugualmente come registri numerici. A seconda della posizione nella stringa questi vengono visualizzati come numeri o come simboli ripresi da apposite tabelle.

Per incrementare o decrementare ciascun registro, è stata implementata un'apposita funzione “Gest_campi (value, min_value, max_value);” i cui argomenti sono appunto il valore minimo (min_value) e quello massimo (max_value) del registro da modificare (value). La funzione restituisce il parametro (value) incrementato o decrementato di una unità a seconda del pulsante premuto.

La disposizione degli operandi all'interno della stringa dipendono dal tipo di operando e non hanno la stessa posizione, sorgono quindi problemi per la visualizzazione sul LCD. Si è fatto uso quindi di 4 mappe selezionate dal tipo del primo operando o dall'operazione tra operandi. Per la precisione se il primo operando è un configuratore di contatore (simbolo “P”) la mappa selezionata sarà “campo_C_LCD[ ] = {0,3,5,7,13};”, se ingresso analogico (simbolo “A”) “campo_A_LCD[ ] = {0,3,4,6,8,13,14,15};”, del caso di operazione tra operandi di tipo Timer (simbolo “T”), la mappa in lavoro sarà “campo_T_LCD[ ] = {0,3,4,5,7,8,10,14};”. In tutti gli altri casi sarà presa in considerazione la mappa “campo_D_LCD[ ] = {0,3,4,5,7,9,10,11,13,14,15};”. In tutti i casi, i valori assegnati rappresentano il numero di colonna della prima riga del LCD (campo da cambiare).

Ogni stringa salvata occupa 4 byte di memoria EEPROM. Anche in questo caso sorgono delle differenze sostanziali tra un'operazione logica, la gestione di un timer, la configurazione di contatore e un'operazione di tipo analogico. Rimandiamo alla tabella 1 com'è stata risolta la disposizione dei vari elementi della stringa all'interno dei 4 byte salvati in memoria.

L'altro file importantissimo è “ExecutePLC.c” che si occupa dell'esecuzione delle stringhe memorizzate. La funzione principale è “Execute ();” e la logica di funzionamento è quella di analisi sequenziale delle stringhe. Di questo dovete tenerne ben conto durante la stesura dei programmi, in quanto per alcune istruzioni l'ordinamento gerarchico è molto importante. Di questo ne parleremo ampiamente nel prossimo numero quando spiegheremo come si programma il PLC, per ora concentriamoci su come il micro interpreta le stringhe.

La prima stringa eseguita è la numero 00 mentre l'ultima è quella indicata dalla locazione di memoria EEPROM 0x00, nel firmware definita col nome di “TOP”. La prima operazione compiuta prima dell'esecuzione delle stringhe, è l'aggiornamento degli ingressi, mentre l'ultima operazione, dopo la scansione di tutte le stringhe residenti in EEPROM, è l'aggiornamento delle uscite.

Ogni stringa caricata dalla memoria viene analizzata alla stessa stregua della sua programmazione, sarà il primo operando a stabilire il proseguo dell'analisi. Se ad esempio la stringa da analizzare è la seguente

05 I.2 & M.0 =Q3

il microcontrollore andrà a leggere il bit 2 dal registro dell'immagine degli ingressi (operando_1 = Acquis_Input (oper_addr_1);), provvederà ad acquisire lo stato del secondo operando, in questo caso il Marker 0 (operando_2 = Acquis_Marker (oper_addr_2);) dopodiché esegue l'operazione tra bit (vedi label exec_operazione: ), per ultimo aggiorna il registro dell'immagine delle uscite (vedi label exec_oper_out: ).

L'operazione tra bit può essere di tipo And, Or oppure Timer. In questo caso ovviamente non si tratta di un'operazione tra bit ma la richiesta di inizializzazione e partenza di un timer, a questo provvede la funzione exec_Timer ();. Una volta raggiunto il tempo impostato viene settato il relativo bit del registro di immagine dei timer e gestito dal PIC come un ingresso o un'uscita qualsiasi. La chiamata delle funzioni in grado di rilevare lo stato del bit dei registri delle immagini sono le seguenti

Ingressi: operando_x = Acquis_Input (oper_addr_x);

Uscite: operando_x = Acquis_Out (oper_addr_x);

Marker: operando_x = Acquis_Marker (oper_addr_x);

Timer: operando_x = Acquis_Timer (oper_addr_x);

Contatori: operando_x = Acquis_Cont (oper_addr_x);

In tutte le funzioni ritornano lo stato del bit puntato dall'argomento del relativo registro immagine.

La richiesta di configurazione di contatore o un'operazione che includa un ingresso analogico, richiedono una procedura più semplice. Nel primo caso la funzione chiamante “Config_contatore (oper_addr_1);” configura il contatore il cui numero è definito dall'argomento e abilita il conteggio, nel secondo caso la funzione “exec_analogica (oper_addr_1);” parametrizza l'ingresso puntato dall'argomento in analogico, esegue la conversione e condiziona il segnale in modo da poterlo confrontare con quello contenuto nella stringa.

Nel caso l'applicazione richieda un numero diverso di ingressi e uscite di quelli disponibili o per qualche motivo avete sostituito il microcontrollore che dispone di porte diverse, vi potrà essere utile modificare le funzioni che trasferiscono le immagini degli ingressi e delle uscite a ingressi e uscite reali. Si tratta rispettivamente di “Read_Input ();” e “Aggiorna_Uscite ();” e il loro funzionamento è talmente ovvio da non meritare alcun commento. Per quanto concerne il bit del registro delle immagini delle uscite non utilizzati perché superiori a quelli disponibili fisicamente, possono essere usati come Marker.

Due parole per le funzioni che aggiornano le immagini delle uscite (Aggiorna_imm_out ();) ed quelle dei marker (Aggiorna_imm_Marker ();). Sono leggermente complesse e permettono la gestione dei diversi tipi di operazione sulle uscite o sui marker.

Analizzatate tutte le stringhe disponibili memoria, l'attenzione si sposta sulla funzione “main();” la quale legge lo stato dei pulsanti e richiama la funzione di visualizzazione dei dati sul LCD (MainPageLCD ();).

 

Elenco componenti  PLC
R1-14 10 K?  
R15 1 K?
R16 27 ? 1/2W
R17 10 K?
RR1 10 K?  
C1 100 µF 40V  
C2 47 µF 16V
C3-4 0,1 µF  
C5-6 22 pF
C7 10 µF  
DZ1-4 5,6V 1/2W
DZ5-10 5,1V 1/2W
D1-2 1N4004
TR1 BC547B
U1 PIC18F4450
U2 MCP6024
U3 – U4 ULN2803
U5 7805
XT1 4 MHz
P1-4 Pulsante da CS
DIS1 Display LCD 2x16
J1 Presa USB “B”
   
   

TABELLA 1: DISPOSIZIONE ELEMENTI DELLA STRINGA SALVATA IN EEPROM

 

OPERAZIONI TRA BIT

 

Byte 4: 0000.0000                     Operando 1

            | |      |_______Indirizzo (0-f)

            | |___________Tipo operando: 0=I, 1=Q, 2=M, 3=T, 4=C, 5=A, 6=P

             |_____________Inversione bit: 0=. (no NOT), 1=! (NOT)

 

Byte 3: 0000.0000                     Operazione + tipo uscita

            | |      | |______Operazione: 0=&, 1=|, 2=T

            | |      |________(libero)

            | |____________Tipo uscita: 0=’=’, 1=S, 2=R, 3=C

            |______________(libero)

 

Byte 2: 0000.0000                     Operando 2

            | |      |_______Indirizzo (0-f)

            | |___________Tipo operando: 0=I, 1=Q, 2=M, 3=T, 4=C, 5=A

             |_____________Inversione bit: 0=. (no NOT), 1=! (NOT)

 

Byte 1: 0000.0000                     operando uscita

            | |      |_______Indirizzo (0-f)

            | |___________Tipo operando: 0=Q, 1=M, 2=C

             |_____________(libero)

 

TIMER

 

Byte 4: 0000.0000                     Operando

            | |      |_______Indirizzo (0-f)

            | |___________Tipo operando: 0=I, 1=Q, 2=M, 3=T, 4=C

             |_____________Inversione bit: 0=. (no NOT), 1=! (NOT)

 

Byte 3: 0000.0000                     Operazione

            | |      | |______Operazione: 2=T

            | |      |________Scala tempo: 0=sec, 1=min

            | |____________(libero)

            |______________(libero)

 

Byte 2: 0000.0000                     Timer

            | |      |_______Indirizzo Timer (0-7)

            | |___________(libero)

             |_____________(libero)

 

Byte 1: 0000.0000                     Tempo

             |_____________Tempo: (1-250 sec/min)

 

CONFIGURA CONTATORE

 

Byte 4: 0000.0000                     Contatore

            | |      |_______Indirizzo (0-3)

            | |___________Tipo operando: 6=P

             |_____________(libero)

 

Byte 3: 0000.0000                     Imposta valore contatore (MSB)

            |___________H (1-65000)

 

Byte 2: 0000.0000                     Imposta valore contatore (LSB)

            |___________L

 

Byte 1: 0000.0000                     Incremento (peso)

             |___________Valore da incrementare (1-100)

 

INGRESSO ANALOGICO

 

Byte 4: 0000.0000                     Operando

            | |      |_______Indirizzo (0-3)

            | |___________Tipo operando: 5=A

             |_____________(libero)

 

Byte 3: 0000.0000                     Operazione + tipo uscita+ operando uscita

            | | | |  |_______Indirizzo operando uscita

            | | | |_________Operazione: 0=’>’, 1=’<’

            | | |___________Tipo uscita: 0=S, 1=R

            | |_____________Tipo operando uscita: 0=Q, 1=M

            |_______________(libero)

 

Byte 2: 0000.0000                     Valore analogico per confronto (MSB)

            |___________H

 

Byte 1: 0000.0000                     Valore analogico per confronto (LSB)

            |___________L

 

 

Legenda:

·         OPERANDI: I = ingresso digitale, Q = uscita, M = marker, T = timer, C = contatore, A = ingresso analogico, P = configuratore del contatore.

·         OPERAZIONE: & = AND, | = OR, ! = NOT, T = Timer

·         OPERAZIONE USCITA: ‘=’ stessa logica, S = Set, R = Reset, C = Complementa bit

·         ANALOGICA: > = maggiore di, < = minore di

 

              


 

Firmware PIC per MikroC Ver.8.2   seconda parte: programmazione PLC

 

 

 

RETURN MAIN PAGE