Свод правил СП 64.13330.2017 (актуализированная редакция СНиП II-25-80, с Изменениями № 1, 2, 3, 4 от 28.12.2023).
Настоящий блокнот предназначен для инженеров-конструкторов, проектировщиков строительных конструкций (ПГС) и расчетчиков деревянных зданий и сооружений.
Современные российские нормы проектирования деревянных конструкций (СП 64.13330.2017) содержат две параллельные системы классификации лесоматериалов, а также нормативы на современные клеёные и композитные материалы:
Традиционная классификация по сортам цельной древесины (ГОСТ 8486 / Таблицы 3 и В.1 СП 64):
Европейско-гармонизированная система классов прочности (ГОСТ 33080 / Таблица В.3 СП 64):
Конструкционная клеёная древесина (Glulam, ГОСТ 20850 / Таблица В.4 СП 64):
Брус многослойный клееный из шпона (LVL, ГОСТ Р 56705 / Таблицы В.2, В.2а, В.7 СП 64):
Конструкционные древесные плиты:
Расчетное сопротивление древесины $R$ для конкретного напряженного состояния вычисляется по формуле:
$$R = \frac{R_n}{\gamma_m} \cdot m_в \cdot m_{длт} \cdot m_т \cdot m_{сс} \cdot m_{сп}$$где:
При расчете по прогибам и деформациям модуль упругости древесины принимается равным:
$$E_{II} = E_{0,ср} \cdot m_в \cdot m_{длт,упр} \cdot m_т \cdot m_{сс}$$где:
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import Markdown, HTML, display
import ipywidgets as widgets
from sp64_materials import (
Timber,
StrengthClassWood,
Glulam,
LVL,
Plywood,
OSB3,
WoodContext,
list_strength_classes,
list_glulam_classes,
list_lvl_classes,
list_service_classes,
list_load_duration_modes,
list_wood_species,
)
print("Нормативный модуль sp64_materials успешно загружен и готов к инженерным расчетам.")
Панель позволяет инженеру оперативно сконфигурировать материал и условия эксплуатации объекта.
Расчетный вывод отделен от виджетов, гарантируя стабильную работу nbviewer и пакетный экспорт через nbconvert.
def configure_control(control):
control.style.description_width = "200px"
control.layout = widgets.Layout(width="98%")
return control
material_category = configure_control(widgets.Dropdown(
options={
"Классы прочности цельной древесины C14–C50 (Табл. В.3)": "strength_class",
"Цельная сортовая древесина по сортам 1–3 (Табл. 3, В.1)": "timber",
"Конструкционная клеёная древесина K20–K36 (Табл. В.4)": "glulam",
"Брус клееный из шпона LVL 1/K45..3/K35 (Табл. В.2)": "lvl",
"Берёзовая строительная фанера ФСФ / ФБС (Табл. В.5)": "plywood",
"Ориентированно-стружечные плиты OSB/3 (Табл. В.6)": "osb3",
},
value="strength_class",
description="Категория лесоматериала:",
))
strength_class_dd = configure_control(widgets.Dropdown(
options=list_strength_classes(),
value="C24",
description="Класс прочности C:",
))
timber_sort_dd = configure_control(widgets.Dropdown(
options=[("1 сорт (отборный/несущий)", 1), ("2 сорт (рядовой строительный)", 2), ("3 сорт (малонагруженный)", 3)],
value=2,
description="Сорт древесины (ГОСТ 8486):",
))
timber_species_dd = configure_control(widgets.Dropdown(
options=[
("Сосна обыкновенная", "pine"),
("Ель европейская", "spruce"),
("Лиственница европейская (m_пор = 1.0)", "larch_european"),
("Лиственница сибирская/дальневосточная (m_пор = 1.2)", "larch_other"),
("Кедр сибирский", "cedar"),
("Пихта сибирская", "fir"),
],
value="pine",
description="Порода древесины:",
))
glulam_class_dd = configure_control(widgets.Dropdown(
options=list_glulam_classes(),
value="K24",
description="Класс клееной древесины K:",
))
lvl_class_dd = configure_control(widgets.Dropdown(
options=list_lvl_classes(),
value="1/K45",
description="Марка бруса LVL:",
))
load_duration_dd = configure_control(widgets.Dropdown(
options=[
("А — постоянная нагрузка (m_dlt = 1.00)", "А"),
("Б — длительная полезная нагрузка (m_dlt = 0.90)", "Б"),
("В — кратковременная переходная (m_dlt = 0.80)", "В"),
("Г — кратковременная снеговая нагрузка (m_dlt = 0.66)", "Г"),
("Д — кратковременная полезная нагрузка (m_dlt = 0.60)", "Д"),
("Е — кратковременная технологическая (m_dlt = 0.50)", "Е"),
("Ж — ветровая расчетная нагрузка (m_dlt = 0.40)", "Ж"),
("К — монтажные кратковременные нагрузки (m_dlt = 0.25)", "К"),
],
value="Г",
description="Режим длительности нагрузки:",
))
service_class_dd = configure_control(widgets.Dropdown(
options=[
("1а — отапливаемые сухие помещения (Wд ≤ 12%, m_v = 1.00)", "1а"),
("1б — отапливаемые с нормальной влажностью (Wд ≤ 12%, m_v = 1.00)", "1б"),
("2 — открытый воздух под навесом (Wд ≤ 20%, m_v = 1.00)", "2"),
("3 — открытый воздух без защиты (Wд ≤ 25%, m_v = 0.90)", "3"),
("4а — влажные помещения/грунт (Wд > 20%, m_v = 0.85)", "4а"),
("4б — агрессивная влажная среда (Wд > 20%, m_v = 0.75)", "4б"),
],
value="2",
description="Класс условий эксплуатации:",
))
temperature_slider = configure_control(widgets.FloatSlider(
value=20.0,
min=20.0,
max=50.0,
step=2.5,
description="Температура среды T, °C:",
))
service_life_dd = configure_control(widgets.Dropdown(
options=[
("50 лет (базовый проектный срок службы, m_сс = 1.0)", 50.0),
("75 лет (повышенная долговечность, m_сс = 0.9)", 75.0),
("100 лет (уникальные здания и сооружения, m_сс = 0.8)", 100.0),
],
value=50.0,
description="Срок службы сооружения:",
))
wood_box = widgets.VBox(
[
widgets.HTML("<b>Параметры нормативного лесоматериала (СП 64.13330.2017)</b>"),
material_category,
strength_class_dd,
timber_sort_dd,
timber_species_dd,
glulam_class_dd,
lvl_class_dd,
widgets.HTML("<b>Эксплуатационный контекст (WoodContext: среда, нагрузки, долговечность)</b>"),
load_duration_dd,
service_class_dd,
temperature_slider,
service_life_dd,
],
layout=widgets.Layout(border="1px solid #ddd", padding="10px"),
)
display(wood_box)
Для проектировщика принципиально важно понимать физические отличия в поведении различных материалов. Сопоставим 4 основных конструкционных материала при типовых условиях строительства:
# Эталонный контекст: снеговая нагрузка (режим Г), класс 2, Т = 20 °C
ctx_standard = WoodContext(load_duration="Г", service_class="2", temperature_c=20.0, service_life_years=50.0)
mat_timber = Timber(sort=2, species="pine", geometry_case="rectangular_edge_h_le_500", context=ctx_standard)
mat_c24 = StrengthClassWood("C24", context=ctx_standard)
mat_k24 = Glulam("K24", context=ctx_standard)
mat_lvl = LVL("1/K45", context=ctx_standard)
materials_compare = [
("Сосна сорт 2 (ГОСТ 8486)", mat_timber, "#1f77b4"),
("Класс C24 (ГОСТ 33080)", mat_c24, "#2ca02c"),
("Клеёная K24 (ГОСТ 20850)", mat_k24, "#ff7f0e"),
("LVL 1/K45 (ГОСТ Р 56705)", mat_lvl, "#9467bd"),
]
fig, axes = plt.subplots(2, 2, figsize=(14, 10.5))
fig.suptitle("Сравнительный инженерный анализ материалов по СП 64.13330.2017 (Режим «Г», Класс 2)", fontsize=13, fontweight="bold")
# График 1: Расчетные сопротивления по основным силовым воздействиям
ax1 = axes[0, 0]
categories = ["R_и (изгиб)", "R_с || (сжатие)", "R_р || (растяжение)", "R_ск || (скалывание)"]
x = np.arange(len(categories))
bar_width = 0.2
for idx, (name, mat, color) in enumerate(materials_compare):
vals = [
mat.resistance("bending"),
mat.resistance("compression_parallel"),
mat.resistance("tension_parallel"),
mat.resistance("shear_parallel"),
]
bars = ax1.bar(x + idx * bar_width, vals, bar_width, label=name, color=color, alpha=0.9, edgecolor="black", linewidth=0.6)
for bar in bars:
height = bar.get_height()
ax1.annotate(f"{height:.1f}",
xy=(bar.get_x() + bar.get_width() / 2, height),
xytext=(0, 3), textcoords="offset points",
ha="center", va="bottom", fontsize=8, fontweight="bold")
ax1.set_title("Расчетные сопротивления R, МПа (при режиме «Г»)", fontsize=11)
ax1.set_xticks(x + bar_width * 1.5)
ax1.set_xticklabels(categories, fontsize=9)
ax1.set_ylabel("Расчетное сопротивление R, МПа", fontsize=10)
ax1.grid(True, linestyle="--", alpha=0.35)
ax1.legend(loc="upper right", fontsize=8.5)
# График 2: Реологическое влияние длительности нагрузок на сопротивление изгибу R_и
ax2 = axes[0, 1]
modes = ["А", "Б", "В", "Г", "Д", "Е", "Ж", "К"]
mode_names = ["А\n(пост.)", "Б\n(длит.)", "В\n(перех.)", "Г\n(снег)", "Д\n(полезн.)", "Е", "Ж\n(ветер)", "К\n(монтаж)"]
for name, mat_cls, color in [
("Сосна сорт 2", lambda m: Timber(2, "pine", "rectangular_edge_h_le_500", WoodContext(m, "2")), "#1f77b4"),
("Класс C24", lambda m: StrengthClassWood("C24", WoodContext(m, "2")), "#2ca02c"),
("Клеёная K24", lambda m: Glulam("K24", WoodContext(m, "2")), "#ff7f0e"),
("LVL 1/K45", lambda m: LVL("1/K45", WoodContext(m, "2")), "#9467bd"),
]:
r_vals = [mat_cls(m).resistance("bending") for m in modes]
ax2.plot(mode_names, r_vals, marker="o", label=name, color=color, linewidth=2.2, markersize=5)
ax2.set_title("Влияние длительности приложения нагрузки на R_и (п. 6.3 СП 64)", fontsize=11)
ax2.set_xlabel("Режим длительности нагрузки (Таблица 9 СП 64)", fontsize=10)
ax2.set_ylabel("Расчетное сопротивление изгибу R_и, МПа", fontsize=10)
ax2.grid(True, linestyle="--", alpha=0.35)
ax2.legend(fontsize=8.5)
# График 3: Модули деформации (жесткостные характеристики для II группы ПС)
ax3 = axes[1, 0]
mod_categories = ["E_0,ср\n(норматив)", "E_05\n(5%-квантиль)", "E_II\n(режим Г)", "G_ср\n(сдвиг)"]
x_mod = np.arange(len(mod_categories))
for idx, (name, mat, color) in enumerate(materials_compare):
vals_mod = [
mat.E_mean_MPa or 0,
mat.E_05_MPa or 0,
mat.E_II_MPa or 0,
mat.G_mean_MPa or 0,
]
bars = ax3.bar(x_mod + idx * bar_width, vals_mod, bar_width, label=name, color=color, alpha=0.9, edgecolor="black", linewidth=0.6)
for bar in bars:
h_val = bar.get_height()
if h_val > 0:
ax3.annotate(f"{h_val:.0f}",
xy=(bar.get_x() + bar.get_width() / 2, h_val),
xytext=(0, 2), textcoords="offset points",
ha="center", va="bottom", fontsize=7.5)
ax3.set_title("Модули деформации материалов вдоль волокон, МПа", fontsize=11)
ax3.set_xticks(x_mod + bar_width * 1.5)
ax3.set_xticklabels(mod_categories, fontsize=9)
ax3.set_ylabel("Модуль упругости, МПа", fontsize=10)
ax3.grid(True, linestyle="--", alpha=0.35)
ax3.legend(loc="upper right", fontsize=8.5)
# График 4: Влияние класса эксплуатации и температуры (климатический фактор)
ax4 = axes[1, 1]
serv_classes = ["1а/1б/2\n(сух./навес)", "3\n(откр.)", "4а\n(влажн.)", "4б\n(грунт/вода)"]
m_v_vals = [1.0, 0.9, 0.85, 0.75]
temperatures = [20.0, 35.0, 42.5, 50.0]
t_labels = ["T ≤ 35 °C (норма)", "T = 42.5 °C", "T = 50.0 °C (предел)"]
t_factors = [1.0, 0.9, 0.8]
line_styles = ["-", "--", ":"]
for idx_t, (t_lab, mt, ls) in enumerate(zip(t_labels, t_factors, line_styles)):
comb_factors = [mv * mt for mv in m_v_vals]
ax4.plot(serv_classes, comb_factors, marker="s", linewidth=2.2, linestyle=ls, label=f"{t_lab} (m_т = {mt:.2f})")
ax4.set_title("Снижение несущей способности от среды: коэффициент (m_в · m_т)", fontsize=11)
ax4.set_xlabel("Класс условий эксплуатации (Таблица 4 СП 64)", fontsize=10)
ax4.set_ylabel("Комплексный множитель m_в · m_т", fontsize=10)
ax4.set_ylim(0.55, 1.05)
ax4.grid(True, linestyle="--", alpha=0.35)
ax4.legend(loc="lower left", fontsize=8.5)
plt.tight_layout()
plt.show()
В таблице ниже сведены характеристики 13 ключевых конструкционных материалов по СП 64.13330.2017 в расчетном режиме «Г» (снеговая нагрузка) и при классе эксплуатации «2» ($20^\circ\text{C}$, проектный срок службы 50 лет).
summary_data = [
("Сосна 1 сорт (ГОСТ 8486)", Timber(1, "pine", "rectangular_edge_h_le_500", ctx_standard)),
("Сосна 2 сорт (ГОСТ 8486)", Timber(2, "pine", "rectangular_edge_h_le_500", ctx_standard)),
("Сосна 3 сорт (ГОСТ 8486)", Timber(3, "pine", "rectangular_edge_h_le_500", ctx_standard)),
("Лиственница сибирская 2 сорт", Timber(2, "larch_other", "rectangular_edge_h_le_500", ctx_standard)),
("Цельная древесина класс C16", StrengthClassWood("C16", ctx_standard)),
("Цельная древесина класс C24", StrengthClassWood("C24", ctx_standard)),
("Цельная древесина класс C30", StrengthClassWood("C30", ctx_standard)),
("Клеёная древесина класс K20", Glulam("K20", ctx_standard)),
("Клеёная древесина класс K24", Glulam("K24", ctx_standard)),
("Клеёная древесина класс K32", Glulam("K32", ctx_standard)),
("LVL Ultralam™ брус 1/K45", LVL("1/K45", ctx_standard)),
("Берёзовая фанера ФСФ 12 мм (вдоль)", Plywood("FSF_birch", 12, 5, "parallel", ctx_standard)),
("Плита ОСП-3 (главная ось)", OSB3("major", ctx_standard)),
]
header = (
"| Конструкционный материал | Плотность ρ, кг/м³ | R_и, МПа | R_с ||, МПа | R_р ||, МПа | R_ск ||, МПа | E_0,ср, МПа | E_II, МПа |\n"
"|:---|---:|---:|---:|---:|---:|---:|---:|\n"
)
rows = []
for name, mat in summary_data:
rho = f"{mat.density_for_weight_kg_m3:.0f}" if mat.density_for_weight_kg_m3 else "—"
def get_res(stress):
try:
return f"{mat.resistance(stress):.2f}"
except (ValueError, KeyError):
return "—"
r_bend = get_res("bending")
r_comp = get_res("compression_parallel")
r_tens = get_res("tension_parallel")
r_shear = get_res("shear_parallel")
e_m = f"{mat.E_mean_MPa:.0f}" if mat.E_mean_MPa else "—"
e_2 = f"{mat.E_II_MPa:.0f}" if mat.E_II_MPa else "—"
rows.append(f"| {name} | {rho} | {r_bend} | {r_comp} | {r_tens} | {r_shear} | {e_m} | {e_2} |")
table_md = header + "\n".join(rows)
display(Markdown(table_md))
Рассмотрим реальную инженерную задачу проектирования шарнирно опертой деревянной балки междуэтажного перекрытия жилого одноквартирного дома.
Прочность по нормальным напряжениям при изгибе (п. 7.2 СП 64): $$M_{max} = \frac{q L^2}{8}, \quad W = \frac{b h^2}{6}, \quad \sigma = \frac{M_{max}}{W} \le R_и \implies K_{исп,\sigma} = \frac{\sigma}{R_и} \le 1{,}00$$
Прочность на скалывание при поперечном изгибе (п. 7.7 СП 64, формула Журавского): $$Q_{max} = \frac{q L}{2}, \quad \tau = \frac{3}{2} \frac{Q_{max}}{b h} \le R_{ск} \implies K_{исп,\tau} = \frac{\tau}{R_{ск}} \le 1{,}00$$
Жесткость по эстетико-психологическому прогибу (п. 8.35 СП 64, Таблица Д.1 СП 20): $$I = \frac{b h^3}{12}, \quad f = \frac{5}{384} \frac{q^н L^4}{E_{II} I} \le f_{ult} = \frac{L}{250} = 18{,}0 \text{ мм} \implies K_{исп,f} = \frac{f}{f_{ult}} \le 1{,}00$$
Физиологические требования по зыбкости перекрытий (п. Д.2.2 СП 20.13330): Прогиб от сосредоточенной нагрузки веса человека $P = 1{,}0$ кН, приложенной в середине пролета: $$f_p = \frac{P L^3}{48 E_{II} I} \le f_{пред,зыбк} \approx 0{,}7 \dots 1{,}0 \text{ мм}$$
# Исходные геометрические и силовые параметры балки
L_m = 4.50
a_step_m = 0.60
q_ser_kN_m = 1.20 # Нормативная нагрузка для расчета прогибов (II группа ПС)
q_des_kN_m = 1.53 # Расчетная нагрузка для расчета прочности (I группа ПС)
M_max_kNm = q_des_kN_m * (L_m ** 2) / 8.0
Q_max_kN = q_des_kN_m * L_m / 2.0
f_ult_mm = (L_m * 1000.0) / 250.0 # Предельный прогиб по СП 20.13330 (L / 250 = 18.0 мм)
P_person_kN = 1.0 # Сосредоточенная нагрузка для проверки зыбкости (100 кг)
ctx_beam = WoodContext(load_duration="Г", service_class="1а", temperature_c=20.0, service_life_years=50.0)
# Сравниваемые проектные варианты сечений (Название, Материал, b_мм, h_мм)
variants = [
("1. Доска 50×200 (Сосна 2 сорт, ГОСТ 8486)", Timber(2, "pine", "rectangular_edge_h_le_500", ctx_beam), 50.0, 200.0),
("2. Доска калиброванная C24 (50×200)", StrengthClassWood("C24", ctx_beam), 50.0, 200.0),
("3. Сдвоенная доска 2×(50×200) (Сосна 2 сорт)", Timber(2, "pine", "rectangular_edge_h_le_500", ctx_beam), 100.0, 200.0),
("4. Клеёная балка Glulam K24 (80×180)", Glulam("K24", ctx_beam), 80.0, 180.0),
("5. Клеёная балка Glulam K24 (100×200)", Glulam("K24", ctx_beam), 100.0, 200.0),
("6. Брус LVL Ultralam™ 1/K45 (45×200)", LVL("1/K45", ctx_beam), 45.0, 200.0),
]
calc_results = []
for name, mat, b, h in variants:
# 1. Геометрические характеристики сечения
W_cm3 = (b * (h ** 2)) / 6.0 / 1000.0 # Момент сопротивления, см³
I_cm4 = (b * (h ** 3)) / 12.0 / 10000.0 # Момент инерции, см⁴
I_mm4 = (b * (h ** 3)) / 12.0 # Момент инерции, мм⁴
V_beam_m3 = (b / 1000.0) * (h / 1000.0) * L_m # Объем древесины на 1 балку, м³
weight_kg_m = (b / 1000.0) * (h / 1000.0) * mat.density_for_weight_kg_m3 # Погонная масса балки, кг/м
# 2. Проверка прочности на изгиб (п. 7.2)
sigma_MPa = (M_max_kNm * 1e6) / (W_cm3 * 1e3)
R_bend = mat.resistance("bending")
k_bend = sigma_MPa / R_bend
# 3. Проверка прочности на скалывание (п. 7.7)
tau_MPa = 1.5 * (Q_max_kN * 1e3) / (b * h)
R_shear = mat.resistance("shear_parallel")
k_shear = tau_MPa / R_shear
# 4. Проверка жесткости по прогибу от распределенной нагрузки (п. 8.35)
E_II = mat.E_II_MPa
f_mm = (5.0 / 384.0) * (q_ser_kN_m * (L_m ** 4) * 1e12) / (E_II * I_mm4)
k_def = f_mm / f_ult_mm
# 5. Проверка зыбкости от сосредоточенной силы 1.0 кН (СП 20.13330 п. Д.2.2)
f_person_mm = (P_person_kN * 1e3 * ((L_m * 1e3) ** 3)) / (48.0 * E_II * I_mm4)
# Итоговый статус конструктивного соответствия
is_ok = (k_bend <= 1.0 and k_shear <= 1.0 and k_def <= 1.0)
status_str = "ПРОХОДИТ" if is_ok else "ДЕФИЦИТ ЖЕСТКОСТИ"
calc_results.append({
"name": name,
"b_h": f"{b:.0f}×{h:.0f}",
"vol": f"{V_beam_m3:.3f}",
"weight": f"{weight_kg_m:.1f}",
"sigma": f"{sigma_MPa:.2f}",
"R_bend": f"{R_bend:.2f}",
"k_bend": f"{k_bend:.2f}",
"tau": f"{tau_MPa:.2f}",
"R_shear": f"{R_shear:.2f}",
"f_mm": f"{f_mm:.1f}",
"k_def": f"{k_def:.2f}",
"f_person": f"{f_person_mm:.2f}",
"status": status_str,
})
rep_lines = [
"| Вариант конструкции | b×h, мм | Объем, м³ | Масса, кг/м | σ, МПа | R_и, МПа | k_изгиб | f, мм | f_ult, мм | k_прогиб | f_зыбк, мм | Статус |",
"|:---|:---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|:---:|",
]
for r in calc_results:
if r['status'] == "ПРОХОДИТ":
stat_cell = f"<b style='color:#2e7d32;'>{r['status']}</b>"
else:
stat_cell = f"<b style='color:#c62828;'>{r['status']}</b>"
rep_lines.append(
f"| {r['name']} | {r['b_h']} | {r['vol']} | {r['weight']} | {r['sigma']} | {r['R_bend']} | {r['k_bend']} | {r['f_mm']} | {f_ult_mm:.1f} | {r['k_def']} | {r['f_person']} | {stat_cell} |"
)
report_title = (
f"### Результаты поверочного расчета балки L = {L_m:.2f} м (M_max = {M_max_kNm:.2f} кН·м, Q_max = {Q_max_kN:.2f} кН, f_ult = {f_ult_mm:.1f} мм)\n\n"
)
display(Markdown(report_title + "\n".join(rep_lines)))
Определяющий характер расчетов по II группе предельных состояний (прогибы и зыбкость):
Одиночная доска 50×200 мм (Сосна 2 сорт):
Нормированный класс C24 (50×200 мм):
Клеёная древесина Glulam K24 (100×200 мм) и сдвоенная доска 2×(50×200):
Брус из клееного шпона LVL 1/K45 (45×200 мм):