Il Bar dell'Ingegneria

Semplice telaio 3D in excel

« Older   Newer »
 
  Share  
.
  1. taipan95
        +1   -1
     
    .

    User deleted


    Allego il link di un documento che ho trovato sul web, e che ho utilizzato come spunto per studiare le matrici di rotazione. In questo pdf dovrebbe essere presentata una soluzione al problema da te enunciato (sempre se ho afferrato la questione)

    http://www.scienzadellecostruzioni.co.uk/D...%20spaziali.pdf
     
    Top
    .
  2.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Si.
    Della questione che ho evidenziato, in questo documento che hai linkato, si inizia a parlarne dalla pagina 8 a seguire.
    Attached Image
    003-Assilocali04

     
    Top
    .
  3.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Gli assi principali (assi locali della trave).

    Ho visto che diversi autori assumono diversa nomenclatura per gli assi locali e conseguentemente le matrici di rotazione hanno diversa forma. C'è chi assume l'asse della trave come asse locale x' mentre altri lo chiamano z' (come per esempio nel documento linkato da taipan). Occorre pertanto definire una volta per tutte i nomi degli assi locali.
    Io ho assunto il seguente (che comunque mi riservo di modificare all'occorrenza) :
    Attached Image
    003-Assilocali05

     
    Top
    .
  4.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Procediamo con la costruzione delle matrici di rigidezza locale delle aste.
    Ho pensato di costruire una sola tabella i cui termini dipendono tutti dall'indice (generico) dell'asta, e successivamente attraverso codice, facendo ciclare l'indice da 1 fino al numero totale delle aste, con copia-incolla da codice, riempire le tabelle di rigidezza locale specifiche per ogni asta.
    Ho quindi organizzato i dati come mostrato:

    YAcjKQb



    Ho riportato lo schema della matrice coi termini da inserire e con molta pazienza ho riempito la tabella digitandovi le funzioni cerca.verticale() tutte riferite alla cella in cui è riportato l'indice dell'asta.

    I nomi attribuiti e la formula utilizzata sono:

    xH7NX1r

    In questo modo facendo ciclare da codice, il valore dalla cella contenente l'indice dell'asta, posso costruirmi le matrici di rigidezza di tutte le aste e sempre attraverso codice le copierò su altro foglio dove ho già predisposto una serie di tabelle (per adesso 40 tabelle di 12x12 atte a contenere 40 matrci di rigidezza di altrettante aste)

    FMVvp7J



    Naturalmente non possiamo pensare di affollare quel povero foglio di cosi tate tabelle (e ancora moltissime altre ne verranno), ma per adesso e solo per scopi illustrativi del metodo lo faremo, fermo restando che alla fine la costruzione delle matrici di rigidezza locali poi quella riferite agli assi globali e la matrice di rigidezza dell'intera struttura saranno gestiti da codice.
     
    Top
    .
  5.     +1   -1
     
    .
    Avatar

    Junior Member

    Group
    Member
    Posts
    23
    Reputation
    +1

    Status
    Offline
    Tanto di cappello

    ma se è per scopi dimostrativi si poteva fare per una sola asta tant'è che poi si deve gestire tutto da codice.
    Forse si può spendere meglio il tempo (è una mia opinione) nello scrivere la matrice di rigidezza con l'opzione incastro-cerniera
    cerniera-cerniera cerniera incastro.

    Davvero complimenti
     
    Top
    .
  6.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    CITAZIONE (iperlabile @ 14/10/2019, 12:28) 
    Tanto di cappello

    ma se è per scopi dimostrativi si poteva fare per una sola asta tant'è che poi si deve gestire tutto da codice.
    Forse si può spendere meglio il tempo (è una mia opinione) nello scrivere la matrice di rigidezza con l'opzione incastro-cerniera
    cerniera-cerniera cerniera incastro.

    Davvero complimenti

    E chi lo dice che non sarà speso anche il tempo per quelle opzioni di aste speciali?

    Il file è per adesso dimostrativo, ma possiede il seme per diventare qualcosa di più. Per prevedere poche aste basta inserire pochi nodi.

    A proposito, hai le matrici di rigidezze di tutti i possibili casi di aste con sconnessione agli estremi? Se li hai postali.
     
    Top
    .
  7.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    3,345
    Reputation
    +213

    Status
    Offline
    CITAZIONE (iperlabile @ 14/10/2019, 12:28) 
    Forse si può spendere meglio il tempo (è una mia opinione) nello scrivere la matrice di rigidezza con l'opzione incastro-cerniera
    cerniera-cerniera cerniera incastro.

    non esiste una matrice incastro-cerniera, o meglio: non esiste a questo livello, perché afazio ha considerato tutti e 12 i possibili gradi di libertà dei nodi.

    se un grado di libertà è bloccato, la corrispondente colonna (e la corrispondente riga) sarà tutta nulla.

    tu invece stai parlando di un'altra cosa, ossia trascurare gli spostamenti dipendenti costruendo la matrice di rigidezza non nel modo canonico (uno spostamento unitario e tutti gli altri nulli, cosa che sta facendo afazio) ma in un modo più "avanzato" che consiste nel dare valore unitario ad uno spostamento indipendente, valore nullo agli altri spostamenti indipendenti e il valore che compete agli spostamenti dipendenti.

    a mio parere, ciò non è "didattico" quanto il caso in corso di svolgimento.
     
    Top
    .
  8.     +1   -1
     
    .
    Avatar

    Junior Member

    Group
    Member
    Posts
    23
    Reputation
    +1

    Status
    Offline
    Ok non è didattico.

    Però magari in futuro partendo dalla matrice cerniera sferica- incastro si può procedere agli svincoli delle rotazioni singole nelle tre direzioni e ottenere le varie matrici. (Anche se il top è mettere un coefficiente che permette di avere uno svincolo parziale per avere il semi-incastro (a piacere) :) ma questo fate finta che non l'ho detto...)

    Questa è la matrice di rigidezza cerniera sferica - incastro. Se trovo le altre le posto.

    https://www.dropbox.com/s/hrnwgnd3shgskwz/...astro.xlsx?dl=0
     
    Top
    .
  9.     +1   +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    3,345
    Reputation
    +213

    Status
    Offline
    evidentemente mi sono spiegato male: il lavoro che sta facendo afazio prescinde dalle condizioni di vincolo ai nodi ed è del tutto generale.

    il lavoro che suggerisci tu introduce nella matrice di rigidezza le cosiddette "rigidezze improprie" ed è strettamente legato alle effettive condizioni di vincolo dell'asta.

    ma con la matrice di afazio, una volta introdotto l'opportuno vettore degli spostamenti che tenga conto degli effettivi spostamenti possibili (derivanti dalle condizioni di vincolo), si arriva ugualmente alla matrice che hai proposto tu.

    col tuo suggerimento si risparmia "tempo macchina" però si perde di generalità.
     
    Top
    .
  10.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    La costruzione delle matrici di rigidezza locale delle aste.

    Aggiunto un pulsante proprio sopra la tabella dove ho inserito le formule che richiamano i termini della matrice in funzione dell'indice dell'asta:

    MRzbBff



    Alla pressione del pulsante viene attivato il seguente codice in cui gran parte delle righe servono solo a fare scena:

    CODICE
    Sub creaRigidezzeLocali()
    Dim n As Double
    Dim i As Integer
    Dim tabella As String
    n = Range("N_Aste").Value

    Sheets("RigidezzeAste").Select
    'Pulisco le tabelle
    For i = 1 To 40
       If i < 10 Then tabella = "KLoc_0" & i Else tabella = "KLoc_" & i
       Sheets("RigidezzeAste").Select
       Range(tabella).Select
       Range(tabella).ClearContents
    Next
       
    For i = 1 To n
       If i < 10 Then tabella = "KLoc_0" & i Else tabella = "KLoc_" & i
       Range("I_RigLoc").Value = i
       Range("KRig_e").Copy
       
       Sheets("RigidezzeAste").Select
       Range(tabella).Select
       Range(tabella).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
       
       Sheets("AsteEstese").Select
       Range("I_RigLoc").Select
    Next
       Sheets("RigidezzeAste").Select
       Range("KLoc_01").Select

    End Sub


    Il codice legge il numero delle aste presenti nella struttura:
    n = Range("N_Aste").Value
    quindi inizializza un ciclo con contatore i

    Nel primo ciclo viene cancellato l'eventuale contenuto delle tabelle contenenti le matrici che si vanno a costruire.

    Occorre notare che nel foglio "RigidezzeAste" ho predisposto 40 nomi di range del tipo KLoc_01, KLoc_02, KLoc_03,....KLoc_40che sono le tabelle dove saranno trascritte le matrici di rigidezza.

    Out1VLZ



    pertanto con la riga:

    If i < 10 Then tabella = "KLoc_0" & i Else tabella = "KLoc_" & i

    definisco la i-esima tabella dove voglio copiare la matrice.

    Con l'istruzione:
    Range("I_RigLoc").Value = i
    inserisco il valore del contatore nella cella in cui è riportato l'indice dell'asta (in modo che la tabella si aggiorni coi termini relativi all'asta)

    Con l'istruzione:
    Range("KRig_e").Copy
    copio il contenuto della matrice d irigidezza

    e con le successive istruzioni:

    Range(tabella).Select
    Range(tabella).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False


    incollo con l'opzione "Incolla Speciale" i valori della matrice precedentemente copiata nella marice iesima.


    Il risultato ottenuto, dopo qualche sfarfalleggiamento (che ho voluto mettere io per dare l'idea dell'eleaborazione) è il seguente:

    cKwvFOR

    Togliendo le righe che fanno passare da un foglio ad un altro, l'elaborazione è quasi immediata.
     
    Top
    .
  11.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Qui allego il file allo stato attuale di avanzamento.
    File Allegato
    Telaio3D_07_1.rar
    (Number of downloads: 51)

     
    Top
    .
  12. unoinpiu
        +2   +1   -1
     
    .

    User deleted


    fornisco un contributo per una possibile ottimizzazione del codice VBA

    dato che i nomi di Range sono tutti con ambito "Cartella di lavoro" non è necessario premettere il riferimento del foglio

    inoltre l'utilizzo della funzione "Format()" può evitare la riga di codice

    CODICE
    If i < 10 Then tabella = "KLoc_0" & i Else tabella = "KLoc_" & i


    infine il copia incolla valori è più efficiente se si uguagliano la proprietà "Value" di due range

    per cui complessivamente il codice di "creaRigidezzeLocali()" può ridursi al seguente:

    CODICE
    Sub creaRigidezzeLocali()
       Dim n As Long
       Dim i As Long
       
       'Pulisco le tabelle
       For i = 1 To 40
           Range("KLoc_" & Format(i, "00")).ClearContents
       Next
           
       n = Range("N_Aste").Value
       For i = 1 To n
           Range("I_RigLoc").Value = i
           Range("KLoc_" & Format(i, "00")).Value = Range("KRig_e").Value
       Next
    End Sub
     
    Top
    .
  13.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    CITAZIONE (unoinpiu @ 15/10/2019, 19:41) 
    fornisco un contributo per una possibile ottimizzazione del codice VBA

    dato che i nomi di Range sono tutti con ambito "Cartella di lavoro" non è necessario premettere il riferimento del foglio

    inoltre l'utilizzo della funzione "Format()" può evitare la riga di codice

    CODICE
    If i < 10 Then tabella = "KLoc_0" & i Else tabella = "KLoc_" & i


    infine il copia incolla valori è più efficiente se si uguagliano la proprietà "Value" di due range

    per cui complessivamente il codice di "creaRigidezzeLocali()" può ridursi al seguente:

    CODICE
    Sub creaRigidezzeLocali()
       Dim n As Long
       Dim i As Long
       
       'Pulisco le tabelle
       For i = 1 To 40
           Range("KLoc_" & Format(i, "00")).ClearContents
       Next
           
       n = Range("N_Aste").Value
       For i = 1 To n
           Range("I_RigLoc").Value = i
           Range("KLoc_" & Format(i, "00")).Value = Range("KRig_e").Value
       Next
    End Sub

    Interessante. Molte grazie.
    resta on line per i prossimi suggerimenti che accoglierò di buon grado, specie quando sarà necessario gestire le matrici direttamente da codice.

    Il prossimo passo è quello di far scrivere le matrici di trasformazioni di ogni asta.
     
    Top
    .
  14. taipan95
        +1   -1
     
    .

    User deleted


    Non so se può essere utile, ma fornisco una parte del mio codice Matlab per creare le matrici di rotazione "R" e da lì moltiplicarle per quelle di rigidezza locale, per ottenere la rigidezza in coordinate globali.

    if x1 == x2 && y1 == y2
    if z2 > z1
    Lambda = [0 0 1; 0 1 0; -1 0 0];
    else
    Lambda = [0 0 -1; 0 1 0; 1 0 0];
    end
    else
    CXx = (x2-x1)/L;
    CYx = (y2-y1)/L;
    CZx = (z2-z1)/L;
    D = sqrt(CXx*CXx + CYx*CYx);
    CXy = -CYx/D;
    CYy = CXx/D;
    CZy = 0;
    CXz = -CXx*CZx/D;
    CYz = -CYx*CZx/D;
    CZz = D;
    Lambda = [CXx CYx CZx; CXy CYy CZy; CXz CYz CZz];
    end

    R = [Lambda zeros(3) zeros(3) zeros(3); zeros(3) Lambda zeros(3) zeros(3); zeros(3) zeros(3) Lambda zeros(3); zeros(3) zeros(3) zeros(3) Lambda];

    y = R'*k*R;

    Ho visto che su Excel c'è il comando "matrice trasposta" (che sarebbe R' in Matlab); zeros(3) è una terna di 0, serve appunto a riempire la matrice di rotazione finale che ha una forma come quella che trovate nel pdf che ho allegato qualche commento sopra. Non ho avuto modo di scaricare il file Excel di afazio, quindi non so se le aste sono state definite a partire dalle coordinate del punto iniziale e finale (x1,y1,z1... x2,y2,z2)
     
    Top
    .
  15.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    CITAZIONE (taipan95 @ 16/10/2019, 07:23) 
    non so se le aste sono state definite a partire dalle coordinate del punto iniziale e finale (x1,y1,z1... x2,y2,z2)

    Non avrei avuto altro modo per definirle.

    Per quanto riguarda la matrice di trasformazione cosi come l'hai costruita tu, esiste la possibilità di errore, cosa che ho anche evidenziato precedentemente, che si manifesta quando l'asta è verticale ed è nota, in altri ambiti, come il problema del "gimbal lock" o in ambito meccanico come "blocco cardanico".

    infatti, se consideri un'asta verticale, le coordinate x e y dei due estremi sono uguali e quindi la quantità:

    D = sqrt(CXx*CXx + CYx*CYx);

    è zero.

    Questa poi è presente nei denominatori dei termini:

    CXy = -CYx/D;
    CYy = CXx/D;

    CXz = -CXx*CZx/D;
    CYz = -CYx*CZx/D;

    con inevitabili errori di "division by zero".

    E' quindi necessario intercettare il caso e gestirlo diversamente.
     
    Top
    .
396 replies since 26/9/2019, 22:11   16302 views
  Share  
.