Jump to content

DllCall problem with visa32.dll


Angel
 Share

Recommended Posts

Hi,

I am trying to create some functions that will people control intruments (osciloscopes, signal generators, spectrum analyzers, etc) through VISA and GPIB. To do so I am trying to call the visa32.dll from AutoIt by means of DllCall.

However I am having trouble with this as I don't seem to be calling the functions properly as I do not get the proper responses from the DLL.

I've reviewed my code several times but I can't see what I am doing wrong, other than the fact that some of the paremeters are supposed to be unsigned integers but I am telling DllCall that they are integers.

So I will post here the original C calls to the functions (which I've used and work in C) and my "AutoIt equivalents". I hope that someone can spot my mistake and help me finish this which I think would be of great use for the "lab rats" like me which are using AutoIt :-). The code is a bit long but I've tried to comment a lot. I've put the functions that I want to call followed by the "translation" using C types (like int, char, etc). Then I put an example that works in C.

Here I go:

The C- code:

#cs
 ; The C code from wich this was copied:
  // First some typedefs and #defines required to understand the function prototypes
  typedef unsigned long    ViUInt32;
  typedef ViUInt32          ViObject;
  typedef ViObject          ViSession;
  typedef ViUInt32          ViAccessMode;
  typedef signed long        ViInt32;
  typedef ViInt32            ViStatus;
  
  #define VI_NULL            (0)
  
  // Then the function prototypes themselves
  
  // viStatus viOpenDefaultRM (*viSession) => signed int viOpenDefaultRM(*unsigned long)
  // viStatus viOpen (viSession, char*, viAccessMode, ViUInt32, *viSession); => signed int viOpen(unsigned long, char*, unsigned long, unsigned long, *unsigned long)
  // viStatus viQueryf (viSession, char*, char*, ...); => like fprintf(fid, command, format_string, params...)
  // viStatus viClose(viSession)
  
  // And the example code
  int int_instr;
  char s_out[255];
  errStatus = viOpenDefaultRM (&DEFAULT_RM);
  errStatus = viOpen (DEFAULT_RM, "GPIB0::20::0", VI_NULL, VI_NULL, &int_instr);
  errStatus = viQueryf (int_ret, "*IDN?\n", "%s", s_out);
  viClose(int_ret);
#ce

This small example gets the "GPIB ID" of the instrument in address 1.

Here is the same code in AutoIt:

Global Const $VI_NULL = 0

; VISA variables
Dim $DEFAULT_RM = 0
Dim $int_instr = 0
Dim $s_out = ""
Dim $v_results

;- Open VISA RESOURCE MANAGER
; errStatus = viOpenDefaultRM (&DEFAULT_RM);
; signed int viOpenDefaultRM(*unsigned long)
$v_results = DllCall("visa32.dll", "int","viOpenDefaultRM", "int_ptr",$DEFAULT_RM)
DebugMsg("@error = " & @error)
DebugMsg("errStatus = " & $v_results[0])
$DEFAULT_RM = $v_results[1]
DebugMsg("$DEFAULT_RM = " & $DEFAULT_RM)

;- Open the INSTRUMENT CONNECTION
; errStatus = viOpen (DEFAULT_RM, "GPIB0::20::0", VI_NULL, VI_NULL, &int_instr);
; signed int viOpen(unsigned long, char*, unsigned long, unsigned long, *unsigned long)
$v_results = DllCall("visa32.dll", "long","viOpen", "long", $DEFAULT_RM, "str","GPIB::1::0", "long",$VI_NULL, "long",$VI_NULL,"long_ptr",$int_instr)
DebugMsg("@error = " & @error)
DebugMsg("errStatus = " & $v_results[0])
$int_instr = $v_results[1]
DebugMsg("$int_instr = " & $int_instr)

;- Send QUERY to instrument and get ANSWER
; errStatus = viQueryf (int_instr, "*IDN?\n", "%s", s_out);
; signed int viQueryf (unsigned long, char*, char*, char*);
;errStatus = viQueryf (h_instr, s_command, "%s", string);
$v_results = DllCall("visa32.dll", "int","viQueryf", "int",$int_instr, "str","*IDN?", "str","%s", "str", $s_out)
DebugMsg("@error = " & @error)
DebugMsg("errStatus = " & $v_results[0])
$s_out = $v_results[1]
DebugMsg("$s_out = " & $s_out)

;- Close INSTRUMENT Connection
; viClose(int_instr);
$v_results = DllCall("visa32.dll", "int","viClose", "int",$int_instr)
DebugMsg($v_results)
$errStatus = $v_results[0]


Func DebugMsg($s_msg)
  MsgBox(0,"Debug",$s_msg)
EndFunc

When I run it I do not see any @error problems but when I get to the query I get an error. Even before that I see that the call to viOpen sets $int_instr to the same value as the call to viOpenDefaultRM sets $DEFAULT_RM, which cannot be, as they are suposed to be handles to different things.

So does someone see what I am doing wrong. I really think that having VISA and GPIB control in AutoIT would be great!

Thanks in advance,

Angel

Link to comment
Share on other sites

I've found the source of the problem. As usual I had not properly read the documentation. I really should listen to Valik when he gives me some advice!

The problem was that DllCall returns a copy of ALL the parameters of the function! I thought that it only returned a copy of the modified parameters!

I think that this should be put in bold in the documentation :-)

Cheers,

Angel

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...