Vai al contenuto
PLC Forum


Modulo Di Posizionamento Fm 353 , Programmazione


coquinati

Messaggi consigliati

mi scuso se rispondo dopo tutti questi giorni , ma sono impegnato in un lavoro che mi sta portando via giornate intere, quindi posso dedicarmi solo al sabato e alla domenica allo studio dell'fm .,

stamattina ho ripreso in mano la situazione, premetto che io i flag non li uso , almeno per ora sto cercando di rendere il tutto più semplice da capire per me .

se mi permetti vorrei chiederti una cosa che non trovo nei manuali, :

ANY: LAR1 P##X_Sorgente; // Parameter assignment ANY
//***********************
L W#16#1002; // ID code & type
T LW [AR1,P#0.0];
L 20; // Nr. bytes
T LW [AR1,P#2.0];
L DBNO; // Nr. DB source
T LW [AR1,P#4.0];
L 450; // From DW number
SLD 3;
OD DW#16#84000000;
T LD [AR1,P#6.0];

in questo caso punti 1002 hex con una word, ma cosi carichi 16 (dec)sul byte 0 e 2(dec) sul byte 1?

scusa se faccio queste domande ma come ripeto è la prima volta che uso dati del tipo ANY ,

L DBB 197; // IF data number is equal of
L DBB 447; // the read request THAN the handshake
==I ; // is complited

non riesco capire se il DBB 447 contiene di suo il numero totale delle DM. ?

scusa del disturbo spero di non avere chiesto cose banali, grazie mille e buon week end

Link al commento
Condividi su altri siti


  • Risposte 118
  • Created
  • Ultima risposta

Top Posters In This Topic

  • coquinati

    67

  • pigroplc

    46

  • walterword

    4

  • beppo

    1

Ciao coquinati.

in questo caso punti 1002 hex con una word, ma cosi carichi 16 (dec)sul byte 0 e 2(dec) sul byte 1?

scusa se faccio queste domande ma come ripeto è la prima volta che uso dati del tipo ANY

Qui ti posso rispondere anchi'io,

Caricare 1002 significa caricare 10 Hex sul primo byte 0, questo non cambia mai, caricare 02 Hex sul byte 1, questo va ad identificare il tipo di dati,

01 BOOL Bit
02 BYTE Byte (8 bit)
03 CHAR Caratteri (8 bit)
04 WORD Parole (16 bit)
05 INT Numeri interi (16 bit)
06 DWORD Parole (32 bit)
07 DINT Numeri interi (32 bit)
08 REAL Numeri in virgola mobile (32 bit)
09 DATE Data
0A TIME_OF_DAY (TOD) Ora
0B TIME Temporizzatore
0C S5TIME Tipo di dati S5TIME
0E DATE_AND_TIME (DT) Data e tempo (64 bit):
13 STRING Stringa di caratteri

Ti rimando a questa discussione per capire il puntatore Any:

http://www.plcforum.it/forums/index.php?showtopic=28796&st=0&p=170508&#entry170508

Spero di esserti stato di aiuto.

Link al commento
Condividi su altri siti

il confronto fra il byte 197 e 447 della anwender DB verifica che nella parte di ricezione siano arrivati I dati. Vero è che se I dati sono arrivati si passa al passo successivo che copia a famosi 20 byte dal byte 450 in poi (sono I valori letti del famoso pacchetto di 5 dati macchina) e poi li scrive in DB2 che è la mia DB di interfaccia standard WinCC per la visualizzazione di quanto ho letto.

Quanto ai flag sei libero di non usarli, basta che rendi sequenziali le operazioni. Il software postato ha la funzione di spiegarti come fare a leggere e scrivere I dati macchina, e visto che il manuale dispensa una spiegazione non prorio chiara, o meglio chiara per coloro abituati da decenni a documentazione di questo tipo o peggiore.

Certo è che se non fai le operazioni in sequenza scordati di farlo funzionare.

Quanto ai puntatori vedo che Beppo ha detto tutto quello che c'era da dire.

pigroplc

Link al commento
Condividi su altri siti

  • 3 weeks later...

ciao ragazzi, finalmente posso continuare con lo studio della funzione.

volevo sapere se mi è permesso chiederlo una precisazione. veniamo al succo del discorso:

L 450; / / From DW number
SLD 3;
OD DW#16#84000000;
T LD [AR1,P#6.0];

allora qua carico 450 che convertito in codice binario è questò:

00000000 00000000 00000001 11000010

shifto il tutto di 3 posti verso sinistra:

00000000 00000000 00001110 00010000

combino con una OR il valore esadecimale 84000000

10000100 00000000 00000000 00000000

00000000 00000000 00001110 00010000

--------------------------------------------------------------

10000100 00000000 00001110 00010000

LD [AR1,P#6.0];

byte 6.0=10000100 , hex= 84 , identifica l'area db,

byte 8.0 e 5 bit del 9.0=00001110 00010 , dec=898 identifica l'indririzzo byte 898.0

però è sbagliato perchè teoricamente devo puntare al byte 200.0 ( da quello che ho capito)

eppure non riesco capire dove sbaglio...

Link al commento
Condividi su altri siti

Inoltre ne aprofitto per chiedere una cosa , il valore di #16#84000000 é un numero a 32 bit , il 32esimo bit rappresenta il segno ,ma funziona anche da esponente in questo caso ?

Grazie ancora !

Link al commento
Condividi su altri siti

devi studiarti bene il discorso dei puntatori, altrimenti NON ti è chiaro il funzionamento del codice.

Una spiegazione esaudiente la trovi nel tuo pc:

C:\Program Files\Siemens\Documentation\Italiano il file è Programmazione con STEP 7 da pagina 624

mi ricordo che c'era nel forum una spiegazione spettacolare dei puntatori fatta da Batta, prova a cercare.

pigroplc

Link al commento
Condividi su altri siti

ora credo di aver capito , i byte 200 a 219 servono per la scrittura , metre i byte da 450 a 469 per la lettura , peer il discorso puntatori penso funziona cosi:

450 in base 2=
00000000 00000000 00000001 11000010
se vado a caricarlo cosi andrei a occupare i bit 0,1,2 del byte 9. cioè darei un indirizzo in bit al mio pointer,( in questo caso ho bisogno di zero).shifto il tutto di 3 posti :
0000000 00000000 00001110 00010000
ora ho i bit 1.2.3 del byte 9 liberi , e ottengo sempre un valore di 450, quindi ora il mio indirizzo è di 450.0 ( lettura)
ora vediamo di combinare le due doppie parole con il valore in hex#84000000
hex84000000:
10000100 00000000 00000000 00000000
00000000 00000000 00001110 00010000
------------------------------------------------------------
10000100 00000000 00001110 00010000
la storia del segno non l'ho ancora svelata , sul sito siemens c'è cosi tanta roba. anzi spero di aver capito correttamente quel poco che ho scritto sopra
Link al commento
Condividi su altri siti

la spiegazione è molto semplice.

Si tratta di sintassi e non c'entrano bit di segno.

il puntatore DEVE essere fatto così in quanto si tratta di trasferire dei byte di una DB e a partire da un determinato indirizzo.

Lo shift dei 3 bit è funzione del fatto che nel puntatore c'è compreso l'indice dei BIT (0-7 duale) = (000-111 binario).

consiglio: NON PERDERCI PIU' TEMPO DEL DOVUTO. Prendilo come dato di fatto, mi ricordo che anni fa c'era una spiegazione nella documentazione in linea Siemens che spiegava che mettendo 84 si identifica un puntatore della DB, mettendo 74 identifica per esempio merker; ecc ecc)

pigroplc

Link al commento
Condividi su altri siti

Si si l'ho trovata la tabella che mi dicevi ;) era sotto ai miei occhi ;) quest 'oggi ho quasi ultimato di capire la parte di scrittura , sinceramente non pensavo che sotto c'era una complessità del genere ... Ci credo che tanta gente rifiuta di imparare queste schede ... Ma io ormai ho iniziato , inoltre anche se dovrei fallire ho già imparato molte cose che una volta se le provavo guardare mi accecavano :)quindi ottimo training ! Speriamo che riesca finire in tempo se no i motori mi si ossidano. :)

Comunque i miei complimenti per aver scritto una cosa del genere pigro plc , Qua ho notato la professionalità che bisogna avere per questo lavoro ..

Inviato dall'app. Mobile di PLC Forum da iPhone6,2

Link al commento
Condividi su altri siti

L DBB 197;

L 5;

+I ;

T DBB 197;

L 70;

se posso ti faccio una domanda, come mai confronti la dbb 197 che è il numero di dato macchina in lettura o scrittura con 70, i dati macchina vanno da 1 a 56 , tra cui 11 non sono occupati quindi me ne restano 45 , considerando però che uno è usato internamente dall'fm e il numero 19 non capisco a cosa serva.

quindi al massimo posso avere un valore 61. non riesco proprio ad arrivarci ho provato ma mi sono arreso all'aiuto.

grazie mille .

Link al commento
Condividi su altri siti

I dati macchina iniziano dal numero 5 fino al 67 (se non erro) nella FM453 e FM354.

Queste schede possono gestire sia I servomotori retroazionati con encoder quindi hanno qualche dato macchina in più.

Le FM353 sono abilitate solamente per i passo passo (secondo me una scusa per giustificare un prezzo inferiore).

Il software funziona per tutte le schede, se si tratta di dati macchina non presenti sulla scheda o semplicemente disabilitati, il risultato della lettura è zero, e la scrittura non sortisce alcun effetto.

Ho tenuto il limite a 70 in quanto mi sono cautelato da successivi aumenti dei dati macchina, visto che allora si trattava di un prodotto molto spinto da Siemens e sul quale prevedevo sviluppi futuri.

L'evoluzione dei bus di campo e il loro utilizzo comune ha ammazzato il mercato di queste schede, che mamma Siemens ha abbandonato come sviluppi successivi.

In sintesi: il software legge e scrive i dati macchina dal 5 al 70, indipendentemente che ci siano o no. Se non ci sono, fa nulla, legge zero e scrive un numero NON gestito dalla scheda (senza per altro restituire alcun codice di errore).

pigroplc

Link al commento
Condividi su altri siti

E' una questione di mercato e di logica:

immagina di avere 60 servomotori da gestire con un PLC:

soluzione 1
prendi un S7-400, gli metti 20 (ripeto venti) FM453 con relativi rack di espansione, alimentatori, qaudro elettrico e cablaggi per gestire il tutto. Il PLC ha il compito di dialogare con le schede che a loro volta tramite una interfaccia analogica comandano I servomotori.

soluzione 2

prendi un S7-300, gli metti gli azionamenti in Profibus o Profinet. Gli azionamenti hanno un loro posizionatore interno, quindi tramite rete gli mandi la quota alla quale devono arrivare e aspetti dall'azionamento il bit di quota raggiunta.

ti do un indizio, ogni FM453 costa 3000 e spiccioli, più i rack più gli alimentatori più il quadro elettrico più grosso più lo sconto sulla serie 300 che non è nemmeno da comparare rispetto alla serie 400.

Adesso la domanda è questa:

quale è la soluzione più economica (oltre più affidabile e semplice da mettere in servizio) ?????

a te le debite conclusion.

pigroplc

Link al commento
Condividi su altri siti

Chiaramente la seconda soluzione in questo caso , ma se io ho un asse massimo 2 da gestire , per esempio un guidafilo . Quale resta la migliore in questo caso ? .

Sempre il sinamics?

Link al commento
Condividi su altri siti

Con I prodotti odierni presenti sul mercato puoi avere decine di soluzioni.

A livello aziendale poi si prendono delle decisioni che:

1) dipendono dalle specifiche imposte dal cliente

2) dipendono dal prezzo e/o dagli accordi dell'ufficio acquisti

3) dipendono da uniformità di configurazione con altre machine simili

4) dipendono dal tempo di consegna visto che oramai si ordina per il giorno prima

e ti ho citato solamente le prime 4 motivazioni che mi vengono in mente stasera.

Ti è chiaro quindi quanto per me è impossibile rispondere alla tua domanda?

pigroplc

Link al commento
Condividi su altri siti

Si si capito molto bene . Quindi un programmatore deve adattarsi anche alle richieste del cliente a livello HW ... Bel casin:)

Inviato dall'app. Mobile di PLC Forum da iPhone6,2

Link al commento
Condividi su altri siti

questa sera ho provato dedicarmi al sinamics.. a prima impressione sembra meno complicato dell'fm .

ma l'fm per ora non l'abbandono, fin che non la imparo bene, magari una azienda ha bisogno di un manutentore o necessita di fare modifiche al programma su macchine che usano queste schede, potrebbe essere una buona via per trovare un lavoro davvero bello...speriamo.

comunque mi sono reso conto di una cosa, io ho iniziato a scrivere la pagina su wincc , chiaramente io posso impostare anzi devo impostare tutte le variabili una a una , mi ritrovo ad affrontare

la

Generazione percorso per giro del motore UMWEG

che è data dal rapporto tra :

UMWEG = DM11 + DM12*2-32

che tradotto è:

= percorso per ogni giro del motore (periodo di suddiv.) +percorso residuo per ogni giro motore*2-32

ora sto pensando cosa mi conviene fare , poichè noto che sulla parametrizzazione ti fa inserire i dati della dm11/12 gia rapportati.

dal manuale non è spiegato molto chiaramente cosa si intende con il periodo di suddivisione ( a parer mio i passi giro), ne con il percorso residuo per ogni giro motore.

mmmm... :blink::wacko:

Link al commento
Condividi su altri siti

Ho un bel foglietto di spiegazioni a casa, ma fino alla prima decade di luglio a casa non ci torno, dovrei vedere degli appunti perchè il calcolo della conversione impulsi/mm non è proprio immediato e devo lavorare anche di sera in albergo per portarmi Avanti.

Se porti pazienza un paio di giorni ti darò una risposta esaudiente.

questa sera ho provato dedicarmi al sinamics.. a prima impressione sembra meno complicato dell'fm .

ah ah ah ah mi hai regalato un momento di risate, e fidati, in India ci sono ben pochi motivi per ridere.

pigroplc

Link al commento
Condividi su altri siti

An trasferta in India :)posso capire:) deve essere davvero dura , sopratutto Senza clima , anche se io non ho mai fatto queste esperienze .e per ora dico purtroppo :) .. Comunque aspetto :)aspetto ;) intanto come hai notato vado con calma :) nel frattempo vado avanti con li altri dati macchina che capisco .

Grazie ancora , e buon lavoro

Link al commento
Condividi su altri siti

  • 2 weeks later...

ciao ragazzi.

pigroplc ho provato a collaudare la funzione ( chiaramente una versione scritta da me , prendendo spunto dalla versione madre , cioè la tua) ancora 3 giorni fa ,, chiaramente come tutte le cose che faccio non va,,,

ho trovato alcuni errori l'ho modificata , ma non andava ancora, allora ho scritto una funzione solo per leggere, e sinceramente qua ho visto qualche strambo dato comparirmi sull'hmi o DB di interfaccia. ma ancora niente di concreto.

ma se io ottengo un valore sulla DB447 diverso dalla DBB 197 devo preocuparmi?

io ragionavo che inserito il JOB di lettura in DBB 196 automaticamente mi ritrovavo i dati macchina da partire dal DBB450 ( dati lettura)

ma non era cosi. allora io per ingannare il sistema di controllo confronti , e vedere se almeno un numero diverso da zero uscisse ho semplicemente caricato i valori che di job/DB/quantita/numero da partire a DBB 447 . risultato: qua si spiegano i numeri strambi

Ecco il codice :


L #n_asse
L 0
==I // se asse uguale a 0 finisce blocco
BEB
L #n_asse
L 2
+I // SE ASSE =1 DB = 3 , ASSE = 2 DB=3,
T #AW_DB
AUF DB [#AW_DB] // OPEN DB PARAMETRIZZAZIONE

U #lettura
UN #scrittura
SPBN m000
L 1
T DBB 196 // 1=DATI MACCHINA
T DBB 199 //1= job LETTURA DATI MACCHINA
T DBB 446
T DBB 449

L 5
T DBB 197 //5= DA MD 5 ,
T DBB 198 //5= LETTURA NUMERO MAX 5 MD AL COLPO
T DBB 447
T DBB 448
U #lettura
U(
L DBB 197 //scrivo da md 5 vedi commento segmento
L DBB 447 // leggo da md 5
==I
)
S DBX 43.3 //job lettura
R DBX 39.3 // job scrittura
R DBX 37.0 // aativazione dati macchina
SPB m004 //attivo la lettura altrimenti
SPA m000 //salto a fine blocco

m004: L 13
m003: T #cont_loop_read
//---------------------------------------------------------
LAR1 P##x_sorgente
//----------------------------------------------------------
L W#16#1002 // carico ID tipo ( 10) , e il tipo dati (02)=byte
T LW [AR1,P#0.0]
L 20 // NR byte da trasferire, fattore di ripetizione
T LW [AR1,P#2.0]
L #AW_DB // nr db sorgente
T LW [AR1,P#4.0]
L 450 // 00000000 00000000 00000001 11000010 (450=lettura)
SLD 3 // 00000000 00000000 00001110 00010000
OD DW#16#8400000 // 10000100 00000000 00000000 00000000
L LD [AR1,P#6.0] // 10000100 00000000 00001110 00010000
// area m. byte 7 byte8 byte9
//------------------------------------------------------------------------------------
LAR1 P##y_destinatario
//------------------------------------------------------------------------------------
L W#16#1002 // carico ID tipo ( 10) , e il tipo dati (02)=byte
T LW [AR1,P#0.0]
L 20 // NR byte da trasferire, fattore di ripetizione
T LW [AR1,P#2.0]
L #db_destinazione // nr db destinazione
T LW [AR1,P#4.0]
L DBB 447 // numero della DM
L 4 //ottieni l'indirizzo in DW, punto ogni 4 byte,
*I
L 20 //inizia da DM 5, parto con indirizzo zero
-I
SLD 3
OD DW#16#84000000
T LD [AR1,P#6.0]

CALL "BLKMOV"
SRCBLK :=#x_sorgente
RET_VAL:=MW60
DSTBLK :=#y_destinatario

L "(AW_DB) ASSE 1".PAR_CHAN.NUMB // numero dati macchina
L 5
+I
T "(AW_DB) ASSE 1".PAR_CHAN.NUMB
T "(AW_DB) ASSE 1".PAR_RD.NUMB

L #cont_loop_read
LOOP m003
R DBX 43.3

BEA
m000: NOP 0

scusa per il distrurbo , da quel che ho capito è dal 2001 che non metti più occhio a queste schede, non vorrei approfittarne troppo

grazie e ciao

Link al commento
Condividi su altri siti

allora,
visto che la cosa è squisitamente propedeutica, comincia a prendere spunto dal software fatto per eseguire il job di lettura singolo e svincolato da qualsiasi codice:

ti costruisci una VAT e fai a scrivere una richiesta di lettura, quindi vai a leggere I valori.

Se non parti da questo metti troppa carne al fuoco e anche se analizzassi il tuo codice e correggessi eventuali errori non avrei contribuito a formare la tua base tecnica.

Se capisci il lavoro di scambio dati e ti ripeto lo puoi capire veramente solo con l'ausilio di una tabella di variabili, il resto te lo scrivi come vuoi tu!

Io poi avrei copiato pari pari il software già fatto e funzionante prima di scriverne uno io e ritrovarmi una pigna di possibili errori di battitura o concettuali.

STEP BY STEP.

Finchè non ti è chiaro con una VAT come funziona lo scambio dati non andare Avanti.

pigroplc

Link al commento
Condividi su altri siti

ho preso alla lettera il tuo consiglio , ho copiato la tua funzione , come hai detto te per ora mi limito nel capirla correttamente .

ho notato una cosa molto strana , che almeno io non mi riesco spiegare , il reset del DBX 39.3 dove l'ho fai?

c'è qualche opzione sul pannello ?

perchè provando , mi ritrovo sempre questo bit su on , e se questo è su on non riesco leggere i dati.

vorrei chiederti an altra cosa riguardo a questo codice:

U "START_WRITE_FM"
CLR
L S5T#10S
SE "TEMP_3"
U "TEMP_3"
S M 93.0
R "START_WRITE_FM"
U "START_READ_FM"
CLR
L S5T#10S
SE "TEMP_4"
U "TEMP_4"
S M 93.1
R "START_READ_FM"

ma come riesci ad abilitare i temporizzatori?

anche se non riesco comprendere come funziona questo codice ,mi sembra di capire che prima scrivi e poi leggi .

sinceramente mi sono apllicato , ma su questi dubbi ,dopo che ci sono stato dietro diverse ore preferisco chiedere.

scusa del disturbo

e grazie ancora della disponibilita

Link al commento
Condividi su altri siti

ho notato una cosa molto strana , che almeno io non mi riesco spiegare , il reset del DBX 39.3 dove l'ho fai?

quello lo dovrebbe fare la FB di interfaccia della scheda, quindi ti limiti a valutare il fronte di discesa per avanzare con la procedura

vorrei chiederti an altra cosa riguardo a questo codice:

sicuramente entrambi I timer non partono, si trattava di un time out che in caso di errore nella esecuzione mi restituiva l'errore che veniva visualizzato a video. Non ricordo sinceramente il perché ho messo un tappo, ADESSO NON FUNZIONA, quindi cancellalo.

ho preso alla lettera il tuo consiglio ,

a dire il vero io mi aspettavo che mi dicessi che hai provato con una VAT, forse così avrei capito che hai preso alla lettera il mio consigio......

pigroplc

Link al commento
Condividi su altri siti

quello lo dovrebbe fare la FB di interfaccia della scheda, quindi ti limiti a valutare il fronte di discesa per avanzare con la procedura

sicuramente entrambi I timer non partono, si trattava di un time out che in caso di errore nella esecuzione mi restituiva l'errore che veniva visualizzato a video. Non ricordo sinceramente il perché ho messo un tappo, ADESSO NON FUNZIONA, quindi cancellalo.

a dire il vero io mi aspettavo che mi dicessi che hai provato con una VAT, forse così avrei capito che hai preso alla lettera il mio consigio......

pigroplc

Si scusa mi sono spiegato male , ho usato anche una VAT ,sempre sulla tua funzione .:)

Appena torno a casa provo riprendere in mano la funzione .

Grazie per ora

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