Time interval data from Vint hub

Supporting 2.7 and 3.2+
Post Reply
User avatar
mparadis
Site Admin
Posts: 959
Joined: Fri Oct 28, 2011 12:17 pm
Contact:

Re: Time interval data from Vint hub

Post by mparadis »

Hi Max,

Some notes about your program:

- It doesn't make sense to put the definition for your VoltageRatioChangeHandler inside your while loop, you only need to define it once, like you would a variable.

- It doesn't make sense to access the value for the variable "a" outside of your change handler. You can think of change handlers as separate programs that run alongside your main program. By the time your main program attempts to access "a", you have no way of knowing whether it's been set by your event handler. You're better off printing "a" from the handler. Rather than continuously printing in an infinite loop, you'd normally do your prints in the event handler and wait for input on your main program. If you want both numbers output simultaneously, the infinite loop may be the easiest way. I needed to add the "global" keyword to the variables to make it work this way.


- The second time you call setIsHubPortDevice, the parameter should still be "1", as 1 means "true" in this case.

- You should use different handles for your different channels. That way, you can keep them both open at the same time.


- If you're just using ordinary sensors plugged into your VINT hub, it doesn't make sense to call setBridgeEnabled. That function only belongs to boards like our 1046 or DAQ1500. If this is the case, you would not use setIsHubPortDevice(1), since you're getting data from the attached device, not the hub port itself.

Here's a modified version that should work:

Code: Select all


#There is about 0.8 seconds difference between the readings
import sys
import time
import datetime
from Phidget22.Devices.VoltageRatioInput import *
from Phidget22.PhidgetException import *
from Phidget22.Phidget import *
from Phidget22.Net import *

try:
    ch = VoltageRatioInput()
    ch2 = VoltageRatioInput()
except RuntimeError as e:
    print("Runtime Exception %s" % e.details)
    print("Press Enter to Exit...\n")
    readin = sys.stdin.read(1)
    exit(1)

a=0
b=0

def VoltageRatioChangeHandlerA(e, voltageRatio):
        global a
        a = voltageRatio

def VoltageRatioChangeHandlerB(e, voltageRatio):
        global b
        b = voltageRatio


start = time.time()

ch.setOnVoltageRatioChangeHandler(VoltageRatioChangeHandlerA)
ch.setHubPort(1)
ch.setIsHubPortDevice(1)
ch.openWaitForAttachment(5000)
ch.setDataInterval(1)

ch2.setOnVoltageRatioChangeHandler(VoltageRatioChangeHandlerB)
ch2.setHubPort(0)
ch2.setIsHubPortDevice(1)
ch2.openWaitForAttachment(5000)
ch2.setDataInterval(1)

while 1:
    try:
        print("Channel 0: {0}   Channel 1: {1}".format(b,a))
        time.sleep(0.4)
    except (KeyboardInterrupt):
        print ("gracefully aborted")
        ch.close()       
        ch2.close()
        sys.exit()
I set the dataInterval for both channels to the minimum for the VINT Hub (1ms) so that 'a' and 'b' will always be as up-to-date as possible regardless of how long the loop sleeps for.
User avatar
mparadis
Site Admin
Posts: 959
Joined: Fri Oct 28, 2011 12:17 pm
Contact:

Re: Time interval data from Vint hub

Post by mparadis »

I had assumed that you were trying to access normal sensors on VINT ports 0 and 1. Now that I know you have a DAQ1500 connected to port 0, we don't need to setIsHubPortDevice(1) since we're accessing a Phidget that's connected to the hub.

Code: Select all


#There is about 0.8 seconds difference between the readings
import sys
import time
import datetime
from Phidget22.Devices.VoltageRatioInput import *
from Phidget22.PhidgetException import *
from Phidget22.Phidget import *
from Phidget22.Net import *

try:
    ch = VoltageRatioInput()
    ch2 = VoltageRatioInput()
except RuntimeError as e:
    print("Runtime Exception %s" % e.details)
    print("Press Enter to Exit...\n")
    readin = sys.stdin.read(1)
    exit(1)

a=0
b=0

def VoltageRatioChangeHandlerA(e, voltageRatio):
        global a
        a = voltageRatio

def VoltageRatioChangeHandlerB(e, voltageRatio):
        global b
        b = voltageRatio


start = time.time()

ch.setOnVoltageRatioChangeHandler(VoltageRatioChangeHandlerA)
ch.setHubPort(1)
ch.setIsHubPortDevice(1)
ch.openWaitForAttachment(5000)
ch.setDataInterval(1)

ch2.setOnVoltageRatioChangeHandler(VoltageRatioChangeHandlerB)
ch2.setHubPort(0)
ch2.setChannel(0)
ch2.openWaitForAttachment(5000)
ch2.setDataInterval(20)

while 1:
    try:
        print("Bridge: {0}   Sensor: {1}".format(b,a))
        time.sleep(0.4)
    except (KeyboardInterrupt):
        print ("gracefully aborted")
        ch.close()       
        ch2.close()
        sys.exit()
- I changed the DataInterval for port 0, since the minimum data interval is 20ms for the DAQ1500. You can find this information on the API page and selecting DAQ1500 from the second drop-down box.

- I also added setChannel(0) because I have the load cell plugged into port 0 of the DAQ1500.

- You don't actually have to call setBridgeEnabled(1) because it is enabled by default (you only need this function if you choose to disable the bridge input for some reason).

- The reason that python is giving you such cryptic error messages is because you're not using try/except to catch PhidgetException errors. If you catch PhidgetExceptions, they'll be able to tell you what's wrong (e.g. invalid argument, Phidget not attached, etc). You can see how catching PhidgetException works if you look at the python sample code for VoltageRatio.
Post Reply

Who is online

Users browsing this forum: No registered users and 16 guests