首次提交完整的python工程代码
This commit is contained in:
BIN
processor/__pycache__/telem_config.cpython-311.pyc
Normal file
BIN
processor/__pycache__/telem_config.cpython-311.pyc
Normal file
Binary file not shown.
BIN
processor/__pycache__/telm_calc.cpython-311.pyc
Normal file
BIN
processor/__pycache__/telm_calc.cpython-311.pyc
Normal file
Binary file not shown.
47
processor/param_tables.py
Normal file
47
processor/param_tables.py
Normal 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
864
processor/telem_config.py
Normal 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): # 区间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,
|
||||
}
|
||||
65
processor/telem_processor.py
Normal file
65
processor/telem_processor.py
Normal 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
389
processor/telm_calc.py
Normal 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
|
||||
|
||||
# 电压1:V = D/255*5.1 D无符号整型
|
||||
elif method == "电压1":
|
||||
D = int(x)
|
||||
return D / 255.0 * 5.1
|
||||
|
||||
# 电压6:V = D*20/65535 D有符号整型
|
||||
elif method == "电压6":
|
||||
D = int(x)
|
||||
return D * 20.0 / 65535.0
|
||||
|
||||
# 电压3:V = D*0.000305185 D有符号整型
|
||||
elif method == "电压3":
|
||||
D = int(x)
|
||||
return D * 0.000305185
|
||||
|
||||
# 电压2:V= 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
|
||||
|
||||
# ===================== 电压1:V = D/255*5.1 → D=V*255/5.1 =====================
|
||||
elif method == "电压1":
|
||||
D = y * 255.0 / 5.1
|
||||
return float(int(round(D))) # 原始是无符号整型
|
||||
|
||||
# ===================== 电压6:V = D*20/65535 → D=V*65535/20 =====================
|
||||
elif method == "电压6":
|
||||
D = y * 65535.0 / 20.0
|
||||
return float(int(round(D))) # 有符号整型
|
||||
|
||||
# ===================== 电压3:V = D*0.000305185 → D=V / 0.000305185 =====================
|
||||
elif method == "电压3":
|
||||
D = y / 0.000305185
|
||||
return float(int(round(D))) # 有符号整型
|
||||
|
||||
# ===================== 电压2:V电压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): # 区间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
|
||||
# 组帧需要整数,返回四舍五入
|
||||
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
|
||||
Reference in New Issue
Block a user