Vai al contenuto
PLC Forum


Ob40_point_address


Messaggi consigliati

Inserito:

Salve a tutti, ho utilizzato l'ob40 per generare un interrupt di processo con una CPU 314c2p. Nonostante tutto funziona ho un dubbio. Per catturare l'interrupt mi sono servito della variabile OB40_POINT_ADDRESS. Questa variabile parte dalla locazione L8.0 ed è una doppia word. Facendo in questo modo l'indirizzo, ad es., 124.5, corrisponde dentro il blocco ob40, all'indirizzo L11.4, cioè in pratica vado a guardare il 4° byte della variabile point address. Perchè il 4° e non il 1° o il 2°??? Come spiega il manuale sembra che debba corrispondere al 1° (in questo caso sarebbe L8.4) ma da prove pratice ho verificato che bisogna utilizzare il 4° (ovvero L11.4). Qualucno sa darmi una risposta??? Grazie a tutti coloro vogliano aiutarmi.


Inserita:

questo accade perchè mamma siemens fa le cose alla "rovescia"

ovvero se prendiamo un byte noi tutti lo scriveremo così

bit 7 -- bit 6 -- bit 5 --ecc (come scriverlo sulla calcolatrice per poi convertirlo)

be mamma siemnes si è messa d'impegno ed il byte te lo scrive così

bit 0 -- bit 1 -- bit 2 --ecc ( per cui se devo trasformare un valore letto in binario con la calcolatrice devo ricordarmi di questo giochino.

Per cui se prendo una due byte mi trovo

LOW byte -- HIGH byte

bit 0 -- bit 1 -- bit 2 -- bit 3.... bit 0 -- bit 1 -- bit 2 -- bit 3....

se le unisco per fare una word mi trovo con

LOW byte -- HIGH byte

bit 8 -- bit 9 -- bit 10 -- bit 11.... bit 0 -- bit 1 -- bit 2 -- bit 3....

nel caso della MW 0 (occuma MB 0 e MB 1)

mi troverei con LOW bit = MB 0 HIGH byte = MB 1.

e così via.

Stai attento che se scivi L11.4 significa che leggi il bit 4 del byte 11 della memoria locale dell OB40.

e non il quarto byte come accenni te. <_<<_<

Inserita:

Quello che ha scritto TravelMan è corretto , comunque se ti da fastidio lavorare con i byte invertiti (Ti capisco perfettamente) puoi utilizzare l'istruzione TAD(TAD inverte la sequenza dei byte nell'accumulatore 1 lavora a 32 bit TAW inverte la sequenza dei byte nell'accumulatore 1-L lavora a 16 bit) e poi trasferire in una word di appoggio e utilizzare i bit da li in poi come una persona normale.

Inserita:
Stai attento che se scivi L11.4 significa che leggi il bit 4 del byte 11 della memoria locale dell OB40. e non il quarto byte come accenni te.

Attenzione mi sono spiegato male, il 4° byte è quello della variabile OB40_POINT_ADDRESS. Intendo dire, che questa variabile viene cominciata a scrivere dalla locazione L8.0 ed è una doppia word quindi occupa 4 byte. In questo caso quindi avremo:

L8.0 --> 1° byte della variabile OB40_POINT_ADDRESS

L9.0 --> 2° byte della variabile OB40_POINT_ADDRESS

L10.0 --> 3° byte della variabile OB40_POINT_ADDRESS

L11.0 --> 4° byte della variabile OB40_POINT_ADDRESS

quindi quando scrivo L11.4 mi riferivo al 4° bit del 4° byte della variabile OB40_POINT_ADDRESS.

ora quello che dice TravelMen

questo accade perchè mamma siemens fa le cose alla "rovescia"

ovvero se prendiamo un byte noi tutti lo scriveremo così

bit 7 -- bit 6 -- bit 5 --ecc (come scriverlo sulla calcolatrice per poi convertirlo)

be mamma siemnes si è messa d'impegno ed il byte te lo scrive così

bit 0 -- bit 1 -- bit 2 --ecc ( per cui se devo trasformare un valore letto in binario con la calcolatrice devo ricordarmi di questo giochino.

fa pensare che viene utilizzata una codifica little endian, ovvero la memoria viene considerata al contrario.

Qualcuno mi può confermare questo???

Gabriele Corrieri
Inserita:

ciao Nettuno

essì ... fin dai tempi storici di S5 in cui Siemens utilizzva processori motorola la codifica dei byte è tipica di motorola, la little endian.

Ciao

Inserita:

Bene, GRAZIE A TUTTI PER LA COLLABORAZIONE. :D:D:D:D

Inserita:
be mamma siemnes si è messa d'impegno ed il byte te lo scrive così

bit 0 -- bit 1 -- bit 2 --ecc

Non è assolutamente vero. Siemens allinea i byte secondo lo standard Motorola (come detto da Gabriele Corrieri), ma questo significa che è invertito l'ordine dei byte all'interno di word e dword, non che è invertito l'allineamento dei bit all'interno del byte.

Quindi, in una DWORD i byte sono allineati come segue:

1° byte - 2° byte - 3° byte - 4° byte.

All'interno dei singoli byte il bit 0 è sempre quello meno significativo (a destra).

Una dword è quindi così formata:

bit 7 6 5 4 3 2 1 0 - 15 14 13 12 11 10 9 8 - 23 22 21 20 19 18 17 16 - 31 30 29 28 27 26 25 24

Ecco perché si deve interrogare L11.4 e non L8.4

Poi, piuttosto che un accesso diretto all'indirizzo L11.4 io consiglierei una soluzione un po' più elegante:

L P##ob40_point_addr

LAR1

U L [AR1,P#3.4]

= M 100.0

Anch'io preferirei lavorare con il byte basso a destra (standard Intel), ma non è stata la Siemens ad inventarsi questo ordinamento. Se dà fastidio, con l'istruzione TAD o TAW (come detto da STEU) si scambiano i byte.

Gabriele Corrieri
Inserita:

Ciao

discordo in parte

Anch'io preferirei lavorare con il byte basso a destra (standard Intel), ma non è stata la Siemens ad inventarsi questo ordinamento.

però mamma Siemens ci ha messo del suo, nel senso che a parte il processore Motorola dei tempi che furono, però a livello di programma plc è stata una scelta tutta teutonica di mantenere i bytes scambiati, o chiamatela come volete, la codifica little endian, si sarebbe potuto tranquillamente scambiare l'ordine byte a livello di firmware senza dover generare quel poco di casino che ciò comporta.

Ciao

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