Files
protocol_convert_software_BD3/processor/telem_config.py

864 lines
37 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# # 数据代号定义
# 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,
}