首次提交完整的python工程代码

This commit is contained in:
2026-06-15 20:38:42 +08:00
commit bca485d748
159 changed files with 248076 additions and 0 deletions

Binary file not shown.

Binary file not shown.

47
processor/param_tables.py Normal file
View File

@@ -0,0 +1,47 @@
# 能源 0x00110000
ENERGY_TABLE = [
("M002YI002", "数值拟合", "0.012676885,0.005308819"),
("M002YI004", "数值拟合", "0.02545648,-0.039275645"),
("M002YI006", "数值拟合", "0.007486385,0.018835631"),
("M002YI008", "数值拟合", "0.018036219,-0.029769313"),
("M002YI010", "数值拟合", "0.005004802,-2.17662752"),
("M002YI012", "数值拟合", "0.004907629,-2.036893601"),
("M002YI014", "数值拟合", "0.004989693,-2.140794708"),
("M002YI016", "数值拟合", "0.007120869,-6.19416166"),
("M002YV018", "数值拟合", "0.02499736,-0.09134717"),
("M002YV020", "数值拟合", "0.01837765,-0.00943934"),
("M002YV022", "数值拟合", "0.007807,0"),
# 其余条目我已省略,格式完全一致
]
# SADA 0x00440000
SADA_TABLE = [
("M057JS005", "状态量", "0=正向,1=反向"),
("M057JS006", "状态量", "0=正向,1=反向"),
("M057JS007", "状态量", "0=零位正常,1=零位异常"),
("M057JS008", "状态量", "0=零位正常,1=零位异常"),
("M057JG039", "特殊公式8", ""),
("M057JG040", "特殊公式8", ""),
]
# 测控 0x00330000
TTC_TABLE = [
("M001CT001", "电阻拟合1", "M001CV038"),
("M001CV002", "电压1", ""),
("M085TV003", "电压6", ""),
]
# 星间链路 0x00550000
INTERSAT_TABLE = [
("M019XV005", "电压3", ""),
("M018XV019", "电压3", ""),
("M018XV017", "电压3", ""),
]
# 总映射
TABLE_MAP = {
0x00110000: ENERGY_TABLE,
0x00440000: SADA_TABLE,
0x00330000: TTC_TABLE,
0x00550000: INTERSAT_TABLE,
}

864
processor/telem_config.py Normal file
View File

@@ -0,0 +1,864 @@
# # 数据代号定义
# DATA_ID_ENERGY = 0x00110000
# DATA_ID_SADA = 0x00440000
# DATA_ID_TTC = 0x00330000
# DATA_ID_INTERSAT = 0x00550000
# # 每个数据代号对应的遥测量数量
# TELEM_COUNT = {
# DATA_ID_ENERGY: 54,
# DATA_ID_SADA: 17,
# DATA_ID_TTC: 49,
# DATA_ID_INTERSAT: 3,
# }
# # 能源 54项
# ENERGY_TABLE = [
# ("M002YI002", "数值拟合", "0.012676885,0.005308819"),
# ("M002YI004", "数值拟合", "0.02545648,-0.039275645"),
# ("M002YI006", "数值拟合", "0.007486385,0.018835631"),
# ("M002YI008", "数值拟合", "0.018036219,-0.029769313"),
# ("M002YI010", "数值拟合", "0.005004802,-2.17662752"),
# ("M002YI012", "数值拟合", "0.004907629,-2.036893601"),
# ("M002YI014", "数值拟合", "0.004989693,-2.140794708"),
# ("M002YI016", "数值拟合", "0.007120869,-6.19416166"),
# ("M002YV018", "数值拟合", "0.02499736,-0.09134717"),
# ("M002YV020", "数值拟合", "0.01837765,-0.00943934"),
# ("M002YV022", "数值拟合", "0.007807,0"),
# ("M002YI040", "数值拟合", "0.012667543,0.027994915"),
# ("M002YI042", "数值拟合", "0.00739087,-0.025728713"),
# ("M002YI044", "数值拟合", "0.017748254,-0.031591554"),
# ("M002YI046", "数值拟合", "0.004947258,-2.130449308"),
# ("M002YI048", "数值拟合", "0.004851602,-1.983224429"),
# ("M002YI050", "数值拟合", "0.004961177,-2.028220055"),
# ("M002YI052", "数值拟合", "0.007101109,-6.287326986"),
# ("M002YV054", "数值拟合", "0.01856155,-0.01615284"),
# ("M002YV056", "数值拟合", "0.007807,0"),
# ("M003YI002", "数值拟合", "0.007015417,-6.172192788"),
# ("M003YI004", "数值拟合", "0.007135218,-6.260644413"),
# ("M003YI016", "", ""),
# ("M003YI018", "", ""),
# ("M003YI020", "", ""),
# ("M003YG027", "状态量", "0=0档,..."),
# ("M003YG028", "状态量", ""),
# ("M003YG029", "状态量", ""),
# ("M003YG030", "状态量", ""),
# ("M003YI032", "", ""),
# ("M003YI034", "数值拟合", "0.007295516,-6.588082011"),
# ("M003YI036", "数值拟合", "0.007280949,-6.426333966"),
# ("M003YV038", "", ""),
# ("M003YI050", "", ""),
# ("M003YI052", "", ""),
# ("M003YI054", "", ""),
# ("M004YV002", "数值拟合", "0.00244140625,0"),
# ("M004YV004", "数值拟合", "0.00244140625,0"),
# ("M004YV006", "数值拟合", "0.00244140625,0"),
# ("M004YV008", "数值拟合", "0.00244140625,0"),
# ("M004YV010", "数值拟合", "0.00244140625,0"),
# ("M004YV012", "数值拟合", "0.00244140625,0"),
# ("M004YV014", "数值拟合", "0.00244140625,0"),
# ("M004YV016", "数值拟合", "0.00244140625,0"),
# ("M004YV018", "数值拟合", "0.00244140625,0"),
# ("M004YV022", "数值拟合", "0.00244140625,0"),
# ("M004YV024", "数值拟合", "0.00244140625,0"),
# ("M004YV026", "数值拟合", "0.00244140625,0"),
# ("M004YV028", "数值拟合", "0.00244140625,0"),
# ("M004YV030", "数值拟合", "0.00244140625,0"),
# ("M004YV032", "数值拟合", "0.00244140625,0"),
# ("M004YV034", "数值拟合", "0.00244140625,0"),
# ("M004YV036", "数值拟合", "0.00244140625,0"),
# ("M004YV038", "数值拟合", "0.00244140625,0"),
# ]
# # SADA 17项
# SADA_TABLE = [
# ("M057JS005", "状态量", "0=正向,1=反向"),
# ("M057JS006", "状态量", "0=正向,1=反向"),
# ("M057JS007", "状态量", "0=零位正常,1=零位异常"),
# ("M057JS008", "状态量", "0=零位正常,1=零位异常"),
# ("M057JS009", "状态量", "0=正常,1=异常"),
# ("M057JS010", "状态量", "0=正常,1=异常"),
# ("M057JS012", "状态量", "0=空闲,1=运行"),
# ("M057JS013", "状态量", "0=空闲,1=运行"),
# ("M057JS014", "状态量", ""),
# ("M057JS015", "状态量", ""),
# ("M057JS017", "状态量", ""),
# ("M057JS018", "状态量", ""),
# ("M057JG023", "10进制", ""),
# ("M057JG024", "10进制", ""),
# ("M057JI037", "", ""),
# ("M057JG039", "特殊公式8", ""),
# ("M057JG040", "特殊公式8", ""),
# ]
# # 测控 49项
# TTC_TABLE = [
# ("M001CT001", "电阻拟合1", "M001CV038"),
# ("M001CV002", "电压1", ""),
# ("M001CV003", "电压1", ""),
# ("M001CV004", "电压1", ""),
# ("M001CS005", "状态量", ""),
# ("M001CS006", "状态量", ""),
# ("M001CS007", "状态量", ""),
# ("M001CS008", "状态量", ""),
# ("M001CS009", "状态量", ""),
# ("M001CS010", "状态量", ""),
# ("M001CS011", "状态量", ""),
# ("M001CT012", "电阻拟合1", "M001CV038"),
# ("M001CV013", "电压1", ""),
# ("M001CV014", "电压1", ""),
# ("M001CV015", "电压1", ""),
# ("M001CS016", "状态量", ""),
# ("M001CS017", "状态量", ""),
# ("M001CS018", "状态量", ""),
# ("M001CS019", "状态量", ""),
# ("M001CS020", "状态量", ""),
# ("M001CS021", "状态量", ""),
# ("M001CS022", "状态量", ""),
# ("M001CV023", "电压1", ""),
# ("M001CV024", "电压1", ""),
# ("M001CT025", "电阻拟合1", "M001CV038"),
# ("M001CS026", "状态量", ""),
# ("M001CI027", "电压1", ""),
# ("M001CV028", "电压1", ""),
# ("M001CV029", "电压1", ""),
# ("M001CT030", "电阻拟合1", "M001CV038"),
# ("M001CS031", "状态量", ""),
# ("M001CI032", "电压1", ""),
# ("M001CT033", "电阻拟合1", "M001CV038"),
# ("M001CS034", "状态量", ""),
# ("M001CS035", "状态量", ""),
# ("M079CG032", "状态量", ""),
# ("M079CS033", "状态量", ""),
# ("M079CS034", "状态量", ""),
# ("M085TV003", "电压6", ""),
# ("M085CV004", "电压6", ""),
# ("M087CS063", "状态量", ""),
# ("M087CS064", "状态量", ""),
# ("M087CS065", "状态量", ""),
# ("M087CS066", "状态量", ""),
# ("M087CS067", "状态量", ""),
# ("M087CS068", "状态量", ""),
# ("M087CS069", "状态量", ""),
# ("M087CS078", "状态量", ""),
# ("M087CS079", "状态量", ""),
# ]
# # 星间链路 3项
# INTERSAT_TABLE = [
# ("M019XV005", "电压3", ""),
# ("M018XV019", "电压3", ""),
# ("M018XV017", "电压3", ""),
# ]
# # 总表映射
# TABLE_MAP = {
# DATA_ID_ENERGY: ENERGY_TABLE,
# DATA_ID_SADA: SADA_TABLE,
# DATA_ID_TTC: TTC_TABLE,
# DATA_ID_INTERSAT: INTERSAT_TABLE,
# }
## 2026/4/5停用
# # 数据代号定义
# DATA_ID_ENERGY = 0x00110000
# DATA_ID_SADA = 0x00440000
# DATA_ID_TTC = 0x00330000
# DATA_ID_INTERSAT = 0x00550000
# # 每个数据代号对应的遥测量数量
# TELEM_COUNT = {
# DATA_ID_ENERGY: 46, # 已改为 46
# DATA_ID_SADA: 17,
# DATA_ID_TTC: 49,
# DATA_ID_INTERSAT: 3,
# }
# # ===================== 能源 46 项 =====================
# ENERGY_TABLE = [
# ("M002YI002", "数值拟合", "0.012676885,0.005308819"),
# ("M002YI004", "数值拟合", "0.02545648,-0.039275645"),
# ("M002YI006", "数值拟合", "0.007486385,0.018835631"),
# ("M002YI008", "数值拟合", "0.018036219,-0.029769313"),
# ("M002YI010", "数值拟合", "0.005004802,-2.17662752"),
# ("M002YI012", "数值拟合", "0.004907629,-2.036893601"),
# ("M002YI014", "数值拟合", "0.004989693,-2.140794708"),
# ("M002YI016", "数值拟合", "0.007120869,-6.19416166"),
# ("M002YV018", "数值拟合", "0.02499736,-0.09134717"),
# ("M002YV020", "数值拟合", "0.01837765,-0.00943934"),
# ("M002YV022", "数值拟合", "0.007807,0"),
# ("M002YI040", "数值拟合", "0.012667543,0.027994915"),
# ("M002YI042", "数值拟合", "0.00739087,-0.025728713"),
# ("M002YI044", "数值拟合", "0.017748254,-0.031591554"),
# ("M002YI046", "数值拟合", "0.004947258,-2.130449308"),
# ("M002YI048", "数值拟合", "0.004851602,-1.983224429"),
# ("M002YI050", "数值拟合", "0.004961177,-2.028220055"),
# ("M002YI052", "数值拟合", "0.007101109,-6.287326986"),
# ("M002YV054", "数值拟合", "0.01856155,-0.01615284"),
# ("M002YV056", "数值拟合", "0.007807,0"),
# ("M003YI002", "数值拟合", "0.007015417,-6.172192788"),
# ("M003YI004", "数值拟合", "0.007135218,-6.260644413"),
# ("M003YI016", "", ""),
# ("M003YI018", "", ""),
# ("M003YI020", "", ""),
# ("M003YG027", "状态量", "0=0档,1=1档,2=2档,3=3档,4=4档,5=5档,6=6档,7=7档,8=8档,9=9档,0xA=10档,0xB=11档,0xC=12档,0xD=13档,0xE=14档,0xF=15档"),
# ("M003YG028", "状态量", "0=0档,1=1档,2=2档,3=3档,4=4档,5=5档,6=6档,7=7档,8=8档,9=9档,0xA=10档,0xB=11档,0xC=12档,0xD=13档,0xE=14档,0xF=15档"),
# ("M003YG029", "状态量", "0=0档,1=1档,2=2档,3=3档,4=4档,5=5档,6=6档,7=7档,8=8档,9=9档,0xA=10档,0xB=11档,0xC=12档,0xD=13档,0xE=14档,0xF=15档"),
# ("M003YG030", "状态量", "0=0档,1=1档,2=2档,3=3档,4=4档,5=5档,6=6档,7=7档,8=8档,9=9档,0xA=10档,0xB=11档,0xC=12档,0xD=13档,0xE=14档,0xF=15档"),
# ("M003YI032", "", ""),
# ("M003YI034", "数值拟合", "0.007295516,-6.588082011"),
# ("M003YI036", "数值拟合", "0.007280949,-6.426333966"),
# ("M003YV038", "", ""),
# ("M003YI050", "", ""),
# ("M003YI052", "", ""),
# ("M003YI054", "", ""),
# ("M004YV002", "数值拟合", "0.00244140625,0"),
# ("M004YV004", "数值拟合", "0.00244140625,0"),
# ("M004YV006", "数值拟合", "0.00244140625,0"),
# ("M004YV008", "数值拟合", "0.00244140625,0"),
# ("M004YV010", "数值拟合", "0.00244140625,0"),
# ("M004YV012", "数值拟合", "0.00244140625,0"),
# ("M004YV014", "数值拟合", "0.00244140625,0"),
# ("M004YV016", "数值拟合", "0.00244140625,0"),
# ("M004YV018", "数值拟合", "0.00244140625,0"),
# ("M004YV022", "数值拟合", "0.00244140625,0"),
# ]
# # ===================== SADA 17 项 =====================
# SADA_TABLE = [
# ("M057JS005", "状态量", "0=正向,1=反向"),
# ("M057JS006", "状态量", "0=正向,1=反向"),
# ("M057JS007", "状态量", "0=零位正常,1=零位异常"),
# ("M057JS008", "状态量", "0=零位正常,1=零位异常"),
# ("M057JS009", "状态量", "0=电位计转角值正常,1=电位计转角异常"),
# ("M057JS010", "状态量", "0=电位计转角值正常,1=电位计转角异常"),
# ("M057JS012", "状态量", "0=电机处于空闲状态,1=电机处于运行状态"),
# ("M057JS013", "状态量", "0=电机处于空闲状态,1=电机处于运行状态"),
# ("M057JS014", "状态量", "0=停转/保持,1=巡航1,2=巡航2,3=快速捕获,4=应急归零,5=零位标定"),
# ("M057JS015", "状态量", "0=停转/保持,1=巡航1,2=巡航2,3=快速捕获,4=应急归零,5=零位标定"),
# ("M057JS017", "状态量", "0=SADM_A不处于零位,1=SADM_A处于零位"),
# ("M057JS018", "状态量", "0=SADM_B不处于零位,1=SADM-B处于零位"),
# ("M057JG023", "10进制", ""),
# ("M057JG024", "10进制", ""),
# ("M057JI037", "数值拟合", "3.0E-4,-37.0E-3"),
# ("M057JG039", "特殊公式8", ""),
# ("M057JG040", "特殊公式8", ""),
# ]
# # ===================== 测控 49 项 =====================
# TTC_TABLE = [
# ("M001CT001", "电阻拟合1", "M001CV038"),
# ("M001CV002", "电压1", ""),
# ("M001CV003", "电压1", ""),
# ("M001CV004", "电压1", ""),
# ("M001CS005", "状态量", ""),
# ("M001CS006", "状态量", ""),
# ("M001CS007", "状态量", ""),
# ("M001CS008", "状态量", ""),
# ("M001CS009", "状态量", ""),
# ("M001CS010", "状态量", ""),
# ("M001CS011", "状态量", ""),
# ("M001CT012", "电阻拟合1", "M001CV038"),
# ("M001CV013", "电压1", ""),
# ("M001CV014", "电压1", ""),
# ("M001CV015", "电压1", ""),
# ("M001CS016", "状态量", ""),
# ("M001CS017", "状态量", ""),
# ("M001CS018", "状态量", ""),
# ("M001CS019", "状态量", ""),
# ("M001CS020", "状态量", ""),
# ("M001CS021", "状态量", ""),
# ("M001CS022", "状态量", ""),
# ("M001CV023", "电压1", ""),
# ("M001CV024", "电压1", ""),
# ("M001CT025", "电阻拟合1", "M001CV038"),
# ("M001CS026", "状态量", ""),
# ("M001CI027", "电压1", ""),
# ("M001CV028", "电压1", ""),
# ("M001CV029", "电压1", ""),
# ("M001CT030", "电阻拟合1", "M001CV038"),
# ("M001CS031", "状态量", ""),
# ("M001CI032", "电压1", ""),
# ("M001CT033", "电阻拟合1", "M001CV038"),
# ("M001CS034", "状态量", ""),
# ("M001CS035", "状态量", ""),
# ("M079CG032", "状态量", ""),
# ("M079CS033", "状态量", ""),
# ("M079CS034", "状态量", ""),
# ("M085TV003", "电压6", ""),
# ("M085CV004", "电压6", ""),
# ("M087CS063", "状态量", ""),
# ("M087CS064", "状态量", ""),
# ("M087CS065", "状态量", ""),
# ("M087CS066", "状态量", ""),
# ("M087CS067", "状态量", ""),
# ("M087CS068", "状态量", ""),
# ("M087CS069", "状态量", ""),
# ("M087CS078", "状态量", ""),
# ("M087CS079", "状态量", ""),
# ]
# # ===================== 星间链路 3 项 =====================
# INTERSAT_TABLE = [
# ("M019XV005", "电压3", ""),
# ("M018XV019", "电压3", ""),
# ("M018XV017", "电压3", ""),
# ]
# # 总表映射
# TABLE_MAP = {
# DATA_ID_ENERGY: ENERGY_TABLE,
# DATA_ID_SADA: SADA_TABLE,
# DATA_ID_TTC: TTC_TABLE,
# DATA_ID_INTERSAT: INTERSAT_TABLE,
# }
"""
2026/4/5
TMY
"""
# -*- coding: utf-8 -*-
import math
from utils import logger
def poly4_calc(D):
"""正向 4 次多项式计算 y"""
y = (-49.736 * (D ** 4)
+ 383.38 * (D ** 3)
- 1068.5 * (D ** 2)
+ 1309.9 * D
- 684.71)
return y
def inverse_poly4_fit(y):
"""
逆运算:已知 y → 求 D
适用于y ∈ [-112, 42]
"""
if not (-112 <= y <= 42):
return 0.0 # 超范围保护
# 二分法区间(根据你的遥测范围实测得出)
left = 1.5
right = 4.5
eps = 1e-5
for _ in range(50):
mid = (left + right) / 2
current_y = poly4_calc(mid)
if current_y < y:
left = mid
else:
right = mid
return (left + right) / 2
# 固定系数
Rr = 10000.0
A = -6.01188
B = 4622.53337
C = -86421.72414
# 1. 定义查找表
M001CT025_LOOKUP = {#电阻拟合+B4
27: 119.83471,
27.5:118.5919984,
28: 117.3540572,
28.5:116.1211001,
29: 114.8933358,
29.5:113.6709678,
30: 112.4541945,
30.5:111.2432089,
31: 110.0381985,
31.5:108.8393454,
32: 107.6468265,
32.5:106.4608129,
33: 105.2814702,
33.5:104.1089584,
34: 102.943432,
34.5:101.7850398,
35: 100.6339251,
# 你可以继续加任意多组
}
def find_closest_x(y_input, lookup_table):
"""
查找表通用函数:输入 y返回最接近的 x
:param y_input: 输入的 y 值M001CT025 物理值)
:param lookup_table: 查找表,格式:字典 {y: x}
:return: 最接近的 y 对应的 x
"""
# 找到查找表中 与输入y 最接近的键
closest_y = min(lookup_table.keys(), key=lambda y: abs(y - y_input))
# 返回对应的 x
return lookup_table[closest_y]
def calc_t_from_V(V):
"""正向V → t内部用"""
if V >= 5.0:
V = 4.9999
if V <= 0:
V = 0.0001
R = V * Rr / (5.0 - V)
lnR = math.log(R)
sqrt_val = math.sqrt(B**2 - 4 * C * (A - lnR))
t = 2 * C / (sqrt_val - B) - 273.15
return t
def calc_V_from_t(t_target):
"""
逆运算:已知温度 t → 求遥测电压 V
:param t_target: 目标温度 ℃
:return: V (V),精度 0.0001
"""
# 电压范围 0 ~ 5V
left = 0.0001
right = 4.9999
eps = 1e-5
# 二分法迭代 50 次足够精确
for _ in range(50):
mid = (left + right) / 2
t_mid = calc_t_from_V(mid)
if t_mid < t_target:
left = mid
else:
right = mid
return (left + right) / 2
def calc_V_from_t_new(t):
#R = math.exp(A-(B**2 - B - 4 * C ** 2/(273.15+t)**2)/4/C)
R = math.exp(A+(B*4*C/(273.15+t)+4*C**2/(273.15+t)**2)/4/C)
return R
def inverse_quadratic_fit(y, coeffs, y_min, y_max):
"""
通用二次多项式逆运算3个拟合参数
公式y = a2*D² + a1*D + a0
已知 y → 求 D只返回合法正根
参数:
y: 目标物理值
coeffs: 拟合系数 [a2, a1, a0]
y_min: y 有效最小值
y_max: y 有效最大值
返回:
D: 原始码值
"""
# 1. 边界限幅
y_clamped = max(y_min, min(y, y_max))
# 2. 取出系数
a2, a1, a0 = coeffs
# 3. 构建一元二次方程标准形式A*D² + B*D + C = 0
A = a2
B = a1
C = a0 - y_clamped
# 4. 求判别式
delta = B ** 2 - 4 * A * C
if delta < 0:
delta = 0 # 防止无实根
# 5. 求正根遥测D一定为正
D = (-B + (delta ** 0.5)) / (2 * A)
# 6. 保证 D 不为负
return max(D, 0.0)
def forward_calc(x, item):
method = item['method']
param = item.get('param')
bits = item['bits']
max_val = (1 << bits) - 1 if bits > 0 else 0xFFFFFFFF
try:
# 1. 无处理方法 → 直接取整
if method is None or method.strip() == '':
d = round(y)
# 2. 数值拟合 Y = a*D + b → D=(Y-b)/a
elif method == '数值拟合':
a, b = param
d = a * x + b
# ======================== 修复核心 ========================
# 1. 先取绝对值(消除负数)
d = abs(d)
# 2. 无符号位宽截断
d = d & max_val
return d
except:
return 0
def reverse_calc(y, item):
method = item['method']
param = item.get('param')
bits = item['bits']
max_val = (1 << bits) - 1 if bits > 0 else 0xFFFFFFFF
try:
# 1. 无处理方法 → 直接取整
if method is None or method.strip() == '':
d = round(y)
# 2. 数值拟合 Y = a*D + b → D=(Y-b)/a
elif method == '数值拟合':
a, b = param
d = round((y - b) / a)
# 3. 特殊公式8
elif method == '特殊公式8':
combined = round(y / 0.00205479)
low16 = combined & 0xFFFF
high4 = (combined >> 16) & 0xF
#d = (high4 << 16) | low16
d = (low16 << 16) | (high4 << 0) #2026/5/7
#logger.info(f"特殊公式8反推y={y} low16={hex(low16)}high4 = {hex(high4)}, d={hex(d)}")
# 4. 状态量 → 不处理
elif method == '状态量':
d = round(y)
# 5. 电阻拟合1
elif method == '电阻拟合1':
R = y
V = R * 5.0 / (R + 10000.0)
d = round(V * 255.0 / 5.1)
# 6. 电压1
elif method == '电压1':
d = round(y * 255.0 / 5.1)
# 7. 电压6有符号
elif method == '电压6':
d = round(y * 65535.0 / 20.0)
# 8. 电压3有符号
elif method == '电压3':
d = round(y / 0.000305185)
# 9. 10进制
elif method == '10进制':
d = round(y)
# ===================== 电阻拟合1 → 逆运算 =====================
# 公式:
# V = D/255*5.1
# R = V*10000/(5.0 - V)
# 逆推 D
#2026/3/30手算验证公式是正确的
elif method == "电阻拟合1":
R = y
Vref = 5.0
Rr = 10000.0
# 逆推 V
if R <= 0.0:
V = 0.0
else:
V = (R * Vref) / (R + Rr)
# 逆推 D
D = V * 255.0 / 5.1
return int(round(D))
# ===================== 特殊公式8逆运算 =====================
# 正向combined = (high4 <<16) | low16 result = combined * 0.00205479
# 逆向combined = y / 0.00205479
# high4 = (combined >> 16) & 0xF
# low16 = combined & 0xFFFF
# raw = (high4 << 28) | low16
# elif method == "特殊公式8":
# combined = int(round(y / 0.00205479))
# low16 = combined & 0xFFFF
# high4 = (combined >> 16) & 0x0F
# raw = (high4 << 28) | low16
# return raw
# ===================== 状态量 / 10进制直接返回 =====================
elif method in ["状态量", "10进制"]:
return int(y)
elif method == "特殊公式11-1":
"""
M057JG023 / M057JG024 专用逆运算
输入:物理值 y
输出:原始值 m用于组帧
"""
# if y < (0.0973 * 1840 + 180): # 区间1y < 359.032
# m = (y - 180) / 0.0973
# elif y > (0.0974 * 1840 - 179.46): # 区间2y > -0.444
# m = (y + 179.46) / 0.0974
# else: # m=1840
# m = 1840.0
#2026/5/7修正公式
if y < (180): # 区间1
m = (y + 179.46) / 0.0974
elif y > (180): # 区间2
m = (y - 180) / 0.0973
else: # m=1840
m = 0.0
# 组帧需要整数,返回四舍五入
#logger.info(f"特殊公式11-1反推y={y} d={ float(round(m))}")
return int(round(m))
elif method == "电压2数值拟合":
"""
逆运算先反解数值拟合再反推电压2
"""
#a, b = map(float, param.split(','))
a,b = param # # 直接解包元组
x = (y - b) / a
D = (x + 5) * 409.6## 电压2
return int(round(D)) # 有符号整型
elif method == "电压1数值拟合":
"""
逆运算先反解数值拟合再反推电压2
"""
#a, b = map(float, param.split(','))
a,b = param # # 直接解包元组
x = (y - b) / a
D = x * 255.0 / 5.1## 电压1
return int(round(D)) # 有符号整型
elif method == "电压1数值拟合5":
"""
逆运算先反解数值拟合5次方程再反推电压2
"""
x = inverse_poly4_fit(y) ##2分法求解5次方程
D = x * 255.0 / 5.1## 电压1
return int(round(D)) # 有符号整型
elif method == "电阻拟合1,MF501(电阻)":
#x = calc_V_from_t(y) #2分法先不用
x = calc_V_from_t_new(y)#公式法
R = x
Vref = 5.0 #5->4.75
Rr = 10000.0
# 逆推 V
if R <= 0.0:
V = 0.0
else:
V = (R * Vref) / (R + Rr)
# 逆推 D
D = V * 255.0 / 5.1
return int(round(D))
elif method == "电压1数值拟合3":
# a, b,c,y_min,y_max = map(float, param_str.split(','))
a,b,c,y_min,y_max= param # # 直接解包元组
coeffs = [a,b,c]
x= inverse_quadratic_fit(y, coeffs, y_min, y_max)
D = x * 50
return int(round(D))# 有符号整型
elif method == "电压6数值拟合":
"""
逆运算先反解数值拟合再反推电压2
"""
#a, b = map(float, param_str.split(','))
a,b = param # # 直接解包元组
x = (y - b) / a
D = x * 65535.0 / 20.0 #电压6
return int(round(D)) # 有符号整型
elif method == "电阻拟合1,B4(电阻)":
x = find_closest_x(y, M001CT025_LOOKUP)#使用查找表
# R = x
# Vref = 5.0
# Rr = 10000.0
# # 逆推 V
# if R <= 0.0:
# V = 0.0
# else:
# V = (R * Vref) / (R + Rr)
# # 逆推 D
# D = V * 255.0 / 5.1
D = x #查找表直接串联了公式12能直接从y得到D
return int(round(D))
else:
d = round(y)
# ======================== 修复核心 ========================
# 1. 先取绝对值(消除负数)
#d = abs(d)#2026/5/7删除
# 2. 无符号位宽截断
d = d & max_val
return d
except:
return 0
FORWARD_CALC = forward_calc
REVERSE_CALC = reverse_calc
"""能源46项"""
ENERGY_LAYOUT = {
'length': 65,
'items': [
{"byte":0, "bit":0, "bits":12, "method":"数值拟合", "param":(0.012676885,0.005308819),'param_num':'M002YI002'},
{"byte":1, "bit":4, "bits":12, "method":"数值拟合", "param":(0.02545648,-0.039275645),'param_num':'M002YI004'},
{"byte":3, "bit":0, "bits":12, "method":"数值拟合", "param":(0.007486385,0.018835631),'param_num':'M002YI006'},
{"byte":4, "bit":4, "bits":12, "method":"数值拟合", "param":(0.018036219,-0.029769313),'param_num':'M002YI008'},
{"byte":6, "bit":0, "bits":12, "method":"数值拟合", "param":(0.005004802,-2.17662752),'param_num':'M002YI010'},
{"byte":7, "bit":4, "bits":12, "method":"数值拟合", "param":(0.004907629,-2.036893601),'param_num':'M002YI012'},
{"byte":9, "bit":0, "bits":12, "method":"数值拟合", "param":(0.004989693,-2.140794708),'param_num':'M002YI014'},
{"byte":10,"bit":4, "bits":12, "method":"数值拟合", "param":(0.007120869,-6.19416166),'param_num':'M002YI016'},
{"byte":12,"bit":0, "bits":12, "method":"数值拟合", "param":(0.02499736,-0.09134717),'param_num':'M002YV018'},
{"byte":13,"bit":4, "bits":12, "method":"数值拟合", "param":(0.01837765,-0.00943934),'param_num':'M002YV020'},
{"byte":15,"bit":0, "bits":12, "method":"数值拟合", "param":(0.007807,0),'param_num':'M002YV022'},
{"byte":16,"bit":4, "bits":12, "method":"数值拟合", "param":(0.012667543,0.027994915),'param_num':'M002YI040'},
{"byte":18,"bit":0, "bits":12, "method":"数值拟合", "param":(0.00739087,-0.025728713),'param_num':'M002YI042'},
{"byte":19,"bit":4, "bits":12, "method":"数值拟合", "param":(0.017748254,-0.031591554),'param_num':'M002YI044'},
{"byte":21,"bit":0, "bits":12, "method":"数值拟合", "param":(0.004947258,-2.130449308),'param_num':'M002YI046'},
{"byte":22,"bit":4, "bits":12, "method":"数值拟合", "param":(0.004851602,-1.983224429),'param_num':'M002YI048'},
{"byte":24,"bit":0, "bits":12, "method":"数值拟合", "param":(0.004961177,-2.028220055),'param_num':'M002YI050'},
{"byte":25,"bit":4, "bits":12, "method":"数值拟合", "param":(0.007101109,-6.287326986),'param_num':'M002YI052'},
{"byte":27,"bit":0, "bits":12, "method":"数值拟合", "param":(0.01856155,-0.01615284),'param_num':'M002YV054'},
{"byte":28,"bit":4, "bits":12, "method":"数值拟合", "param":(0.007807,0),'param_num':'M002YV056'},
{"byte":30,"bit":0, "bits":12, "method":"数值拟合", "param":(0.007015417,-6.172192788),'param_num':'M003YI002'},
{"byte":31,"bit":4, "bits":12, "method":"数值拟合", "param":(0.007135218,-6.260644413),'param_num':'M003YI004'},
{"byte":33,"bit":0, "bits":4, "method":"状态量", "param":None,'param_num':'M003YG027'},
{"byte":33,"bit":4, "bits":4, "method":"状态量", "param":None,'param_num':'M003YG028'},
{"byte":34,"bit":0, "bits":4, "method":"状态量", "param":None,'param_num':'M003YG029'},
{"byte":34,"bit":4, "bits":4, "method":"状态量", "param":None,'param_num':'M003YG030'},
{"byte":35,"bit":0, "bits":12, "method":"数值拟合", "param":(0.007295516,-6.588082011),'param_num':'M003YI034'},
{"byte":36,"bit":4, "bits":12, "method":"数值拟合", "param":(0.007280949,-6.426333966),'param_num':'M003YI036'},
{"byte":38,"bit":0, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV002'},
{"byte":39,"bit":4, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV004'},
{"byte":41,"bit":0, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV006'},
{"byte":42,"bit":4, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV008'},
{"byte":44,"bit":0, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV010'},
{"byte":45,"bit":4, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV012'},
{"byte":47,"bit":0, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV014'},
{"byte":48,"bit":4, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV016'},
{"byte":50,"bit":0, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV018'},
{"byte":51,"bit":4, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV022'},
{"byte":53,"bit":0, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV024'},
{"byte":54,"bit":4, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV026'},
{"byte":56,"bit":0, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV028'},
{"byte":57,"bit":4, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV030'},
{"byte":59,"bit":0, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV032'},
{"byte":60,"bit":4, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV034'},
{"byte":62,"bit":0, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV036'},
{"byte":63,"bit":4, "bits":12, "method":"数值拟合", "param":(0.00244140625,0),'param_num':'M004YV038'},
##2026/4/20新增4个遥测量
{"byte":65,"bit":0, "bits":12, "method":"电压2数值拟合", "param":(16.48788,-0.01808),'param_num':'M010YV012'},
{"byte":66,"bit":4, "bits":12, "method":"电压2数值拟合", "param":(16.473805,-0.009011),'param_num':'M010YV014'},
{"byte":68,"bit":0, "bits":12, "method":"电压2数值拟合", "param":(11.32755,0.010142),'param_num':'M010YV006'},
{"byte":69,"bit":4, "bits":12, "method":"数值拟合", "param":(0.025144973,-0.009176576),'param_num':'M004YV038'},
]
}
"""SADA 16B"""
SADA_LAYOUT = {
'length': 16,
'items': [
{"byte":0,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M057JS005'},
{"byte":0,"bit":1,"bits":1,"method":"状态量","param":None,'param_num':'M057JS006'},
{"byte":0,"bit":2,"bits":1,"method":"状态量","param":None,'param_num':'M057JS007'},
{"byte":0,"bit":3,"bits":1,"method":"状态量","param":None,'param_num':'M057JS008'},
{"byte":0,"bit":4,"bits":1,"method":"状态量","param":None,'param_num':'M057JS009'},
{"byte":0,"bit":5,"bits":1,"method":"状态量","param":None,'param_num':'M057JS010'},
{"byte":0,"bit":6,"bits":1,"method":"状态量","param":None,'param_num':'M057JS012'},
{"byte":0,"bit":7,"bits":1,"method":"状态量","param":None,'param_num':'M057JS013'},
{"byte":1,"bit":0,"bits":3,"method":"状态量","param":None,'param_num':'M057JS014'},
{"byte":1,"bit":3,"bits":3,"method":"状态量","param":None,'param_num':'M057JS015'},
{"byte":1,"bit":6,"bits":1,"method":"状态量","param":None,'param_num':'M057JS017'},
{"byte":1,"bit":7,"bits":1,"method":"状态量","param":None,'param_num':'M057JS018'},
{"byte":2,"bit":0,"bits":16,"method":"特殊公式11-1","param":None,'param_num':'M057JG023'},
{"byte":4,"bit":0,"bits":16,"method":"特殊公式11-1","param":None,'param_num':'M057JG024'},
{"byte":6,"bit":0,"bits":16,"method":"数值拟合","param":(0.0003, -0.037),'param_num':''},#暂无
{"byte":8,"bit":0,"bits":32,"method":"特殊公式8","param":None,'param_num':'M057JG039'},
{"byte":12,"bit":0,"bits":32,"method":"特殊公式8","param":None,'param_num':'M057JG040'},
]
}
##测控
TT_LAYOUT = {
'length': 42,#2026/4/7 修改为42
'items': [
{"byte":0,"bit":0,"bits":8,"method":"电阻拟合1,MF501(电阻)","param":None,'param_num':'M001CT001'},
{"byte":1,"bit":0,"bits":8,"method":"电压1数值拟合","param":(1.282,0),'param_num':'M001CV002'},
{"byte":2,"bit":0,"bits":8,"method":"电压1数值拟合","param":(3.030,0),'param_num':'M001CV003'},
{"byte":3,"bit":0,"bits":8,"method":"电压1数值拟合5","param":(-49.736,383.38,-1068.5,1309.9,-684.71),'param_num':'M001CV004'},
{"byte":4,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS005'},
{"byte":5,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS006'},
{"byte":6,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS007'},
{"byte":7,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS008'},
{"byte":8,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS009'},
{"byte":9,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS010'},
{"byte":10,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS011'},
{"byte":11,"bit":0,"bits":8,"method":"电阻拟合1,MF501(电阻)","param":None,'param_num':'M001CT012'},
{"byte":12,"bit":0,"bits":8,"method":"电压1数值拟合","param":(1.2136,0),'param_num':'M001CV013'},
{"byte":13,"bit":0,"bits":8,"method":"电压1数值拟合","param":(2.871,0),'param_num':'M001CV014'},
{"byte":14,"bit":0,"bits":8,"method":"电压1数值拟合5","param":(-54.122,417.42,-1166.5,1434.6,-743.93),'param_num':'M001CV015'},
{"byte":15,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS016'},
{"byte":16,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS017'},
{"byte":17,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS018'},
{"byte":18,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS019'},
{"byte":19,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS020'},
{"byte":20,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS021'},
{"byte":21,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS022'},
{"byte":22,"bit":0,"bits":8,"method":"电压1","param":None,'param_num':'M001CV023'},
{"byte":23,"bit":0,"bits":8,"method":"电压1数值拟合3","param":(0.4116,0.931,0,0,12),'param_num':'M001CV024'},
{"byte":24,"bit":0,"bits":8,"method":"电阻拟合1,B4(电阻)","param":(-0.112,4.8447,-85.505,489.01),'param_num':'M001CT025'},
{"byte":25,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS026'},
{"byte":26,"bit":0,"bits":8,"method":"电压1数值拟合3","param":(-0.0045,0.9061,0,0,1),'param_num':'M001CI027'},
{"byte":27,"bit":0,"bits":8,"method":"电压1","param":None,'param_num':'M001CV028'},
{"byte":28,"bit":0,"bits":8,"method":"电压1数值拟合3","param":(0.3723,0.9585,0,0,12),'param_num':'M001CV029'},
{"byte":29,"bit":0,"bits":8,"method":"电阻拟合1,MF501(电阻)","param":None,'param_num':'M001CT030'},
{"byte":30,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS031'},
{"byte":31,"bit":0,"bits":8,"method":"电压1数值拟合3","param":(0.0099,0.8116,0,0,1),'param_num':'M001CI032'},
{"byte":32,"bit":0,"bits":8,"method":"电阻拟合1,MF501(电阻)","param":None,'param_num':'M001CT033'},
{"byte":33,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS034'},
{"byte":34,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M001CS035'},
{"byte":35,"bit":0,"bits":2,"method":"状态量","param":None,'param_num':'M079CG032'},
{"byte":35,"bit":2,"bits":1,"method":"状态量","param":None,'param_num':'M079CS033'},
{"byte":35,"bit":3,"bits":1,"method":"状态量","param":None,'param_num':'M079CS034'},
{"byte":36,"bit":0,"bits":16,"method":"电压6","param":None,'param_num':'M085TV003'},
{"byte":38,"bit":0,"bits":16,"method":"电压6数值拟合","param":(1.73,0),'param_num':'M085CV004'},
{"byte":40,"bit":3,"bits":1,"method":"状态量","param":None,'param_num':'M087CS063'},
{"byte":40,"bit":4,"bits":1,"method":"状态量","param":None,'param_num':'M087CS064'},
{"byte":40,"bit":5,"bits":1,"method":"状态量","param":None,'param_num':'M087CS065'},
{"byte":40,"bit":6,"bits":1,"method":"状态量","param":None,'param_num':'M087CS066'},
{"byte":40,"bit":7,"bits":1,"method":"状态量","param":None,'param_num':'M087CS067'},
{"byte":41,"bit":0,"bits":1,"method":"状态量","param":None,'param_num':'M087CS068'},
{"byte":41,"bit":1,"bits":1,"method":"状态量","param":None,'param_num':'M087CS069'},
{"byte":41,"bit":2,"bits":1,"method":"状态量","param":None,'param_num':'M087CS078'},
{"byte":41,"bit":3,"bits":1,"method":"状态量","param":None,'param_num':'M087CS079'},
]
}
#星间链路
INTER_SAT_LAYOUT = {
'length': 6,
'items': [
{"byte":0,"bit":0,"bits":16,"method":"电压3","param":None,'param_num':'M019XV005'},
{"byte":2,"bit":0,"bits":16,"method":"电压3","param":None,'param_num':'M018XV017'},
{"byte":4,"bit":0,"bits":16,"method":"电压3","param":None,'param_num':'M018XV019'},
]
}
#总映射
TELEM_LAYOUT = {
0x00110000: ENERGY_LAYOUT,
0x00330000: TT_LAYOUT,
0x00440000: SADA_LAYOUT,
0x00550000: INTER_SAT_LAYOUT,
}

View File

@@ -0,0 +1,65 @@
import struct
import math
"""
2026/3/30 停用
"""
# ===================== 模型配置表 =====================
MODEL_MAP = {
0x00110000: "energy",
0x00440000: "sada",
0x00330000: "ttc",
0x00550000: "intersat",
}
# 内部实现所有拟合/公式,状态量只返回原值不处理
def process_value(value: float, method: str, param: str, ref_cache: dict) -> float:
try:
x = value
if not method:
return x
# 数值拟合 y = ax + b
if method == "数值拟合":
a, b = map(float, param.split(","))
return a * x + b
# 电压1: V = D/255*5.1 D无符号int
elif method == "电压1":
D = int(x)
return D / 255.0 * 5.1
# 电压6: V = D*20/65535 D有符号int
elif method == "电压6":
D = int(x)
return D * 20.0 / 65535.0
# 电压3: V = D*0.000305185 D有符号int
elif method == "电压3":
D = int(x)
return D * 0.000305185
# 电阻拟合1: Rr=1e4; V=D/255*5.1; R=V*Rr/(Vref-V)
elif method == "电阻拟合1":
D = int(x)
V = D / 255.0 * 5.1
ref_name = param.strip()
Vref = ref_cache.get(ref_name, 5.1)
if abs(Vref - V) < 1e-9:
return 0.0
Rr = 10000.0
return V * Rr / (Vref - V)
# 特殊公式8按你文档实现
elif method == "特殊公式8":
# 简化示例:返回原值,可按需求扩展
return x
# 状态量 / 10进制不处理
elif method in ["状态量", "10进制"]:
return x
return x
except:
return value

389
processor/telm_calc.py Normal file
View File

@@ -0,0 +1,389 @@
"""
2026/3/29
"""
import struct
import math
def calc_telem(value: float, method: str, param_str: str, ref_cache: dict) -> float:
#def telem_calc(value: float, method: str, param_str: str, ref_cache: dict) -> float:
try:
x = value
# 空方法:原值
if not method:
return x
# 数值拟合 y = a*x + b
if method == "数值拟合":
a, b = map(float, param_str.split(','))
return a * x + b
# 电压1V = D/255*5.1 D无符号整型
elif method == "电压1":
D = int(x)
return D / 255.0 * 5.1
# 电压6V = D*20/65535 D有符号整型
elif method == "电压6":
D = int(x)
return D * 20.0 / 65535.0
# 电压3V = D*0.000305185 D有符号整型
elif method == "电压3":
D = int(x)
return D * 0.000305185
# 电压2V= D *10/4096-5 D有符号整型
elif method == "电压2":
D = int(x )
return D * 10 / 4096 - 5
# # 电阻拟合1
# elif method == "电阻拟合1":
# D = int(x)
# V = D / 255.0 * 5.1
# ref_key = param_str.strip()
# Vref = ref_cache.get(ref_key, 5.1)
# if abs(Vref - V) < 1e-12:
# return 0.0
# Rr = 10000.0
# return V * Rr / (Vref - V)
# 电阻拟合1
elif method == "电阻拟合1":
D = int(x)
V = D / 255.0 * 5.1
# V基准固定为 5.0V
Vref = 5.0
if abs(Vref - V) < 1e-12:
return 0.0
Rr = 10000.0
return V * Rr / (Vref - V)
# # 特殊公式8按你描述完整实现
# elif method == "特殊公式8":
# raw = int(x)
# if param_str:
# parts = param_str.split(',')
# else:
# parts = []
# flag = int(parts[0]) if len(parts) >= 1 else 0
# if flag == 0:
# # 遥测状态字16位处理
# w = raw & 0xFFFF
# bh = (w >> 8) & 0xFF
# bl = w & 0xFF
# bh8 = bh + 0x8
# bl8 = bl + 0x8
# h4 = (bh8 >> 4) & 0xF
# l4 = (bl8 >> 4) & 0xF
# B1 = (l4 << 4) | h4
# else:
# # 遥控状态字8位直接用
# B1 = raw & 0xFF
# # 后面位比较逻辑你需要我也可以补全
# return float(B1)
elif method == "特殊公式8":
"""
最新规则:
1) 原始值取整
2) 低 16bit低位
3) 高 4bit :高位
4) 合并 = (高位4bit << 16) | 低位16bit
5) 结果 = 合并值 × 0.00205479
"""
raw_int = int(x) & 0xFFFFFFFF # 取32位无符号
# 低位 16bit
low16 = raw_int & 0xFFFF
# 高位 4bit最后4bit
high4 = (raw_int >> 28) & 0x0F
# 合并 20bit高4位 <<16 | 低16位
combined = (high4 << 16) | low16
# 乘以系数
result = combined * 0.00205479
return float(result)
# 状态量 / 10进制不处理
elif method in ["状态量", "10进制"]:
return x
return x
except Exception as e:
return value
import struct
import math
def poly4_calc(D):
"""正向 4 次多项式计算 y"""
y = (-49.736 * (D ** 4)
+ 383.38 * (D ** 3)
- 1068.5 * (D ** 2)
+ 1309.9 * D
- 684.71)
return y
def inverse_poly4_fit(y):
"""
逆运算:已知 y → 求 D
适用于y ∈ [-112, 42]
"""
if not (-112 <= y <= 42):
return 0.0 # 超范围保护
# 二分法区间(根据你的遥测范围实测得出)
left = 1.5
right = 4.5
eps = 1e-5
for _ in range(50):
mid = (left + right) / 2
current_y = poly4_calc(mid)
if current_y < y:
left = mid
else:
right = mid
return (left + right) / 2
# 固定系数
Rr = 10000.0
A = -6.01188
B = 4622.53337
C = -86421.72414
def calc_t_from_V(V):
"""正向V → t内部用"""
if V >= 5.0:
V = 4.9999
if V <= 0:
V = 0.0001
R = V * Rr / (5.0 - V)
lnR = math.log(R)
sqrt_val = math.sqrt(B**2 - 4 * C * (A - lnR))
t = 2 * C / (sqrt_val - B) - 273.15
return t
def calc_V_from_t(t_target):
"""
逆运算:已知温度 t → 求遥测电压 V
:param t_target: 目标温度 ℃
:return: V (V),精度 0.0001
"""
# 电压范围 0 ~ 5V
left = 0.0001
right = 4.9999
eps = 1e-5
# 二分法迭代 50 次足够精确
for _ in range(50):
mid = (left + right) / 2
t_mid = calc_t_from_V(mid)
if t_mid < t_target:
left = mid
else:
right = mid
return (left + right) / 2
def inverse_quadratic_fit(y, coeffs, y_min, y_max):
"""
通用二次多项式逆运算3个拟合参数
公式y = a2*D² + a1*D + a0
已知 y → 求 D只返回合法正根
参数:
y: 目标物理值
coeffs: 拟合系数 [a2, a1, a0]
y_min: y 有效最小值
y_max: y 有效最大值
返回:
D: 原始码值
"""
# 1. 边界限幅
y_clamped = max(y_min, min(y, y_max))
# 2. 取出系数
a2, a1, a0 = coeffs
# 3. 构建一元二次方程标准形式A*D² + B*D + C = 0
A = a2
B = a1
C = a0 - y_clamped
# 4. 求判别式
delta = B ** 2 - 4 * A * C
if delta < 0:
delta = 0 # 防止无实根
# 5. 求正根遥测D一定为正
D = (-B + (delta ** 0.5)) / (2 * A)
# 6. 保证 D 不为负
return max(D, 0.0)
def calc_telem_reverse(result: float, method: str, param_str: str) -> float:
"""
【逆运算】
输入A 软件发来的 结果值
输出:反推出来的 原始值 D
完全按你提供的处理方法反向计算
"""
try:
y = result
# ===================== 空方法:直接返回 =====================
if not method:
return y
# ===================== 数值拟合Y = a*x + b → x=(y-b)/a =====================
if method == "数值拟合":
a, b = map(float, param_str.split(','))
x = (y - b) / a
return x
# ===================== 电压1V = D/255*5.1 → D=V*255/5.1 =====================
elif method == "电压1":
D = y * 255.0 / 5.1
return float(int(round(D))) # 原始是无符号整型
# ===================== 电压6V = D*20/65535 → D=V*65535/20 =====================
elif method == "电压6":
D = y * 65535.0 / 20.0
return float(int(round(D))) # 有符号整型
# ===================== 电压3V = D*0.000305185 → D=V / 0.000305185 =====================
elif method == "电压3":
D = y / 0.000305185
return float(int(round(D))) # 有符号整型
# ===================== 电压2V电压2 = D *10/4096-5其中D为无符号整型计算时转化成十进制数。 → D=V + 5*409.6 =====================
elif method == "电压2":
D = (y + 5) * 409.6
return float(int(round(D))) # 有符号整型
# ===================== 电阻拟合1 → 逆运算 =====================
# 公式:
# V = D/255*5.1
# R = V*10000/(5.0 - V)
# 逆推 D
#2026/3/30手算验证公式是正确的
elif method == "电阻拟合1":
R = y
Vref = 5.0
Rr = 10000.0
# 逆推 V
if R <= 0.0:
V = 0.0
else:
V = (R * Vref) / (R + Rr)
# 逆推 D
D = V * 255.0 / 5.1
return float(int(round(D)))
# ===================== 特殊公式8逆运算 =====================
# 正向combined = (high4 <<16) | low16 result = combined * 0.00205479
# 逆向combined = y / 0.00205479
# high4 = (combined >> 16) & 0xF
# low16 = combined & 0xFFFF
# raw = (high4 << 28) | low16
elif method == "特殊公式8":
combined = int(round(y / 0.00205479))
low16 = combined & 0xFFFF
high4 = (combined >> 16) & 0x0F
raw = (high4 << 28) | low16
return float(raw)
# ===================== 状态量 / 10进制直接返回 =====================
elif method in ["状态量", "10进制"]:
return y
elif method == "特殊公式11-1":
"""
M057JG023 / M057JG024 专用逆运算
输入:物理值 y
输出:原始值 m用于组帧
"""
# if y < (0.0973 * 1840 + 180): # 区间1y < 359.032
# m = (y - 180) / 0.0973
# elif y > (0.0974 * 1840 - 179.46): # 区间2y > -0.444
# m = (y + 179.46) / 0.0974
# else: # m=1840
# m = 1840.0
#2026/5/7修正公式
if y < (180): # 区间1
m = (y + 179.46) / 0.0974
elif y > (180): # 区间2
m = (y - 180) / 0.0973
else: # m=1840
m = 0.0
# 组帧需要整数,返回四舍五入
return float(round(m))
elif method == "电压2数值拟合":
"""
逆运算先反解数值拟合再反推电压2
"""
a, b = map(float, param_str.split(','))
x = (y - b) / a
D = (x + 5) * 409.6## 电压2
return float(int(round(D))) # 有符号整型
elif method == "电压1数值拟合":
"""
逆运算先反解数值拟合再反推电压2
"""
a, b = map(float, param_str.split(','))
x = (y - b) / a
D = x * 255.0 / 5.1## 电压1
return float(int(round(D))) # 有符号整型
elif method == "电压1数值拟合5":
"""
逆运算先反解数值拟合5次方程再反推电压2
"""
x = inverse_poly4_fit(y) ##2分法求解5次方程
D = x * 255.0 / 5.1## 电压1
return float(int(round(D))) # 有符号整型
elif method == "电阻拟合1,MF501(电阻)":
x = calc_V_from_t(y) #2分法
R = x
Vref = 5.0
Rr = 10000.0
# 逆推 V
if R <= 0.0:
V = 0.0
else:
V = (R * Vref) / (R + Rr)
# 逆推 D
D = V * 255.0 / 5.1
return float(int(round(D)))
elif method == "电压1数值拟合3":
a, b,c,y_min,y_max = map(float, param_str.split(','))
coeffs = [a,b,c]
return inverse_quadratic_fit(y, coeffs, y_min, y_max)
elif method == "电压6数值拟合":
"""
逆运算先反解数值拟合再反推电压2
"""
a, b = map(float, param_str.split(','))
x = (y - b) / a
D = x * 65535.0 / 20.0 #电压6
return float(int(round(D))) # 有符号整型
except Exception as e:
return result