This commit is contained in:
2024-04-30 15:55:23 +02:00
parent d86c753975
commit 54043bba44
5 changed files with 212 additions and 63 deletions
+51 -53
View File
@@ -161,7 +161,7 @@ record(waveform,"$(P)Plg-Mtn${INDEX}-ErrId-Arr"){
field(TSE, "0")
}
# Axis Error Id
# Axis status word
record(waveform,"$(P)Plg-Mtn${INDEX}-Stat-Arr"){
info(asyn:FIFO, "1000")
field(DESC, "Status wd")
@@ -191,10 +191,13 @@ record(ao,"$(P)Plg-Mtn${INDEX}-AxCmd-RB"){
field(DTYP,"asynInt32")
field(OUT, "@asyn(PLUGIN.MOTION_${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.motion_${INDEX}.axis_id")
field(DOL, "0")
field(PREC,"0")
field(DRVL,"0")
field(DRVH,"100")
field(VAL, "1")
}
record(ai,"$(P)Plg-Mtn${INDEX}-SmpHz-RB"){
record(ai,"$(P)Plg-Mtn${INDEX}-SmpHz"){
info(asyn:READBACK,"1")
field(DESC, "Sample rate")
field(DTYP,"asynFloat64")
@@ -204,68 +207,63 @@ record(ai,"$(P)Plg-Mtn${INDEX}-SmpHz-RB"){
field(SCAN, "I/O Intr")
}
record(ai,"$(P)Plg-Mtn${INDEX}-BuffSze"){
info(asyn:READBACK,"1")
field(DESC, "Buffer Size")
field(DTYP,"asynInt32")
field(INP, "@asyn(PLUGIN.MOTION_${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.motion_${INDEX}.buff_size")
field(VAL, "1")
}
# Future use
#record(ai,"$(P)Plg-Mtn${INDEX}-BuffSze"){
# info(asyn:READBACK,"1")
# field(DESC, "Buffer Size")
# field(DTYP,"asynInt32")
# field(INP, "@asyn(PLUGIN.MOTION_${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.motion_${INDEX}.buff_size")
# field(VAL, "1")
#}
record(ai,"$(P)Plg-Mtn${INDEX}-ElmCnt"){
info(asyn:READBACK,"1")
field(DESC, "Elements in buffer count")
field(DTYP,"asynInt32")
field(INP, "@asyn(PLUGIN.MOTION_${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.motion_${INDEX}.elem_count")
field(VAL, "1")
}
# Future use
#record(ai,"$(P)Plg-Mtn${INDEX}-ElmCnt"){
# info(asyn:READBACK,"1")
# field(DESC, "Elements in buffer count")
# field(DTYP,"asynInt32")
# field(INP, "@asyn(PLUGIN.MOTION_${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.motion_${INDEX}.elem_count")
# field(VAL, "1")
#}
record(bo,"$(P)Plg-Mtn${INDEX}-TrgCmd-RB"){
info(asyn:READBACK,"1")
field(DESC, "Trigg command")
field(DTYP,"asynInt32")
field(OUT, "@asyn(PLUGIN.MOTION_${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.motion_${INDEX}.trigg")
field(ZNAM,"IDLE")
field(ONAM,"TRIGG")
field(VAL, "0")
field(HIGH, 0.001)
}
# Future use
#record(bo,"$(P)Plg-Mtn${INDEX}-TrgCmd-RB"){
# info(asyn:READBACK,"1")
# field(DESC, "Trigg command")
# field(DTYP,"asynInt32")
# field(OUT, "@asyn(PLUGIN.MOTION_${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.motion_${INDEX}.trigg")
# field(ZNAM,"IDLE")
# field(ONAM,"TRIGG")
# field(VAL, "0")
# field(HIGH, 0.001)
#}
#record(longout,"$(P)Plg-Mtn${INDEX}-Mde-RB"){
# Future use
#record(mbbo, "$(P)Plg-Mtn${INDEX}-Mde-RB"){
# info(asyn:READBACK,"1")
# field(DESC, "Mode selection")
# field(PINI, "1")
# field(TSE, "0")
# field(DTYP, "asynInt32")
# field(OUT, "@asyn(PLUGIN.MOTION_${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.motion_${INDEX}.mode")
# field(SCAN, "Passive")
# field(ZRST, "NO_COMMAND")
# field(ZRVL, 0)
# field(ONST, "CONT")
# field(ONVL, 1)
# field(TWST, "TRIGG")
# field(TWVL, 2)
# field(VAL, 1)
#}
record(mbbo, "$(P)Plg-Mtn${INDEX}-Mde-RB"){
info(asyn:READBACK,"1")
field(DESC, "Mode selection")
field(PINI, "1")
field(TSE, "0")
field(DTYP, "asynInt32")
field(OUT, "@asyn(PLUGIN.MOTION_${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.motion_${INDEX}.mode")
field(ZRST, "NO_COMMAND")
field(ZRVL, 0)
field(ONST, "CONT")
field(ONVL, 1)
field(TWST, "TRIGG")
field(TWVL, 2)
field(VAL, 1)
}
record(longout,"$(P)Plg-Mtn${INDEX}-Cmd-RB"){
info(asyn:READBACK,"1")
field(DESC, "Command")
field(PINI, "1")
field(TSE, "0")
field(DTYP, "asynInt32")
field(OUT, "@asyn(PLUGIN.MOTION_${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.motion_${INDEX}.cmd")
field(SCAN, "Passive")
}
# Future use
# record(longout,"$(P)Plg-Mtn${INDEX}-Cmd-RB"){
# info(asyn:READBACK,"1")
# field(DESC, "Command")
# field(PINI, "1")
# field(TSE, "0")
# field(DTYP, "asynInt32")
# field(OUT, "@asyn(PLUGIN.MOTION_${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.motion_${INDEX}.cmd")
# field(SCAN, "Passive")
# }
record(longin,"$(P)Plg-Mtn${INDEX}-Stat"){
info(asyn:READBACK,"1")
+4 -5
View File
@@ -3,10 +3,6 @@ ecmc_plugin_motion
Plugin designed for commisioning and troubleshooting of motion axes.
Motion data are sampled, buffered and exposed to epics as waveforms.
# Panel
```
# Plugin loaded once (MTN_ID defaults to 0)
@@ -14,4 +10,7 @@ caqtdm -macro "SYS=c6025a" ecmc_plugin_motion_main.ui
# If loaded more times
caqtdm -macro "SYS=c6025a,MTN_ID=1" ecmc_plugin_motion_main.ui
```
```
# Python panels
In tools directory is WIP.
+129 -1
View File
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>1252</width>
<width>1420</width>
<height>893</height>
</rect>
</property>
@@ -397,8 +397,136 @@
<number>1</number>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton">
<property name="geometry">
<rect>
<x>1270</x>
<y>80</y>
<width>100</width>
<height>22</height>
</rect>
</property>
<property name="text">
<string>Enable</string>
</property>
<property name="channel" stdset="0">
<string notr="true">$(SYS):Plg-Mtn$(MTN_ID=0)-EnaCmd-RB</string>
</property>
</widget>
<widget class="caNumeric" name="canumeric">
<property name="geometry">
<rect>
<x>1300</x>
<y>120</y>
<width>100</width>
<height>50</height>
</rect>
</property>
<property name="integerDigits" stdset="0">
<number>1</number>
</property>
<property name="decimalDigits" stdset="0">
<number>0</number>
</property>
<property name="value">
<double>0.000000000000000</double>
</property>
<property name="channel" stdset="0">
<string notr="true">$(SYS):Plg-Mtn$(MTN_ID=0)-AxCmd-RB</string>
</property>
<property name="colorMode">
<enum>caNumeric::Alarm</enum>
</property>
<property name="precisionMode">
<enum>caNumeric::User</enum>
</property>
<property name="fixedFormat">
<bool>true</bool>
</property>
<property name="limitsMode">
<enum>caNumeric::User</enum>
</property>
<property name="maxValue">
<double>100.000000000000000</double>
</property>
<property name="minValue">
<double>0.000000000000000</double>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>1230</x>
<y>130</y>
<width>63</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Axis ID:</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit">
<property name="geometry">
<rect>
<x>1330</x>
<y>190</y>
<width>61</width>
<height>20</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">$(SYS):Plg-Mtn$(MTN_ID=0)-SmpHz</string>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>1230</x>
<y>190</y>
<width>63</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Rate [Hz]:</string>
</property>
</widget>
<widget class="caLabel" name="calabel">
<property name="geometry">
<rect>
<x>1310</x>
<y>290</y>
<width>90</width>
<height>28</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">$(SYS):Plg-Mtn$(MTN_ID=0)-SmpHz</string>
</property>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>caNumeric</class>
<extends>QFrame</extends>
<header>caNumeric</header>
</customwidget>
<customwidget>
<class>caToggleButton</class>
<extends>QCheckBox</extends>
<header>caToggleButton</header>
</customwidget>
<customwidget>
<class>caLabel</class>
<extends>QLabel</extends>
<header>caLabel</header>
</customwidget>
<customwidget>
<class>caLineEdit</class>
<extends>QLineEdit</extends>
<header>caLineEdit</header>
</customwidget>
<customwidget>
<class>caStripPlot</class>
<extends>QwtPlot</extends>
+3 -3
View File
@@ -833,9 +833,9 @@ void ecmcMotionPlg::executeMotionObject() {
return;
}
if(cfgMode_==TRIGG && !bTriggInProgress_) {
return;
}
//if(cfgMode_==TRIGG && !bTriggInProgress_) {
// return;
//}
// protect axis_ if axis object id is changed over asyn
epicsMutexLock(axisMutex_);
+25 -1
View File
@@ -334,39 +334,63 @@ class ecmcMtnMainGui(QtWidgets.QDialog):
self.pv_signal_cbs['ElmCnt'].data_signal.emit(value)
def on_change_PosAct_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['PosAct-Arr'].data_signal.emit(value)
def on_change_PosSet_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
def on_change_PosSet_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['PosSet-Arr'].data_signal.emit(value)
def on_change_PosErr_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['PosErr-Arr'].data_signal.emit(value)
def on_change_Time_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['Time-Arr'].data_signal.emit(value)
def on_change_Ena_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['Ena-Arr'].data_signal.emit(value)
def on_change_EnaAct_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['EnaAct-Arr'].data_signal.emit(value)
def on_change_Bsy_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['Bsy-Arr'].data_signal.emit(value)
def on_change_Exe_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['Exe-Arr'].data_signal.emit(value)
def on_change_TrjSrc_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['TrjSrc-Arr'].data_signal.emit(value)
def on_change_EncSrc_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['EncSrc-Arr'].data_signal.emit(value)
def on_change_AtTrg_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['AtTrg-Arr'].data_signal.emit(value)
def on_change_ErrId_Arr(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):
if self.pause:
return
self.pv_signal_cbs['ErrId-Arr'].data_signal.emit(value)
def on_change_Mde_RB(self,pvname=None, value=None, char_value=None,timestamp=None, **kw):