From de7285d542f0a547954632049579df10e625de56 Mon Sep 17 00:00:00 2001 From: Thierry Zamofing Date: Thu, 20 Jul 2023 13:15:30 +0200 Subject: [PATCH] migrate smaract to community driver, update ui-files --- Makefile | 2 +- ReadmeMCS.md | 76 +++++++++++++++++ add_EXPMX4.cmd | 2 + generate.py | 190 ++++++++++++++++++++++++++++++++----------- qt/ESB_MX_5cam.ui | 149 ++++----------------------------- qt/ESB_MX_SmarAct.ui | 175 +++++++++++++++++++++++++++++++++++++++ qt/ESB_MX_exp.ui | 189 ++++-------------------------------------- 7 files changed, 432 insertions(+), 351 deletions(-) create mode 100644 ReadmeMCS.md create mode 100644 add_EXPMX4.cmd create mode 100644 qt/ESB_MX_SmarAct.ui diff --git a/Makefile b/Makefile index be24fcc..24f2034 100644 --- a/Makefile +++ b/Makefile @@ -17,4 +17,4 @@ install_ioc: generate cd gen/ioc;make install generate: - /opt/gfa/python-3.5/latest/bin/python generate.py -m 0xf + /opt/gfa/python-3.8/latest/bin/python generate.py -m 0xf diff --git a/ReadmeMCS.md b/ReadmeMCS.md new file mode 100644 index 0000000..1622ade --- /dev/null +++ b/ReadmeMCS.md @@ -0,0 +1,76 @@ +asynReport 255 +asynSetTraceIOMask +asynSetTraceInfoMask +asynSetTraceMask +/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/SASE_RIXS/Readme.md + +asynReport +asynReport 3 MCS +asynReport 3 asynMCS + + +asynSetTraceMask asynMCS 0 0xff +asynSetTraceIOMask asynMCS 0 0xff + +asynSetTraceMask asynMCS,0, error|device|filter|driver|flow|warning +asynSetTraceIOMask asynMCS,0, nodata|ascii|escape|hex +asynSetTraceInfoMask asynMCS,0, time|port|source|thread + +#quite/default asyn communication +asynSetTraceMask asynMCS,0, error +asynSetTraceIOMask asynMCS,0, escape +asynSetTraceInfoMask asynMCS,0, time|port|source +asynSetTraceMask MCS,0, error +asynSetTraceIOMask MCS,0, escape +asynSetTraceInfoMask MCS,0, time|port|source + + +#good debugging for asyn communication +asynSetTraceMask asynMCS,0, error|driver +asynSetTraceIOMask asynMCS,0, escape +asynSetTraceInfoMask asynMCS,0, time|port|source + +#good debugging for motor record tracing +asynSetTraceMask MCS,0, error|device|filter|driver|flow|warning +asynSetTraceIOMask MCS,0, escape +asynSetTraceInfoMask MCS,0, time|port|source + + +/home/zamofing_t/Documents/doc-ext/SmaractMCS/MCSrs232InterfaceDocumentation.pdf +ncat 129.129.244.32 5000 +->resut :ID4049801502 + +:GSI +:GIV +:GNC + +:GCT0 + +:MPA0,123000,2000 +:GP0 +->:P0,123000\n +:MPA0,987,2000 +:GST0 +:ST0,1 + +#good debugging for motor record tracing +asynSetTraceMask asynS1,0, 0x09 +asynSetTraceIOMask asynS1,0, 0x02 +asynSetTraceInfoMask asynS1,0, 0x07 + + + +add a ASYn record + +caqtdm -macro 'S=SARES30-SMX,M=MCS,T=MCS' ESB_MX_SmarAct + +caqtdm -macro 'P=SARES30-SMX:,R=ASYN' asynOctet + +caput SARES30-SMX:ASYN.AOUT :GSI +caput SARES30-SMX:ASYN.AOUT :GP0 +caput SARES30-SMX:ASYN.AOUT :MPA0,123000,2000 +caput SARES30-SMX:ASYN.AOUT :GST0 + + + +caget SARES30-SMX:ASYN.TINP diff --git a/add_EXPMX4.cmd b/add_EXPMX4.cmd new file mode 100644 index 0000000..279d3c3 --- /dev/null +++ b/add_EXPMX4.cmd @@ -0,0 +1,2 @@ +#Powerbrick for new commissioning of fast scanning stage +#FOR NOW IT IS AN EMPTY CPNFIG ! \ No newline at end of file diff --git a/generate.py b/generate.py index 65dbfd6..c52629f 100755 --- a/generate.py +++ b/generate.py @@ -17,33 +17,98 @@ from __future__ import print_function import logging, sys, os, json import string -host2param={ -#HOST runScript -'SAR-CPPM-EXPMX1': ('require ESB_MX\nrunScript $(ESB_MX_DIR)/add_EXPMX1.cmd "P=SAR-EXPMX,PORT=PPMAC1"',), -'SAR-CPPM-EXPMX2': ('require ESB_MX\nrunScript $(ESB_MX_DIR)/add_EXPMX2.cmd "P=SAR-EXPMX,PORT=PPMAC1"',), -'SAR-CPPM-EXPMX3': ('require ESB_MX\nrunScript $(ESB_MX_DIR)/add_EXPMX3.cmd "P=SAR-EXPMX,PORT=PPMAC1"',), -} +class Generate: + yamlParam={ + # ioc : ( host , port , ver , arch , osys , osys_id , + # 'SAR-CSSU-EXPMX1' : ('SAR-CSSU-EXPMX1' , 50001 , '3.14.12' , 'moxa42-armv6l' , 'moxa42-armv6l' , 'moxa42-armv6l' , ) , + 'SAR-CPPM-EXPMX1' : ('SAR-CPPM-EXPMX1' , 50001 , '7.0.7' , 'eldk42-ppc4xxFP' , 'eldk42-ppc4xxFP' , 'eldk42-ppc4xxFP' , ) , + 'SAR-CPPM-EXPMX2' : ('SAR-CPPM-EXPMX2' , 50001 , '7.0.7' , 'eldk42-ppc4xxFP' , 'eldk42-ppc4xxFP' , 'eldk42-ppc4xxFP' , ) , + 'SAR-CPPM-EXPMX3' : ('SAR-CPPM-EXPMX3' , 50001 , '7.0.7' , 'eldk42-ppc4xxFP' , 'eldk42-ppc4xxFP' , 'eldk42-ppc4xxFP' , ) , + 'SAR-CPPM-EXPMX4' : ('SAR-CPPM-EXPMX4' , 50001 , '7.0.7' , 'eldk42-ppc4xxFP' , 'eldk42-ppc4xxFP' , 'eldk42-ppc4xxFP' , ) , + 'SARES30-CPCL-MCSSMX' : ('saresc-softioc-11' , 50001 , '7.0.6' , 'x86_64' , 'RHEL7' , 'rhel' , ) , + } + mxSmarAct={ + 'port':'MCS', + 'host':'129.129.244.32', + 'prefix':'SARES30-SMX', + 'motLst':( + # description , PV name , axis , hlm , llm , dir , sens , + ('COLLI:TX' , 'MCS1' , 0 , 12 , -10 , 1 , 'S' ) , + ('COLLI:TY' , 'MCS2' , 1 , 12 , -10 , 1 , 'S' ) , + ('Motor3' , 'MCS3' , 2 , 10 , -10 , 0 , 'S' ) , + ('POSTTUBE:TX1' , 'MCS4' , 3 , 10 , -10 , 0 , 'S' ) , + ('POSTTUBE:TX2' , 'MCS5' , 4 , 10 , -10 , 0 , 'S' ) , + ('POSTTUBE:TY1' , 'MCS6' , 5 , 15 , -20 , 0 , 'S' ) , + ('POSTTUBE:TY2' , 'MCS7' , 6 , 15 , -20 , 0 , 'S' ) , + ('POSTTUBE:TZ' , 'MCS8' , 7 , 10 , -10 , 1 , 'S' ) , + ('Motor9' , 'MCS9' , 8 , 10 , -10 , 0 , 'S' ) , + ('SLITS:X1' , 'MCS10' , 9 , 10 , -10 , 1 , 'S' ) , + ('SLITS:X2' , 'MCS11' , 10 , 10 , -10 , 1 , 'S' ) , + ('SLITS:Y1' , 'MCS12' , 11 , 10 , -10 , 1 , 'S' ) , + ('SLITS:Y2' , 'MCS13' , 12 , 10 , -10 , 1 , 'S' ) , + ('XEYE:TX' , 'MCS14' , 13 , 10 , -10 , 0 , 'S' ) , + ('XEYE:TY' , 'MCS15' , 14 , 10 , -10 , 0 , 'S' ) , + ), + } + pb_host2param={ + # HOST runScript + 'SAR-CPPM-EXPMX1':('','require ESB_MX\nrunScript $(ESB_MX_DIR)/add_EXPMX1.cmd "P=SAR-EXPMX,PORT=PPMAC1"',), + 'SAR-CPPM-EXPMX2':('','require ESB_MX\nrunScript $(ESB_MX_DIR)/add_EXPMX2.cmd "P=SAR-EXPMX,PORT=PPMAC1"',), + 'SAR-CPPM-EXPMX3':('','require ESB_MX\nrunScript $(ESB_MX_DIR)/add_EXPMX3.cmd "P=SAR-EXPMX,PORT=PPMAC1"',), + 'SAR-CPPM-EXPMX4':('','require ESB_MX\nrunScript $(ESB_MX_DIR)/add_EXPMX4.cmd "P=SAR-EXPMX,PORT=PPMAC1"',), + } - -tplYaml='''\ -cpu_architecture: {os} -os: {os} -os_id: {os} -epics_version: 7.0.7 + tplYaml='''\ ioc_host: {host} ioc_port: {port} +epics_version: {ver} +cpu_architecture: {arch} +os: {osys} +os_id: {osys_id} ''' -################################################################## -# DO NOT EDIT: Generated with epics_ioc_modules/OATT/generate.py -# This is the IOC on "{host}" port {port}: -################################################################## -tplScriptPowerBrickIOC='''\ -##################################### + lutSensMcs={'S':0, 'SR':1, 'SP':2, 'SC':3, 'SR20':4, 'M':5, 'SD':6, 'SR2':7, 'MD':8, 'SC500':9, 'User Def':10, + 'None':11, 'LC':12, 'L':13} + + tplMcsCtrl='''\ +epicsEnvSet("ENGINEER", "T. Zamofing (zamofing_t)") +epicsEnvSet("LOCATION", "0.Z553.58") + +#load module +# motorSmarAct community driver +# smarActMot PSI templates and other files +require motorSmarAct zamofing_t +#require motorSmarAct +require smarActMot +# ------------- +drvAsynIPPortConfigure("asyn{port}", "{host}:5000", 0, 0, 0) +# PORT, MCS_PORT, number of axes, active poll period (sec), idle poll period (sec) +smarActMCSCreateController("{port}", "asyn{port}", {num_ax}, 0.1, 1.0) +''' + + tplMcsAxis='''\ +smarActMCSCreateAxis({port}, {axis}, {chan}) +''' + + mcs_subs_hdr='''\ +file asyn.template {{{{P={prefix}, PORT=asyn{port}}}}} + +##### MCS +file $(smarActMot_DIR)/db/MCS_axis.template +{{ + pattern + {{PORT ,S ,M ,ADDR,DESC ,DIR,VBAS,VMAX,DHLM,DLLM,EGU,SENSOR ,UDSENS,RTRY}} +''' + + tplScriptPowerBrickIOC='''\ +########################################## +# DO NOT EDIT: Generated with generate.py +# This is the IOC on host {host} +########################################## # PPMAC responsible: Thierry Zamofing -##################################### +########################################## {req} ############################################ @@ -62,7 +127,7 @@ powerPmacCreateController("PPMAC1", 200, 1000) {devConf} ''' -tplEVR='''\ + tplEVR='''\ ####### initialise EVR ############################## # https://git.psi.ch/epics_driver_modules/mrfioc2 require mrfioc2 @@ -74,42 +139,43 @@ require mrfioc2_regDev runScript $(mrfioc2_regDev_DIR)/mrfioc2_regDev_pulseID_RX.cmd, "DEVICE=EVR0,SYS=SAR-EXPMX" ''' - -class CPPM: - def __init__(self): - pass - - def genIOC(self): - print('### genIOC ###') - tpl=tplScriptPowerBrickIOC - os.makedirs('gen/ioc/',exist_ok=True) #os.makedirs('gen/db/',exist_ok=True) + def genYAML(self): + + for ioc,p in self.yamlParam.items(): + param=dict(zip(('host','port','ver','arch','osys','osys_id',),p)) + fn=f'gen/ioc/{ioc}_parameters.yaml' + print('generate '+fn+' ...') + fh=open(fn,'w') + fh.write(self.tplYaml.format(**param)) + fh.close() + print('done.') + + def genIOC(self): + print('### genIOC ###') + tplIOC=Generate.tplScriptPowerBrickIOC + yamlParam=Generate.yamlParam + pb_h2p=Generate.pb_host2param + tplEVR=Generate.tplEVR fh=open('gen/ioc/Makefile','w') fh.write('include /ioc/tools/ioc.makefile\n') fh.close() - - port=50001 - osys='eldk42-ppc4xxFP' - - for host,v in host2param.items(): - devConf,=v - req='' - + for host in yamlParam.keys(): + if not host in pb_h2p: + assert(host=='SARES30-CPCL-MCSSMX') + self.genSmarActIOC(host) + continue + req,devConf=pb_h2p[host] fn='gen/ioc/{host}_startup.script'.format(host=host) - print('generate '+fn+'...') + print('generate '+fn+' ...') fh=open(fn,'w') - fh.write(tpl.format(host=host,port=port,req=req,devConf=devConf)) + fh.write(tplIOC.format(host=host,req=req,devConf=devConf)) if host=='SAR-CPPM-EXPMX1': fh.write(tplEVR) fh.close() - fn='gen/ioc/{host}_parameters.yaml'.format(host=host) - print('generate '+fn+'...') - fh=open(fn,'w') - fh.write(tplYaml.format(os=osys,host=host,port=port)) - fh.close() print('done.') def genLauncher(self): @@ -125,6 +191,36 @@ class CPPM: #'''.format(dev=dev)) # fh.close() + def genSmarActIOC(self,ioc): + tplCtrl=Generate.tplMcsCtrl + tplAxis=Generate.tplMcsAxis + motLst=Generate.mxSmarAct['motLst'] + subs=Generate.mcs_subs_hdr + host=Generate.mxSmarAct['host'] + prefix=Generate.mxSmarAct['prefix'] + port=Generate.mxSmarAct['port'] + lutSens=Generate.lutSensMcs + num_ax=len(motLst) + fn=f'gen/ioc/{ioc}_startup.script' + print('generate '+fn+' ...') + with open(fn,'w') as fh_ss: + fh_ss.write(tplCtrl.format(host=host,port=port,num_ax=num_ax)) + + fn_subs=f'gen/ioc/{ioc}_gen.subs' # with a name _* the .subs file is recognize by the 'ioc install' tool + print('generate '+fn_subs+'...') + with open(fn_subs,'w') as fh: + fh.write(subs.format(port=port,prefix=prefix)) + for d, m, a, hlm, llm, dir,sens in motLst: + sens=lutSens[sens] + param={'PORT':port,'S':prefix,'M':m,'ADDR':a,'DESC':'"'+d+'"', + 'DIR':dir,'VBAS':0,'VMAX':2,'DHLM':hlm,'DLLM':llm,'EGU':'mm','SENSOR':sens,'UDSENS':0,'RTRY':1} + fh.write(' {{{PORT:10},{S:16},{M:10},{ADDR:4},{DESC:27},{DIR:3},{VBAS:4},{VMAX:4},{DHLM:4},{DLLM:4},{EGU:3},{SENSOR:7},{UDSENS:5}{RTRY:5}}}\n'.format(**param)) + fh_ss.write(tplAxis.format(port=port,axis=a,chan=a)) + fh.write('}\n\n') + + + + if __name__=='__main__': def parse_args(): import argparse @@ -138,10 +234,12 @@ if __name__=='__main__': args = parser.parse_args() #print(args) - obj=CPPM() + obj=Generate() if args.mode&0x1: - obj.genIOC() + obj.genYAML() if args.mode&0x2: + obj.genIOC() + if args.mode&0x4: obj.genLauncher() parse_args() diff --git a/qt/ESB_MX_5cam.ui b/qt/ESB_MX_5cam.ui index e3fecde..0ee8efb 100644 --- a/qt/ESB_MX_5cam.ui +++ b/qt/ESB_MX_5cam.ui @@ -53,17 +53,7 @@ - -P=$(P),M=MOT_GIR_1; -P=$(P),M=MOT_GIR_2; -P=$(P),M=MOT_GIR_3; -P=$(P),M=MOT_GIR_4; -P=$(P),M=MOT_GIR_5; -P=$(P),M=MOT_GIR_X; -P=$(P),M=MOT_GIR_Y; -P=$(P),M=MOT_GIR_U; -P=$(P),M=MOT_GIR_V; -P=$(P),M=MOT_GIR_W + P=$(P),M=MOT_GIR_1;P=$(P),M=MOT_GIR_2;P=$(P),M=MOT_GIR_3;P=$(P),M=MOT_GIR_4;P=$(P),M=MOT_GIR_5;P=$(P),M=MOT_GIR_X;P=$(P),M=MOT_GIR_Y;P=$(P),M=MOT_GIR_U;P=$(P),M=MOT_GIR_V;P=$(P),M=MOT_GIR_W ESB_MX_motor.ui @@ -228,7 +218,7 @@ P=$(P),M=MOT_GIR_W type motion code as: -'&1;#1..5j/;cpx call15;abslinear X(1000)Y(0)U(0)V(0)W(0);call16' +'&1;#1..5j/;cpx abslinear X(1000)Y(0)U(0)V(0)W(0)' @@ -548,15 +538,15 @@ P=$(P),M=MOT_GIR_W 16 - - QFrame::NoFrame - M2 Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + QFrame::NoFrame + @@ -772,15 +762,15 @@ P=$(P),M=MOT_GIR_W 16 - - QFrame::NoFrame - M3 Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + QFrame::NoFrame + @@ -912,15 +902,15 @@ P=$(P),M=MOT_GIR_W 16 - - QFrame::NoFrame - M4 Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + QFrame::NoFrame + @@ -1124,15 +1114,15 @@ P=$(P),M=MOT_GIR_W 16 - - QFrame::NoFrame - M5 Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + QFrame::NoFrame + @@ -1185,15 +1175,15 @@ P=$(P),M=MOT_GIR_W 16 - - QFrame::NoFrame - M1 Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + QFrame::NoFrame + capolyline m3move @@ -1251,111 +1241,6 @@ P=$(P),M=MOT_GIR_W BrickLV.Reset=1;#1..8j/ - - - - 640 - 490 - 120 - 31 - - - - EPushButton::WidthAndHeight - - - $(P):MOVE_XYUVW - - - MOVE XYUVW - - - 1 - - - caMessageButton::Static - - - - - - 450 - 370 - 171 - 151 - - - - - 0 - - - - - - 0 - 0 - - - - $(P):5CAM_X - - - - - - - - 0 - 0 - - - - $(P):5CAM_Y - - - - - - - - 0 - 0 - - - - $(P):5CAM_U - - - - - - - - 0 - 0 - - - - $(P):5CAM_V - - - - - - - - 0 - 0 - - - - $(P):5CAM_W - - - - - diff --git a/qt/ESB_MX_SmarAct.ui b/qt/ESB_MX_SmarAct.ui new file mode 100644 index 0000000..78959da --- /dev/null +++ b/qt/ESB_MX_SmarAct.ui @@ -0,0 +1,175 @@ + + + Form + + + + 0 + 0 + 797 + 673 + + + + Form + + + false + + + + + 0 + 0 + 781 + 26 + + + + Expert + + + Smaract Controller $(S):$(M) + + + Qt::AlignLeading + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + caLabel::Default + + + QFrame::NoFrame + + + + + + 5 + 53 + 784 + 612 + + + + S=$(S),T=$(T),M=$(M)1;S=$(S),T=$(T),M=$(M)2;S=$(S),T=$(T),M=$(M)3;S=$(S),T=$(T),M=$(M)4;S=$(S),T=$(T),M=$(M)5;S=$(S),T=$(T),M=$(M)6;S=$(S),T=$(T),M=$(M)7;S=$(S),T=$(T),M=$(M)8;S=$(S),T=$(T),M=$(M)9;S=$(S),T=$(T),M=$(M)10;S=$(S),T=$(T),M=$(M)11;S=$(S),T=$(T),M=$(M)12;S=$(S),T=$(T),M=$(M)13;S=$(S),T=$(T),M=$(M)14;S=$(S),T=$(T),M=$(M)15 + + + MCS_stage.ui + + + 15 + + + 3 + + + caInclude::NoFrame + + + + + + 640 + 30 + 80 + 20 + + + + + URW Gothic L + 12 + + + + satus bits + + + + + + 215 + 30 + 80 + 20 + + + + + URW Gothic L + 12 + + + + Position + + + + + + 7 + 30 + 80 + 20 + + + + + URW Gothic L + 12 + + + + Motor + + + + + + 346 + 30 + 100 + 20 + + + + + URW Gothic L + 12 + true + + + + Absolute + + + + + + caLabel + QLabel +
caLabel
+
+ + caInclude + QWidget +
caInclude
+
+
+ + +
diff --git a/qt/ESB_MX_exp.ui b/qt/ESB_MX_exp.ui index 7300c89..657d1db 100644 --- a/qt/ESB_MX_exp.ui +++ b/qt/ESB_MX_exp.ui @@ -7,7 +7,7 @@ 0 0 776 - 706 + 640 @@ -194,9 +194,9 @@ - 20 - 620 - 121 + 140 + 590 + 120 22 @@ -213,39 +213,10 @@ enable plc 1 - - - - 160 - 620 - 121 - 24 - - - - Smaract - - - - 128 - 136 - 255 - - - - Smaract - - - ESB_MX_SmarAct_main.ui - - - P=SARES30-ESBMX - - - 170 + 360 590 100 22 @@ -267,9 +238,9 @@ - 30 - 650 - 100 + 260 + 590 + 90 22 @@ -288,7 +259,7 @@ 20 590 - 121 + 120 22 @@ -305,143 +276,17 @@ enable plc 1 - - - - 160 - 650 - 151 - 30 - - - - -ESB_MX Girder - - - - 0 - 0 - 0 - - - - - 89 - 126 - 225 - - - - HEXGIR - - - ESB_MX_5cam.ui - - - P=$(P) - - - caRowColMenu::Menu - - - false;false;false;false;false;false;false;false;false;false;false;false;false;false;false;false - - - - - - 340 - 650 - 151 - 30 - - - - -ESB_MX Girder(old) - - - - 0 - 0 - 0 - - - - - 89 - 126 - 225 - - - - HEXGIR - - - S_CS_HEXGIR_5Dbasic.ui - - - NAME=$(P), NAME1=$(P) - - - caRowColMenu::Menu - - - false;false;false;false;false;false;false;false;false;false;false;false;false;false;false;false - - - - - - 340 - 610 - 151 - 30 - - - - -ESB_MX EVR - - - - 0 - 0 - 0 - - - - - 89 - 126 - 225 - - - - EVR - - - G_EVR_main.ui - - - SYS=$(P),DEVICE=EVR0,FF=PCIe - - - caRowColMenu::Menu - - - false;false;false;false;false;false;false;false;false;false;false;false;false;false;false;false - - - 510 - 610 - 151 - 30 + 560 + 590 + 180 + 31 - -ESB_MX EVR VME + -related panels @@ -458,13 +303,13 @@ - EVR;EVR-simple + SmarAct;SmarAct (old);Girder;EVR;EVR-simple - G_EVR_main.ui;S_LAS-TMAIN.ui + ESB_MX_SmarAct.ui;ESB_MX_SmarAct_main.ui;ESB_MX_5cam.ui;G_EVR_main.ui;S_LAS-TMAIN.ui - SYS=SAR-CVME,DEVICE=EVR0,FF=VME-300;SYS=SAR-CVME,IOC=SAR-CVME-EVR0,DEVICE=EVR0 + S=SARES30-SMX,M=MCS,T=MCS;P=SARES30-ESBMX;P=$(P);SYS=SAR-CVME,DEVICE=EVR0,FF=VME-300;SYS=SAR-CVME,IOC=SAR-CVME-EVR0,DEVICE=EVR0 caRowColMenu::Menu