跳转到内容
RailWise KB已发布

结构应变与应力计算工具 — 基于应变片/光纤数据的应力反算

将应变监测数据转换为结构应力,支持混凝土和钢结构,考虑温度效应修正和弹性模量选取

复核 2026-07-09入门公开可引用RailWise 技术团队
tool-guide

本工具将应变监测数据(应变片或光纤传感器)转换为结构应力,支持混凝土结构和钢结构的应力反算,考虑温度效应修正和材料弹性模量的合理选取。

  • 桥梁、隧道衬砌等混凝土结构的应力监测
  • 钢结构支撑、钢轨的应力监测
  • 结构健康监测系统的应力状态评估
  • 承载力分析和预警阈值设定
类型 内容
输入 应变读数、温度读数、材料类型、截面信息
输出 应力值、温度修正后应变、应力比、安全状态评估

$$\sigma = E \cdot \varepsilon_{eff}$$

其中:

  • $\sigma$:应力(MPa)
  • $E$:弹性模量(MPa)
  • $\varepsilon_{eff}$:有效应变(扣除温度效应后的应变)

应变片/光纤同时受力学应变和温度影响:

$$\varepsilon_{measured} = \varepsilon_{mechanical} + \varepsilon_{thermal}$$

温度应变: $$\varepsilon_{thermal} = \alpha \cdot \Delta T$$

有效应变: $$\varepsilon_{eff} = \varepsilon_{measured} - \alpha \cdot \Delta T$$

其中:

  • $\alpha$:材料热膨胀系数(με/℃)
  • $\Delta T$:温度变化量(℃)

根据GB 50010-2010:

$$E_c = \frac{10^5}{2.2 + \frac{34.74}{f_{cu,k}}}$$

或查表:

混凝土强度等级 C30 C35 C40 C45 C50 C55 C60
E_c (×10⁴ MPa) 3.00 3.15 3.25 3.35 3.45 3.55 3.60

钢材弹性模量:$E_s = 2.06 \times 10^5$ MPa(常数)


Terminal window
python tool_strain_calculation.py \
--strain 1250 \
--temperature 28.5 \
--material concrete \
--concrete-grade C40 \
--baseline-temp 20.0
from strain_calculation import calculate_stress, StrainSensor
# 创建传感器对象
sensor = StrainSensor(
sensor_type='fiber', # 传感器类型
material='concrete', # 材料类型
concrete_grade='C40', # 混凝土强度等级
thermal_coefficient=10.0 # 热膨胀系数 (με/℃)
)
# 计算应力
result = sensor.calculate_stress(
strain_reading=1250, # 应变读数 (με)
temperature=28.5, # 当前温度 (℃)
baseline_temperature=20.0 # 基准温度 (℃)
)
print(f"应力: {result['stress']:.2f} MPa")
print(f"应力比: {result['stress_ratio']:.2%}")
print(f"安全状态: {result['safety_status']}")

参数名 含义 类型 取值范围 必填 说明
strain_reading 应变读数 float - 微应变(με)
temperature 当前温度 float -50~80℃ 传感器处温度
baseline_temperature 基准温度 float -50~80℃ 初始安装温度
material 材料类型 str concrete/steel 混凝土或钢材
concrete_grade 混凝土等级 str C20~C80 条件 混凝土必填
steel_type 钢材类型 str Q235/Q345/Q390 条件 钢材必填
thermal_coefficient 热膨胀系数 float 8~15 με/℃ 默认按材料类型
elastic_modulus 自定义弹性模量 float >0 MPa 覆盖默认值
材料 热膨胀系数(με/℃) 说明
混凝土 10~12 与骨料类型有关
普通钢 12 常数
不锈钢 16 304/316系列
光纤 0.55 石英玻璃

注:光纤传感器的热膨胀系数与粘贴基材不同,需根据实际安装情况确定。


场景:隧道衬砌混凝土C40,光纤传感器读数1250με,温度28.5℃,基准温度20℃。

输入

params = {
'strain_reading': 1250,
'temperature': 28.5,
'baseline_temperature': 20.0,
'material': 'concrete',
'concrete_grade': 'C40',
'thermal_coefficient': 11.0
}

计算过程

  1. 温度变化 ΔT = 28.5 - 20.0 = 8.5℃
  2. 温度应变 ε_thermal = 11.0 × 8.5 = 93.5 με
  3. 有效应变 ε_eff = 1250 - 93.5 = 1156.5 με
  4. 弹性模量 E_c = 3.25 × 10⁴ MPa (C40)
  5. 应力 σ = 32500 × 1156.5 × 10⁻⁶ = 37.59 MPa
  6. 应力比 = 37.59 / 40.0 = 93.98% (C40轴心抗压)

输出结果

原始应变: 1250.0 με
温度修正: -93.5 με
有效应变: 1156.5 με
应力: 37.59 MPa
应力比: 93.98%
安全状态: 接近限值,需关注

场景:钢支撑Q345,应变片读数850με,温度32℃,基准温度20℃。

计算结果

  1. 温度修正 = 12 × 12 = 144 με
  2. 有效应变 = 850 - 144 = 706 με
  3. 应力 = 206000 × 706 × 10⁻⁶ = 145.44 MPa
  4. 应力比 = 145.44 / 345 = 42.2% → 安全

应力比 安全状态 建议措施
< 50% 安全 正常监测
50%~70% 正常 关注发展趋势
70%~85% 关注 加密监测,分析原因
85%~100% 接近限值 预警,采取控制措施
> 100% 超限 立即预警,停止加载
  • 有效应变为正:拉应力
  • 有效应变为负:压应力
  • 混凝土结构一般不允许出现拉应力(或按裂缝控制)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
结构应变与应力计算工具
基于应变片/光纤数据的应力反算,支持温度修正
Author: RailWise技术团队
Version: 1.0.0
"""
from typing import Dict, Optional
from dataclasses import dataclass
# 混凝土弹性模量表 (×10⁴ MPa)
CONCRETE_E_MODULUS = {
'C20': 2.55, 'C25': 2.80, 'C30': 3.00, 'C35': 3.15,
'C40': 3.25, 'C45': 3.35, 'C50': 3.45, 'C55': 3.55,
'C60': 3.60, 'C65': 3.65, 'C70': 3.70, 'C75': 3.75,
'C80': 3.80
}
# 混凝土轴心抗压强度设计值 (MPa)
CONCRETE_FC = {
'C20': 9.6, 'C25': 11.9, 'C30': 14.3, 'C35': 16.7,
'C40': 19.1, 'C45': 21.1, 'C50': 23.1, 'C55': 25.3,
'C60': 27.5, 'C65': 29.7, 'C70': 31.8, 'C75': 33.8,
'C80': 35.9
}
# 钢材弹性模量和屈服强度
STEEL_PROPERTIES = {
'Q235': {'E': 2.06e5, 'fy': 235},
'Q345': {'E': 2.06e5, 'fy': 345},
'Q390': {'E': 2.06e5, 'fy': 390},
'Q420': {'E': 2.06e5, 'fy': 420},
}
# 默认热膨胀系数 (με/℃)
DEFAULT_THERMAL_COEFF = {
'concrete': 11.0,
'steel': 12.0,
'stainless_steel': 16.0,
'fiber': 0.55,
}
@dataclass
class StressResult:
"""应力计算结果"""
stress: float # 应力(MPa)
effective_strain: float # 有效应变(με)
thermal_strain: float # 温度应变(με)
raw_strain: float # 原始应变(με)
stress_ratio: float # 应力比
safety_status: str # 安全状态
is_tension: bool # 是否为拉应力
class StrainSensor:
"""应变传感器计算类"""
def __init__(
self,
sensor_type: str = 'strain_gauge',
material: str = 'concrete',
concrete_grade: Optional[str] = None,
steel_type: Optional[str] = None,
thermal_coefficient: Optional[float] = None,
elastic_modulus: Optional[float] = None
):
"""
初始化应变传感器
Args:
sensor_type: 传感器类型
material: 材料类型
concrete_grade: 混凝土强度等级
steel_type: 钢材类型
thermal_coefficient: 热膨胀系数
elastic_modulus: 自定义弹性模量
"""
self.sensor_type = sensor_type
self.material = material
self.concrete_grade = concrete_grade
self.steel_type = steel_type
# 确定弹性模量
if elastic_modulus is not None:
self.E = elastic_modulus
elif material == 'concrete':
if concrete_grade not in CONCRETE_E_MODULUS:
raise ValueError(f"未知混凝土等级: {concrete_grade}")
self.E = CONCRETE_E_MODULUS[concrete_grade] * 1e4
elif material == 'steel':
steel = steel_type or 'Q345'
if steel not in STEEL_PROPERTIES:
raise ValueError(f"未知钢材类型: {steel}")
self.E = STEEL_PROPERTIES[steel]['E']
else:
raise ValueError(f"未知材料类型: {material}")
# 确定热膨胀系数
if thermal_coefficient is not None:
self.alpha = thermal_coefficient
else:
self.alpha = DEFAULT_THERMAL_COEFF.get(material, 11.0)
# 确定强度设计值
if material == 'concrete' and concrete_grade:
self.f_design = CONCRETE_FC.get(concrete_grade, 19.1)
elif material == 'steel' and steel_type:
self.f_design = STEEL_PROPERTIES.get(steel_type, {}).get('fy', 345)
else:
self.f_design = 345 # 默认
def calculate_stress(
self,
strain_reading: float,
temperature: float,
baseline_temperature: float = 20.0
) -> StressResult:
"""
计算应力
Args:
strain_reading: 应变读数(με)
temperature: 当前温度(℃)
baseline_temperature: 基准温度(℃)
Returns:
StressResult: 计算结果
"""
# 温度变化
delta_t = temperature - baseline_temperature
# 温度应变
thermal_strain = self.alpha * delta_t
# 有效应变
effective_strain = strain_reading - thermal_strain
# 应力计算
stress = self.E * effective_strain * 1e-6 # MPa
# 应力比
stress_ratio = abs(stress) / self.f_design if self.f_design > 0 else 0
# 安全状态
if stress_ratio < 0.5:
safety_status = '安全'
elif stress_ratio < 0.7:
safety_status = '正常'
elif stress_ratio < 0.85:
safety_status = '关注'
elif stress_ratio < 1.0:
safety_status = '接近限值'
else:
safety_status = '超限'
return StressResult(
stress=stress,
effective_strain=effective_strain,
thermal_strain=thermal_strain,
raw_strain=strain_reading,
stress_ratio=stress_ratio,
safety_status=safety_status,
is_tension=effective_strain > 0
)
def batch_calculate(
self,
readings: list,
temperatures: list,
baseline_temperature: float = 20.0
) -> list:
"""
批量计算
Args:
readings: 应变读数列表
temperatures: 温度列表
baseline_temperature: 基准温度
Returns:
list: 计算结果列表
"""
results = []
for strain, temp in zip(readings, temperatures):
result = self.calculate_stress(strain, temp, baseline_temperature)
results.append(result)
return results
def print_stress_report(result: StressResult) -> None:
"""打印应力计算报告"""
print("=" * 50)
print("结构应力计算报告")
print("=" * 50)
print(f"原始应变: {result.raw_strain:.1f} με")
print(f"温度应变: {result.thermal_strain:.1f} με")
print(f"有效应变: {result.effective_strain:.1f} με")
print(f"应力: {result.stress:.2f} MPa")
print(f"应力比: {result.stress_ratio:.2%}")
print(f"应力类型: {'拉应力' if result.is_tension else '压应力'}")
print(f"安全状态: {result.safety_status}")
print("=" * 50)
# CLI接口
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description='结构应变与应力计算工具')
parser.add_argument('--strain', type=float, required=True, help='应变读数(με)')
parser.add_argument('--temperature', type=float, required=True, help='当前温度(℃)')
parser.add_argument('--baseline-temp', type=float, default=20.0, help='基准温度(℃)')
parser.add_argument('--material', type=str, default='concrete', choices=['concrete', 'steel'])
parser.add_argument('--concrete-grade', type=str, default='C40', help='混凝土等级')
parser.add_argument('--steel-type', type=str, default='Q345', help='钢材类型')
parser.add_argument('--thermal-coeff', type=float, default=None, help='热膨胀系数')
args = parser.parse_args()
sensor = StrainSensor(
material=args.material,
concrete_grade=args.concrete_grade if args.material == 'concrete' else None,
steel_type=args.steel_type if args.material == 'steel' else None,
thermal_coefficient=args.thermal_coeff
)
result = sensor.calculate_stress(
strain_reading=args.strain,
temperature=args.temperature,
baseline_temperature=args.baseline_temp
)
print_stress_report(result)

  • 应变片精度通常为±1~2με,对应力计算精度有直接影响
  • 温度测量精度影响温度修正效果,建议使用同位置温度传感器
  • 弹性模量取值对结果影响显著,建议采用实测值或试验值
  • 适用于线弹性范围内的应力计算
  • 混凝土结构开裂后,应变读数不能代表整体应力
  • 大应变情况(>10000με)需考虑非线性效应

Q: 温度修正后应变反而增大? A: 当温度低于基准温度时,温度应变为负,扣除后有效应变增大,属正常现象。

Q: 应力比超过100%是否意味着破坏? A: 不一定。应力比基于设计强度,实际承载力通常高于设计值。但超过100%必须预警并分析。

Q: 光纤与应变片读数差异大? A: 检查标距是否一致;光纤为分布式测量,应变片为点测量;检查安装工艺。



#应变计算 #应力反算 #应变片 #光纤传感 #弹性模量 #温度修正 #结构健康监测 #Python工具 #RailWise


文档版本: 1.0.0 | 最后更新: 2026-06-10 | 作者: RailWise技术团队

引用与复核把知识带回真实工程判断

引用时保留页面与来源线索;涉及标准条文、阈值、频率和项目结论,请回到现行依据与责任人复核。

查看 Agent 使用规则