Files
protocol_convert_software_BD3/processor/telem_config.py

864 lines
37 KiB
Python
Raw Normal View History

# # 数据代号定义
# 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* + 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,
}