home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 April / PCWorld_2005-04_cd.bin / software / vyzkuste / autoit / autoit-v3-setup.exe / Include / Visa.au3 < prev   
Text File  |  2005-02-06  |  57KB  |  1,113 lines

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