Commit 60e5851e authored by Mateus Goto's avatar Mateus Goto

[To be fixed]

parent 88cea533
from NHR9400series.NHR9410 import NHR9410
from NHR9400series.NHR9430 import NHR9430
from UtilitiesRei.IPFinder import IPFinder
class controlInterface:
def __init__(self):
self.__listIp = IPFinder().getList()
self.__listUsedIp = []
self.__nhr9410 = []
self.__nhr9430 = []
#refresh the list of ip
def refresh(self):
self.__listIp = IPFinder().getList()
for ip in self.__listUsedIp:
self.__listIp.remove(ip)
#create a NHR object
def newNhr(self, nhr):
if(nhr == "9410"):
new = NHR9410()
elif nhr == "9430":
new = NHR9430()
else:
return -1
new.locateIp(self.__listIp)
new.setS()
usedIp = new.getIp()
try:
self.__listIp.remove(usedIp)
self.__listUsedIp.append(usedIp)
if nhr == "9410":
self.__nhr9410.append(new)
elif nhr == "9430":
self.__nhr9430.append(new)
else:
return -1
except:
print("Any IP address matched")
def getNhr9410(self):
return self.__nhr9410
def getNhr9430(self):
return self.__nhr9430
def getListIp(self):
return self.__listIp
usedIp = new.getIp()
\ No newline at end of file
from abc import abstractmethod
import socket
import time
from UtilitiesRei.refineOutput import refineOutput
class NHR9400():
def __init__(self, name):
self.__name = name
self.__s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.__s.settimeout(1)
self.__ip = ""
################################# Configurations ######################################################
#Default start: Enable all instruments and close output relays and starts an aperture measurement on all channels which will run for the time specified by the last received SENSe:SWEep:APERture instrument command
#!!!!!! upgrade this function later
def start(self):
self.__s.send("SOUR:OUTP:ON 1\n".encode())
self.__s.send("INIT\n".encode())
def locateIp(self, clients = []):
for client in clients:
try:
self.__s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.__s.connect((client, 5025))
self.__s.send("*RST".encode())
self.__s.send("SYST:RWL\n".encode()) #Command to activate remote control and locking the touchscreen
self.__s.send("*IDN?\n".encode())
msg = self.__s.recv(1024)
recv = self.receiveString(msg)
id = "NH Research," + str(self.__name)
if recv.find(id) != -1: #if find this subtring
self.__ip = client
print(self.__ip)
print("Connection successfully")
break
else:
self.__s.close()
except:
print("Connection failed 2")
def getIp(self):
return self.__ip
def getS(self):
return self.__s
#chose a mode with the instrument will run, check the manual to see all modes.
def configMode(self, mode):
if mode < 0 and mode > 16:
print("INVALID INPUT")
else:
self.__s.send(("CONF:HW:MODE " + str(mode) + "\n").encode())
self.checkErrors()
self.validMode()
#check if the mode is valid for the current hardware
def validMode(self):
self.__s.send("CONF:HW:MODE:VAL".encode())
print(self.receiveString())
#Command configures if [SOURCe:]<Function> commands are immediately or phase-angle controlled Query returns the synchronous operating mode
def instrumentSync(self, value):
if value == 0 or value == 1:
self.__s.send(("CONF:INST:SYNC "+ str(value) + "\n").encode())
else:
print("INVALID INPUT")
#The 9400 will contain one (1), two (2), or three (3) logical instruments depending on the CONFigure:HW:MODE selected. Unless otherwise noted in a specific command, Any command or queries with an INSTRUMENT scope will be processed by the last instrument selected by either an INSTrument:NSELect or an INSTrument:SELect.
def instrumentNselect(self, value):
if value < 1 or value > 3:
print("INVALID INPUT")
else:
self.__s.send(("INST:NSEL " + str(value) + "\n").encode())
self.checkErrors()
#Command selects an instrument by its alias name created with INSTrument:DEFine[:NAME]. Query returns the current selected logical instrument alias name.
#check this command, maybe something wrong
def instrumentSelect(self):
self.__s.send("INST:SEL".encode())
self.checkErrors()
#Command assigns an alias name allowing selection of the instrument using INSTrument:SELect <name> Query returns the alias name assigned to a specific output channel.
def instrumentDefName(self, name, num):
self.instrumentNselect(num)
self.__s.send(("INST:DEF:" + str(name) + "\n").encode())
self.checkErrors()
#Command disassociates an <identifier> alias from the logical instrument number.
#After the command executes, the default identifier is re-associated with the instrument number.
#The default identifier cannot be deleted.
def instDelName(self, name):
self.__s.send(("INST:DEL:" + str(name) + "\n").encode())
self.checkErrors()
#Query returns the <identifier> alias for the requested instrument number.
#If no instrument number is provided, the <identifier> of the selected instrument is returned.
def instrumentName(self, num):
if num < 1 or num > 3:
print("INVALID INPUT")
else:
self.__s.send(("INST:NAME " + str(num) + "\n").encode())
self.checkErrors()
#Function that receives messages back and transform it in a string
def receiveString(self,recv):
recv = refineOutput().byteToString(recv)
return recv
#Function that receives messages back and transform it in a float
def receiveFloat(self, msg):
msg = refineOutput().byteToFloat(msg)
return msg
#Function that receives messages back and transform it in a array
def receiveArray(self, msg):
msg = refineOutput().byteToArray(msg)
return msg
def identify(self):
self.__s.send("*IDN?\n".encode())
return self.receive()
#Function to see if exist any error in the carry
def checkErrors(self):
self.__s.send("SYST:ERR?\n".encode())
value = self.__s.recv(1024)
return self.receiveString(value)
def close(self):
self.__s.send("SOUR:OUTP:ON 0\n".encode())
self.__s.send("ABOR\n".encode())
self.__s.send("SYST:LOC\n".encode())
self.__s.close()
# Controle do relé de saída do hardware (LIGAR OU DESLIGAR)
# 0 OFF - Instrumento desabilitado
# 1 ON - Instrumento habilitado
def enableOutput(self, value):
if value == 0 or value == 1:
self.__s.send(("SOUR:OUTP:ON "+ str(value) + "\n").encode())
else:
print("INVALID INPUT")
################################# System command #####################################################
#Command places the touch panel (if present) in local control mode. All front panel keys are returned to a functional state.
def systLocal(self):
self.__s.send("SYST:LOC\n".encode())
#Command or receipt of an external SCPI command places the touch panel in a non-locked remote mode.
def systRemote(self):
self.__s.send("SYST:REM\n".encode())
#Query returns the SCPI version number to which the module complies. The value is of the form YYYY.V, where YYYY is the year and V is the revision number for that year.
def systVersion(self):
self.__s.send("SYST:VER\n".encode())
#Command specifies the interval (Seconds) in which a command must be received. Query returns the programmed watchdog interval (Seconds).
def systWatchdogInterval(self, interval):
if interval < 0: return -1
self.__s.send(("SYST:WATC:INT " + str(interval) +"\n").encode())
self.__s.send(("*RST\n").encode())
self.__s.send("SYST:RWL\n".encode())
#Command determines the type communication required to reset the watchdog timer. Query returns the type of communication required to reset the watchdog timer.
def systWatchdogRobust(self, bool):
if bool != 0 or bool != 1: return -1
self.__s.send(("SYST:WATC:ROB " + str(bool) +"\n").encode())
self.__s.send(("*RST\n").encode())
self.__s.send("SYST:RWL\n".encode())
#Command resets watchdog timer
def systWatchdogService(self):
self.__s.send(("SYST:WATC:SERV\n").encode())
self.__s.send(("*RST\n").encode())
self.__s.send("SYST:RWL\n".encode())
################################# Digital Subsystem ############################
#Query returns the current state of the general purpose digital input port on the specified module.
def digitalInput(self):
self.__s.send(("DIG:INP\n").encode())
#Query returns the number of general purpose digital inputs (expressed as number of bits).
def digitalInputCount(self):
self.__s.send(("DIG:INP:COUN\n").encode())
#Command sets the state of the general purpose digital output port on the specified module. Query returns the last programmed state of the general purpose digital output
def digitalOutput(self):
self.__s.send(("DIG:OUT\n").encode())
#Query returns the number of general purpose digital outputs (expressed as number of bits).
def digitalInputCount(self):
self.__s.send(("DIG:OUT:COUN\n").encode())
################################# Instrument Capabilities - System Information Queries ##############################
# Query returns the number of output channels detected by the hardware.
def instrumentSystemChanels(self):
self.__s.send(("INST:CAP:SYST:CHAN?\r\n").encode())
value = self.__s.recv(1024)
return self.receiveString(value)
# Query returns the number of chassis detected (Master + Auxiliaries)
def instrumentSystemChassis(self):
self.__s.send(("INST:CAP:SYST:CHAS?\n").encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#Query returns the maximum number of commands which can be stored in a macro
def instrumentSystemMacros(self):
self.__s.send(("INST:CAP:MACR:COMM:MAX?\n").encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#Query returns the maximum delay time allowed for MACRo:WAIT[:TIME] within a single macro step.
def instrumentSystemMacroDelay(self):
self.__s.send(("INST:CAP:MACR:DEL:MAX?\n").encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#Query returns the default Regulation Gain setting set value used by the hardware.
def instrumentSystemRGainNominal(self):
self.__s.send(("INST:CAP:RGA:NOM?\n").encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#Query returns the maximum Regulation Gain setting set value used by the hardware.
def instrumentSystemRGainMax(self):
self.__s.send(("INST:CAP:RGA:MAX?\n").encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#Query returns the maximum trip time (seconds) for a safety limit settings
def instrumentSystemTripMax(self):
self.__s.send(("INST:CAP:TRIP:MAX?\n").encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
################################# Instrument Capabilities - Measurement Capabilities Queries ##############################
#Query returns a list with the absolute maximum and minimum measurement aperture setting for the module.
def instrumentSystemApertureRange(self):
range = []
self.__s.send(("INST:CAP:APER:MIN?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:APER:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
#Query returns the absolute peak current measurement capability for instrument selected.
def instrumentSystemCurrent(self):
range = []
self.__s.send(("INST:CAP:CURR:MEAS:MIN?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:CURR:MEAS:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
#Query returns maximum (minimum) peak current measurement for the selected instrument & range
def instrumentSystemCurrentRange(self):
range = []
self.__s.send(("INST:CAP:CURR:MEAS:RANG:MIN?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:CURR:MEAS:RANG:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
#Query returns the waveform digitizer’s maximum (minimum) sample frequency in Hz.
def instrumentSystemFreq(self):
range = []
self.__s.send(("INST:CAP:SAMP:FREQ:MIN?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:SAMP:FREQ:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
#Query returns the waveform digitizer’s maximum sample memory depth
def instrumentSamplePoints(self):
self.__s.send(("INST:CAP:SAMPl:POIN:MAX?\n").encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#Query returns the absolute peak voltage measurement capability for instrument selected.
#For AC (1φ) & DC outputs: Query response is expressed as line-neutral.
#For AC multi-φ outputs: Query response is expressed as line-line equivalent value.
def instrumentSystemVoltage(self):
range = []
self.__s.send(("INST:CAP:VOLT:MEAS:MIN?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:VOLT:MEAS:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
def instrumentSystemVoltagePhase(self, phase):
if phase == 1:
msg = "INST:CAP:VOLT:APH:"
elif phase == 2:
msg = "INST:CAP:VOLT:BPH:"
elif phase == 3:
msg = "INST:CAP:VOLT:CPH:"
else:
return -1
range = []
self.__s.send((msg + "MEAS:MIN?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send((msg + "MEAS:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
#Query returns maximum (minimum) peak voltage measurement for the selected instrument & range
def instrumentSystemVoltageRange(self):
range = []
self.__s.send(("INST:CAP:VOLT:MEAS:RANG:MIN?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:VOLT:MEAS:RANG:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
def instrumentSystemVoltageRangePhase(self, phase):
if phase == 1:
msg = "INST:CAP:VOLT:APH:"
elif phase == 2:
msg = "INST:CAP:VOLT:BPH:"
elif phase == 3:
msg = "INST:CAP:VOLT:CPH:"
else:
return -1
range = []
self.__s.send((msg + "MEAS:RANG:MIN?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send((msg + "MEAS:RANG:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
################################# Instrument Capabilities - Setting Capabilities Queries ##############################
# Query returns the absolute maximum current (ARMS or ADC) output capability for instrument selected.
def instrumentCapCurrent(self):
self.__s.send(("INST:CAP:CURR:MAX?\r\n").encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#Query returns the maximum current (ARMS or ADC) set-point value for selected instrument & range
def instrumentCapCurrentRange(self):
self.__s.send(("INST:CAP:CURR:RANG:MAX?\n").encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#Query returns a list of maximum or minimum current (ARMS or ADC) ranges for the selected instrument.
def instrumentCapCurrentRangeList(self):
range = []
self.__s.send(("INST:CAP:CURR:RANG:LIST:MIN?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveString(value))
self.__s.send(("INST:CAP:CURR:RANG:LIST:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveString(value))
return range
#Query returns the maximum (minimum) allowable operating frequency.
def instrumentCapFreqRange(self):
range = []
self.__s.send((":INST:CAP:FREQ:RANG:MIN?\r\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:FREQ:RANG:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
#Query returns the absolute maximum true power (Watts) setting value for the instrument selected.
def instrumentCapPowerMax(self):
self.__s.send(("INST:CAP:POW:ALL:MAX?\n").encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
# for each phase
def instrumentCapPowerMaxPhase(self, phase):
if phase == 1:
msg = "INST:CAP:POW:APH:"
elif phase == 2:
msg = "INST:CAP:POW:BPH:"
elif phase == 3:
msg = "INST:CAP:POW:CPH:"
else:
return -1
self.__s.send((msg + "MAX?\n").encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#These queries will retrieve the minimum (smallest positive) and maximum (largest positive) positive resistance setting for the Module. For example, the minimum = 1.5 and maximum = 1000.
def instrumentCapResistencePos(self):
self.__s.send(("INST:CAP:RES:POS:MIN?\r\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:RES:POS:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
def instrumentCapResistencenNeg(self):
self.__s.send(("INST:CAP:RES:NEG:MIN?\r\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:RES:NEG:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
#Query returns the absolute maximum voltage (VRMS or VDC) output capability for instrument selected.
def instrumentCapVoltageMaxMin(self):
range = []
self.__s.send(("INST:CAP:VOLT:ALL:MIN?\r\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:VOLT:ALL:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
################################# Setters and Getters ################################################
#set limit voltage of all phases
def setVoltage(self,voltage):
if voltage < 0:
return -1
self.__s.send(("SOUR:VOLT: " + str(voltage) + "\n").encode())
#Functions that sets the limits voltage on one phase (A, B or C)
def setVoltageA(self,voltage):
if voltage < 0:
return -1
self.__s.send(("SOUR:VOLT:APH " + str(voltage) + "\n").encode())
def setVoltageB(self,voltage):
if voltage < 0:
return -1
self.__s.send(("SOUR:VOLT:BPHase " + str(voltage) + "\n").encode())
def setVoltageC(self,voltage):
if voltage < 0:
return -1
self.__s.send(("SOUR:VOLT:CPHase " + str(voltage) + "\n").encode())
#Command establishes the True Power limit (W) as a positive value for the selected instrument.
def setPower(self, pow):
if pow < 0:
return -1
self.__s.send(("SOUR:POW: " + str(pow) + "\n").encode())
#Individual command for one phase
def setPowerA(self, pow):
if pow < 0:
return -1
self.__s.send(("SOUR:POW:APHase " + str(pow) + "\n").encode())
def setPowerB(self, pow):
if pow < 0:
return -1
self.__s.send(("SOUR:POW:BPHase " + str(pow) + "\n").encode())
def setPowerC(self, pow):
if pow < 0:
return -1
self.__s.send(("SOUR:POW:CPHase " + str(pow) + "\n").encode())
#Command establishes the operating frequency for the selected instrument.
def setFreq(self, freq):
if freq < 0:
return -1
self.__s.send(("SOUR:FREQ " + str(freq) + "\n").encode())
#!!!! Doesnt work!!!!
def getFreq(self):
self.__s.send("FETC:FREQ\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#Fetch the average voltage of all channels
def getVoltage(self):
self.__s.send("FETC:VOLT?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#fetch individual value of voltage of one channel
def getVoltageA(self):
self.__s.send("FETC:VOLT:APHase?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
def getVoltageB(self):
self.__s.send("FETC:VOLT:BPHase?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
def getVoltageC(self):
self.__s.send("FETC:VOLT:CPHase?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
def getVoltageArray(self):
self.__s.send("FETC:ARR:VOLT?\n".encode())
value = self.__s.recv(1024)
return self.receiveArray(value)
#Fetch the average power of all channels
def getPower(self):
self.__s.send("FETC:POW?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#fetch individual value of Power of one channel
def getPowerA(self):
self.__s.send("FETC:POW:APHase?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
def getPowerB(self):
self.__s.send("FETC:POW:BPHase?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
def getPowerC(self):
self.__s.send("FETC:POW:CPHase?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#Fetch the average current of all channels
def getCurrent(self):
self.__s.send("FETC:CURR?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
#fetch individual value of current of one channel
def getCurrentA(self):
self.__s.send("FETC:CURR:APHase?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
def getCurrentB(self):
self.__s.send("FETC:CURR:BPHase?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
def getCurrentC(self):
self.__s.send("FETC:CURR:CPHase?\n".encode())
value = self.__s.recv(1024)
return self.receiveFloat(value)
from NHR9400series.NHR9400 import NHR9400
class NHR9410(NHR9400):
def __init__(self):
super().__init__("9410")
def setS(self):
self.__s = self.getS()
from NHR9400series.NHR9400 import NHR9400
class NHR9430(NHR9400):
def __init__(self):
super().__init__("9430")
def setS(self):
self.__s = self.getS()
#Command sets the loading features <loading mode> for a 9430 AC output Query returns the loading features enabled on a 9430
#Command is only accepted if the instrument is a 9430, with AC outputs mode, and in an OFF state Other models & modes: This command is invalid
# 0 = NORMal = CC / CP / CVA with modifiers (PF, CF, & IWAVESHAPE)
# 1 = CR = Constant Resistance (with optional CC limit)
# 2 = RL = Constant series Resistance & Inductance
def instrumentLoad(self, value):
if value < 0 or value > 2:
print("INVALID INPUT")
else:
if value == 0:
self.__s.send("CONF:INST:LOAD:NORM".encode())
if value == 1:
self.__s.send("CONF:INST:LOAD:CR".encode())
if value == 2:
self.__s.send("CONF:INST:LOAD:RL".encode())
self.checkErrors()
#Command enables bi-directional power flow for the 9420 (DC outputs) and 9430 (AC outputs) Query returns if Bi-directional power flow is permitted.
#0 | NO | FALSE | OFF = Bi directional mode is disabled
#1 | YES | TRUE | ON = Bi directional mode is enabled
def instrumentBidirec(self, value):
if value == 0 or value == 1:
self.__s.send(("CONF:INST:BID"+ str(value) + "\n").encode())
else:
print("INVALID INPUT")
self.checkErrors()
#Command sets the standby detection conditions.
#Query returns the configured standby detection conditions for the selected instrument
def instrumentStndy(self):
self.__s.send("CONF: INST:STBY".encode())
self.checkErrors()
#set the current of all phases ** Available only to NHR9430-12
def setCurrent(self, current):
if current < 0:
return -1
self.__s.send(("SOUR:CURR " + str(current) + "\n").encode())
#Functions that sets the limite currents on one phase (A, B or C)
def setCurrentA(self, current):
if current < 0:
return -1
self.__s.send(("SOUR:CURR:APHase " + str(current) + "\n").encode())
def setCurrentB(self, current):
if current < 0:
return -1
self.__s.send(("SOUR:CURR:BPHase " + str(current) + "\n").encode())
def setCurrentC(self, current):
if current < 0:
return -1
self.__s.send(("SOUR:CURR:CPHase " + str(current) + "\n").encode())
def getCurrentArray(self):
self.__s.send("FETC:ARR:CURR?\n".encode())
value = self.__s.recv(1024)
return self.receiveArray(value)
###################### Instrument Capabilities #################
#Query returns the minimum and maximum allowable set value for crest factor in NORMal loading mode Refer to CONFigure:LOAD:MODE for information about setting the 9430 in NORmal loading mode.
def instrumentCapCurrentCF(self):
range = []
self.__s.send(("INST:CAP:CURR:CF:MIN?\r\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:CURR:CF:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
#Query returns the minimum and maximum resistance that can be set in RL loading mode. Refer to CONFigure:LOAD:MODE for information about setting the 9430 in RL loading mode.
def instrumentCapResistenceRL(self):
range = []
self.__s.send(("INST:CAP:RL:RES:MIN?\r\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:RL:RES:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
#Query returns the minimum and maximum inductance that can be set in RL loading mode.
def instrumentCapInductanceRL(self):
range = []
self.__s.send(("INST:CAP:RL:IND:MIN?\r\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
self.__s.send(("INST:CAP:RL:IND:MAX?\n").encode())
value = self.__s.recv(1024)
range.append(self.receiveFloat(value))
return range
import socket
from scapy.all import ARP, Ether, srp
class IPFinder:
#uses socket and scapy to scan the entire local network and returns all the IPs adresses of the devices connects in this networok
def __getAllIp(self):
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.connect(("10.255.255.255",1))
local_ip = s.getsockname()[0]
splited = local_ip.split('.')
splited = local_ip.split('.')
splited.pop()
splited.append("1/24")
local_ip = ".".join(splited)
arp = ARP(pdst=local_ip)
ether = Ether(dst="ff:ff:ff:ff:ff:ff")
packet = ether/arp
result = srp(packet, timeout=1,retry = 1, verbose = 0)[0]
clients = []
for sent, received in result:
clients.append(received.psrc)
self.__clients = clients
def deteleIp(self, ip):
self.__clients.remove(ip)
def getList(self):
self.__getAllIp()
return self.__clients
\ No newline at end of file
class refineOutput:
def byteToFloat(self, recv):
recv = bytes(recv)
recv = recv.decode("UTF-8")
recv = recv.rstrip('\n\x00')
return float(recv)
def byteToString(self, recv):
recv = bytes(recv)
recv = recv.decode("UTF-8")
recv = recv.rstrip('\n\x00')
return recv
def byteToArray(self, recv):
recv = bytes(recv)
recv = recv.decode("UTF-8")
recv = recv.rstrip('\n\x00')
recv_array = recv.split(',')
return recv_array
\ No newline at end of file
...@@ -2,17 +2,19 @@ import json ...@@ -2,17 +2,19 @@ import json
from random import randint from random import randint
from asyncio import sleep from asyncio import sleep
from channels.generic.websocket import AsyncWebsocketConsumer from channels.generic.websocket import AsyncWebsocketConsumer
from NHR9400series.NHR9400 import NHR9400 from NHR9400series.NHR9410 import NHR9410
from NHR9400series.NHR9430 import NHR9430 from Control_Interface.controlInterface import controlInterface
interface = controlInterface()
interface.newNhr("9410")
nhr10 = []
nhr10 = interface.getNhr9410()
class GraphConsumer(AsyncWebsocketConsumer): class GraphConsumer(AsyncWebsocketConsumer):
async def connect(self): async def connect(self):
await self.accept() await self.accept()
for i in range(1000): for i in range(1000):
await self.send(json.dumps({'value': NHR9400.getVoltageArray()})) await self.send(json.dumps({'value': randint(0,40)}))
await sleep(0.16) await sleep(1)
var dps = Array(130)
const ctx = document.getElementById('myChart').getContext('2d');
var myChart = new CanvasJS.Chart("chartContainer",{
var graph_data = { title: {
type: 'line', text: "Live Data"
},
data: { axisY: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'], gridThickness: 0
datasets: [{ },
label: '# of Votes', data: [{
data: [12, 19, 3, 5, 2, 3], type: "spline",
tension: 0, dataPoints: dps
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
],
borderWidth: 5
}]
},
}
const data = {
labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
datasets: [{
label: 'Looping tension',
data: [65, 59, 80, 81, 26, 55, 40],
tension: 0.5,
fill: false,
borderColor: 'rgb(75, 192, 192)',
}] }]
}; });
myChart.render();
const config = {
type: 'line',
data: graph_data,
bezierCurve: true,
options: {
animations: {
tension: {
duration: 1000,
easing: 'easeInSine',
loop: true
}
},
scales: {
y: { // defining min and max so hiding the dataset does not change scale range
min: 0,
max: 100
}
}
}
};
const myChart = new Chart(ctx, graph_data, config);
var socket = new WebSocket('ws://localhost:7000/ws/graph/');
var updateInterval = 500;
var socket = new WebSocket('ws://localhost:8000/ws/graph/')
socket.onmessage = function(e){ socket.onmessage = function(e){
var djangoData = JSON.parse(e.data); var djangoData = JSON.parse(e.data);
console.log(djangoData); console.log(djangoData.value);
var updatedDps = [];
var newGraphData = graph_data.data.datasets[0].data; myChart.options.data[0].dataPoints = [];
newGraphData.shift();
newGraphData.push(djangoData.value);
graph_data.data.datasets[0].data = newGraphData; for(var i = 0; i < dps.length; i++)
myChart.update(); updatedDps.push(djangoData.value[i]);
console.log(djangoData.value[i]);
} myChart.options.data[0].dataPoints = updatedDps;
\ No newline at end of file myChart.render();
};
setInterval(function(e){socket.onmessage()}, updateInterval);
\ No newline at end of file
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<div class="row"> <div class="row">
<div class="col-10 mx-auto mt-5"> <div class="col-10 mx-auto mt-5">
<h1 id="app">{{ text }}</h1> <h1 id="app">{{ text }}</h1>
<canvas id="myChart" width="400" height="200"></canvas> <canvas id="chartContainer" width="400" height="200"></canvas>
</div> </div>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment