Problem #1 is trying to get Matlab to call a LabVIEW app. Simple enough from the LV end, just turn on the VI server.
Seems simple enough from the Matlab end:
e=actxserver('LabVIEW.Application');
vipath='c:\Documents and Settings\nosflowm\Desktop\testx.vi';
vi=invoke(e,'GetVIReference',vipath);
I can run the VI with:
vi.Run or vi.Call or vi.Call2
The trouble is I have no idea how to pass parameters to the VI and how to read back the output. I've munged together that I can set the input arguments the hard way:
vi.SetControlValue('input variable1',4);
But if I try to use the NI suggested method "Call" or "Call2", Matlab chokes on any input parameter I specify:
??? Invoke Error, Dispatch Exception: The parameter is incorrect.
Any ideas?
Problem #2 involves interfacing with a VisualBasic program developed by a third-party for a piece of hardware, and he's really reluctant to help debug anything.
I can sort of munge things into working by embedding his OCX into a global variable and have each subVI in my app refer to it. But it just feels wrong, and I have to implement a signaling channel to prevent contention. I should be able to create a reference and pass that between VIs. Only problem is that it fails miserably, giving me Error code -97, and when I probe the line, it has a null reference to the ActiveX interface.
That's the easy part. The hard part is that I want to write clean code. That is, I want to initialize the instrument when I start my top level VI and close it when I'm done. But somewhere things don't close out cleanly. Which means that every time I want to test my code, I need to restart LabVIEW, or the ActiveX server thinks that someone else is controlling the hardware interface (4 serial ports). How can I fully close down the ActiveX object without restarting LabVIEW?
Sorry if my jargon is off, I've never worked with ActiveX, COM, or NET before. Any help would be appreciated.
Why is it so difficult to do seemingly simple things in ActiveX?
in Calling External Code
Posted
OK, I'm having two big problems with ActiveX.
Problem #1 is trying to get Matlab to call a LabVIEW app. Simple enough from the LV end, just turn on the VI server.
Seems simple enough from the Matlab end:
e=actxserver('LabVIEW.Application');
vipath='c:\Documents and Settings\nosflowm\Desktop\testx.vi';
vi=invoke(e,'GetVIReference',vipath);
I can run the VI with:
vi.Run or vi.Call or vi.Call2
The trouble is I have no idea how to pass parameters to the VI and how to read back the output. I've munged together that I can set the input arguments the hard way:
vi.SetControlValue('input variable1',4);
But if I try to use the NI suggested method "Call" or "Call2", Matlab chokes on any input parameter I specify:
object.Call2([paramNames], [paramVals], [openFP], [closeFPAfterCall], [suspendOnCall])turns into:
>> vi.Call2('input variable1',5)
??? Invoke Error, Dispatch Exception: The parameter is incorrect.
Any ideas?
Problem #2 involves interfacing with a VisualBasic program developed by a third-party for a piece of hardware, and he's really reluctant to help debug anything.
I can sort of munge things into working by embedding his OCX into a global variable and have each subVI in my app refer to it. But it just feels wrong, and I have to implement a signaling channel to prevent contention. I should be able to create a reference and pass that between VIs. Only problem is that it fails miserably, giving me Error code -97, and when I probe the line, it has a null reference to the ActiveX interface.
That's the easy part. The hard part is that I want to write clean code. That is, I want to initialize the instrument when I start my top level VI and close it when I'm done. But somewhere things don't close out cleanly. Which means that every time I want to test my code, I need to restart LabVIEW, or the ActiveX server thinks that someone else is controlling the hardware interface (4 serial ports). How can I fully close down the ActiveX object without restarting LabVIEW?
Sorry if my jargon is off, I've never worked with ActiveX, COM, or NET before. Any help would be appreciated.
Thanks,
-- MW