# # 数据代号定义 # 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): # 区间1:y < 359.032 # m = (y - 180) / 0.0973 # elif y > (0.0974 * 1840 - 179.46): # 区间2:y > -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 #查找表直接串联了公式1,2,能直接从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, }