home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 February / PCWorld_2006-02_cd.bin / software / vyzkuste / triky / triky.exe / autoit-v3-setup.exe / Include / Visa.au3 < prev   
Text File  |  2005-02-12  |  64KB  |  1,270 lines

  1. #include-once
  2. Opt("MustDeclareVars",1)
  3.  
  4. ; ------------------------------------------------------------------------------
  5. ;
  6. ; AutoIt Version: 3.0
  7. ; Language:       English
  8. ; Description:    VISA (GPIB & TCP) library for AutoIt
  9. ;                 Functions that allow controlling instruments (e.g. oscilloscopes,
  10. ;                 signal generators, spectrum analyzers, power supplies, etc)
  11. ;                 that have a GPIB or Ethernet port through the VISA interface
  12. ;                 (GPIB, TCP or Serial Interface)
  13. ; Limitations:    The VISA queries only return the 1st line of the device answer
  14. ;                 This is not a problem in most cases, as most devices will always
  15. ;                 answer with a single line.
  16. ; Notes:
  17. ;                 If you are interested in this library you probably already know 
  18. ;                 what is VISA and GPIB, but here there is a short description 
  19. ;                 for those that don't know about it:
  20. ;
  21. ;                 Basically GPIB allows you to control instruments like Power 
  22. ;                 Supplies, Signal Generators, Oscilloscopes, Signal Generators, etc.
  23. ;                 You need to install or connect a GPIB interface card (PCI, PCMCIA
  24. ;                 or USB) to your PC and install the corresponding GPIB driver.
  25. ;
  26. ;                 VISA is a standard API that sits on top of the GPIB driver and
  27. ;                 it allows you to use the same programs to control your 
  28. ;                 instruments regardless of the type of GPIB card that you have 
  29. ;                 installed in your PC (most cards are made either by National 
  30. ;                 Instruments(R) or by Agilent/Hewlett-Packard(R)).
  31. ;
  32. ;                 This library is that it opens AutoIt to a different kind of 
  33. ;                 automation (instrument automation). Normally you would need to
  34. ;                 use some expensive "instrumentation" environment like 
  35. ;                 Labwindows/CVI (TM), LabView (TM) or Matlab (TM) to automate 
  36. ;                 instruments but now you can do so with AutoIt.
  37. ;                 The only requirement is that you need a VISA compatible GPIB 
  38. ;                 card (all cards that I know are) and the corresponding VISA 
  39. ;                 driver must be installed (look for visa32.dll in the 
  40. ;                 windows\system32 folder).
  41. ;
  42. ;                 Basically you have 4 main functions:
  43. ;                 _viExecCommand - Executes commands and queries through GPIB
  44. ;                 _viOpen, _viClose - Open/Close a connection to a GPIB instrument.
  45. ;                 _viFindGpib - Find all the instruments in the GPIB bus
  46. ;
  47. ;                 There are other less important functions, like:
  48. ;                 _viGTL - Go to local mode (exeit the "remote control mode")
  49. ;                 _viGpibBusReset - Reset the GPIB bus if it is in a bad state
  50. ;                 _viSetTimeout - Sets the GPIB Query timeout
  51. ;                 _viSetAttribute - Set any VISA attribute
  52. ;
  53. ;                 There is one known limitation of this library:
  54. ;                 - The GPIB queries do not support binary transfer.
  55. ;
  56. ;                 It is recommended that you try first to execute the _viFindGpib 
  57. ;                 function (as shown in the example in the _viFindGpib header)
  58. ;                 and see if you can find any instruments. You can also have a 
  59. ;                 look at the examples in the _viExecCommand function description.
  60. ;
  61. ; ==============================================================================
  62. ; VERSION       DATE       DESCRIPTION
  63. ; -------    ----------    -----------------------------------------------------
  64. ; v1.0.00    02/01/2005    Initial release
  65. ; v1.0.01    02/06/2005    Formatted according to Standard UDF rules
  66. ;                          Fixed _viGpibBusReset
  67. ;                          Renamed _viFindGPIB to _viFindGpib
  68. ;                          Removed unnecessary MsgBox calls
  69. ;                          More detailed function headers
  70. ;                          Added Serial Interface related Attribute/Value Constants
  71. ; v1.0.02    02/11/2005    Fixed _viQueryf only executing "*IDN?" queries
  72. ;                          Fixed _viQueryf only returning characters up to the first space
  73. ;                          Fixed _viQuertf returning only first line of answer
  74. ;                          Added _viInterativeControl for interactive VISA control
  75. ;                          Added GPIB message termination attributes
  76. ; ------------------------------------------------------------------------------
  77.  
  78.  
  79. ; ==============================================================================
  80. ;- VISA Definitions ------------------------------------------------------------
  81. ; The VISA library requires some GLOBAL CONSTANTS and VARIABLES that are defined
  82. ; here:
  83.  
  84. ;- VISA CONSTANTS -------------------------------------------------------------
  85.  
  86. Global Const $VI_SUCCESS = 0 ; (0L)
  87. Global Const $VI_NULL = 0
  88.  
  89. Global Const $VI_TRUE = 1
  90. Global Const $VI_FALSE = 0
  91.  
  92. ;- VISA GPIB BUS control macros (for _viGpibControlREN, see below) -------------
  93. Global Const $VI_GPIB_REN_DEASSERT = 0
  94. Global Const $VI_GPIB_REN_ASSERT = 1
  95. Global Const $VI_GPIB_REN_DEASSERT_GTL = 2
  96. Global Const $VI_GPIB_REN_ASSERT_ADDRESS = 3
  97. Global Const $VI_GPIB_REN_ASSERT_LLO = 4
  98. Global Const $VI_GPIB_REN_ASSERT_ADDRESS_LLO = 5
  99. Global Const $VI_GPIB_REN_ADDRESS_GTL = 6
  100.  
  101.  
  102. ;- VISA interface ATTRIBUTE NAMES ----------------------------------------------
  103. ; General Attributes
  104. Global Const $VI_ATTR_TMO_VALUE = 0x3FFF001A
  105.  
  106. ; Serial Interface related Attributes
  107. Global Const $VI_ATTR_ASRL_BAUD = 0x3FFF0021
  108. Global Const $VI_ATTR_ASRL_DATA_BITS = 0x3FFF0022
  109. Global Const $VI_ATTR_ASRL_PARITY = 0x3FFF0023
  110. Global Const $VI_ATTR_ASRL_STOP_BITS = 0x3FFF0024
  111. Global Const $VI_ATTR_ASRL_FLOW_CNTRL = 0x3FFF0025
  112.  
  113. ; GPIB message termination attributes
  114. Global $VI_ATTR_TERMCHAR = 0x3FFF0018
  115. Global $VI_ATTR_TERMCHAR_EN = 0x3FFF0038
  116. Global $VI_ATTR_SEND_END_EN = 0x3FFF0016
  117.  
  118. ; NOTE: There are more attribute types. Please refer to the VISA Programmer's Guide
  119.  
  120.  
  121. ;- VISA interface ATTRIBUTE VALUES ---------------------------------------------
  122. ;* TIMEOUT VALUES:
  123. Global Const $VI_TMO_IMMEDIATE = 0
  124. Global Const $VI_TMO_INFINITE = 0xFFFFFFF
  125.  
  126. ; Serial Interface related Attribute Values
  127. Global Const $VI_ASRL_PAR_NONE = 0
  128. Global Const $VI_ASRL_PAR_ODD = 1
  129. Global Const $VI_ASRL_PAR_EVEN = 2
  130. Global Const $VI_ASRL_PAR_MARK = 3
  131. Global Const $VI_ASRL_PAR_SPACE = 4
  132.  
  133. Global Const $VI_ASRL_STOP_ONE = 10
  134. Global Const $VI_ASRL_STOP_ONE5 = 15
  135. Global Const $VI_ASRL_STOP_TWO = 20
  136.  
  137. Global Const $VI_ASRL_FLOW_NONE = 0
  138. Global Const $VI_ASRL_FLOW_XON_XOFF = 1
  139. Global Const $VI_ASRL_FLOW_RTS_CTS = 2
  140. Global Const $VI_ASRL_FLOW_DTR_DSR = 4
  141.  
  142. ; NOTE: There are more attribute values. Please refer to the VISA Programmer's Guide
  143.  
  144.  
  145. ;- VISA Global variable(s) -----------------------------------------------------
  146. ; The VISA Resource Manager is used by the _viOpen functions (see below)
  147. ; This is the only (non constant) Global required by this library
  148. Global $VISA_DEFAULT_RM = -1
  149.  
  150.  
  151.  
  152. ; ==============================================================================
  153. ;- Main VISA/GPIB functions ----------------------------------------------------
  154. ; These include _viExecCommand, _viOpen, _viClose and _viFindGpib
  155.  
  156. ;===============================================================================
  157. ;
  158. ; Description:      MAIN FUNCTION - Send a Command/Query to an Instrument/Device
  159. ; Syntax:           _viExecCommand($h_session, $s_command, $i_timeout_ms = -1)
  160. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session handle (INTEGER)
  161. ;                              * STRING -> A VISA DESCRIPTOR is a string which
  162. ;                                specifies the resource with which to establish a
  163. ;                                communication session. An example descriptor is
  164. ;                                "GPIB::20::0". This function supports all valid
  165. ;                                VISA descriptors, including GPIB, TCP, VXI and
  166. ;                                Serial Interface instruments. A detailed explanation
  167. ;                                of VISA descriptors is shown in the Notes section
  168. ;                                of this function.
  169. ;                                As a SHORTCUT you can use a STRING containing
  170. ;                                the address number (e.g. "20") of a GPIB 
  171. ;                                instrument instead of typing the full descriptor
  172. ;                                (in that case, "GPIB::20::0")
  173. ;                              * INTEGER -> A VISA session handle is an integer
  174. ;                                value returned by _viOpen (see below).
  175. ;                                It is recommended that instead you use _viOpen
  176. ;                                and VISA session handles instead of descriptors
  177. ;                                if you plan to communicate repeteadly with an
  178. ;                                Instrument or Device, as otherwise each time that
  179. ;                                you contact the instrument you would incur the
  180. ;                                overhead of opening and closing the communication
  181. ;                                link.
  182. ;                                Once you are done using the instrument you must
  183. ;                                remember to close the link with _viClose (see below)
  184. ;                   $s_command - Command/Query to execute.
  185. ;                                A query MUST contain a QUESTION MARK (?)
  186. ;                                When the command is a QUERY the function will
  187. ;                                automatically wait for the instrument's answer
  188. ;                                (or until the operation times out)
  189. ;                   $i_timeout_ms - The operation timeout in MILISECONDS
  190. ;                                This is mostly important for QUERIES only
  191. ;                                This is an OPTIONAL PARAMETER.
  192. ;                                If it is not specified the last set timeout will
  193. ;                                be used. If it was never set before the default
  194. ;                                timeout (which depends on the VISA implementation)
  195. ;                                will be used. Timeouts can also be set separatelly
  196. ;                                with the _viSetTimeout function (see below)
  197. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  198. ;                   visa32.dll is in {WINDOWS}\system32)
  199. ;                   For GPIB communication a GPIB card (such as a National Instruments
  200. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  201. ; Return Value(s):  The return value depends on whether the command is a QUERY
  202. ;                   or not and in whether the operation was successful or not.
  203. ;
  204. ;                   * Command, NON QUERY:
  205. ;                     On Success - Returns ZERO
  206. ;                     On Failure - Returns -1 if the VISA DLL could not be open
  207. ;                                  or a NON ZERO value representing the VISA
  208. ;                                  error code (see the VISA programmer's guide)
  209. ;                   * QUERY:
  210. ;                     On Success - Returns the answer of the instrument to the QUERY
  211. ;                     On Failure - Returns -1 if the VISA DLL could not be open
  212. ;                                  Returns -3 if the VISA DLL returned an unexpected
  213. ;                                  number of results
  214. ;                                  or returns a NON ZERO value representing the VISA
  215. ;                                  error code (see the VISA programmer's guide)
  216. ;
  217. ;                   This function always sets @error to 1 in case of error
  218. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  219. ; Example(s):
  220. ;                 - Simple communication examples:
  221. ;                   Get instrument ID:
  222. ;                     $s_idn = _viExecCommand("GPIB::20::0","*IDN?")
  223. ;                   This is the same as:
  224. ;                     $s_idn = _viExecCommand("20","*IDN?") -> Note that "20" is a STRING
  225. ;
  226. ;                 - More efficient way to communicate many times
  227. ;                   You must use _viOpen and _viClose
  228. ;                   In this example we measure a POWER 100 times:
  229. ;                     $h_session = _viOpen("GPIB::1::0") ; or $h_session = _viOpen("1")
  230. ;                     For $n = 0 To 99
  231. ;                       $power_array[$n] = _viExecCommand($h_session,"POWER?")
  232. ;                     Next
  233. ;                     _viClose($h_session)
  234. ;
  235. ;                   A more complex example, using 2 instruments, a signal generator
  236. ;                   and a spectrum analyzer, to measure the average power error of
  237. ;                   the generator:
  238. ;
  239. ;                     $h_spec_analyzer = _viOpen("GPIB::1::0") ; or $h_session = _viOpen("1")
  240. ;                     $h_signal_gen = _viOpen("GPIB::12::0") ; or $h_session = _viOpen("1")
  241. ;                     $average_power_error = 0
  242. ;                     For $ideal_power = -100 To -10 ; dBM
  243. ;                       _viExecCommand($h_signal_gen,"SOURCE:POWER " & $ideal_power & "dBm")
  244. ;                       $current_power_error = Abs($ideal_power - _viExecCommand($h_spec_analyzer,"POWER?"))
  245. ;                       $average_power_error = $average_power_error + $current_power_error
  246. ;                     Next
  247. ;                     $average_power_error = $average_power_error / 91
  248. ;                     _viClose($h_spec_analyzer)
  249. ;                     _viClose($h_signal_gen)
  250. ;
  251. ; Note(s):
  252. ;                 The following is a description of the MOST COMMON VISA DESCRIPTORS
  253. ;                 Note that there are some more types. For more info please
  254. ;                 refer to a VISA programmer's guide (available at www.ni.com)
  255. ;                 Optional segments are shown in square brackets ([]).
  256. ;                 Required segments that must be filled in are denoted by angle
  257. ;                 brackets (<>).
  258. ;
  259. ;                 Interface   Syntax
  260. ;                 ------------------------------------------------------------
  261. ;                 GPIB INSTR      GPIB[board]::primary address
  262. ;                                 [::secondary address] [::INSTR]
  263. ;                 GPIB INTFC      GPIB[board]::INTFC
  264. ;                 TCPIP SOCKET    TCPIP[board]::host address::port::SOCKET
  265. ;                 Serial INSTR    ASRL[board][::INSTR]
  266. ;                 PXI INSTR       PXI[board]::device[::function][::INSTR]
  267. ;                 VXI INSTR       VXI[board]::VXI logical address[::INSTR]
  268. ;                 GPIB-VXI INSTR  GPIB-VXI[board]::VXI logical address[::INSTR]
  269. ;                 TCPIP INSTR     TCPIP[board]::host address[::LAN device name]
  270. ;                                 [::INSTR]
  271. ;
  272. ;                 The GPIB keyword is used for GPIB instruments.
  273. ;                 The TCPIP keyword is used for TCP/IP communication.
  274. ;                 The ASRL keyword is used for serial instruments.
  275. ;                 The PXI keyword is used for PXI instruments.
  276. ;                 The VXI keyword is used for VXI instruments via either embedded
  277. ;                 or MXIbus controllers.
  278. ;                 The GPIB-VXI keyword is used for VXI instruments via a GPIB-VXI
  279. ;                 controller.
  280. ;
  281. ;                 The default values for optional parameters are shown below.
  282. ;
  283. ;                 Optional Segment          Default Value
  284. ;                 ---------------------------------------
  285. ;                 board                     0
  286. ;                 secondary address         none
  287. ;                 LAN device name           inst0
  288. ;
  289. ;
  290. ;                 Example Resource Strings:
  291. ;                 --------------------------------------------------------------
  292. ;                 GPIB::1::0::INSTR     A GPIB device at primary address 1 and
  293. ;                                       secondary address 0 in GPIB interface 0.
  294. ;
  295. ;                 GPIB2::INTFC          Interface or raw resource for GPIB
  296. ;                                       interface 2.
  297. ;
  298. ;                 TCPIP0::1.2.3.4::999::SOCKET    Raw TCP/IP access to port 999
  299. ;                                                 at the specified IP address.
  300. ;
  301. ;                 ASRL1::INSTR          A serial device attached to interface
  302. ;                                       ASRL1.  VXI::MEMACC Board-level register
  303. ;                                       access to the VXI interface.
  304. ;
  305. ;                 PXI::15::INSTR        PXI device number 15 on bus 0.
  306. ;
  307. ;                 VXI0::1::INSTR        A VXI device at logical address 1 in VXI
  308. ;                                       interface VXI0.
  309. ;
  310. ;                 GPIB-VXI::9::INSTR    A VXI device at logical address 9 in a
  311. ;                                       GPIB-VXI controlled system.
  312. ;
  313. ;===============================================================================
  314.  
  315. Func _viExecCommand($h_session, $s_command, $i_timeout_ms = -1)
  316.   If StringInStr($s_command,"?") == 0 Then
  317.     ; The Command is NOT a QUERY
  318.     Return _viPrintf($h_session, $s_command, $i_timeout_ms)
  319.   Else
  320.     ; The Command is a QUERY
  321.     Return _viQueryf($h_session, $s_command, $i_timeout_ms)
  322.   EndIf
  323. EndFunc
  324.  
  325.  
  326. ;===============================================================================
  327. ;
  328. ; Description:      Opens a VISA connection to an Instrument/Device
  329. ; Syntax:           _viOpen($s_visa_address, $s_visa_secondary_address = 0)
  330. ; Parameter(s):     $s_visa_address - A VISA resource descriptor STRING (see the 
  331. ;                   NOTES of _viExecCommand above for more info)
  332. ;                   As as shortcut you can also directly pass a GPIB address as 
  333. ;                   an integer
  334. ;                   $s_visa_secondary_address - Some GPIB instruments have
  335. ;                   secondary addresses. This parameter is ZERO by default, which
  336. ;                   means NO SECONDARY ADDRESS.
  337. ;                   Only use this optional parameter if the primary address is
  338. ;                   passed as an integer
  339. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  340. ;                   visa32.dll is in {WINDOWS}\system32)
  341. ;                   For GPIB communication a GPIB card (such as a National Instruments
  342. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  343. ; Return Value(s):  On Success - Returns a (POSITIVE) VISA Instrument Handle
  344. ;                   On Failure - Returns -1 and SETS @error to 1
  345. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  346. ; Note(s):          For simple usage there is no need to use this function, as
  347. ;                   _viExecCommand automatically opens/closes a VISA connection
  348. ;                   if you pass it a VISA resource descriptor (see the NOTES of
  349. ;                   _viExecCommand above for more info)
  350. ;
  351. ;                   However, if you want to repeteadly send commands/queries to
  352. ;                   a device, you should call this function followed by using the
  353. ;                   returned instrument handle instead of the VISA descriptor
  354. ;
  355. ;                   Do not forget to use _viClose when you are done, though
  356. ;
  357. ;===============================================================================
  358.  
  359. Func _viOpen($s_visa_address, $s_visa_secondary_address = 0)
  360.   Local $h_session = -1 ; The session handle by default is invalid (-1)
  361.   
  362.   If IsNumber($s_visa_address) Or StringInStr($s_visa_address,"::") == 0 Then
  363.     ; We passed a number => Create the VISA string:
  364.     $s_visa_address = "GPIB0::" & $s_visa_address & "::" & $s_visa_secondary_address
  365.   EndIf
  366.  
  367.   ;- Do not open an instrument connection twice
  368.   ; TODO
  369.  
  370.   ;- Make sure that there is a Resource Manager open (Note: this will NOT open it twice!)
  371.   _viOpenDefaultRM()
  372.  
  373.   ;- Open the INSTRUMENT CONNECTION
  374.   ; errStatus = viOpen (VISA_DEFAULT_RM, "GPIB0::20::0", VI_NULL, VI_NULL, &h_session);
  375.   ; signed int viOpen(unsigned long, char*, unsigned long, unsigned long, *unsigned long)
  376.   Local $a_results
  377.   $a_results = DllCall("visa32.dll", "long","viOpen", "long", $VISA_DEFAULT_RM, "str",$s_visa_address, "long",$VI_NULL, "long",$VI_NULL,"long_ptr",-1)
  378.   If @error <> 0 Then
  379.     ; Could not open VISA (visa32.dll)
  380.     ;MsgBox(16,"_viOpen - DllCall error","Could not open VISA (visa32.dll)")
  381.     Return -1
  382.   EndIf
  383.   Local $errStatus = $a_results[0]
  384.   If $errStatus <> 0 Then
  385.     ; Could not open VISA instrument/resource
  386.     SetError(1)
  387.     ;MsgBox(16,"VISA error","Could not open VISA instrument/resource: " & $s_visa_address)
  388.     Return -2
  389.   EndIf
  390.   ; Make sure that the DllCall returned enough values
  391.   If UBound($a_results) < 6 Then
  392.     SetError(1)
  393.     ;MsgBox(16,"VISA error","Call to viOpen did not return the right number of values")
  394.     Return -3
  395.   EndIf
  396.  
  397.   $h_session = $a_results[5]
  398.   If $h_session <= 0 Then
  399.     ; viOpen did not return a valid handle
  400.     SetError(1)
  401.     ;MsgBox(16,"VISA error","viOpen did not return a valid handle")
  402.     Return -4
  403.   EndIf
  404.   
  405.   ; We have a valid handle for the device  
  406.   Return $h_session
  407. EndFunc
  408.  
  409.  
  410. ;===============================================================================
  411. ;
  412. ; Description:      Closes a VISA connection to an Instrument/Device
  413. ; Syntax:           _viClose($h_session)
  414. ; Parameter(s):     $h_session - A VISA session handle (as returned by _viOpen)
  415. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  416. ;                   visa32.dll is in {WINDOWS}\system32)
  417. ;                   For GPIB communication a GPIB card (such as a National Instruments
  418. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  419. ; Return Value(s):  On Success - Returns 0
  420. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  421. ;                                or a NON ZERO value representing the VISA
  422. ;                                error code (see the VISA programmer's guide)
  423.  
  424. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  425. ; Note(s):          For simple usage there is no need to use this function, as
  426. ;                   _viExecCommand automatically opens/closes a VISA connection
  427. ;                   if you pass it a VISA resource descriptor (see the NOTES of
  428. ;                   _viExecCommand above for more info)
  429. ;
  430. ;                   However, if you want to repeteadly send commands/queries to
  431. ;                   a device, you should use _viOpen followed by using the
  432. ;                   returned instrument handle instead of the VISA descriptor
  433. ;                   and then calling this function
  434. ;
  435. ;===============================================================================
  436.  
  437. Func _viClose($h_session)
  438.   ;- Close INSTRUMENT Connection
  439.   ; viClose(h_session);
  440.   Local $a_results
  441.   $a_results = DllCall("visa32.dll", "int","viClose", "int",$h_session)
  442.   If @error <> 0 Then
  443.     ;MsgBox(16,"_viClose - DllCall error","Could not open VISA (visa32.dll)")
  444.     Return -1
  445.   EndIf
  446.   Local $errStatus = $a_results[0]
  447.   If $errStatus <> 0 Then
  448.     ; Could not close VISA instrument/resource
  449.     SetError(1)
  450.     ;MsgBox(16,"VISA error","Could not close VISA instrument/resource: " & $h_session)
  451.     Return $errStatus
  452.   EndIf
  453.   
  454.   Return 0
  455. EndFunc
  456.  
  457.  
  458. ;===============================================================================
  459. ;
  460. ; Description:      Find all the DEVICES found in the GPIB bus
  461. ; Syntax:           _viFindGpib(ByRef $a_descriptor_list, ByRef $a_idn_list, $f_show_search_results = 0)
  462. ; Parameter(s):     $a_descriptor_list (ByRef) - RETURNS an array of the VISA resource 
  463. ;                   descriptors (see the NOTES of _viExecCommand above for more 
  464. ;                   info) of the instruments that were found in the GPIB bus
  465. ;                   $a_idn_list (ByRef) - RETURNS an array of the IDNs (i.e names)
  466. ;                   of the instruments that were found in the GPIB bus
  467. ;                   $f_show_search_results - If 1 a message box showing the
  468. ;                   results of the search will be shown
  469. ;                   The default is 0, which means that the results are not shown
  470. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  471. ;                   visa32.dll is in {WINDOWS}\system32)
  472. ;                   For GPIB communication a GPIB card (such as a National Instruments
  473. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  474. ; Return Value(s):  On Success - The number of instruments found (0 or more)
  475. ;                   On Failure - Returns a NEGATIVE value and SETS @error to 1
  476. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  477. ; Example(s):
  478. ;  ; This example performs a search on the GPIB bus and shows the results in a MsgBox
  479. ;  Dim $a_descriptor_list[1], $a_idn_list[1]
  480. ;  _viFindGpib($a_descriptor_list, $a_idn_list, 1)
  481. ;
  482. ; Note(s):          For simple usage there is no need to use this function, as
  483. ;                   _viExecCommand automatically opens/closes a VISA connection
  484. ;                   if you pass it a VISA resource descriptor (see the NOTES of
  485. ;                   _viExecCommand above for more info)
  486. ;
  487. ;                   However, if you want to repeteadly send commands/queries to
  488. ;                   a device, you should call this function followed by using the
  489. ;                   returned instrument handle instead of the VISA descriptor
  490. ;
  491. ;                   Do not forget to use _viClose when you are done, though
  492. ;
  493. ;===============================================================================
  494.  
  495. Func _viFindGpib(ByRef $a_descriptor_list, ByRef $a_idn_list, $f_show_search_results = 0)
  496.   ;- Make sure that there is a Resource Manager open (Note: this will NOT open it twice!)
  497.   _viOpenDefaultRM()
  498.  
  499.   ; Create the GPIB instrument list and return the 1st instrument descriptor
  500.   ; viStatus viFindRsrc (viSession, char*, *ViFindList, *ViUInt32, char*);
  501.   ; errStatus = viFindRsrc (VISA_DEFAULT_RM, "GPIB?*INSTR", &h_current_instr, &num_matches, s_found_instr_descriptor);
  502.   Local $a_results = DllCall("visa32.dll", "long","viFindRsrc", _
  503.     "long", $VISA_DEFAULT_RM, "str","GPIB?*INSTR", "long_ptr",-1, _
  504.     "int_ptr",-1, "str","")
  505.   If @error <> 0 Then
  506.     ; Could not open VISA (visa32.dll)
  507.     ;MsgBox(16,"_viFindGpib - DllCall error","Could not open VISA (visa32.dll)")
  508.     Return -1
  509.   EndIf
  510.   Local $errStatus = $a_results[0]
  511.   If $errStatus <> 0 Then
  512.     ; Could not perform GPIB FIND operation
  513.     SetError(1)
  514.     ;MsgBox(16,"VISA error","Could not perform GPIB FIND operation")
  515.     Return -2
  516.   EndIf
  517.   ; Make sure that the DllCall returned enough values
  518.   If UBound($a_results) < 5 Then
  519.     SetError(1)
  520.     ;MsgBox(16,"VISA error","Call to viFindRsrc did not return the right number of values")
  521.     Return -3
  522.   EndIf
  523.  
  524.   ; Assign the outputs of the DllCall
  525.   Local $h_list_pointer = $a_results[3] ; The pointer to the list of found instruments
  526.   Local $i_num_instr = $a_results[4] ; The number of instruments that were found
  527.   Local $s_first_descriptor = $a_results[5] ; The descriptor of the first instrument found
  528.   If $i_num_instr < 1 Then ; No insturments were found
  529.     If $f_show_search_results == 1 Then
  530.       MsgBox(64,"GPIB search results","NO INSTRUMENTS FOUND in the GPIB bus")
  531.     EndIf
  532.  
  533.     Return $i_num_instr
  534.   EndIf
  535.  
  536.   ; At least 1 instrument was found
  537.   ReDim $a_descriptor_list[$i_num_instr], $a_idn_list[$i_num_instr]
  538.   $a_descriptor_list[0] = $s_first_descriptor
  539.   ; Get the IDN of the 1st instrument
  540.   $a_idn_list[0] = _viExecCommand($s_first_descriptor,"*IDN?")
  541.  
  542.   ; Get the IDN of all the remaining instruments
  543.   For $n=1 To $i_num_instr-1
  544.     ; If more than 1 instrument was found, get the handle of the next instrument
  545.     ; and get its IDN
  546.  
  547.     ;- Get the handle and descriptor of the next instrument in the GPIB bus
  548.     ; We do this by calling "viFindNext"
  549.     ; viFindNext (*ViFindList, char*);
  550.     ; viFindNext (h_current_instr,s_found_instr_descriptor);
  551.     $a_results = DllCall("visa32.dll", "long","viFindNext", "long",$h_list_pointer, "str","")
  552.     If @error <> 0 Then
  553.       ; Could not open VISA (visa32.dll)
  554.       ;MsgBox(16,"_viFindGpib - DllCall error","Could not open VISA (visa32.dll)")
  555.       Return -1
  556.     EndIf
  557.     Local $errStatus = $a_results[0]
  558.     If $errStatus <> 0 Then
  559.       ; Could not perform GPIB FIND NEXT operation
  560.       SetError(1)
  561.       ;MsgBox(16,"VISA error","Could not perform GPIB FIND NEXT operation")
  562.       Return -2
  563.     EndIf
  564.     ; Make sure that the DllCall returned enough values
  565.     If UBound($a_results) < 3 Then
  566.       SetError(1)
  567.       ;MsgBox(16,"VISA error","Call to viFindNext did not return the right number of values")
  568.       Return -3
  569.     EndIf
  570.     $a_descriptor_list[$n] = $a_results[2]
  571.     $a_idn_list[$n] = _viExecCommand($a_descriptor_list[$n],"*IDN?")
  572.   Next
  573.  
  574.   If $f_show_search_results == 1 Then
  575.     ; Create the GPIB instrument list and show it in a MsgBox
  576.     Local $s_search_results = ""
  577.     For $n=0 To $i_num_instr-1
  578.       $s_search_results = $s_search_results & $a_descriptor_list[$n] & " - " & $a_idn_list[$n] & @CR
  579.     Next
  580.     MsgBox(64,"GPIB search results",$s_search_results)
  581.   EndIf
  582.  
  583.   Return $i_num_instr
  584.  
  585. EndFunc
  586.  
  587.  
  588. ;===============================================================================
  589. ;- Internal VISA functions, used by _viExecCommand, _viOpen and/or _viClose ----
  590. ; The functions in this section are not meant to be called outside this library
  591. ; under normal use
  592.  
  593. ;===============================================================================
  594. ;
  595. ; Description:      Open the VISA Resource Manager
  596. ; Syntax:           _viOpenDefaultRM()
  597. ; Parameter(s):     None
  598. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  599. ;                   visa32.dll is in {WINDOWS}\system32)
  600. ;                   For GPIB communication a GPIB card (such as a National Instruments
  601. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  602. ; Return Value(s):  On Success - The Default Resource Manager Handle (also stored
  603. ;                   in the $VISA_DEFAULT_RM global)
  604. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  605. ;                                Returns -2 if there was an error opening the 
  606. ;                                Default Resource Manager
  607. ;                                Returns -3 if the returned Resource Manager is
  608. ;                                invalid
  609. ;                   This function always sets @error to 1 in case of error
  610. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  611. ; Note(s):          You should not need to directly call this function under
  612. ;                   normal use as _viOpen calls it when necessary
  613. ;
  614. ;===============================================================================
  615. Func _viOpenDefaultRM()
  616.   Local $h_visa_rm = $VISA_DEFAULT_RM
  617.   If $VISA_DEFAULT_RM < 0 Then
  618.     ; Only open the Resource Manager once (i.e. when $VISA_DEFAULT_RM is still -1)
  619.     $h_visa_rm = $VISA_DEFAULT_RM ; Initialize the output result with the default value (-1)
  620.  
  621.     ; errStatus = viOpenDefaultRM (&VISA_DEFAULT_RM);
  622.     ; signed int viOpenDefaultRM(*unsigned long)
  623.     Local $a_results
  624.     $a_results = DllCall("visa32.dll", "int","viOpenDefaultRM", "int_ptr",$VISA_DEFAULT_RM)
  625.     If @error <> 0 Then
  626.       ; Could not open VISA (visa32.dll)
  627.       ;MsgBox(16,"_viOpenDefaultRM - DllCall error","Could not open VISA (visa32.dll)")
  628.       Return -1
  629.     EndIf
  630.     Local $errStatus = $a_results[0]
  631.     If $errStatus <> 0 Then
  632.       ; Could not create VISA Resource Manager
  633.       SetError(1)
  634.       ;MsgBox(16,"VISA error","Could not create VISA Resource Manager")
  635.       Return -2
  636.     EndIf
  637.     ; Everything went fine => Set the Resource Manager global
  638.     $VISA_DEFAULT_RM = $a_results[1]
  639.     If $VISA_DEFAULT_RM <= 0 Then
  640.       ; There was an error, reset the $VISA_DEFAULT_RM
  641.       $VISA_DEFAULT_RM = -1 ; Default value
  642.       SetError(1)
  643.       Return -3
  644.     EndIf
  645.     $h_visa_rm = $VISA_DEFAULT_RM
  646.   EndIf
  647.   
  648.   Return $h_visa_rm
  649. EndFunc
  650.  
  651.  
  652. ;===============================================================================
  653. ;
  654. ; Description:      Send a COMMAND (NOT a QUERY) to an Instrument/Device
  655. ; Syntax:           _viPrintf($h_session, $s_command, $i_timeout_ms = -1)
  656. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session handle (INTEGER)
  657. ;                                Look at the _viExecCommand function for more
  658. ;                                details
  659. ;                   $s_command - Command/Query to execute.
  660. ;                                A query MUST contain a QUESTION MARK (?)
  661. ;                                When the command is a QUERY the function will
  662. ;                                automatically wait for the instrument's answer
  663. ;                                (or until the operation times out)
  664. ;                   $i_timeout_ms - The operation timeout in MILISECONDS
  665. ;                                This is mostly important for QUERIES only
  666. ;                                This is an OPTIONAL PARAMETER.
  667. ;                                If it is not specified the last set timeout will
  668. ;                                be used. If it was never set before the default
  669. ;                                timeout (which depends on the VISA implementation)
  670. ;                                will be used. Timeouts can also be set separatelly
  671. ;                                with the _viSetTimeout function (see below).
  672. ;                                Depending on the bus type (GPIB, TCP, etc) the
  673. ;                                timeout might not be set to the exact value that
  674. ;                                you request. Instead the closest valid timeout
  675. ;                                bigger than the one that you requested will be used.
  676. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  677. ;                   visa32.dll is in {WINDOWS}\system32)
  678. ;                   For GPIB communication a GPIB card (such as a National Instruments
  679. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  680. ; Return Value(s):  On Success - Returns ZERO
  681. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  682. ;                                or a NON ZERO value representing the VISA
  683. ;                                error code (see the VISA programmer's guide)
  684. ;                   This function always sets @error to 1 in case of error
  685. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  686. ; Note(s):
  687. ;                   Normally you do not need to use this function, 
  688. ;                   as _viExecCommand automatically choses between _viPrintf and
  689. ;                   _viQueryf depending on the command type.
  690. ;
  691. ;                   If you need to use it anyway, it is recommended that you do 
  692. ;                   not use this command for sending QUERIES, only for GPIB 
  693. ;                   commands that DO NOT RETURN AN ANSWER
  694. ;
  695. ;                   Also, this is not really a "PRINTF-like" function, as it 
  696. ;                   does not allow you to pass multiple parameters. This is only
  697. ;                   called _viPrintf because it uses the VISA function viPrintf
  698. ;
  699. ;                   See _viExecCommand for more details
  700. ;
  701. ;===============================================================================
  702.  
  703. Func _viPrintf($h_session, $s_command, $i_timeout_ms = -1)
  704.   Local $f_close_session_before_return = 0 ; By default do not close the session at the end
  705.   If IsString($h_session) Then
  706.     ; When we pass a string, i.e. a VISA ID (like GPIB::20::0, for instance) instead
  707.     ; of a VISA session handler, we will automatically OPEN and CLOSE the instrument
  708.     ; session for the user.
  709.     ; This is of course slower if you need to do more than one GPIB call but much
  710.     ; more convenient for short tests
  711.     $f_close_session_before_return = 1
  712.     $h_session = _viOpen($h_session)
  713.   EndIf
  714.  
  715.   ;- Set the VISA timeout if necessary
  716.   If $i_timeout_ms >= 0 Then
  717.     _viSetTimeout($h_session, $i_timeout_ms)
  718.   EndIf
  719.  
  720.   ;- Send Command to instrument
  721.   ; errStatus = viPrintf (h_session, "%s", "*RST");
  722.   ; signed int viPrintf (unsigned long, char*, char*);
  723.   Local $a_results
  724.   $a_results = DllCall("visa32.dll", "int","viPrintf", "int",$h_session, "str","%s", "str",$s_command)
  725.   If @error <> 0 Then
  726.     ; Could not open VISA (visa32.dll)
  727.     ;MsgBox(16,"_viPrintf - DllCall error","Could not open VISA (visa32.dll)")
  728.     Return -1
  729.   EndIf
  730.   Local $errStatus = $a_results[0]
  731.   If $errStatus <> 0 Then
  732.     ; Could not send command to VISA instrument/resource
  733.     SetError(1)
  734.     ;MsgBox(16,"VISA error","Could not send command to VISA instrument/resource: " & $h_session)
  735.     Return $errStatus
  736.   EndIf
  737.  
  738.   If $f_close_session_before_return == 1 Then
  739.     _viClose($h_session)
  740.   EndIf
  741. EndFunc
  742.  
  743.  
  744. ;===============================================================================
  745. ;
  746. ; Description:      Send a QUERY (a Command that returns an answer) to an Instrument/Device
  747. ; Syntax:           _viQueryf($h_session, $s_query, $i_timeout_ms = -1)
  748. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session handle (INTEGER)
  749. ;                                Look at the _viExecCommand function for more
  750. ;                                details
  751. ;                   $s_command - The query to execute (e.g. "*IDN?").
  752. ;                                A query MUST contain a QUESTION MARK (?)
  753. ;                                The function willautomatically wait for the 
  754. ;                                instrument's answer (or until the operation 
  755. ;                                times out)
  756. ;                   $i_timeout_ms - The operation timeout in MILISECONDS
  757. ;                                This is mostly important for QUERIES only
  758. ;                                This is an OPTIONAL PARAMETER.
  759. ;                                If it is not specified the last set timeout will
  760. ;                                be used. If it was never set before the default
  761. ;                                timeout (which depends on the VISA implementation)
  762. ;                                will be used. Timeouts can also be set separatelly
  763. ;                                with the _viSetTimeout function (see below)
  764. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  765. ;                   visa32.dll is in {WINDOWS}\system32)
  766. ;                   For GPIB communication a GPIB card (such as a National Instruments
  767. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  768. ; Return Value(s):  On Success - Returns a STRING containing the answer of the 
  769. ;                                instrument to the QUERY
  770. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  771. ;                                Returns -3 if the VISA DLL returned an unexpected
  772. ;                                number of results
  773. ;                                or returns a NON ZERO value representing the VISA
  774. ;                                error code (see the VISA programmer's guide)
  775. ;                   This function always sets @error to 1 in case of error
  776. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  777. ; Note(s):
  778. ;                   Normally you do not need to use this function, 
  779. ;                   as _viExecCommand automatically choses between _viPrintf and
  780. ;                   _viQueryf depending on the command type.
  781. ;
  782. ;                   If you need to use it anyway, make sure that you use it for 
  783. ;                   a command that RETURNS an ANSWER or you will be stuck until 
  784. ;                   the Timeout expires, which could never happen if the Timeout
  785. ;                   is infinite ("INF")!
  786. ;
  787. ;                   Also, this is not really a "SCANF-like" function, as it 
  788. ;                   does not allow you to specify the format of the output
  789. ;
  790. ;                   There are two known limitations of this function:
  791. ;                   - The GPIB queries only return the 1st line of the device 
  792. ;                     answer. This is normally not a problem as most devices
  793. ;                     always return a single line answer.
  794. ;                   - The GPIB queries do not support binary transfer.
  795. ;
  796. ;                   See _viExecCommand for more details
  797. ;
  798. ;===============================================================================
  799. Func _viQueryf($h_session, $s_query, $i_timeout_ms = -1)
  800.   Local $f_close_session_before_return = 0 ; By default do not close the session at the end
  801.   If IsString($h_session) Then
  802.     ; When we pass a string, i.e. a VISA ID (like GPIB::20::0, for instance) instead
  803.     ; of a VISA session handler, we will automatically OPEN and CLOSE the instrument
  804.     ; session for the user.
  805.     ; This is of course slower if you need to do more than one GPIB call but much
  806.     ; more convenient for short tests
  807.     $f_close_session_before_return = 1
  808.     $h_session = _viOpen($h_session)
  809.   EndIf
  810.  
  811.   ;- Set the VISA timeout if necessary
  812.   If $i_timeout_ms >= 0 Then
  813.     _viSetTimeout($h_session, $i_timeout_ms)
  814.   EndIf
  815.  
  816.   ;- Send QUERY to instrument and get ANSWER
  817.   ; errStatus = viQueryf (h_session, "*IDN?\n", "%s", s_answer);
  818.   ; signed int viQueryf (unsigned long, char*, char*, char*);
  819.   ;errStatus = viQueryf (h_instr, s_command, "%s", string);
  820.   Local $a_results, $s_answer = ""
  821.   $a_results = DllCall("visa32.dll", "int","viQueryf", "int",$h_session, "str",$s_query, "str","%t", "str", $s_answer)
  822.   If @error <> 0 Then
  823.     ; Could not open VISA (visa32.dll)
  824.     ;MsgBox(16,"_viQueryf - DllCall error","Could not open VISA (visa32.dll)")
  825.     Return -1
  826.   EndIf
  827.   Local $errStatus = $a_results[0]
  828.   If $errStatus <> 0 Then
  829.     ; Could not query VISA instrument/resource
  830.     SetError(1)
  831.     ;MsgBox(16,"VISA error","Could not query VISA instrument/resource: " & $h_session)
  832.     Return $errStatus
  833.   EndIf
  834.   ; Make sure that the DllCall returned enough values
  835.   If UBound($a_results) < 5 Then
  836.     ; Call to viQuery did not return the right number of values
  837.     SetError(1)
  838.     ;MsgBox(16,"VISA error","Call to viQuery did not return the right number of values")
  839.     Return -3
  840.   EndIf
  841.   $s_answer = $a_results[4]
  842.  
  843.   If $f_close_session_before_return == 1 Then
  844.     _viClose($h_session)
  845.   EndIf
  846.  
  847.   Return $s_answer
  848. EndFunc
  849.  
  850.  
  851. ;- Misc VISA interface functions -----------------------------------------------
  852.  
  853. ;===============================================================================
  854. ;
  855. ; Description:      Sets the VISA timeout in MILISECONDS (uses _viSetAttribute)
  856. ; Syntax:           _viSetTimeout($h_session, $i_timeout_ms)
  857. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session
  858. ;                   handle (INTEGER). Look the explanation in _viExecCommand
  859. ;                   (you can find it above)
  860. ;                   $i_timeout_ms - The timeout IN MILISECONDS for VISA operations
  861. ;                   (mainly for GPIB queries)
  862. ;                   If you set it to 0 the tiemouts are DISABLED
  863. ;                   If you set it to "INF" the VISA operations will NEVER timeout.
  864. ;                   Be careful with this as it could easly hung your program if
  865. ;                   your instrument does not respond to one of your queries
  866. ;                   Depending on the bus type (GPIB, TCP, etc) the timeout might 
  867. ;                   not be set to the exact value that you request. Instead the 
  868. ;                   closest valid timeout bigger than the one that you requested 
  869. ;                   will be used.
  870. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  871. ;                   visa32.dll is in {WINDOWS}\system32)
  872. ;                   For GPIB communication a GPIB card (such as a National Instruments
  873. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  874. ; Return Value(s):  On Success - Returns 0
  875. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  876. ;                                or a NON ZERO value representing the VISA
  877. ;                                error code (see the VISA programmer's guide)
  878. ;                   This function always sets @error to 1 in case of error
  879. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  880. ; Note(s):          You can avoid directly calling this function most of the time,
  881. ;                   as _viExecCommand accepts a timeout (in ms) as its 3rd argument.
  882. ;                   If you do not pass this 3rd argument then the previous timeout
  883. ;                   will be used (or the default timeout, which depends on the
  884. ;                   VISA driver, if it was never set before)
  885. ;
  886. ;===============================================================================
  887. Func _viSetTimeout($h_session, $i_timeout_ms)
  888.   If StringUpper(String($i_timeout_ms)) == "INF" Then
  889.     $i_timeout_ms = $VI_TMO_INFINITE
  890.   EndIf
  891.   Return _viSetAttribute($h_session, $VI_ATTR_TMO_VALUE, $i_timeout_ms)
  892. EndFunc
  893.  
  894.  
  895. ;===============================================================================
  896. ;
  897. ; Description:      VISA attribute set (GENERIC)
  898. ;                   Called by _viSetTimeout, this function can ALSO be used to 
  899. ;                   set many other VISA specific attributes, like the Serial
  900. ;                   Interface Attributes.
  901. ;                   Read the VISA documentation for more information
  902. ; Syntax:           _viSetAttribute($h_session, $i_attribute, $i_value)
  903. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session
  904. ;                   handle (INTEGER). Look the explanation in _viExecCommand
  905. ;                   (you can find it above)
  906. ;                   $i_attribute - The index of the attribute that must be changed
  907. ;                   Attributes are defined in the VISA library. This AutoIt
  908. ;                   implementation only defines a CONSTANT for the TIMEOUT
  909. ;                   attribute ($VI_ATTR_TMO_VALUE) but you can pass any other
  910. ;                   index if you want to.
  911. ;                   $i_value - The value of the attribute. It must be an integer
  912. ;                   and the possible values depend on the attribute type
  913. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  914. ;                   visa32.dll is in {WINDOWS}\system32)
  915. ;                   For GPIB communication a GPIB card (such as a National Instruments
  916. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  917. ; Return Value(s):  On Success - Returns 0
  918. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  919. ;                                or a NON ZERO value representing the VISA
  920. ;                                error code (see the VISA programmer's guide)
  921. ;                   This function always sets @error to 1 in case of error
  922. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  923. ; Note(s):          
  924. ;                   This is a list of the currently pre-defined attributes and 
  925. ;                   values. Remember that you can use any other valid 
  926. ;                   attribute/value by passing the corresponding integer index 
  927. ;                   (as defined in the VISA programmer's guide) to this function.
  928. ;                   
  929. ;                   * Attribute: $VI_ATTR_TMO_VALUE -> Set Timeout
  930. ;                   * Values:
  931. ;                             A timeout in MILLISECONDS or
  932. ;                             $VI_TMO_IMMEDIATE (or 0) for "Return immediatly"
  933. ;                             VI_TMO_INFINITE (or "INF") for "No timeout"
  934. ;                           
  935. ;                   * Attribute: $VI_ATTR_ASRL_BAUD
  936. ;                   * Values:
  937. ;                             Any valid baudrate (9600, 115200, etc)
  938. ;                   
  939. ;                   * Attribute: $VI_ATTR_ASRL_DATA_BITS
  940. ;                   * Values: 
  941. ;                             From 5 to 8
  942. ;                   
  943. ;                   * Attribute: $VI_ATTR_ASRL_PARITY
  944. ;                   * Values:
  945. ;                             $VI_ASRL_PAR_NONE
  946. ;                             $VI_ASRL_PAR_ODD
  947. ;                             $VI_ASRL_PAR_EVEN
  948. ;                             $VI_ASRL_PAR_MARK
  949. ;                             $VI_ASRL_PAR_SPACE
  950. ;                   
  951. ;                   * Attribute: $VI_ATTR_ASRL_STOP_BITS
  952. ;                   * Values:
  953. ;                             $VI_ASRL_STOP_ONE 
  954. ;                             $VI_ASRL_STOP_ONE5
  955. ;                             $VI_ASRL_STOP_TWO 
  956. ;                             
  957. ;                   * Attribute: $VI_ATTR_ASRL_FLOW_CNTRL
  958. ;                   * Values:
  959. ;                             $VI_ASRL_FLOW_NONE
  960. ;                             $VI_ASRL_FLOW_XON_XOFF
  961. ;                             $VI_ASRL_FLOW_RTS_CTS
  962. ;                             $VI_ASRL_FLOW_DTR_DSR
  963.  
  964.  
  965. ;
  966. ;===============================================================================
  967. Func _viSetAttribute($h_session, $i_attribute, $i_value)
  968.   Local $f_close_session_before_return = 0 ; By default do not close the session at the end
  969.   If IsString($h_session) Then
  970.     ; When we pass a string, i.e. a VISA ID (like GPIB::20::0, for instance) instead
  971.     ; of a VISA session handler, we will automatically OPEN and CLOSE the instrument
  972.     ; session for the user.
  973.     ; This is of course slower if you need to do more than one GPIB call but much
  974.     ; more convenient for short tests
  975.     $f_close_session_before_return = 1
  976.     $h_session = _viOpen($h_session)
  977.   EndIf
  978.   
  979.   ; errStatus = _viSetAttribute ($h_session, $VI_ATTR_TMO_VALUE, $timeout_value);
  980.   ; signed int viGpibControlREN (unsigned long, int, int);
  981.   Local $a_results
  982.   $a_results = DllCall("visa32.dll", "int","viSetAttribute", "int",$h_session, "int", $i_attribute, "int",$i_value)
  983.   If @error <> 0 Then
  984.     ; Could not open VISA (visa32.dll)
  985.     ;MsgBox(16,"_viSetAttribute - DllCall error","Could not open VISA (visa32.dll)")
  986.     Return -1
  987.   EndIf
  988.   Local $errStatus = $a_results[0]
  989.   If $errStatus <> 0 Then
  990.     ; Could not set attribute of VISA instrument/resource
  991.     SetError(1)
  992.     ;MsgBox(16,"VISA error","Could not set attribute of VISA instrument/resource: " & $h_session)
  993.     Return $errStatus
  994.   EndIf
  995.   
  996.   If $f_close_session_before_return == 1 Then
  997.     _viClose($h_session)
  998.   EndIf
  999.   
  1000.   Return 0
  1001. EndFunc
  1002.  
  1003.  
  1004. ;===============================================================================
  1005. ;
  1006. ; Description:      Go To Local mode (uses _viGpibControlREN)
  1007. ;                   Instruments that accept this command will exit the "Remote
  1008. ;                   Control mode" and go to "Local mode"
  1009. ;                   If the instrument is already in "Local mode" this is simply
  1010. ;                   ignored.
  1011. ;                   Normally, if an instrument does not support this command it
  1012. ;                   will simply stay in the "Remote Control mode"
  1013. ; Syntax:           _viGTL($h_session)
  1014. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session
  1015. ;                   handle (INTEGER). Look the explanation in _viExecCommand
  1016. ;                   (you can find it above)
  1017. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  1018. ;                   visa32.dll is in {WINDOWS}\system32)
  1019. ;                   For GPIB communication a GPIB card (such as a National Instruments
  1020. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  1021. ;                   This function always sets @error to 1 in case of error
  1022. ; Return Value(s):  On Success - Returns 0
  1023. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  1024. ;                                or a NON ZERO value representing the VISA
  1025. ;                                error code (see the VISA programmer's guide)
  1026. ;                   This function always sets @error to 1 in case of error
  1027. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  1028. ; Note(s):          None
  1029. ;
  1030. ;===============================================================================
  1031. Func _viGTL($h_session)
  1032.   Return _viGpibControlREN($h_session, $VI_GPIB_REN_ADDRESS_GTL)
  1033. EndFunc
  1034.  
  1035.  
  1036. ;===============================================================================
  1037. ;
  1038. ; Description:      GPIB BUS "reset" (uses _viGpibControlREN)
  1039. ;                   Use this function when the GPIB BUS gets stuck for some reason.
  1040. ;                   You might be lucky and resolve the problem by calling this
  1041. ;                   function
  1042. ; Syntax:           _viGpibBusReset()
  1043. ; Parameter(s):     None
  1044. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  1045. ;                   visa32.dll is in {WINDOWS}\system32)
  1046. ;                   For GPIB communication a GPIB card (such as a National Instruments
  1047. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  1048. ; Return Value(s):  On Success - Returns 0
  1049. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  1050. ;                                or a NON ZERO value representing the VISA
  1051. ;                                error code (see the VISA programmer's guide)
  1052. ;                   This function always sets @error to 1 in case of error
  1053. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  1054. ; Note(s):          None
  1055. ;
  1056. ;===============================================================================
  1057. Func _viGpibBusReset()
  1058.   Return _viGpibControlREN("GPIB0::INTFC", $VI_GPIB_REN_DEASSERT)
  1059. EndFunc
  1060.  
  1061.  
  1062. ;===============================================================================
  1063. ;
  1064. ; Description:      Control the VISA REN bus line
  1065. ; Syntax:           _viGpibControlREN ($h_session, $i_mode)
  1066. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session
  1067. ;                   handle (INTEGER). Look the explanation in _viExecCommand
  1068. ;                   (you can find it above)
  1069. ;                   $i_mode - The mode into which the REN line of the GPIB bus
  1070. ;                   will be set.
  1071. ;                   Modes are defined in the VISA library. Look at the top of
  1072. ;                   this file for valid modes
  1073. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  1074. ;                   visa32.dll is in {WINDOWS}\system32)
  1075. ;                   For GPIB communication a GPIB card (such as a National Instruments
  1076. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  1077. ; Return Value(s):  On Success - Returns 0
  1078. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  1079. ;                                or a NON ZERO value representing the VISA
  1080. ;                                error code (see the VISA programmer's guide)
  1081. ;                   This function always sets @error to 1 in case of error
  1082. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  1083. ; Note(s):          This function is used by _viGTL and _viGpibBusReset
  1084. ;
  1085. ;===============================================================================
  1086. Func _viGpibControlREN ($h_session, $i_mode)
  1087.   Local $f_close_session_before_return = 0 ; By default do not close the session at the end
  1088.   If IsString($h_session) Then
  1089.     ; When we pass a string, i.e. a VISA ID (like GPIB::20::0, for instance) instead
  1090.     ; of a VISA session handler, we will automatically OPEN and CLOSE the instrument
  1091.     ; session for the user.
  1092.     ; This is of course slower if you need to do more than one GPIB call but much
  1093.     ; more convenient for short tests
  1094.     $f_close_session_before_return = 1
  1095.     $h_session = _viOpen($h_session)
  1096.   EndIf
  1097.  
  1098.   ; errStatus = viGpibControlREN ($h_session, VI_GPIB_REN_ASSERT);
  1099.   ; signed int viGpibControlREN (unsigned long, int);
  1100.   Local $a_results
  1101.   $a_results = DllCall("visa32.dll", "int","viGpibControlREN", "int",$h_session, "int", $i_mode)
  1102.   If @error <> 0 Then
  1103.     ; Could not open VISA (visa32.dll)
  1104.     ;MsgBox(16,"_viGpibControlREN - DllCall error","Could not open VISA (visa32.dll)")
  1105.     Return -1
  1106.   EndIf
  1107.   Local $errStatus = $a_results[0]
  1108.   If $errStatus <> 0 Then
  1109.     ; Could not send to Local VISA instrument/resource
  1110.     SetError(1)
  1111.     ;MsgBox(16,"VISA error","Could not send to Local VISA instrument/resource: " & $h_session)
  1112.     Return $errStatus
  1113.   EndIf
  1114.  
  1115.   If $f_close_session_before_return == 1 Then
  1116.     _viClose($h_session)
  1117.   EndIf
  1118.  
  1119.   Return 0
  1120. EndFunc
  1121.  
  1122.  
  1123. ;===============================================================================
  1124. ;
  1125. ; Description:      Interactive VISA control.
  1126. ;                   This function lets you easily test your SCPI commands 
  1127. ;                   interactively.
  1128. ;                   It also lets you save these commands into a file
  1129. ;                   Simply answer the questions (Device Descriptor, SCPI command
  1130. ;                   and timeout).
  1131. ;                   * If you click Cancel on the 1st question the interactive
  1132. ;                     control ends.
  1133. ;                   * If you click Cancel to the other queries, you will go back
  1134. ;                     to the Device Descriptor question.
  1135. ; Syntax:           _viInteractiveControl($s_command_save_filename = "")
  1136. ; Parameter(s):     $s_command_save_filename - This is an OPTIONAL PARAMETER
  1137. ;                     The name of the file in which the SCPI commands issued 
  1138. ;                     during the interactive session will be saved.
  1139. ;                     If no filename is passed the funcion asks the user if and 
  1140. ;                     where does the user want to save the issued commands.
  1141. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  1142. ;                   visa32.dll is in {WINDOWS}\system32)
  1143. ;                   For GPIB communication a GPIB card (such as a National Instruments
  1144. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  1145. ; Return Value(s):  The list of AutoIt3 VISA commands that were executed by the tool.
  1146. ;                   This is the same list that is saved into the file if the a
  1147. ;                   filename is passed to the function.
  1148. ; Author(s):        Angel Ezquerra <ezquerra@gmail.com>
  1149. ; Note(s):          Type "FIND" in the Device Descriptor query to perform a GPIB
  1150. ;                   search
  1151. ;
  1152. ;===============================================================================
  1153. Func _viInteractiveControl($s_command_save_filename = "")
  1154.   ;- Define variables, set their default values
  1155.   Local $s_vi_id = "FIND" ; "GPIB::1::0" ; Default values
  1156.   Local $s_command = "*IDN?"
  1157.   Local $i_timeout_ms = 10000 ; ms
  1158.   Local $s_answer = ""
  1159.   Local $a_descriptor_list[1], $a_idn_list[1] ; The results of the GPIB search
  1160.   ; The variables used to save the commands to a file
  1161.   Local $s_empty_command_list = "#include <Visa.au3>" & @CR & @CR & "Local $s_answer" & @CR & @CR
  1162.   Local $s_new_command = ""
  1163.   Local $s_command_list = $s_empty_command_list
  1164.   
  1165.   ;- Loop until the user Cancles the Instrument Device Descriptor request
  1166.   While 1
  1167.     ;- Request the Instrument Descriptor (reuse the previous descriptor)
  1168.     Local $s_vi_id = InputBox("Instrument Device Descriptor", _
  1169.       "- Type the Instrument Device Descriptor (e.g. 'GPIB::1::0' or 'GPIB::1::INSTR')" & _
  1170.       @CR & @CR & _
  1171.       "- Type FIND to perform a GPIB search" & _
  1172.       @CR & @CR & _
  1173.       "- Click CANCEL to STOP the VISA interactive tool", $s_vi_id, "", 500, 250)
  1174.     If @error == 1 Then
  1175.       ; The Cancel button was pushed -> Exit the loop
  1176.       ExitLoop
  1177.     EndIf
  1178.     If StringUpper($s_vi_id) == "FIND" Then
  1179.       ; Perform a GPIB search
  1180.       $s_command_list = $s_command_list & _
  1181.         "Local $a_descriptor_list[1], $a_idn_list[1]" & @CR & @CR & _
  1182.         "_viFindGpib($a_descriptor_list, $a_idn_list, 1)" & @CR & @CR
  1183.       _viFindGpib($a_descriptor_list, $a_idn_list, 1)
  1184.       If UBound($a_descriptor_list) >= 1 Then
  1185.         ; If an instrument was found, use the 1st found instrument as the default
  1186.         ; for the next query
  1187.         $s_vi_id = $a_descriptor_list[0]
  1188.       EndIf
  1189.       ContinueLoop
  1190.     EndIf
  1191.     
  1192.     ;- Request the command that must be executed (reuse the previous command)
  1193.     $s_answer = InputBox("SCPI command","Type the SCPI command", $s_command)
  1194.     If @error == 1 Then
  1195.       ; The Cancel button was pushed -> Restart the process
  1196.       ContinueLoop
  1197.     EndIf
  1198.     $s_command = $s_answer ; We got a valid command
  1199.     
  1200.     ;- Request the timeout (reuse the previous timout)
  1201.     $s_answer = InputBox("Command Timeout (ms)", _
  1202.       "Type the command timeout (in milliseconds)", $i_timeout_ms)
  1203.     If @error == 1 Then
  1204.       ; The Cancel button was pushed -> Restart the process
  1205.        ContinueLoop
  1206.     EndIf
  1207.     $i_timeout_ms = 0 + $s_answer ; We got a valid timeout
  1208.     
  1209.     ;- Add the command to the command list
  1210.     $s_new_command = '$s_answer = _viExecCommand("' & $s_vi_id & '", "' & _
  1211.       $s_command & '", ' & $i_timeout_ms & ')'
  1212.     $s_command_list = $s_command_list & $s_new_command & @CR
  1213.     
  1214.     ;- Execute the requested command
  1215.     $s_answer = _viExecCommand($s_vi_id, $s_command, $i_timeout_ms)
  1216.  
  1217.     If IsString($s_answer) Then
  1218.       ;- The command was a query and the instrument answered it
  1219.       ; Show the query results
  1220.       MsgBox(64,"Query results", "[" & $s_vi_id & "] " & $s_command & " -> " & $s_answer)
  1221.     ElseIf $s_answer == 0 Then
  1222.       ;- The command was not a query but it was exuced successfully
  1223.       MsgBox(64, "Command result", "The command:" & @CR & @CR & _
  1224.         "         '" & $s_command & "'" & @CR & @CR & _
  1225.         "was SUCCESSFULLY executed on the device: " & @CR & @CR & _
  1226.         "         '" & $s_vi_id & "'")
  1227.     ElseIf $s_answer < 0 Then
  1228.       ;- There was an error -> Show an error message
  1229.       $s_answer = MsgBox(16 + 4,"VISA Error", _
  1230.         "There was a VISA error when executing the command:" & @CR & @CR & _
  1231.         "'" & $s_command & "'" & @CR & @CR & "on the Device '" & $s_vi_id & "'" & _
  1232.         @CR & @CR & _
  1233.         "Do you want to RESET the GPIB bus before continuing?")
  1234.       If $s_answer == 6 Then ; Yes
  1235.         _viGpibBusReset()
  1236.         MsgBox(0,"VISA","The GPIB bus was RESET!")
  1237.       EndIf
  1238.     EndIf
  1239.   WEnd
  1240.   
  1241.   If $s_command_list <> $s_empty_command_list Then
  1242.     ; If at least one command was issued we might want to save the file
  1243.     
  1244.     If $s_command_save_filename == "" Then
  1245.       ; The user did not pass an explicit file name in which to save the commands
  1246.       ; Ask him if he wants to save the m now
  1247.       $s_answer = MsgBox(64 + 4, "Save commands to AutoIt3 script?", _
  1248.         "Do you want to save the commands that you issued into an AutoIt3 script?")
  1249.       If $s_answer == 6 Then ; Yes
  1250.         $s_command_save_filename = FileSaveDialog("Save as...", @ScriptDir, _
  1251.           "AutoIt3 scripts (*.au3)", 16, "visa_log.au3")
  1252.         If @error <> 0 Then
  1253.           $s_command_save_filename = ""
  1254.         EndIf
  1255.       EndIf
  1256.     EndIf
  1257.     
  1258.     If $s_command_save_filename <> "" Then
  1259.       ;- Save the SCPI commands into a file
  1260.       If FileExists($s_command_save_filename) Then
  1261.         ; Delete the save file if it already exists
  1262.         FileDelete($s_command_save_filename)
  1263.       EndIf
  1264.       FileWrite($s_command_save_filename, $s_command_list)
  1265.     EndIf
  1266.   EndIf
  1267.   
  1268.   Return $s_command_list ; Return the list of executed commands
  1269. EndFunc
  1270.