Vai al contenuto
PLC Forum


Rabbit (Progetto on-line)


Gabriele Riva

Messaggi consigliati

dunque sto preparando una scheda dove acquisisco dati cosi composta :

PIC16F876 , 4 uscite a rele' e 4 ingressi (piu avanti optoisolati .

finche e' una ok , ma il mio scopo sarebbe quello di creare una rete su standard RS485

e protocollo modbus che sto gia studuando .

visto che il pic dispone di 64 byte , ed in questo caso la scheda tratta solo bit , che essi siano uscite

piuttosto che ingressi , pensavo di snellire il protocollo gestendo solo

la lettura e la scrittura che il modbus definisce come registri con prefisso 3xxxx.

quindi copierei o scorporerei tutti i bit della scheda in diversi bytes che saranno poi trasmessi al master

che puo essere un PC oppre un modulo Rabbit che e' molto piu potente e dispone di piu ram per gestire diversi nodi (schede I/O)

il modbus su rs485 e' formato da 1 byte indirizzo , 1 byte funzione , 1 byte quantita dati ,

n° bytes per contenere i bit , e 2 byte (piu significativo e meno della word che gestisce il CRC )

quindi se penso al massimo a 32 ingressi piuttosto che 32 uscite sono 4 bytes di dati ,

che devo preservare per il buffer + 1 +1 +1 +2 = 9 bytes di ram del PIC16F876 da destinare alla gestione della comunicazione .

considerando l'algoritmo per il calcolo del CRC , forse a livello di memoria flash dovrei riuscire a gestire il tutto

mentre a livello di ram ditemelo voi

??? dovrei riuscire mi rimangono ancora 55 bytes liberi visto che poi il micro non fara un gran lavoro

dovra solo copiare i registri ,dichiarati alle porte ingresso piuttosto che uscite ,nei byte del dati della comunicazione .

domanda : per gestire questo protocollo devo avere la possibilita di spedire dei pacchetti , quindi un buffer di

9 bytes , solo che pero il PIC gestisce lo standard Rs232 che tramite i driver MAX232 vengono "buttati " in rete

il pacchetto Rs232 e' diverso da come vorrei fare io , secondo voi come potrei fare ?

sto provando con 2 PC la comunicazione modbus su tcp\ip e qui non ho problemi perche il tcp mi da la possibilita' di spedire e ricevere un pacchetto composto da n° bytes ed una volta ricevuto o prima di spedirlo posso riempirlo come voglio a seconda delle specifiche modbus e dai controlli che faccio .

la comodita tra 2 pc e' che spedendo un buffer che e' un array di bytes posso tranquillamente

spedire senza trasformazione in ascii anche numeri intero a 16 bit

come faccio? prendo un intero , con 2 interi di appoggio , lo maschero con gli 8 bit meno significati

e copio il risultato nell'intero di appoggio1 , e poi li maschero con quelli piu significati e dopo aver shiftato

a dx di 8 li copio nell'intero di appoggio2 .da qui sono sicuro che il mio byte non supera mai 255

poi converto i 2 interi in byte e li metto nel pacchetto

dalla parte dove leggo faccio l'algoritmo opposto , e li metto in OR sull'intero finale e sono apposto

quindi come di solito uso nei plc schneider spedisco anche i bit di ingressi piuttosto che uscite e merker

tutti in word , e cosi evito di scrivere le funzioni sui bit .

Solo che pero con la trasmissione rs232 mi sembra di aver capito che funziona diversamente

cioe spedisce un pacchetto di al massimo 8 bit di dati , quindi come potrei interpretare la cosa???

quindi

IFACH

LIVIO

DLGCOM

per cortesia illuminatemi

ciao walter

grazie

Modificato: da walterword
Link al commento
Condividi su altri siti


  • Risposte 400
  • Created
  • Ultima risposta

Top Posters In This Topic

  • walterword

    154

  • dlgcom

    85

  • Livio Orsini

    46

  • ifachsoftware

    36

No , di memoria ram hai ben 368 byte , divisi in quattro banchi .

hai 96 byte nel banco 0

80 byte nei banchi 1 2 e 3

gli ultimi 16 byte dei banchi 1,2 e 3 sono la copia degli indirizzi da 070h a 07Fh

Link al commento
Condividi su altri siti

i primi sono tassativamente riservati ai registri di "sistema" per esempio tmr , status ect

vero?

c'e' una tabella sul manuale del 16F876 , che ho appena finito di stampare

comunque la mia lacuna sta nella comunicazione RS232 .

se invece questo pic supporta lo standard RS485 allora sono a cavallo

:D

ciao

walter

Link al commento
Condividi su altri siti

Devi farti la gestione della 485 , ovvero dovrai gestire l'uscita per commutare RXeTX .

Per il resto il pic a una USART che fa tutto il lavoro di trasmissione .. devo solo depositare in un registro il byte che vuoi trasmettere .

quelli riservati sono :

banco 0 da 000h a 01Fh

banco 1 da 080h a 09Fh

banco 2 da 100h a 11Fh

banco 3 da 180h a 18Fh

Link al commento
Condividi su altri siti

ok il CRC lo lascio per ultimo

tanto sono prove on devo consegnare qualcosa che poi si impianta.

allora devo gestire il protocollo in RS232 cosi .

preparo una tabella o meglio dire una colonna ,

che e' il buffer di trasmissione , quindi spedisco il primo byte ,

qualcosa mi dira che 'e stato spedito e quindi tramite puntatore o indicizzatore spedisco il secondo ect .

dal lato ricevitore se la funziona ritorna senza codce di errore

ricevo il buffer (sempre di 1 byte alla volta )

e ad ogni byte che arriva incremento un contatore per sapere

quanti byte ho ricevuto , ogni byte che ricevo lo copio su di un'area

di meoria per memorizzarlo , e svuoto il buffer .

Via cosi fintanto che non ho ricevuto tutti i byte del quale so precendemtente quanti sono perche li ho richiesti (nel master)

prima id riceverli .

devo trovare documentazione per capire come fare pero

cioe come , dove e perche e come ca**o faccio a settare a 1

il bit di start per esempio , e ttui gli altri bit del pacchetto .

mah .....

bisogna sincronizzare bene tutte le operazioni

domanda : prima di rispondere alle richieste del master , uno slave ,

cosa fa ? come fa a sapere se la linea e' libera e cioe che nessuno stia

mandando pacchetti , compresi gli altri slaves ?

sai col pc e TCP\ip la cosa e' piu difficile sotto altri aspetti

nei plc pure , qua invece siamo a basso livello , alle radici di dove succede tutto ,e sinceramente se devo dorti la verita i miei studi sulla comunicazione seriale e i pic li ho iniziati domenica

ciao luca

e scusa per la rottura

ciao

walter

Link al commento
Condividi su altri siti

ok quindi a prescindere dal protocollo

sempre un byte alla volta sia in ricezione che trasmissione

a livello hw di rete ci pensa poi il max485 a convertire il segnale .

dico bene? :huh:

cioe ma se devo spedire un intero ?

devo settare il bit di start , prepare il primo byte scorporando l'intero in 2 bytes , spedirlo

poi spedire il secondo e poi settare il bit di stop ?

Modificato: da walterword
Link al commento
Condividi su altri siti

domanda : prima di rispondere alle richieste del master , uno slave ,

cosa fa ? come fa a sapere se la linea e' libera e cioe che nessuno stia

mandando pacchetti , compresi gli altri slaves ?

saprannno dal numero di byte della trasmissione , e sono uno slave sara' abilitato a trasmettere .

Alla fine della trasmissione dello slave , il master fara un altra domanda per un altro slave o per lo stesso in caso di errori di ricezione.

Link al commento
Condividi su altri siti

ho visto qualche istruzione o meglio dire funzione visto che si passano dei parametri in assembler

sulla guida del MPlab

la funzione btfsc potrebbe essere usata per valutare se sulla porta della seriale c'e' lo zero logico

per vedere se ' arrivato il bit di start da parte del trasmittente eseguendo un ciclo tipo while-do in assembler

esempio

loop

btsfc valore logico sulla seriale,1

goto .....subroutine per leggere il byte arrivato

loop

dovrebbe comunque esistere una word , pardon , un REGISTRO !!! , dove vengano salvati i bit in arrivo

o no ?

va be dai devo trovare un esempio pratico dove c'e' un esempio di comunicazione in assembler

che come linguaggio assomiglia un PO' all AWL :D:D

be e' molto veloce ho visto come linguaggio , certo quando si devon fare cicli con puntatori o

indici su indici allora e' meglio usare il C , oppure fare dei switch-case per controllare

dei valori per esempio di valori in arrivo

va be ancora qualche giorno che mi mandano quel ca**o di programmatore e poi mi smazzo la seriale

e poi inizio a divertirmi :blink:

ciao

walter

a parte che anche in S7-200 on awl si posson fare dei bei cicli lavorando su tabelle composte da piu colonne

basta sincronizzare bene tra loro i puntatori

le istruzioni sono "&" per caricare indirizzi di variabili in puntatori (formato doppiaword)

e * per deindirizzare il puntatore , e cioe fare operazioni sulla variabile da esso puntata

oppure per salvare o leggere il valore della variabile puntata .senza * per esempio una somma viene incrementato il valore del puntatore (in sostanza viene incrementato l'indice) quindi punta ad un'altra variabile)

poi si puo caricare l'indirizzo di un puntatore in un altro ect

se anche coi microprocessori si posson fare queste cose penso proprio riusciro ad impararli discretamente

Modificato: da walterword
Link al commento
Condividi su altri siti

dalle specifiche RS232 bisogna campionare il segnale a meta della sua durata

quindi quando sono nel loop "vizioso"e leggo uno 0 sulla porta che non so come ma che settaro come

rx chiamo la routine che gestisce l'arrivo dei bit .

per non sapere leggere ne scrivere azzero subito il registro che dedichero alla ricezione quindi ul mio buffer

di 1 byte.

poi devo aspettare con un ritardo , che sapro come fare nel futuro , per una durata di 1 volta e mezza la durata di un bit (visto la diversita di durate tra bit di start e gli altri di dati )

quindi si presume che sia arrivato il momento di andare a controllare il livello logico sulla porta seriale

anche perche a questo punto il bit di start dovrebbe essere finito

leggo lo stato e lo memorizzo nel bit CARRY di STATUS che mi permette di shiftare o meglio ruotare

i bit nel byte (registro-buffer)

aspetto la durata di 1 bit questa volta e faccio le stesse operazioni

in sostanza ruotando sempre di un bit a dx dovrei trovarmi giusto visto che la seriale trasmette partendo

dal bit meno significativo , o sbaglio ? :(

tutto questo movimento lo devo memorizzare in un'altra variabile che contera le operazioni , per sapere

quando ca**o sono arrivati tutti gli 8 sfigati bit del dato .

poi con qualche astuzia me ne rivado nel loop vizioso ad aspettare se arriva un altro bit di start :blink:

questa secondo me dovrebbe essere la dinamica a basso livello , che potrebbe essere annidata

all'interno di un'altra routine che gestira il mega pacchettone magari di 256 byte ( il massimo in modbus)

:unsure:

cioe s enon funziona cosi mi metto li io col tester , la biro e un foglio e lo scrivo io il buffer

azzzzzzzzzzzzzzzz.......................

ditemi se ho capito qualcosa anch'io

e' da domenica che ho iniziato i micro e le comunicazioni seriali , abbiate un po di pieta'

per favore :)

ciao

walter

Modificato: da walterword
Link al commento
Condividi su altri siti

Non hai bosogno di fare tutto questo con i pic 16F87x.

Hanno gia' internamente un modulo per la ricezione seriale.

Devi solo configurare la velocita' e appena arriva un carattere , il pic alzera' un flag per comunicarti che e' disponibile un byte nel buffer di ricezone, questo flag puo' anche scatenare un interrupt , cosi' non sei obbligato a leggere in continuazione lo stato del flag .

oggi non ho tempo , ma domani ti mando una piccola routine di ricezioe e strasmissione seriale

Link al commento
Condividi su altri siti

:D:D:D

fantastico !!!

scusa un domanda : cioe la conversione del byte me la da in carattere o posso anche prenderla

in byte proprio come valore decimale ???

cosi mi sarebbe piu comodo ricevere i byte , cosi nel protocollo in base alla loro posizione

vado ad unirli in OR + shift a sx e ricavo il mio intero che avevo precedentemente

scisso in 2 byte come ho spiegato nei posto sopra

ciao e grazie

walter

Link al commento
Condividi su altri siti

ifachsoftware

Walter , premetto che mi hai fatto venire il mal di testa , ma vedo di riassumerti :

1) Il PIC16F876 contiene un modulo che gestisce la seriale che viene riportata su due PIN a livello logico CMOS 0/5V

2) Per collegarti ad un dispositivo RS232 devi usare un convertitore da 5V a RS232 che e' un MAX232 o equivalenti

3) La RS485 e' come la RS232 per la parte di trasmissione e ricezione (ossia la colleghi agli stessi pin della 232) solo che ti serve un MAX485 o equivalente per adattare il livello del segnale (in questo caso i cavi vanno Twistati e dotati di resistenze terminatrici da 120 Ohm a entrambi i capi) , piu' un pin aggiuntivo a cui collegherai i due segnali del MAX 485 che definiscono se sei in trasmissione o in ricezione , tali segnali vanno abilitati prima di partire a trasmettere e disabilitati subito dopo)

4) Il 16F876 e' dotato di 2 Buffer da 1 Byte (8 Bit) cadauno che sono i buffer di trasmissione e di ricezione

In pratica metti il dato nel buffer e dei bit che devi alzare o leggere ti dicono se il dato e' da spedire , se e' stato spedito , se e' arrivato un byte ecc.

5) Il metodo migliore per gestire la seriale e' usare gli interrupt che chiamano una funzione quando e' stato ricevuo qualche carattere o quando e' stato trasmesso qualche dato.

6) Ti ho dato degli esempi in C della CCS con esempio di gestione della seriale , considerando che conosci il C ti consiglio di partire da li , l'assembler piano piano lo impari.

Ciao :)

Link al commento
Condividi su altri siti

sto studiando l'assembler

che non mi dispiace neanche poi tanto , e' dinamico e veloce

quando avro capito i concetti ed il significato di ogni singola istruzione , provato e

modificato un po di codice , e quando sentiro la necessita di fare programmi piu avanzati e complessi

allora iniziero a studiarmi il potente compilatore in C, in modo tale da poter integrare sempre

alcune parti di codice in asm per ottimizzare .

i microprocessori mi danno veramente una capacita di voler fare non indifferente

sembra quasi di essere dentro nel core e gestire le parti a basso livello , dal program counter , ai registri

alla gesione di reti e protocolli .

mi rendo conto di quante cose si possan fare , ma tante tante , e con una liberta e flessibilita non indifferente .

basta pensare che un micro dal costo di pochi euro puo veramente fare quasi tutto

e puo interfacciarsi con diversi mondi quali pc , plc , altri micro , server web ect ect .

sono rimasto veramente affascinato :D

ciao

walter

Link al commento
Condividi su altri siti

Caro Walter ,

Io invece sono alle prese con il C# , ho comprato un libro e mi sto atrezzando per lo studio .

Ti ho trovato anche sul forum del C# .it ...

Interessante come piattaforma , sopratutto per la portabilita'

Voglio provare a fare qualche applicazione per pocket PC visto che esiste SDK free.

Esiste qualche demo di OPC server che si possa isare in ambiente .NET?

Link al commento
Condividi su altri siti

io per i plc siemens uso Opc Server della siemens

paghi una sola licenza per il protocollo (S7-Profibus ho io fa MPI e PROFI)

da li c'e' una dll che ti permette di leggere ,scrivere , gestire eventi e quant'altro su plc siemens S7-300\400

Premetto che ci ho messo 2 settimane per far funzionare il discorso con c#

sai non del C# non siamo PARACULI come quelli del VISUAL BASIC , siamo un livello piu sotto

e dobbiamo saper gestire le conversioni dei dati e i tipi . :ph34r:

Oggi non ho avuto tempo , ero a piacenza , ma ieri sono riuscito ad implementare una funzione del modbus su TCP\IP con VC# . simultaneamente sto scrivendo sia la parte client che server in base alle specifiche che ti ho mandato .Direi che il doscroso funziona , ho bestemmiato un po con gli oggetti socket e sull'impacchettamento

dei dati in byte.Nel pc server ho inizializzato un array di 1000 interi come se fossero i registir del modbus con

indirizzo 3xxx.

domani voglio col fantastico

plc

premium tsx con scheda ethernet , chi meglio di lui puo rispondermi come server ?

cosi vedo un po cosa mi rimanda , voglio implementare anche altre 2 funzioni : scrivi molti registri

e leggi una word .

Fratello mi sto rpeparando per il brasile , non ti dimenticare ;)

se eventualmente ti serve una mano col c# fai un fischio , e' solo da gennaio che lo uso

ma qualcosina la so fare anch'io

nel frattempo procedo col fantastico mondo dei micro , mi sembra quasi di esser dentro quel pezzetto di silicio

Guardati bene alcuni post del forum visualcsharp , potresti trovare molti spunti

ciao bro'

walter :D

Link al commento
Condividi su altri siti

col visual studio 2003.net puoi fare progetti crystal report , vb.net,java.net ( che non la caga nessuno )

progetti web asp.net , servizi web , progetti di libreria controlli , custm ect, e anche pocket pc e

windows ce

pensa un bel micro sotto , un bel pannellino o computerino con wince , e chi ci ferma piu .

Il tutto ovviamente in rete :D

Link al commento
Condividi su altri siti

FRATELLI!!!!!!!!!!!!!!!!!!!!!!!!

il discorso client-server modbus tcp\ip funziona che e' una meraviglia !!!

:D:D:D

ho implementato per ora un asola funzione : leggi tanti registri.

nel server ho simulato un array di 1000 registri , che ogni 100 ms incrementano di 1 (reg++;)

quando sono >32000 =0 ;

Il client l'ho messo sotto timer , ed ogni 200ms fa una chiamata alla mia dll , legge i dati sempre refreshati

crea gli oggetti dalacolumn , datatable e dataset e visualizza in una griglia dati

i dati che cambiano continuamente .

Posso scegliere al volo di andare a leggere da dove voglio e quanto voglio con gli opportuni controlli nel server

sta andando da qualche ora e non si e' ancora impiantato

che meraviglia !!!!!!!!!!111 :lol:

lo faccio andare tutta notte e domani mattina quando mi sveglio se sta ancora andando

prendo e butto tutto fuori nel giardino

FACCIO UN MACELLOOOOOOOOOOOOOOOOO!!!!!!!!!!!!!!!!!!!!!!!!!!1111

AHAHAHAHAHAH

CIAO

WALTER

Modificato: da walterword
Link al commento
Condividi su altri siti

io per i plc siemens uso Opc Server della siemens

paghi una sola licenza per il protocollo (S7-Profibus ho io fa MPI e PROFI)

Paghi solo una licenza ? interessante ...

Se mi puoi dare il codice , provo a trovarlo qui ...

il discorso client-server modbus tcp\ip funziona che e' una meraviglia !!!

Complimenti !!

Io ho appena iniziato a leggere le specifiche.

Devo solo trovare il C# :(

Dovro' iniziare a smanettare con il rabbit per implementare il modbus...

Link al commento
Condividi su altri siti

e' tutta la notte e la mattina che funziona senza perdere un colpo

adesso vedo di metter giu anche la funzione Scrivi tanti registri

usufruendo del codice che ho usato per impacchettare i dati di ritorno della Leggi multi registri poi voglio provare il tutto col fantastico plc premium e shceda ethernet , se anche lui mi risponde siamo a buon punto

Codice Opc Server :

-dunque devi ordinare il simatic net cd che contiene l'NCM net (uguale a quello dello step 7) ma in versione ridotta , in sostanza solo per configurare la rete e la stazione pc che si appoggia sull'OPC

poi devi prendere un alicenza tra le tante , io ho preso quella del protocollo S7-profibus

oggi vado a cremona e vedo di prendere i dati (costa sulle 380-400 euro).

poi devi creare un'applicazione client facendo riferimento ad un assembly ( dll in .NET ) tra le tante , ti diro io quale ed il percorso .

da qui creare oggetto opc server ,oggetti gruppo , oggetti items

crei tutte le strutture array e i tipi di dati che passerai poi alle funzioni di scrittura o lettura sincrone e asincrone

puoi gestire anche eventi tipo si scatena un metodo quando cambia un dato entro un certo range all'interno di

di un gruppo precedentemente configurato .

nel pc metti anche una CP5611 (MPI) e configurando col configuratore scegli profibus nel pc , mentre

scegli mpi con relativi indirizzi nel plc .nel plc devi anche aggiungere nuova stazione pc simatic

che contiene un rack virtuale dove piazzaerai al primo posto l'op server , al 3 o 4 a seconda dellla scheda

la tua cp

io nel notebook ho la cp5512 e con un cavo solo mi collego al plc in mpi ,

con le dovute parametrizzazioni posso debuggare il pc on line e contemporaneamente

lanciare la mi apllicazione per testarla , quindi scrivo da una parte e leggo dall'altra in tempo zero,

tutto con un pc ed un cavo mpi .

per il C# se non trovi il visual c#.Net 2003 standard che ti consente di realizzare applicazioni windows e web

puoi scaricarti l'SDK gratuito , dopo aver installato il file DOTNETFX.msi che ti installa il framework altrimenti non gira un ca**o

dunque oaragona C# al java , e il framework .NET alla virtual java machine ma molto piu potente

con un 0infinita di classi , la gestione anche qua del Garbage Collettor , il codice sicuro senza punttori se vuoi

e tante al tre belle cose .

con l'sdk devi pero , non avendo il RAD , aggiungere tutti i componenti ed inizializzarli da codice

proprieta comrpese .

ciao

walter :D

Link al commento
Condividi su altri siti

molti di voi si chiederanno , cosa vorra fare sto pazzo ?

semplice :

Plc Premium tsx (server ) prot. Modbus su tcp\ip

PC client (client) prot. Modbus su tcp\ip

oppure Micro Rabbit (client) prot. Modbus su tcp\ip

schede acquisizione analog\digital con micro PIC

devices vari in SPI o I2C con PIC

PIC -RABBIT prot. Modbus RS232-RS485

oppure PIC -PC prot. Modbus RS232-RS485

oppure RAbbit-PC prot. Modbus RS232-RS485 -oppure Modbus TCP\IP

ect ect

Pls S7-300\400 opc server

PC client

PC-Rabbit prot. Modbus RS232-RS485 -oppure Modbus TCP\IP

oppure PC-PIC prot. Modbus RS232-RS485

schede acquisizione analog\digital con micro PIC

devices vari in SPI o I2C con PIC

sono aperte le scommesse , riusciro a compiere il mio progetto anzi ns .progetti

mi sembra di aver capito che siamo in 3-4

io dico di si , di solito quando mi inpunto , costo di morire , ma porto semre a termine quello che voglio

bisogna studiare e provare tanto , ma si puo fare

sig. nel futuro potrete disporre di una linea nuova che rivoluzionera il mondo dell'automazione industriale

:D:D:D

ciao

walter

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...