diff --git a/config/RCU.yaml b/config/RCU.yaml index aac519d77a8d804ab74e462509ce18479d2d8c43..338f910f685d6fd7a091796029bd34b4fde1e439 100644 --- a/config/RCU.yaml +++ b/config/RCU.yaml @@ -266,6 +266,7 @@ variables: rw: ro dtype: double dim: 32 + monitor: true - name: RCU_Pwr_dig description: Enable LDOs @@ -318,6 +319,7 @@ variables: dtype: uint8 dim: 96 mask: Ant_mask + monitor: true - name: RCU_dth1_freq driver: I2C_RCU diff --git a/config/UNB2.yaml b/config/UNB2.yaml index deb05e0b90ef84cf2663c38eef44b0fba0fa20c5..0f39ecce392ca66e6f289c0f19fbe01ab289c39e 100644 --- a/config/UNB2.yaml +++ b/config/UNB2.yaml @@ -152,6 +152,7 @@ variables: dtype: double scale: 1.2207e-4 #2^-13 dim: 2 + monitor: true - name: [UNB2_POL_QSFP_N01_VOUT,UNB2_POL_QSFP_N01_IOUT,UNB2_POL_QSFP_N01_TEMP,UNB2_POL_QSFP_N23_VOUT,UNB2_POL_QSFP_N23_IOUT,UNB2_POL_QSFP_N23_TEMP] driver: switch_PS @@ -162,6 +163,7 @@ variables: dtype: double scale: 1.2207e-4 #2^-13 dim: 2 + monitor: true - name: [UNB2_POL_SWITCH_1V2_VOUT,UNB2_POL_SWITCH_1V2_IOUT,UNB2_POL_SWITCH_1V2_TEMP,UNB2_POL_SWITCH_PHY_VOUT,UNB2_POL_SWITCH_PHY_IOUT,UNB2_POL_SWITCH_PHY_TEMP] driver: switch_PS @@ -172,6 +174,7 @@ variables: dtype: double scale: 1.2207e-4 #2^-13 dim: 2 + monitor: true - name: [UNB2_POL_CLOCK_VOUT,UNB2_POL_CLOCK_IOUT,UNB2_POL_CLOCK_TEMP] driver: switch_PS @@ -182,6 +185,7 @@ variables: dtype: double scale: 1.2207e-4 #2^-13 dim: 2 + monitor: true ##Local MP per FPGA node - name: UNB2_FPGA_DDR4_SLOT_TEMP @@ -194,6 +198,7 @@ variables: dtype: double scale: 0.0625 dim: 16 + monitor: true - name: UNB2_FPGA_DDR4_SLOT_PART_NUMBER driver: switch_DDR4 @@ -203,6 +208,7 @@ variables: rw: ro dtype: string dim: 16 + monitor: true - name: [UNB2_POL_FPGA_CORE_VOUT,UNB2_FPGA_POL_CORE_IOUT,UNB2_FPGA_POL_CORE_TEMP,UNB2_FPGA_POL_ERAM_VOUT,UNB2_FPGA_POL_ERAM_IOUT,UNB2_FPGA_POL_ERAM_TEMP] driver: switch_FPGA_PS @@ -213,6 +219,7 @@ variables: dtype: double scale: 1.2207e-4 #2^-13 dim: 8 + monitor: true - name: [UNB2_FPGA_POL_RXGXB_VOUT,UNB2_FPGA_POL_RXGXB_IOUT,UNB2_FPGA_POL_RXGXB_TEMP,UNB2_FPGA_POL_TXGXB_VOUT,UNB2_FPGA_POL_TXGXB_IOUT,UNB2_POL_FPGA_TXGXB_TEMP] driver: switch_FPGA_PS @@ -223,6 +230,7 @@ variables: dtype: double scale: 1.2207e-4 #2^-13 dim: 8 + monitor: true - name: [UNB2_FPGA_POL_HGXB_VOUT,UNB2_FPGA_POL_HGXB_IOUT,UNB2_FPGA_POL_HGXB_TEMP,UNB2_FPGA_POL_PGM_VOUT,UNB2_FPGA_POL_PGM_IOUT,UNB2_FPGA_POL_PGM_TEMP] driver: switch_FPGA_PS @@ -233,6 +241,7 @@ variables: dtype: double scale: 1.2207e-4 #2^-13 dim: 8 + monitor: true @@ -247,6 +256,7 @@ variables: dtype: double scale: 0.0625 #TBC dim: 48 + monitor: true - name: UNB2_FPGA_QSFP_CAGE_LOS description: Bits for 4 TX, 4 RX channels @@ -257,6 +267,7 @@ variables: rw: ro dtype: uint8 dim: 48 + monitor: true methods: diff --git a/opcuaserv/i2client.py b/opcuaserv/i2client.py index 87ddab573bda93db1715bc3a7552f21c8cb7c7b1..b00d227a52297b16e43c29ff4962a926804b1427 100644 --- a/opcuaserv/i2client.py +++ b/opcuaserv/i2client.py @@ -28,6 +28,9 @@ class i2client(): Data=OPCUAset(id1,InstType.varSet,data,mask) self.Qout.put(Data); + def QoutLength(self): + return self.Qout.qsize() + def callmethod(self,id1,mask=[]): Data=OPCUAset(id1,InstType.method,[],mask) self.Qout.put(Data); diff --git a/opcuaserv/opcuaserv.py b/opcuaserv/opcuaserv.py index 897a9438aa21152f48b2d640e8b1d9d932123879..9ce7c06b040fc286ee0eaafda0f80b64824579ff 100644 --- a/opcuaserv/opcuaserv.py +++ b/opcuaserv/opcuaserv.py @@ -68,8 +68,9 @@ def AddVarW(vname,varvalue2,v,Q1,debug): obj=(DEBUGobj if debug else PCCobj) myvar2 = obj.add_variable(idx, vname, varvalue2) myvar2.set_writable() - Vars_W[myvar2.nodeid.Identifier]=[vname,myvar2.get_data_value(),v,Q1] - handle = sub.subscribe_data_change(myvar2) + if v: + Vars_W[myvar2.nodeid.Identifier]=[vname,myvar2.get_data_value(),v,Q1] + handle = sub.subscribe_data_change(myvar2) return myvar2 def Addmethod(vname,v,Q1,debug): diff --git a/opcuaserv/yamlreader.py b/opcuaserv/yamlreader.py index 0697006a22c737e684938826379ae4e29bba01f9..380da019470cbcaa7913ffcb83ab2d9743c4c780 100644 --- a/opcuaserv/yamlreader.py +++ b/opcuaserv/yamlreader.py @@ -19,11 +19,14 @@ def int2bytes(i): class yamlreader(yamlconfig): def __init__(self,i2cserver,yamlfile='RCU'): + self.yamlfile=yamlfile; yamlconfig.__init__(self,yamlfile) self.server=i2cserver; - + self.timecount=0; + self.monitorvarcnt=0; def AddVars(self,AddVarR,AddVarW): + self.monitorvar=AddVarW(self.yamlfile+"_monitor_rate_RW",60,None,None,None) for v in self.conf['variables']: # print(v) dim1=v.get('dim',1); @@ -181,3 +184,19 @@ class yamlreader(yamlconfig): logging.debug(str(("OPCset",v['name'],data3))) v['OPCR'].set_value(data3); + def Monitor(self): + T1=self.monitorvar.get_value()*10; + if T1<=0: return; + self.timecount+=1; + while self.timecount>=T1: + if self.server.QoutLength()>3: return; + v=self.conf['variables'][self.monitorvarcnt]; + if v.get('monitor'): + mask=(v['maskOPC'].get_value() if v.get('maskOPC') else []) +# print("monitor",v['name'],mask) + self.server.readvar(self.monitorvarcnt,mask=mask) + self.monitorvarcnt+=1; + if self.monitorvarcnt>=len(self.conf['variables']): + self.monitorvarcnt=0; + self.timecount=0; + diff --git a/pypcc2.py b/pypcc2.py index 2fadc3efd85a2db5c4681d7a5c54a8b59ccf6970..df8342006b8942a20da8e1874a0f36d262b91a1a 100644 --- a/pypcc2.py +++ b/pypcc2.py @@ -49,6 +49,7 @@ for name in I2Cports: #Initialise OPCUA server and load variables logging.info("Initialised OPC-UA Server") +configs=[] if not(args.test): opcuaserv.InitServer(port=args.port) logging.info("Load OPCUA variables & start i2c listing thread") @@ -57,6 +58,7 @@ if not(args.test): RCU_conf=yamlreader.yamlreader(RCU_I2C,yamlfile=name) RCU_conf.AddVars(opcuaserv.AddVarR,opcuaserv.AddVarW) RCU_conf.AddMethod(opcuaserv.Addmethod) + configs.append(RCU_conf); thread2=threading.Thread(target=RCU_conf.getvar); #Thread on OPC-UA side of pipe thread2.start() @@ -72,7 +74,9 @@ if False: try: while RunTimer: - time.sleep(1) + time.sleep(0.1); + for c in configs: + c.Monitor(); finally: if not(args.test): logging.info("Stop OPC-UA server")