1
0

conversions.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. const {
  2. ATT_COEF,
  3. DEFAULT_DRIVER_PARAMS,
  4. SCALE_MAX,
  5. TWO_PI,
  6. getDriverParams,
  7. getSharedInputValues,
  8. toFiniteNumber
  9. } = require('./calculation-context')
  10. function getSpeedBase(inputValues = {}, driverParams = DEFAULT_DRIVER_PARAMS) {
  11. const candidates = [
  12. inputValues['速度基准'],
  13. getSharedInputValues()['速度基准'],
  14. driverParams.speedBase
  15. ]
  16. for (let index = 0; index < candidates.length; index += 1) {
  17. const speedBase = toFiniteNumber(candidates[index])
  18. if (speedBase > 0) return speedBase
  19. }
  20. return 0
  21. }
  22. function getSampleLimits(driverParams = getDriverParams()) {
  23. const baseVoltage = driverParams.baseVoltage
  24. const samplingResistorOhm = driverParams.samplingResistorMohm / 1000
  25. const currentSampleMax = baseVoltage / 2 / samplingResistorOhm / driverParams.opAmpGain
  26. const currentBase = currentSampleMax * 2
  27. const voltageSampleMax = driverParams.busVoltageDividerRatio * baseVoltage
  28. return {
  29. analogInputDividerRatio: driverParams.analogInputDividerRatio,
  30. baseVoltage,
  31. busVoltageDividerRatio: driverParams.busVoltageDividerRatio,
  32. carrierFrequencyKHz: driverParams.carrierFrequencyKHz,
  33. currentBase,
  34. currentSampleMax,
  35. speedBase: getSpeedBase({}, driverParams),
  36. voltageSampleMax
  37. }
  38. }
  39. function formatWriteValue(value) {
  40. if (!Number.isFinite(value)) return '--'
  41. return String(Math.round(value))
  42. }
  43. function formatFixedValue(value, precision = 2) {
  44. const numberValue = toFiniteNumber(value, NaN)
  45. if (!Number.isFinite(numberValue)) return '--'
  46. const text = numberValue.toFixed(precision)
  47. return Number(text) === 0 ? (0).toFixed(precision) : text
  48. }
  49. function calculateSpeedSlope(inputValues, driverParams = getDriverParams()) {
  50. const speedMin = toFiniteNumber(inputValues['速度最小值'])
  51. const speedMax = toFiniteNumber(inputValues['速度最大值'])
  52. const speedBase = getSpeedBase(inputValues, driverParams)
  53. const minVoltage = toFiniteNumber(inputValues['调速最低电压'])
  54. const maxVoltage = toFiniteNumber(inputValues['调速最高电压'])
  55. const { baseVoltage, analogInputDividerRatio } = getSampleLimits(driverParams)
  56. if (speedMax <= speedMin || maxVoltage <= minVoltage || !speedBase) return null
  57. return (speedMax - speedMin) / speedBase / ((maxVoltage - minVoltage) * analogInputDividerRatio / baseVoltage)
  58. }
  59. function calculateSpeedCommandWriteValue(actualValue, inputValues = {}, driverParams = getDriverParams()) {
  60. if (actualValue === '' || actualValue === undefined || actualValue === null) return '--'
  61. const numberValue = toFiniteNumber(actualValue, NaN)
  62. const speedBase = getSpeedBase(inputValues, driverParams)
  63. if (!Number.isFinite(numberValue) || !speedBase) return '--'
  64. return formatWriteValue(numberValue / speedBase * SCALE_MAX)
  65. }
  66. function calculateAtoGainWriteValues(atoBandwidth, inputValues = {}, driverParams = getDriverParams()) {
  67. if (atoBandwidth === '' || atoBandwidth === undefined || atoBandwidth === null) {
  68. return {
  69. kpWriteValue: '--',
  70. kiWriteValue: '--'
  71. }
  72. }
  73. const bandwidth = toFiniteNumber(atoBandwidth, NaN)
  74. const speedBase = getSpeedBase(inputValues, driverParams)
  75. const polePairs = toFiniteNumber(inputValues['极对数'])
  76. const sampleFrequency = driverParams.carrierFrequencyKHz * 1000
  77. const tpwmValue = 1 / sampleFrequency
  78. const baseFrequency = speedBase / 60 * polePairs
  79. if (!Number.isFinite(bandwidth) || !speedBase || !polePairs || !baseFrequency) {
  80. return {
  81. kpWriteValue: '--',
  82. kiWriteValue: '--'
  83. }
  84. }
  85. return {
  86. kpWriteValue: formatWriteValue(4095 * TWO_PI * ATT_COEF * bandwidth / baseFrequency),
  87. kiWriteValue: formatWriteValue(SCALE_MAX * TWO_PI * bandwidth * bandwidth * tpwmValue / baseFrequency)
  88. }
  89. }
  90. function calculateDqGainWriteValue(item, actualValue) {
  91. if (actualValue === '' || actualValue === undefined || actualValue === null) return '--'
  92. const numberValue = toFiniteNumber(actualValue, NaN)
  93. if (!Number.isFinite(numberValue)) return '--'
  94. if (item.gainType === 'kp') return formatWriteValue(4095 * numberValue)
  95. if (item.gainType === 'ki') return formatWriteValue(SCALE_MAX * numberValue)
  96. return formatWriteValue(numberValue)
  97. }
  98. function getFloatPrecision(item) {
  99. if (item.name === 'LD' || item.name === 'LQ') return 6
  100. if (item.name === 'RS') return 4
  101. return 2
  102. }
  103. function calculateParameterInputWriteValue(item, actualValue, inputValues = {}, driverParams = getDriverParams()) {
  104. if (actualValue === '' || actualValue === undefined || actualValue === null) return '--'
  105. const numberValue = toFiniteNumber(actualValue, NaN)
  106. if (!Number.isFinite(numberValue)) return '--'
  107. const { baseVoltage, analogInputDividerRatio } = getSampleLimits(driverParams)
  108. const speedBase = getSpeedBase(inputValues, driverParams)
  109. if (['开机电压', '关机电压', '调速最低电压', '调速最高电压'].includes(item.name)) {
  110. return formatWriteValue(SCALE_MAX * numberValue / baseVoltage * analogInputDividerRatio)
  111. }
  112. if (['速度最小值', '速度最大值'].includes(item.name)) {
  113. if (!speedBase) return '--'
  114. return formatWriteValue(SCALE_MAX * numberValue / speedBase)
  115. }
  116. if (item.name === 'SOUT_MAX') {
  117. const { currentBase } = getSampleLimits(driverParams)
  118. return formatWriteValue(numberValue / currentBase * SCALE_MAX)
  119. }
  120. if (item.name === '上油转速') {
  121. if (!speedBase) return '--'
  122. return formatWriteValue(SCALE_MAX * numberValue / speedBase)
  123. }
  124. if (item.type === 'uint8_t') {
  125. if (numberValue < 0 || numberValue > 0xFF) return '--'
  126. return formatWriteValue(numberValue)
  127. }
  128. if (item.type === 'float') return formatFixedValue(numberValue, getFloatPrecision(item))
  129. return formatWriteValue(numberValue)
  130. }
  131. function calculateProtectionWriteValue(item, actualValue, driverParams = getDriverParams()) {
  132. if (!actualValue && actualValue !== 0) return '--'
  133. const { currentBase, currentSampleMax, voltageSampleMax, speedBase } = getSampleLimits(driverParams)
  134. if (['过压保护值', '欠压保护值', '过压恢复值', '欠压恢复值'].includes(item.name)) {
  135. return formatWriteValue(actualValue / voltageSampleMax * SCALE_MAX)
  136. }
  137. if (item.name === '软件过流值') {
  138. return formatWriteValue(actualValue / currentBase * SCALE_MAX)
  139. }
  140. if (['速度限制最大值', '速度限制最小值', '速度中间值'].includes(item.name)) {
  141. return formatWriteValue(actualValue / speedBase * SCALE_MAX)
  142. }
  143. if (item.name === '功率保护值') {
  144. return formatWriteValue(actualValue / currentSampleMax / voltageSampleMax * SCALE_MAX)
  145. }
  146. return item.type === 'float' ? formatFixedValue(Number(actualValue), 2) : formatWriteValue(actualValue)
  147. }
  148. function calculateParameterReadValue(item, rawValue, inputValues = {}, driverParams = getDriverParams()) {
  149. const rawNumber = toFiniteNumber(rawValue, NaN)
  150. if (!Number.isFinite(rawNumber)) return null
  151. const ratio = rawNumber / SCALE_MAX
  152. const {
  153. analogInputDividerRatio,
  154. baseVoltage,
  155. currentBase,
  156. currentSampleMax,
  157. voltageSampleMax
  158. } = getSampleLimits(driverParams)
  159. const speedBase = getSpeedBase(inputValues, driverParams)
  160. if (['开机电压', '关机电压', '调速最低电压', '调速最高电压'].includes(item.name)) {
  161. return analogInputDividerRatio ? ratio * baseVoltage / analogInputDividerRatio : null
  162. }
  163. if (['过压保护值', '欠压保护值', '过压恢复值', '欠压恢复值'].includes(item.name)) {
  164. return ratio * voltageSampleMax
  165. }
  166. if (['速度最小值', '速度最大值', '上油转速', '速度限制最大值', '速度限制最小值', '速度中间值'].includes(item.name)) {
  167. return speedBase ? ratio * speedBase : null
  168. }
  169. if (item.name === '软件过流值' || item.name === 'SOUT_MAX') {
  170. return ratio * currentBase
  171. }
  172. if (item.name === '功率保护值') {
  173. return ratio * currentSampleMax * voltageSampleMax
  174. }
  175. return null
  176. }
  177. function calculateStatusValue(name, rawValue, driverParams = getDriverParams()) {
  178. const rawNumber = toFiniteNumber(rawValue)
  179. const ratio = rawNumber / SCALE_MAX
  180. const {
  181. analogInputDividerRatio,
  182. baseVoltage,
  183. busVoltageDividerRatio,
  184. currentBase,
  185. currentSampleMax,
  186. voltageSampleMax,
  187. speedBase
  188. } = getSampleLimits(driverParams)
  189. if (name === '母线电压') return ratio * baseVoltage * busVoltageDividerRatio
  190. if (name === '母线电流') return ratio * currentBase
  191. if (name === 'NTC 电压') return ratio * baseVoltage
  192. if (name === '模拟输入电压') return analogInputDividerRatio ? ratio * baseVoltage / analogInputDividerRatio : 0
  193. if (name === '估算速度') return ratio * speedBase
  194. if (name === '估算功率') return ratio * voltageSampleMax * currentSampleMax
  195. if (name === '频率' || name === '占空比') return rawNumber / 10
  196. return rawNumber
  197. }
  198. module.exports = {
  199. SCALE_MAX,
  200. calculateAtoGainWriteValues,
  201. calculateDqGainWriteValue,
  202. calculateParameterInputWriteValue,
  203. calculateParameterReadValue,
  204. calculateProtectionWriteValue,
  205. calculateSpeedCommandWriteValue,
  206. calculateSpeedSlope,
  207. calculateStatusValue,
  208. formatFixedValue,
  209. getSampleLimits
  210. }