Почему проверки при расчёте арматуры в контрфорсе не получаются равными нулю?
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Архитектура и Строительство > Прочее. Архитектура и строительство > Почему проверки при расчёте арматуры в контрфорсе не получаются равными нулю?

Почему проверки при расчёте арматуры в контрфорсе не получаются равными нулю?

Ответ
Поиск в этой теме
Непрочитано 13.04.2011, 08:15 1 | #1
Почему проверки при расчёте арматуры в контрфорсе не получаются равными нулю?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,134

Решил вручную прикинуть степень армирования контрфорсов сетками.
Составил программу в Excel по схеме армирования при действии только момента. Высота сжатой зоны вычисляется простым способом: через равенство нулю статического момента относительно нейтральной оси.
Напряжения вычисляются но проверки не сходятся, не равны 0, поэтому прошу специалистовпосмотреть в коде. В чём ошибка в программе из-за которой проверки не равны нулю.

Просмотров: 2916
 
Автор темы   Непрочитано 17.04.2011, 06:11
1 | #2
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Извините за явные ошибки которые потом я заметил в своём коде (в частности ширина раскрытия трещин вычислялась от расчётного момента). Сейчас я код исправил и для моментов проверка обычно получается равной 0 и в то же время для продольных сил проверка не получается равной 0, а получается около 0,15. Посмотрите мой код попробуйте найти в нём ошибки! Кому удастся получить проверки равные нулю тому премия 100 рублей!
Код:
[Выделить все]
Option Explicit
Public gcolАрматура As Collection
Public Const gstrНазваниеПрограммы As String = "Армирование контфорса"
Public glngОтвет As Long

Public Sub ВычПрочнПрямоугольникаПоМоменту()
'Функция вычисляет прочность прямоугольника по изгибающему моменту
Dim objЛист As Worksheet, dblbk As Double, dblLk As Double, dblas As Double, intКолвоРядовАрм As Integer, dblds As Double, objСтержень As clsСтержень
Dim intНомРядаАрм As Integer, dbldxs As Double, dbldys As Double, dblx As Double, dbly As Double, inti As Integer, dblYmaxb As Double
'Переменные необходимые для вычисления высоты сжатой зоны
Dim dblxc As Double, dbldxc As Double, dble As Double, dblSсжат As Double, dblSраст As Double
Dim dblEb As Double, dblEs As Double, dblAlfa As Double, dblz As Double, dblYно As Double, dblAs0 As Double
'Переменные необходимые для вычисления напряжений
Dim dblAred As Double, dblSred As Double, dblIred As Double, dblI0 As Double
Dim dblYc As Double, dblzs As Double, dblzsc As Double
Dim dblMn As Double, dblMr As Double, dblSigmabmax As Double, dblSigmaSmax As Double, dblSigmaSmin As Double
Dim rngНачЯч As Range, intКолвоНагр As Integer, intНомНагр  As Integer, intКолвоАрм As Integer, intНомАрм As Integer
Dim dblNсум As Double, dblMсум As Double, dblRbmc2 As Double, dblRs As Double
Dim dblTanSigmab As Double
'Переменные для вычисления ширины раскрытия трещин
Dim dblAcr As Double, dblAcrпр As Double, dblpsi As Double, dblAr As Double, dblZsmax As Double, dblSigmaSmaxn As Double
On Error GoTo ОбработкаОшибок
'Получим основные геометрические параметры контрфорса
   Set objЛист = Sheets("Вычисления")
   dblbk = objЛист.Range("bk_") '- ширина контрфорса, (м)
   dblLk = objЛист.Range("Lk_") '- длина контрфорса, (м)
   dblas = objЛист.Range("as_") '- расстояние от края до ц.т. арматуры, (м)
   intКолвоРядовАрм = objЛист.Range("nrs_") '- количество рядов арматуры, (шт)
   dblds = objЛист.Range("ds_") '- диаметр стержней арматуры, (м)
   dblAcrпр = objЛист.Range("Acrпр_")
   dblEs = objЛист.Range("Es_")
   dblYmaxb = dblLk / 2 '- макисмальная координата края бетона как сверху так и снизу, (м)
'Заполним список арматуры
   Set gcolАрматура = New Collection
   dbldxs = dblbk - 2 * dblas
   dbldys = (dblLk - 2 * dblas) / (intКолвоРядовАрм - 1) 'расстояние между рядами арматуры по вертикали
   dblx = dbldxs / 2 '- начальная координата x стержней
   dbly = dblLk / 2 - dblas '- начальная координата самого верхнего стержня
   intКолвоАрм = 2 * intКолвоРядовАрм '- количество рядов арматуры
   For intНомРядаАрм = 1 To intКолвоРядовАрм
      Set objСтержень = New clsСтержень
      objСтержень.XКоорд = -dblx: objСтержень.YКоорд = dbly
      objСтержень.НомСтержня = 2 * intНомРядаАрм - 1
      gcolАрматура.Add objСтержень
      Set objСтержень = New clsСтержень
      objСтержень.XКоорд = dblx: objСтержень.YКоорд = dbly
      objСтержень.НомСтержня = 2 * intНомРядаАрм
      gcolАрматура.Add objСтержень
      dbly = dbly - dbldys
   Next intНомРядаАрм
'Вычислим высоту сжатой зоны из уравнения равенства статического момента
   dblEb = objЛист.Range("Eb_") '- модуль упругости бетона, (м)
   dblEs = objЛист.Range("Es_") '- модуль упругости арматуры, (м)
   dblAlfa = dblEs / dblEb '- коэффициент приведения характеристик стали к бетону
   dble = 0.000001 '- точность вычислений высоты сжатой зоны 0.1 мм
   dbldxc = 0.01 '- приращение высоты изменения высоты сжатой зоны, (м)
   dblxc = dbldxc '- начальная высота сжатой зоны, (м)
   dblAs0 = Atn(1) * dblds ^ 2 '- площадь одного стержня арматуры, (м2)
   Do While dbldxc >= dble
'Вычислим статический момент сжатой зоны бетона
      dblSсжат = dblbk * dblxc ^ 2 / 2 'статический момент вычисленный без учёта треугольной эпюры моментов в сжатой зоне как по значениям так и по координате центра тяжести
'Надо ли учитывать треугольную эпюру напряжений при вычислении статического момента в сжатой зоне?
'При проверке этой гипотезы надо учитывать что произведение напряжения на ститеский момент даёт величину момента
'Вычислим статический момент с учётом координаты центра тяжести как для треугольной эпюры напряжений
'      dblSсжат = dblbk * dblxc ^ 2 * 2 / 3 'статический момент вычисленный с учётом треугольной эпюры моментов в сжатой зоне по координате центра тяжести
'      dblSсжат = dblbk * dblxc ^ 2 / 3 'статический момент вычисленный с учётом треугольной эпюры моментов в сжатой зоне как по значениям так и по координате центра тяжести
      dblSраст = 0#
'Вычислим статические моменты от арматуры
      dblYно = dblYmaxb - dblxc '- координата нейтральной оси сечения
      For intНомРядаАрм = 1 To intКолвоРядовАрм
         Set objСтержень = gcolАрматура(intНомРядаАрм * 2)
         dblz = objСтержень.YКоорд - dblYно
         If dblz > 0 Then
            dblSсжат = dblSсжат + 2 * dblAs0 * dblz * dblAlfa
            dblSсжат = dblSсжат - 2 * dblAs0 * dblz '-вычтем из статического момента сжатой зоны бетона площадь занятую арматурой
         Else
            dblSраст = dblSраст + 2 * dblAs0 * dblz * dblAlfa
         End If
      Next intНомРядаАрм
'Сравним статические моменты сжатой и растянутой частей
'сначала приращение сжатой зоны имеет положительный знак, значит подразумевается что статический момент сжатой зоны меньше чем растянутой и высоту сжатой зоны надо увеличивать
'если обнаружится что статический момент сжатой зоны стал больше чем растянутой значит надо возвращаться к предыдущему значению высоты сжатой зоны
'делить приращение на 2, прибавлять новое приращение и проверять условие равенства статических моментов
'если окажется что приращение стало меньше точности вычислений, то прибавлять поделённое на 2 приращение высоты сжатой зоны не надо а просто
'выйти из цикла и получится минимальная найденная высота сжатой зоны
      If Abs(dblSсжат + dblSраст) <= dble Then
         Exit Do
      ElseIf dblSсжат < Abs(dblSраст) Then
         dblxc = dblxc + dbldxc
      Else
         dblxc = dblxc - dbldxc
         dbldxc = dbldxc / 2
         If dbldxc < dble Then Exit Do
         dblxc = dblxc + dbldxc
      End If
   Loop
'Запишем полученную высоту сжатой зоны на лист
   objЛист.Range("Sсжат") = dblSсжат '- статический момент сжатой зоны, (м3)
   objЛист.Range("Sраст") = dblSраст '- статический момент растянутой зоны, (м3)
   objЛист.Range("xc_") = dblxc '- вычисленная высота сжатой зоны, (м)
   dblYно = dblLk / 2 - dblxc
'Вычислим площадь приведённого сечения, статический момент и момент инерции приведённого сечения относительно нейтральной оси
   Call ВычислитьASIred(dblbk, dblxc, dblYно, gcolАрматура, dblAs0, dblAlfa, dblAred, dblSred, dblIred)
   objЛист.Range("Ared") = dblAred '- приведённая площадь контрфорса, (м3)
   objЛист.Range("Sred") = dblSred '- приведённый статический момент контрфорса, (м3)
   objЛист.Range("Ired") = dblIred '- приведённый момент инерции контрфорса, (м)
'Вычислим переменные для вычисления ширины раскрытия трещин
   dblAr = dblbk * (dblas + 6 * dblds)
   dblpsi = 1.5 * Sqr(dblAr / (2 * dblds))
'Вычислим расстояния до наиболее растянутой и наиболее сжатой арматуры
   Set rngНачЯч = objЛист.Range("НачЯчТаблУсилий").Cells(2, 2)
   intКолвоНагр = objЛист.Range("ns_")
   dblRbmc2 = objЛист.Range("Rbmc2")
   dblRs = objЛист.Range("Rs_")
   For intНомНагр = 1 To intКолвоНагр
      dblMn = rngНачЯч.Cells(intНомНагр, 1)
      dblMr = rngНачЯч.Cells(intНомНагр, 2)
'Вычислим максимальное напряжение в сжатом железобетоне Sigmabmax=-(Mвнс_/I0*x0*1000+Nвнс_/Ared*10)
      dblSigmabmax = dblMr / dblIred * dblxc
'Вычислим напряжения в арматуре
      For intНомРядаАрм = 1 To intКолвоРядовАрм
         Set objСтержень = gcolАрматура(2 * intНомРядаАрм)
         dblz = objСтержень.YКоорд - dblYно
         objСтержень.Sigma = -dblAlfa * dblMr / dblIred * dblz
         gcolАрматура(2 * intНомРядаАрм - 1).Sigma = objСтержень.Sigma
      Next intНомРядаАрм
      dblSigmaSmin = gcolАрматура(1).Sigma
      dblSigmaSmax = gcolАрматура(intКолвоАрм).Sigma
'Вычислим проверочную сумму продольных усилий на ось X
      dblNсум = -dblSigmabmax / 2 * dblbk * dblxc
      dblTanSigmab = dblSigmabmax / dblxc
'Вычислим проверочный момент внутренних сил, который должен равняться внешнему моменту
      dblMсум = dblSigmabmax / 3 * dblbk * dblxc ^ 2
      For intНомРядаАрм = 1 To intКолвоРядовАрм
         Set objСтержень = gcolАрматура(2 * intНомРядаАрм)
         dblz = objСтержень.YКоорд - dblYно
         If dblz > 0 Then
            dblNсум = dblNсум - 2 * dblz * dblTanSigmab * dblAs0 '-вычтем из силы в сжатой зоне бетона площадь занятую арматурой
            dblMсум = dblMсум - 2 * dblz * dblTanSigmab * dblz * dblAs0 '-вычтем из момента в сжатой зоне бетона площадь занятую арматурой
         End If
         dblNсум = dblNсум - Sgn(dblz) * 2 * objСтержень.Sigma * dblAs0
         dblMсум = dblMсум + Abs(2 * objСтержень.Sigma * dblAs0 * dblz)
      Next intНомРядаАрм
      dblMсум = dblMсум - dblMr
'Вычислим ширину раскрытия трещин в контрфорсе
      dblZsmax = -dblLk / 2 + dblas - dblYно
      dblSigmaSmaxn = -dblAlfa * dblMn / dblIred * dblZsmax
      dblAcr = dblSigmaSmaxn / dblEs * dblpsi
'Запишем полученные ответы на лист
      rngНачЯч.Cells(intНомНагр, 3) = dblSigmabmax
      rngНачЯч.Cells(intНомНагр, 4) = dblRbmc2
      rngНачЯч.Cells(intНомНагр, 5) = dblSigmaSmin
      rngНачЯч.Cells(intНомНагр, 6) = dblSigmaSmax
      rngНачЯч.Cells(intНомНагр, 7) = dblRs
      rngНачЯч.Cells(intНомНагр, 8) = dblNсум
      rngНачЯч.Cells(intНомНагр, 9) = dblMсум
      rngНачЯч.Cells(intНомНагр, 10) = Round(dblAcr, 4)
      rngНачЯч.Cells(intНомНагр, 11) = dblAcrпр
   Next intНомНагр
'Выведем сообщение о выполненной работе
   MsgBox "Высота сжатой зоны xc=" & dblxc & " м", vbInformation, gstrНазваниеПрограммы
   Exit Sub
ОбработкаОшибок:
   MsgBox "При вычислении прочности прямоугольника по изгибающему моменту произошла ошибка!" & vbLf & vbLf & _
   "Описание ошибки: " & Err.Description & vbLf & vbLf & _
   "Номер ошибки = " & Err.Number, vbInformation, gstrНазваниеПрограммы
   Resume Next
End Sub

Public Function ВычислитьASIred(dblbk As Double, dblxc As Double, dblYно As Double, vАрматура As Variant, dblAs0 As Double, dblAlfa As Double, _
dblAred As Double, dblSred As Double, dblIred As Double)
'Функция вычисляет приведённую площадь, статичекий момент и момент инерции относительно нейтральной оси
Dim intНомАрм As Integer, intКолвоАрм As Integer, objСтержень As clsСтержень, dblz As Double
On Error GoTo ОбработкаОшибок
   dblAred = dblxc * dblbk
   dblSred = dblbk * dblxc ^ 2 / 2
'   dblSred = dblbk * dblxc ^ 2 * 2 / 3
   dblIred = dblbk * dblxc ^ 3 / 3
   intКолвоАрм = vАрматура.Count
   For intНомАрм = 1 To intКолвоАрм
      Set objСтержень = vАрматура(intНомАрм)
      dblAred = dblAred + dblAs0 * dblAlfa
      dblz = objСтержень.YКоорд - dblYно
      If dblz > 0 Then
         dblSred = dblSred - dblAs0 * dblz  '-вычтем из статического момента сжатой зоны бетона площадь занятую арматурой
         dblIred = dblIred - dblAs0 * dblz ^ 2 '-вычтем из момента инерции сжатой зоны бетона площадь занятую арматурой
      End If
      dblSred = dblSred + dblAs0 * dblz * dblAlfa
      dblIred = dblIred + dblAs0 * dblz ^ 2 * dblAlfa
   Next intНомАрм
   Exit Function
ОбработкаОшибок:
   MsgBox "При вычислении приведённых характеристик сечения произошла ошибка!" & vbLf & vbLf & _
   "Описание ошибки: " & Err.Description & vbLf & vbLf & _
   "Номер ошибки = " & Err.Number, vbInformation, gstrНазваниеПрограммы
   Resume Next
End Function
Если ничего лучшего не придумаете то я буду использовать при подборе арматуры в контрфорсе именно эту программу!

Последний раз редактировалось МишаИнженер, 17.04.2011 в 06:17.
МишаИнженер вне форума  
Ответ
Вернуться   Форум DWG.RU > Архитектура и Строительство > Прочее. Архитектура и строительство > Почему проверки при расчёте арматуры в контрфорсе не получаются равными нулю?

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск