params.wxml 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. <navigation-bar background="{{themeMode === 'dark' ? '#111827' : '#FFF'}}"></navigation-bar>
  2. <view wx:if="{{toastText}}" class="page-toast page-toast--{{toastType}} {{themeClass}}">
  3. {{toastText}}
  4. </view>
  5. <view wx:if="{{activeParamView}}" class="subpage-fixed-header {{activeParamView == 'genericModbus' ? 'subpage-fixed-header--generic' : ''}} {{themeClass}}">
  6. <view class="subpage-page-header">
  7. <view wx:if="{{!(isGenericProtocol && activeParamView == 'genericModbus')}}" class="subpage-back" bindtap="backToParamsHome">
  8. <view class="subpage-back-icon"></view>
  9. </view>
  10. <view class="subpage-page-title">
  11. {{activeParamView == 'driver' ? '驱动器参数' : activeParamView == 'protection' ? '保护' : activeParamView == 'estimator' ? '估算器参数' : activeParamView == 'dq' ? 'DQ轴电流环参数' : activeParamView == 'startup' ? '启动位置管理' : activeParamView == 'speed' ? '速度管理' : activeParamView == 'genericModbus' ? '' : activeParamView == 'status' ? '状态' : ''}}
  12. </view>
  13. <view wx:if="{{activeParamView == 'driver'}}" class="panel-actions subpage-actions">
  14. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" bindtap="readDriverPageParameters">读取</view>
  15. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" bindtap="writeMotorParameters">写入</view>
  16. </view>
  17. <view wx:elif="{{activeParamView == 'protection'}}" class="panel-actions subpage-actions">
  18. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" data-group="protection" bindtap="onGroupRead">读取</view>
  19. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" data-group="protection" bindtap="onGroupWrite">写入</view>
  20. </view>
  21. <view wx:elif="{{activeParamView == 'estimator'}}" class="panel-actions panel-actions--three subpage-actions">
  22. <view class="panel-action-button" bindtap="onEstimatorUpdate">更新</view>
  23. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" data-group="estimator" bindtap="onGroupRead">读取</view>
  24. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" data-group="estimator" bindtap="onGroupWrite">写入</view>
  25. </view>
  26. <view wx:elif="{{activeParamView == 'dq'}}" class="panel-actions subpage-actions">
  27. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" data-group="dq" bindtap="onGroupRead">读取</view>
  28. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" data-group="dq" bindtap="onGroupWrite">写入</view>
  29. </view>
  30. <view wx:elif="{{activeParamView == 'startup'}}" class="panel-actions subpage-actions">
  31. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" bindtap="readStartupManagement">读取</view>
  32. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" bindtap="writeStartupManagement">写入</view>
  33. </view>
  34. <view wx:elif="{{activeParamView == 'speed'}}" class="panel-actions subpage-actions">
  35. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" bindtap="readSpeedManagement">读取</view>
  36. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" bindtap="writeSpeedManagement">写入</view>
  37. </view>
  38. <view wx:elif="{{activeParamView == 'genericModbus'}}" class="panel-actions subpage-actions">
  39. <view class="panel-action-button" bindtap="saveGenericModbusJson">保存</view>
  40. <view class="panel-action-button" bindtap="importGenericModbusJson">加载</view>
  41. <view class="panel-action-button panel-action-button--icon" bindtap="openGenericModbusDraft">+</view>
  42. </view>
  43. <view wx:elif="{{activeParamView == 'status'}}" class="panel-actions subpage-actions">
  44. <view class="panel-action-button {{canReadStatus ? '' : 'is-disabled'}}" bindtap="readStatus">读取</view>
  45. </view>
  46. </view>
  47. </view>
  48. <scroll-view class="scrollarea {{themeClass}} {{activeParamView ? 'scrollarea--subpage' : ''}} {{activeParamView == 'genericModbus' ? 'scrollarea--generic' : ''}}" scroll-y type="list">
  49. <view class="page-shell">
  50. <block wx:if="{{activeParamView == 'driver'}}">
  51. <view class="panel driver-summary-panel">
  52. <view class="driver-summary-row driver-summary-row--top">
  53. <text class="driver-summary-chip">{{chipModel || '--'}}</text>
  54. <text class="driver-summary-checksum">{{flashChecksum || '--'}}</text>
  55. </view>
  56. <view class="driver-summary-row driver-summary-row--model">
  57. <text class="driver-summary-model">{{motorModel || '--'}}</text>
  58. </view>
  59. </view>
  60. <view class="panel params-section-panel">
  61. <view class="params-section-title">硬件参数</view>
  62. <view wx:for="{{readonlyParamRegisters}}" wx:key="name" class="param-row">
  63. <view class="param-main">
  64. <view class="param-name">{{item.name}}</view>
  65. <view wx:if="{{!item.hideMeta}}" class="param-meta">{{item.addressDisplay}}</view>
  66. </view>
  67. <view class="param-value">{{item.displayValue || '--'}}{{item.unit ? ' ' + item.unit : ''}}</view>
  68. </view>
  69. </view>
  70. <view class="panel params-section-panel">
  71. <view class="params-section-title">电机参数</view>
  72. <view wx:for="{{motorParameterInputRegisters}}" wx:key="name" class="param-row input-row">
  73. <view class="param-main">
  74. <view class="param-name">{{item.name}}</view>
  75. <view class="param-meta {{item.isDirty ? 'param-meta--dirty' : ''}}">{{item.addressDisplay}} {{item.writeValue || '--'}}</view>
  76. </view>
  77. <view class="input-wrap">
  78. <input
  79. class="value-input value-input--with-unit"
  80. type="{{item.unit ? 'text' : 'digit'}}"
  81. placeholder="--"
  82. value="{{item.inputValue}}"
  83. data-index="{{index}}"
  84. bindinput="onMotorParameterInput"
  85. bindblur="onMotorParameterBlur"
  86. />
  87. </view>
  88. </view>
  89. </view>
  90. </block>
  91. <block wx:elif="{{activeParamView == 'protection'}}">
  92. <view
  93. wx:for="{{protectionSections}}"
  94. wx:for-item="section"
  95. wx:key="key"
  96. class="panel protection-section-panel"
  97. >
  98. <view class="params-section-title">{{section.title}}</view>
  99. <view
  100. wx:for="{{section.rows}}"
  101. wx:for-item="row"
  102. wx:key="key"
  103. class="protection-field-row"
  104. >
  105. <view
  106. wx:for="{{row.fields}}"
  107. wx:for-item="field"
  108. wx:key="name"
  109. class="protection-field protection-field--{{field.kind}}"
  110. >
  111. <view class="protection-field-main">
  112. <view class="param-name">{{field.label}}</view>
  113. <view class="param-meta {{field.isDirty ? 'param-meta--dirty' : ''}}">{{field.addressDisplay}} {{field.metaValue}}</view>
  114. </view>
  115. <switch
  116. wx:if="{{field.kind == 'switch'}}"
  117. checked="{{field.value}}"
  118. color="#0f766e"
  119. disabled="{{!connectedDevice}}"
  120. data-index="{{field.sourceIndex}}"
  121. bindchange="onProtectionSwitchChange"
  122. />
  123. <view wx:else class="input-wrap">
  124. <input
  125. class="value-input {{field.unit ? 'value-input--with-unit' : ''}}"
  126. type="{{field.unit ? 'text' : 'digit'}}"
  127. placeholder="--"
  128. value="{{field.inputValue}}"
  129. data-index="{{field.sourceIndex}}"
  130. data-input-group="protection"
  131. bindinput="onProtectionInputChange"
  132. bindblur="onInputBlur"
  133. />
  134. </view>
  135. </view>
  136. </view>
  137. </view>
  138. </block>
  139. <block wx:elif="{{activeParamView == 'estimator'}}">
  140. <view class="panel params-section-panel">
  141. <view wx:for="{{estimatorCalculatedDisplayRegisters}}" wx:key="name" class="param-row">
  142. <view class="param-main">
  143. <view class="param-name">{{item.name}}</view>
  144. <view class="param-meta {{item.isDirty ? 'param-meta--dirty' : ''}}">{{item.addressDisplay}} {{item.writeValue || '--'}}</view>
  145. </view>
  146. <view class="param-value">{{item.writeValue || '--'}}{{item.unit ? ' ' + item.unit : ''}}</view>
  147. </view>
  148. <view
  149. wx:for="{{atoBandwidthDisplayRegisters}}"
  150. wx:for-item="atoItem"
  151. wx:key="name"
  152. class="param-row input-row"
  153. >
  154. <view class="param-main">
  155. <view class="param-name">{{atoItem.name}}</view>
  156. <view class="param-meta {{atoItem.isDirty ? 'param-meta--dirty' : ''}}">KP 0x{{atoItem.kpAddress}} {{atoItem.kpWriteValue || '--'}} KI 0x{{atoItem.kiAddress}} {{atoItem.kiWriteValue || '--'}}</view>
  157. </view>
  158. <view class="input-wrap">
  159. <input
  160. class="value-input {{atoItem.unit ? 'value-input--with-unit' : ''}}"
  161. type="{{atoItem.unit ? 'text' : 'digit'}}"
  162. placeholder="--"
  163. value="{{atoItem.inputValue}}"
  164. data-index="{{atoItem.sourceIndex}}"
  165. data-input-group="ato"
  166. bindinput="onAtoBandwidthInput"
  167. bindblur="onInputBlur"
  168. />
  169. </view>
  170. </view>
  171. </view>
  172. </block>
  173. <block wx:elif="{{activeParamView == 'dq'}}">
  174. <view class="panel params-section-panel">
  175. <view
  176. wx:for="{{dqGainDisplayRegisters}}"
  177. wx:for-item="dqItem"
  178. wx:key="name"
  179. class="param-row input-row"
  180. >
  181. <view class="param-main">
  182. <view class="param-name">{{dqItem.name}}</view>
  183. <view class="param-meta {{dqItem.isDirty ? 'param-meta--dirty' : ''}}">{{dqItem.addressDisplay}} {{dqItem.writeValue || '--'}}</view>
  184. </view>
  185. <view class="input-wrap">
  186. <input
  187. class="value-input {{dqItem.unit ? 'value-input--with-unit' : ''}}"
  188. type="{{dqItem.unit ? 'text' : 'digit'}}"
  189. placeholder="--"
  190. value="{{dqItem.inputValue}}"
  191. data-index="{{dqItem.sourceIndex}}"
  192. data-input-group="dq"
  193. bindinput="onDqGainInput"
  194. bindblur="onInputBlur"
  195. />
  196. </view>
  197. </view>
  198. </view>
  199. </block>
  200. <block wx:elif="{{activeParamView == 'startup'}}">
  201. <view class="panel params-section-panel">
  202. <view class="params-section-title">顺逆风配置</view>
  203. <view wx:for="{{tailwindControlRegisters}}" wx:key="address" class="param-row">
  204. <view class="param-main">
  205. <view class="param-name">{{item.name}}</view>
  206. <view class="param-meta {{item.isDirty ? 'param-meta--dirty' : ''}}">{{item.addressDisplay}} {{item.writeValue}}</view>
  207. </view>
  208. <switch
  209. checked="{{item.value}}"
  210. color="#0f766e"
  211. disabled="{{!connectedDevice}}"
  212. data-index="{{item.sourceIndex}}"
  213. bindchange="onTailwindSwitchChange"
  214. />
  215. </view>
  216. <view wx:for="{{tailwindCalculatedDisplayRegisters}}" wx:key="name" class="param-row">
  217. <view class="param-main">
  218. <view class="param-name">{{item.name}}</view>
  219. <view class="param-meta {{item.isDirty ? 'param-meta--dirty' : ''}}">{{item.addressDisplay}} {{item.writeValue || '--'}}</view>
  220. </view>
  221. <view class="param-value">{{item.writeValue || '--'}}{{item.unit ? ' ' + item.unit : ''}}</view>
  222. </view>
  223. <view
  224. wx:for="{{tailwindAtoBandwidthDisplayRegisters}}"
  225. wx:for-item="atoItem"
  226. wx:key="name"
  227. class="param-row input-row"
  228. >
  229. <view class="param-main">
  230. <view class="param-name">{{atoItem.name}}</view>
  231. <view class="param-meta {{atoItem.isDirty ? 'param-meta--dirty' : ''}}">KP 0x{{atoItem.kpAddress}} {{atoItem.kpWriteValue || '--'}} KI 0x{{atoItem.kiAddress}} {{atoItem.kiWriteValue || '--'}}</view>
  232. </view>
  233. <view class="input-wrap">
  234. <input
  235. class="value-input {{atoItem.unit ? 'value-input--with-unit' : ''}}"
  236. type="{{atoItem.unit ? 'text' : 'digit'}}"
  237. placeholder="--"
  238. value="{{atoItem.inputValue}}"
  239. data-index="{{atoItem.sourceIndex}}"
  240. data-input-group="ato"
  241. bindinput="onAtoBandwidthInput"
  242. bindblur="onInputBlur"
  243. />
  244. </view>
  245. </view>
  246. </view>
  247. <view class="panel params-section-panel">
  248. <view class="params-section-title">预定位配置</view>
  249. <view wx:for="{{prepositionSwitchRegisters}}" wx:key="address" class="param-row">
  250. <view class="param-main">
  251. <view class="param-name">{{item.name}}</view>
  252. <view class="param-meta {{item.isDirty ? 'param-meta--dirty' : ''}}">{{item.addressDisplay}} {{item.writeValue}}</view>
  253. </view>
  254. <switch
  255. checked="{{item.value}}"
  256. color="#0f766e"
  257. disabled="{{!connectedDevice}}"
  258. data-index="{{item.sourceIndex}}"
  259. bindchange="onTailwindSwitchChange"
  260. />
  261. </view>
  262. <view wx:for="{{prepositionParameterDisplayRegisters}}" wx:key="name" class="param-row input-row">
  263. <view class="param-main">
  264. <view class="param-name">{{item.name}}</view>
  265. <view class="param-meta {{item.isDirty ? 'param-meta--dirty' : ''}}">{{item.addressDisplay}} {{item.writeValue || '--'}}</view>
  266. </view>
  267. <view class="input-wrap">
  268. <input
  269. class="value-input {{item.unit ? 'value-input--with-unit' : ''}}"
  270. type="{{item.unit ? 'text' : 'digit'}}"
  271. placeholder="--"
  272. value="{{item.inputValue}}"
  273. data-index="{{item.sourceIndex}}"
  274. data-input-group="preposition"
  275. bindinput="onPrepositionParameterInput"
  276. bindblur="onInputBlur"
  277. />
  278. </view>
  279. </view>
  280. </view>
  281. </block>
  282. <block wx:elif="{{activeParamView == 'speed'}}">
  283. <view class="panel params-section-panel">
  284. <view class="params-section-title">速度环路</view>
  285. <view wx:for="{{speedLoopInputDisplayRegisters}}" wx:key="name">
  286. <view class="param-row input-row">
  287. <view class="param-main">
  288. <view class="param-name">{{item.name}}</view>
  289. <view class="param-meta {{item.isDirty ? 'param-meta--dirty' : ''}}">{{item.addressDisplay}} {{item.writeValue || '--'}}</view>
  290. </view>
  291. <view class="input-wrap">
  292. <input
  293. class="value-input {{item.unit ? 'value-input--with-unit' : ''}}"
  294. type="{{item.unit ? 'text' : 'digit'}}"
  295. placeholder="--"
  296. value="{{item.inputValue}}"
  297. data-index="{{item.sourceIndex}}"
  298. data-input-group="parameter"
  299. bindinput="onInputChange"
  300. bindblur="onInputBlur"
  301. />
  302. </view>
  303. </view>
  304. </view>
  305. <view wx:for="{{speedLoopExtraDisplayRegisters}}" wx:key="name">
  306. <view class="param-row input-row">
  307. <view class="param-main">
  308. <view class="param-name">{{item.name}}</view>
  309. <view class="param-meta {{item.isDirty ? 'param-meta--dirty' : ''}}">{{item.addressDisplay}} {{item.writeValue || '--'}}</view>
  310. </view>
  311. <view class="input-wrap">
  312. <input
  313. class="value-input {{item.unit ? 'value-input--with-unit' : ''}}"
  314. type="{{item.unit ? 'text' : 'digit'}}"
  315. placeholder="--"
  316. value="{{item.inputValue}}"
  317. data-index="{{item.sourceIndex}}"
  318. data-input-group="speedLoopExtra"
  319. bindinput="onSpeedLoopExtraInput"
  320. bindblur="onInputBlur"
  321. />
  322. </view>
  323. </view>
  324. </view>
  325. </view>
  326. <view class="panel params-section-panel">
  327. <view class="params-section-title">VSP曲线</view>
  328. <view wx:for="{{vspCurveRegisters}}" wx:key="name">
  329. <view class="param-row input-row">
  330. <view class="param-main">
  331. <view class="param-name">{{item.name}}</view>
  332. <view class="param-meta {{item.isDirty ? 'param-meta--dirty' : ''}}">{{item.addressDisplay}} {{item.writeValue || '--'}}{{item.actualText ? ' ' + item.actualText : ''}}</view>
  333. </view>
  334. <view class="input-wrap">
  335. <input
  336. class="value-input {{item.unit ? 'value-input--with-unit' : ''}}"
  337. type="{{item.unit ? 'text' : 'digit'}}"
  338. placeholder="--"
  339. value="{{item.inputValue}}"
  340. data-index="{{item.sourceIndex}}"
  341. data-input-group="parameter"
  342. bindinput="onInputChange"
  343. bindblur="onInputBlur"
  344. />
  345. </view>
  346. </view>
  347. </view>
  348. <view class="param-row">
  349. <view class="param-main">
  350. <view class="param-name">{{speedSlopeRegister.name}}</view>
  351. <view class="param-meta {{speedSlopeRegister.isDirty ? 'param-meta--dirty' : ''}}">{{speedSlopeRegister.addressDisplay}} {{speedSlopeRegister.writeValue || '--'}}</view>
  352. </view>
  353. <view class="param-value">{{speedSlopeRegister.writeValue || '--'}}{{speedSlopeRegister.unit ? ' ' + speedSlopeRegister.unit : ''}}</view>
  354. </view>
  355. </view>
  356. <view class="panel params-section-panel">
  357. <view class="params-section-title">上油参数</view>
  358. <view wx:for="{{oilParameterInputRegisters}}" wx:key="name" class="param-row input-row">
  359. <view class="param-main">
  360. <view class="param-name">{{item.name}}</view>
  361. <view class="param-meta {{item.isDirty ? 'param-meta--dirty' : ''}}">{{item.addressDisplay}} {{item.writeValue || '--'}}</view>
  362. </view>
  363. <view class="input-wrap">
  364. <input
  365. class="value-input {{item.unit ? 'value-input--with-unit' : ''}}"
  366. type="{{item.unit ? 'text' : 'digit'}}"
  367. placeholder="--"
  368. value="{{item.inputValue}}"
  369. data-index="{{index}}"
  370. data-input-group="oil"
  371. bindinput="onOilParameterInput"
  372. bindblur="onInputBlur"
  373. />
  374. </view>
  375. </view>
  376. </view>
  377. </block>
  378. <block wx:elif="{{activeParamView == 'genericModbus'}}">
  379. <view wx:if="{{!genericModbusGroups.length && !genericModbusDialog.visible}}" class="empty-state generic-empty-state">
  380. <view class="empty-title">暂无寄存器组</view>
  381. <view class="empty-text">点击右上角 + 添加,或从聊天记录导入 JSON</view>
  382. </view>
  383. <view
  384. wx:for="{{genericModbusGroups}}"
  385. wx:for-item="group"
  386. wx:key="id"
  387. class="generic-group-shell {{group.deleteVisible ? 'is-delete-visible' : ''}}"
  388. >
  389. <view
  390. wx:if="{{!group.expanded && group.deleteVisible}}"
  391. class="generic-delete-action"
  392. data-group-id="{{group.id}}"
  393. bindtap="deleteGenericModbusGroup"
  394. >
  395. -
  396. </view>
  397. <view
  398. class="panel generic-group-panel {{group.expanded ? '' : 'panel--collapsed'}}"
  399. data-group-id="{{group.id}}"
  400. bindtouchstart="onGenericGroupTouchStart"
  401. bindtouchend="onGenericGroupTouchEnd"
  402. >
  403. <view class="panel-header panel-header--with-actions">
  404. <view
  405. class="panel-heading-toggle"
  406. data-group-id="{{group.id}}"
  407. bindtap="toggleGenericModbusGroup"
  408. >
  409. <view class="panel-icon icon-terminal"></view>
  410. <view class="generic-group-title-wrap">
  411. <view class="panel-title" data-group-id="{{group.id}}" catchlongpress="openGenericGroupEdit">{{group.name}}</view>
  412. <view class="param-meta generic-group-meta">{{group.addressRangeText}} · {{group.quantity}}/{{group.wordQuantity}}{{group.addressWarningText ? ' · ' + group.addressWarningText : ''}}</view>
  413. </view>
  414. </view>
  415. <view class="panel-actions generic-group-actions">
  416. <view
  417. class="panel-action-button {{connectedDevice && !group.addressOverflow ? '' : 'is-disabled'}}"
  418. data-group-id="{{group.id}}"
  419. bindtap="readGenericModbusGroup"
  420. >
  421. 读取
  422. </view>
  423. <view
  424. wx:if="{{group.writable}}"
  425. class="panel-action-button {{connectedDevice && !group.addressOverflow ? '' : 'is-disabled'}}"
  426. data-group-id="{{group.id}}"
  427. bindtap="writeGenericModbusGroup"
  428. >
  429. 写入
  430. </view>
  431. <view class="entry-chevron {{group.expanded ? 'is-expanded' : ''}}"></view>
  432. </view>
  433. </view>
  434. <block wx:if="{{group.expanded}}">
  435. <view
  436. wx:for="{{group.registers}}"
  437. wx:for-item="register"
  438. wx:for-index="registerIndex"
  439. wx:key="id"
  440. class="generic-register-row"
  441. >
  442. <view class="generic-register-main">
  443. <view
  444. class="generic-register-name"
  445. data-group-id="{{group.id}}"
  446. data-index="{{registerIndex}}"
  447. bindtap="openGenericRegisterInfo"
  448. catchlongpress="openGenericRegisterEdit"
  449. >
  450. {{register.name}}
  451. </view>
  452. <view class="generic-register-meta">
  453. <text>{{register.addressText}} {{register.rawValueText}}</text>
  454. </view>
  455. </view>
  456. <view class="generic-register-input-wrap {{register.showUnit && register.unit ? 'generic-register-input-wrap--unit' : ''}}">
  457. <block wx:if="{{group.writable}}">
  458. <input
  459. class="value-input generic-register-value {{register.isDirty ? 'value-input--dirty' : ''}}"
  460. placeholder="--"
  461. data-group-id="{{group.id}}"
  462. data-index="{{registerIndex}}"
  463. value="{{register.inputValue}}"
  464. bindinput="onGenericRegisterValueInput"
  465. bindblur="onGenericRegisterValueBlur"
  466. />
  467. <view wx:if="{{register.showUnit && register.unit}}" class="generic-register-unit">{{register.unit}}</view>
  468. </block>
  469. <view wx:else class="param-value generic-readonly-value">{{register.displayValue || '--'}}{{register.showUnit && register.unit ? ' ' + register.unit : ''}}</view>
  470. </view>
  471. </view>
  472. </block>
  473. </view>
  474. </view>
  475. </block>
  476. <block wx:elif="{{activeParamView == 'status'}}">
  477. <view class="panel params-section-panel">
  478. <view wx:for="{{statusRegisters}}" wx:key="name" class="param-row">
  479. <view class="param-main">
  480. <view class="param-name">{{item.name}}</view>
  481. <view class="param-meta">{{item.addressDisplay}} {{item.rawValue}}</view>
  482. </view>
  483. <view class="param-value">{{item.displayValue}}{{item.displayUnit ? ' ' + item.displayUnit : ''}}</view>
  484. </view>
  485. </view>
  486. </block>
  487. <block wx:else>
  488. <view class="panel panel--collapsed param-entry-panel" data-view="driver" bindtap="openParamView">
  489. <view class="panel-header panel-header--with-actions">
  490. <view class="panel-heading-toggle">
  491. <view class="panel-icon icon-chip"></view>
  492. <view class="panel-title">驱动器参数</view>
  493. </view>
  494. <view class="entry-chevron"></view>
  495. </view>
  496. </view>
  497. <view class="panel panel--collapsed param-entry-panel" data-view="estimator" bindtap="openParamView">
  498. <view class="panel-header panel-header--with-actions">
  499. <view class="panel-heading-toggle">
  500. <view class="panel-icon icon-bars"></view>
  501. <view class="panel-title">估算器参数</view>
  502. </view>
  503. <view class="entry-chevron"></view>
  504. </view>
  505. </view>
  506. <view class="panel panel--collapsed param-entry-panel" data-view="dq" bindtap="openParamView">
  507. <view class="panel-header panel-header--with-actions">
  508. <view class="panel-heading-toggle">
  509. <view class="panel-icon icon-tune"></view>
  510. <view class="panel-title">DQ轴电流环参数</view>
  511. </view>
  512. <view class="entry-chevron"></view>
  513. </view>
  514. </view>
  515. <view class="panel panel--collapsed param-entry-panel" data-view="startup" bindtap="openParamView">
  516. <view class="panel-header panel-header--with-actions">
  517. <view class="panel-heading-toggle">
  518. <view class="panel-icon icon-target"></view>
  519. <view class="panel-title">启动位置管理</view>
  520. </view>
  521. <view class="entry-chevron"></view>
  522. </view>
  523. </view>
  524. <view class="panel panel--collapsed param-entry-panel" data-view="speed" bindtap="openParamView">
  525. <view class="panel-header panel-header--with-actions">
  526. <view class="panel-heading-toggle">
  527. <view class="panel-icon icon-speed"></view>
  528. <view class="panel-title">速度管理</view>
  529. </view>
  530. <view class="entry-chevron"></view>
  531. </view>
  532. </view>
  533. <view class="panel panel--collapsed param-entry-panel" data-view="protection" bindtap="openParamView">
  534. <view class="panel-header panel-header--with-actions">
  535. <view class="panel-heading-toggle">
  536. <view class="panel-icon icon-shield-check"></view>
  537. <view class="panel-title">保护</view>
  538. </view>
  539. <view class="entry-chevron"></view>
  540. </view>
  541. </view>
  542. <view class="panel panel--collapsed param-entry-panel" data-view="status" bindtap="openParamView">
  543. <view class="panel-header panel-header--with-actions">
  544. <view class="panel-heading-toggle">
  545. <view class="panel-icon icon-status"></view>
  546. <view class="panel-title">状态</view>
  547. </view>
  548. <view class="entry-chevron"></view>
  549. </view>
  550. </view>
  551. </block>
  552. </view>
  553. </scroll-view>
  554. <view wx:if="{{genericModbusDialog.visible}}" class="generic-dialog-mask {{themeClass}}" bindtap="closeGenericModbusDraft">
  555. <view class="generic-dialog" catchtap="noop">
  556. <view class="generic-dialog-header">
  557. <view class="generic-dialog-title">{{genericModbusDialog.title}}</view>
  558. <view class="generic-dialog-close" bindtap="closeGenericModbusDraft">×</view>
  559. </view>
  560. <block wx:if="{{genericModbusDialog.mode == 'createGroup' || genericModbusDialog.mode == 'editGroup'}}">
  561. <view class="generic-dialog-body">
  562. <view class="generic-config-row">
  563. <view class="param-main">
  564. <view class="param-name">寄存器组名</view>
  565. <view class="param-meta">每组寄存器地址连续</view>
  566. </view>
  567. <input
  568. class="value-input generic-value-input"
  569. data-field="groupName"
  570. value="{{genericModbusDialog.groupName}}"
  571. bindinput="onGenericDraftInput"
  572. />
  573. </view>
  574. <view class="generic-config-row">
  575. <view class="param-main">
  576. <view class="param-name">寄存器类型</view>
  577. <view class="param-meta">决定读取功能码与是否可写</view>
  578. </view>
  579. <picker
  580. mode="selector"
  581. range="{{genericModbusRegisterTypeOptions}}"
  582. range-key="label"
  583. value="{{genericModbusDialog.registerTypeIndex}}"
  584. bindchange="onGenericDraftTypeChange"
  585. >
  586. <view class="generic-picker-value">{{genericModbusDialog.registerTypeText}}</view>
  587. </picker>
  588. </view>
  589. <view class="generic-config-row">
  590. <view class="param-main">
  591. <view class="param-name">寄存器起始地址</view>
  592. <view class="param-meta">16进制,例如 00A0</view>
  593. </view>
  594. <input
  595. class="value-input generic-value-input"
  596. data-field="startAddress"
  597. value="{{genericModbusDialog.startAddress}}"
  598. bindinput="onGenericDraftInput"
  599. />
  600. </view>
  601. <view class="generic-config-row">
  602. <view class="param-main">
  603. <view class="param-name">寄存器数量</view>
  604. <view class="param-meta">1 - 256</view>
  605. </view>
  606. <input
  607. class="value-input generic-value-input"
  608. type="number"
  609. data-field="quantity"
  610. value="{{genericModbusDialog.quantity}}"
  611. bindinput="onGenericDraftInput"
  612. />
  613. </view>
  614. </view>
  615. </block>
  616. <block wx:elif="{{genericModbusDialog.mode == 'editRegister' || genericModbusDialog.mode == 'viewRegister'}}">
  617. <view class="generic-dialog-body">
  618. <view class="generic-info-stack">
  619. <view class="generic-info-row">
  620. <view class="generic-info-label">名称</view>
  621. <view wx:if="{{genericModbusDialog.mode == 'viewRegister'}}" class="generic-info-value">{{genericModbusDialog.name}}</view>
  622. <input wx:else class="value-input generic-value-input" data-field="name" value="{{genericModbusDialog.name}}" bindinput="onGenericDraftInput" />
  623. </view>
  624. <view class="generic-info-row">
  625. <view class="generic-info-label">地址</view>
  626. <view class="generic-info-value">{{genericModbusDialog.addressText}}</view>
  627. </view>
  628. <view wx:if="{{genericModbusDialog.showDataType}}" class="generic-info-row">
  629. <view class="generic-info-label">类型</view>
  630. <view wx:if="{{genericModbusDialog.mode == 'viewRegister'}}" class="generic-info-value">{{genericModbusDialog.dataTypeText}}</view>
  631. <picker wx:else mode="selector" range="{{genericModbusDataTypeOptions}}" range-key="label" value="{{genericModbusDialog.dataTypeIndex}}" bindchange="onGenericDialogDataTypeChange">
  632. <view class="generic-picker-value">{{genericModbusDialog.dataTypeText}}</view>
  633. </picker>
  634. </view>
  635. <view wx:if="{{genericModbusDialog.showTextLength}}" class="generic-info-row">
  636. <view class="generic-info-label">长度</view>
  637. <view wx:if="{{genericModbusDialog.mode == 'viewRegister'}}" class="generic-info-value">{{genericModbusDialog.textByteLength || '--'}}B</view>
  638. <input wx:else class="value-input generic-value-input" type="number" data-field="textByteLength" value="{{genericModbusDialog.textByteLength}}" bindinput="onGenericDraftInput" />
  639. </view>
  640. <view class="generic-info-row">
  641. <view class="generic-info-label">备注</view>
  642. <view wx:if="{{genericModbusDialog.mode == 'viewRegister'}}" class="generic-info-value">{{genericModbusDialog.remark || '--'}}</view>
  643. <input wx:else class="value-input generic-value-input" data-field="remark" value="{{genericModbusDialog.remark}}" bindinput="onGenericDraftInput" />
  644. </view>
  645. <view wx:if="{{genericModbusDialog.showUnit}}" class="generic-info-row">
  646. <view class="generic-info-label">单位</view>
  647. <view wx:if="{{genericModbusDialog.mode == 'viewRegister'}}" class="generic-info-value">{{genericModbusDialog.unit || '--'}}</view>
  648. <input wx:else class="value-input generic-value-input" data-field="unit" value="{{genericModbusDialog.unit}}" bindinput="onGenericDraftInput" />
  649. </view>
  650. <view wx:if="{{genericModbusDialog.mode == 'viewRegister' || genericModbusDialog.showRange}}" class="generic-info-row">
  651. <view class="generic-info-label">最小值</view>
  652. <view wx:if="{{genericModbusDialog.mode == 'viewRegister'}}" class="generic-info-value">{{genericModbusDialog.minValue || '--'}}</view>
  653. <input wx:else class="value-input generic-value-input" data-field="minValue" value="{{genericModbusDialog.minValue}}" bindinput="onGenericDraftInput" />
  654. </view>
  655. <view wx:if="{{genericModbusDialog.mode == 'viewRegister' || genericModbusDialog.showRange}}" class="generic-info-row">
  656. <view class="generic-info-label">最大值</view>
  657. <view wx:if="{{genericModbusDialog.mode == 'viewRegister'}}" class="generic-info-value">{{genericModbusDialog.maxValue || '--'}}</view>
  658. <input wx:else class="value-input generic-value-input" data-field="maxValue" value="{{genericModbusDialog.maxValue}}" bindinput="onGenericDraftInput" />
  659. </view>
  660. </view>
  661. </view>
  662. </block>
  663. <view class="generic-draft-actions">
  664. <view class="panel-action-button" bindtap="closeGenericModbusDraft">{{genericModbusDialog.cancelText}}</view>
  665. <view wx:if="{{genericModbusDialog.confirmText}}" class="panel-action-button is-active" bindtap="confirmGenericModbusDialog">{{genericModbusDialog.confirmText}}</view>
  666. </view>
  667. </view>
  668. </view>