The Structural Engineer's Corner

Eng. Onorio Francesco Salvatore

Verifica e progetto di pilastri in c.a. con metodo semplificato

Written By: Francesco Salvatore Onorio - Apr• 03•09

dominio3

Oggi forniamo un codice che consente di calcolare il momento resistente di una sezione per un fissato valore dello sforzo normale. Sostanzialmente è un codice VBA da inserire in un foglio Excel. La procedura è la seguente:

  1. Aprire un nuovo foglio Excel, e quindi aprire la pagina progetto di Visual Basic;
  2. inserire un nuovo modulo;
  3. copiare ed incollare il codice qui sotto;
  4. tornare nel foglio Excel;
  5. nella voce inserisci funzione trovate la nuova funzione tra quelle definite dall’utente.

La procedura segue le indicazioni contenute in “Verifica e progetto allo stato limite ultimo di pilastri in c.a. a sezione rettangolare: un metodo semplificatoAurelio Ghersi e Marco Muratore.

Le resistenze di calcolo dell’acciaio e del cls sono quelle definite nel DM08. In particolare:
fyd = fyk/gamma.s
fcd =alfa.cc*fck/gamma.c

Ecco il codice da inserire:

Public Function VSezRettSLU(B As Double, H As Double, c As Double, Af As Double, fyd As Double, fcd As Double, Ned As Double, flag As Double) As Variant
‘La funzione calcola il momento resistente
‘ di una sezione rettangolare in c.a. con armatura doppia e simmetrica
‘ per fissato sforzo normale di calcolo Ned
‘Argomenti della funzione sono:
‘B- base della sezione (mm)
‘H- altezza della sezione (mm)
‘C- copriferro (mm)
‘Af- area armatura superiore ed inferiore (mmq)
‘fyd – resistenza di calcolo dell’acciaio (MPa)
‘fyc – resistenza di calcolo del cls (MPa)
‘Ned- sforzo normale normale di calcolo (KN)positivo se di compressione
‘flag- parametro di controllo in base al quale la funzione restituisce il valore:

‘flag=1 Ns.Rd = resistenza di calcolo per trazione pura in KN
‘flag=2 Ncc.Rd = resistenza di calcolo per compressione pura in KN
‘flag=3 Momento di rottura per fissato sforzo normale in KN*m
‘Se viene fornito un flag diverso dai precedenti, viene impostato a 3

‘La funzione effettua minimi controlli
‘ e nel caso di geometria nulla o dati privi di senso, restituisce la stringa N.B.

Dim Ncc_Rd As Double

Dim Nc_Rd As Double
Dim Mc_Rd As Double

Dim Ns_Rd As Double
Dim Ms_Rd As Double

Dim Mrd As Double
Dim q As Double  ‘rigo aggiunto

‘—– controlli di validita’ dei dati——————–
If flag < 1 Or flag > 3 Then
flag = 3
End If

If B <= 0 Or H <= 0 Or Af <= 0 Or c <= 0 Or fyd <= 0 Or fcd <= 0 Then
‘ controlla dimensioni negative o nulle della sezione
VSezRettSLU = “N.B.”
Exit Function
End If

Ned = Ned * 1000

Ncc_Rd = B * H * fcd + 2 * Af * fyd

Nc_Rd = 289 * B * H * fcd / 594
Mc_Rd = 289 * B * H ^ 2 * fcd / 2376

Ns_Rd = -2 * Af * fyd
Ms_Rd = Af * (H – 2 * c) * fyd

Select Case Ned

Case Is < Ns_Rd
Mrd = 0
Case Ns_Rd To 0
Mrd = Ms_Rd * (1 + Ned / Ns_Rd)
Case 0 To Nc_Rd
Mrd = (Mc_Rd * (1 – ((Ned – Nc_Rd) / Nc_Rd) ^ 2) + Ms_Rd)
Case Is > Ncc_Rd
Mrd = 0
Case Nc_Rd To Ncc_Rd
q = 1 + (Nc_Rd / (Nc_Rd + Ns_Rd)) ^ 2
Mrd = (Mc_Rd – Ms_Rd) * (1 – ((Ned – Nc_Rd) / (Nc_Rd + Ns_Rd)) ^ q) ‘ corretto Mc – rd in Mc_Rd

End Select

Select Case flag
Case 1
VSezRettSLU = Ns_Rd / 1000
Case 2
VSezRettSLU = Ncc_Rd / 1000
Case 3
VSezRettSLU = Mrd / 1000000

End Select

End Function

Si ringrazia l’ing. Afazio per il contributo.

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

19 Comments

  1. Afazio says:

    Le virgolette che precedono la parola Public non van messe

    inoltre il valore di fcd e’ quello previsto nel DM08 che pertanto e’ gia comprensivo del coefficiente alfa, denominato alfa.cc nel DM.

    fcd=alfa.cc*fck/gamma.c

    Afazio


  2. Ho editato le virgolette (le metto per abitudine quando uso il quote) e ho aggiunto la definizione delle resistenze.

    Grazie Afazio.

  3. Gennaro says:

    “inserire un nuovo modulo” ???

  4. Afazio says:

    @Gennaro

    Si, quando sei in ambiente programmazione di visualBasic per excel, devi aggiungere un nuovo modulo al progetto che ha lo stesso titolo del tuo file. Lo aggiungi premendo col destro in una qualsiasi voce del progetto.

    Afazio

  5. Francesco Durante says:

    Ma funziona? Ho implementato un pilastro b=350 mm, h=400 mm, Af = 600 mmq, fyd=390MPa, fcd=14MPa, C=20 mm. Ottengo questi risultati
    con NEd =-100kN viene MRd=102.24 KNm
    con NEd =0kN viene MRd=84.24 KNm
    con NEd =+100kN viene MRd=103.19 KNm
    cioè il dominio presenta un minimo per NEd=0.


  6. Ricontrolla i valori che hai inserito e l’uso dei flag, perché il foglio funziona.
    Saluti.

  7. Francesco Durante says:

    Ho controllato e non funziona. E si capisce anche leggendo il listato che non può funzionare. Nel CASE per Ned compreso tra Ns_Rd e 0 l’espressione per il momento ultimo è Mrd = Ms_Rd * (1 + Ned / Ns_Rd). Questa espressione per Ned = Ns_Rd deve assumere valore 0 (la sezione collassa per sola trazione). Invece siccome Ns_Rd è stato definito negativo (Ns_Rd = -2 * Af * fyd) il valore che viene fuori per Mrd è 2*Ms_Rd. Conviene definire Ns_RD = 2*Af*fyd come indicato nell’articolo di Ghersi. Per distinguere i CASE si può porre il segno meno davanti a Ns_Rd (ad es. nel primo caso: Case Is < -Ns_Rd).
    Oppure andrebbe cambiata la formula del Mrd ponendo un segno meno davanti a Ned/Ns_Rd ma io lascerei la formula come è stata ricavata dall'autore.
    Inoltre ci sono altri due errori.
    Nella espressione di Mrd per Ned tra Nc_Rd e Ncc_Rd il primo fattore è (Mc_Rd + Ms_Rd) e non (Mc_Rd – Ms_Rd). L'altro errore è che nella stessa espressione, della quantità elevata a q va prima calcolato il valore assoluto. Quindi va anteposto Abs in VB.
    Fatte queste modifiche il programma va alla grande!!
    Saluti,
    Francesco Durante

  8. Afazio says:

    Ho abbandonato da parecchio tempo questa funzione: l’ho scritta e lasciata qui per essere sottoposta al controllo di eventuali utilizzatori ed alle correzione di inevitabili bug/errori da parte di volenterosi.
    Non ho piu’ nè tempo nè voglia di controllare quanto da te segnalato dato che successivamente mi sono dedicato ad una funzione che mi determina Mrd in maniera esatta (e non approssimata come fa questa in discussione) e che preferisco dedicare i miei sforzi piu’ alla nuova funzione che non alla vecchia, purtuttavia se hai verificato che con le correzioni che proponi la funzione va alla grande, ti esorto a pubblicare in queste pagine la versione corretta affinche possa essere utilizzata da altri.
    Grazie.

    Afazio.

    @Lexatus: in merito alla mia reiscrizione su ingforum…. non ci penso proprio ed anzi me ne tengo lontano. Non vado nemmeno a spulciare o a curiosare. Ritengo di non essere meritevole.
    Un caro saluto.

  9. Afazio says:

    @ Francesco Durante:
    da una veloce lettura evidenzio quanto segue:
    non e’ affatto vero che per Ned compreso tra Ns_Rd e 0 il momento di rottura deve essere nullo. Il momento di rottura, invece, ha un valore non nullo e lo si puo’ facilmente desumere dal tipico dominio di rottura.
    Il momento di rottura e’ nullo solo nei due punti di intersezione del dominio con l’asse delle ascisse (cioè con l’asse degli sforzi normali).

  10. Afazio says:

    @ Francesco Durante:
    sempre dalla veloce lettura:
    la parte in cui viene determinato l’esponete q è:
    Case Nc_Rd To Ncc_Rd
    q = 1 + (Nc_Rd / (Nc_Rd + Ns_Rd)) ^ 2</b)

    la funzione esegue questa parte di codice solo se Ned è compreso tra i due valori Nc_Rd ed Ncc_Rd che sono entrambi valori positivi. Per questo motivo non necessita sottoporre i valori alòla funzione ABS di VBA

  11. Afazio says:

    @Tutti

    spero di riuscire a trovare il tempo per postare la nuova funzione (in realtà sono piu’ funzioni) per la determinazione di Mrd per:
    sezione rettangolare
    sezione trapezia
    sezione circolare
    sezione a T

    con armatura doppia ed asimmetrica.

    Con l’occasione ricordo che la funzione oggetto del presente 3d e’ applicabile solo a sezioni rettangolari con armatura doppia e simmetrica.

    saluti.

    Afazio alias gio’


  12. Caro Giovanni, quando vuoi pubblicare qualcosa non esitare. I tuoi lavori sono sempre ottimi. Anche la funzione di cui parli sarebbe interessante.

    In merito ad IngForum, si, ti capisco. Ad ogni modo, ogni tanto mi piacerebbe scambiare due chiacchiere con te. Frequenti altri forum, tipo quello su Bebnet?

  13. Afazio says:

    Ho abbandonato anche quello. Troppo tacco e punta per i miei gusti. Io preferisco fumare le mie sigarette in libertà. Anche di quello ritengo di non esserne meritevole.
    Quando hai voglia di comunicare con me hai sempre la mia mail personale. Non ho risposto alla tua ultima perchè pensavo di risponderti qui. Ma sappi che ogni tuo contatto è gradito.

    ciao

  14. Francesco Durante says:

    @Afazio
    Premetto che sono grato a chi ha organizzato questo forum e a coloro che vi pubblicano commenti o strumenti. Ero alla ricerca di un algoritmo che permettesse di implementare la verifica dei pilastri in excel dato che non mi piace lavorare con software ingessati che sulla carta fanno tutto e poi all’atto pratico rimani bloccato perchè hanno un menu vecchio; o, il che è anche peggio, ti sputano fuori risultati che non riesci a controllare. Per cui ben venga questo blog che è l’unico che ho trovato che rispondeva al mio bisogno. Semplicemente avevo visto che qualcosa non andava e, nello sprito del forum, ho cercato di dare il mio contributo.
    Entrando nel merito del mio intervento, non ho detto che “per Ned compreso tra Ns_Rd e 0 il momento di rottura deve essere nullo”. Invece ho detto che “per Ned = Ns_Rd deve assumere valore 0”.
    Per quanto riguarda la presenza del valore assoluto nell’espressione di q effettivamente avevo verificato che non comportava errori, ma ritengo che possa essere applicato dato che l’autore ha ritenuto di farlo.
    Per quanto riguarda le modifiche che ho apportato penso che siano già chiare dal mio precedente post. Se qualcuno lo ritiene comunque posterò il codice.
    Per quanto riguarda il tuo codice per la verifica esatta dei pilastri anche con armature asimmetriche e per sezioni dalla geometria più complessa della rettangolare, ti invito caldamente a pubblicarlo perchè farai un grande favore innanzitutto a me, e poi a tutti i fruitori del forum dato che strumenti di questo tipo non si trovano in giro.
    Cordiali saluti a tutti,
    Francesco Durante

  15. Afazio says:

    @ Francesco Durante.
    Tranquillo, non ho affatto inteso i tuoi appunti come fosse una critica negativa, anzi ben vengano. Ma come già accennato ho abbandonato da parecchio quella funzione ed il controllo di quanto da te annotato mi veniva alquanto difficile. In effetti mancherebbe nel primo case il segno di uguaglianza col quale si colmerebbe anche il caso specifico da te segnalato.
    Per quanto riguarda la nuova funzione, intanto inizio qui a trascrivere la prima invitando il gestore di questo blog a spostarla in apposito 3d dove aggiungerei le parti a seguire.

    Function arcCos(numero As Double) As Double
    arcCos = Atn(-numero / Sqr(-numero * numero + 1)) + 2 * Atn(1)
    End Function

    Function CalcEpsilon_rottura(H As Double, dmin As Double, _
    di As Double, delta As Double, _
    Optional epsSmax As Double = 0.0675, _
    Optional epsCmax As Double = 0.0035, _
    Optional epsCrif As Double = 0.002) As Double
    ‘Restituisce la deformazione limite per il calcolo del dominio MN funzione dei parametri immessi
    ‘ Attenzione nell’uso: valori positivi di epsilon per il cls non hanno alcun senso! Controllare la funzione SigmaC
    ‘Parametri:
    ‘ h=altezza sezione (mm)
    ‘ dmin = copriferro superiore o inferiore (mm)
    ‘ di = distanza della fibra di cui si calcola epsilon dall’estremità superiore della sezione (mm)
    ‘ delta = coefficiente di campo (da 0 a 5 per i momenti positivi che tendono le fibre inferiori,
    ‘ da 5 a 10 per i momenti negativi che tendono le fibre superiori)
    ‘ epsSmax = deformazione limite dell’acciaio
    ‘ epsCmax = deformazione limite del cls
    ‘ epsCrif = deformazione limite del cls per compressione semplice

    Dim x0 As Double ‘ variabile di appoggio

    Select Case delta
    Case 0 To 1
    CalcEpsilon_rottura = epsSmax – (H – dmin – di) / (H – dmin) * (epsSmax * delta)
    Case 1 To 2
    CalcEpsilon_rottura = epsSmax – (H – dmin – di) / (H – dmin) * (epsSmax + epsCmax * (delta – 1))
    Case 2 To 3
    CalcEpsilon_rottura = -epsCmax + di / (H – dmin) * (epsCmax + epsSmax * (3 – delta))
    Case 3 To 4
    CalcEpsilon_rottura = epsCmax * (-1 + di * (4 – delta) / (H – dmin) + di * (delta – 3) / H)
    Case 4 To 5
    x0 = (epsCmax – epsCrif) * H / epsCmax
    CalcEpsilon_rottura = -epsCrif + epsCrif * (5 – delta) * (di – x0) / (H – x0)
    Case 5 To 6
    CalcEpsilon_rottura = -(6 – delta) * epsCrif – (delta – 5) * epsCmax * di / H
    Case 6 To 7
    CalcEpsilon_rottura = -epsCmax * ((7 – delta) * dmin * (H – di) / (H * (H – dmin)) + (di – dmin) / (H – dmin))
    Case 7 To 8
    CalcEpsilon_rottura = -epsCmax * (di – dmin) / (H – dmin) + (delta – 7) * epsSmax * (H – di) / (H – dmin)
    Case 8 To 9
    CalcEpsilon_rottura = (epsSmax + (9 – delta) * epsCmax) * (H – di) / (H – dmin) – (9 – delta) * epsCmax
    Case 9 To 10
    CalcEpsilon_rottura = (10 – delta) * epsSmax * (H – di) / (H – dmin) + (delta – 9) * epsSmax
    Case Else
    CalcEpsilon_rottura = 0
    End Select

    End Function

    Il commento a questa funzione e la illustrazione di cio’ che fa ed a cosa servirà nell’intero codice, saranno aggiunti nel nuovo 3d.


  16. Cari,
    vi sto seguendo e questi scambi sono utili. Mi scuso con Francesco Durante se il tono del primo intervento è sembrato un po’ “secco”, ma la funzione è stata discussa su IngForum (almeno così ricordo) e non sembravano esserci errori (ma, alla fine, ci sono o no? Non ho avuto modo di seguire con particolare attenzione, conto di farlo nel weekend).

    @Afazio
    Si, ti conosco bene. Seguire i tuoi interventi mette allegria, oltre al fatto che c’è sempre da imparare qualcosa.
    Pensandoci, potremmo farlo da noi un forum…

    Comunque, adesso sono impegnato con una scadenza, ma entro domani conto di fare un articolo ad hoc sulla tua funzione, in modo che possa essere diffusa e discussa. Grazie mille, come al solito, per i tuoi contributi.


  17. […] * il riferimento è al seguente articolo: Verifica e progetto di pilastri in c.a. con metodo semplificato. […]

  18. Enert says:

    bello……..

Leave a Reply

Your email address will not be published. Required fields are marked *