ActiveX applications building overview

In the DM2000 framework, ActiveX - based applications typically are special HTML documents running in the Minibrowser window. These applications are compact and may be created by end users since they do not require complex development environments like Delphi or Visual Studio. The only essential issue is instrument interface drivers: if your device has no standard interface or ready-for-use driver, this means that you have to create driver yourself. Fortunately, the most of measurement instruments equipped with standard RS-232C interface, and appropriate ActiveX control (cportlib.ocx) may be downloaded from this website.

Notice: at present, cportlib.ocx control is beta version! Although it works well in my applications, it was not properly tested on different platforms and may have bugs. I plan that next official release of DM2000 will include full-featured set of ActiveX components for RS232 interface and other applications (check news page for more information about latest updates). Besides, you may use third-party RS232 ActiveX controls with DM2000.

To illustrate the process of the creation of sample ActiveX - based applications, this page discusses detailed step-by-step instructions how to write simple applet for real-time data acquisition (Keithley 2182 nanovoltmeter used as an example of typical measurement instrument with RS-232C port). Make a study of these code snippets to familiarize with ActiveX scripting, use them as a template for your own applications and you will see that with DM2000 data acquisition is as easy as 1-2-3!

Step 1 - initial preparations

To begin with, you should properly install DM2000 application and CPortLib.ocx control as described in the "readme" files and other online instructions (don't forget to register ActiveX control). Since DM2000 shares security zone settings with Microsoft Internet Explorer, please ensure that execution of ActiveX controls is enabled. Use following HTML page template for your applications:

<html>
<head>
<title>Keithley 2182 test</title>
<script language="VBScript">

</script>
</head>

<body onunload="Port.Active=false">

<h3>Keithley 2182 test</h3>

<form name="Frm">

</form>

<object classid="clsid:A9F50D64-52CD-4002-AA48-CF459297034D" id="Port"
  width="200" height="100" style="visibility: hidden">
  <param name="Visible" value="false">
</object>

</body>
</html>

Text between <title> and </title> tags as well as "visible" page title (<h3>...</h3>) is optional. You will use <script>...</script> section to place script code (you may also use JavaScript instead of VBScript). "Object" tags are required to insert ActiveX control identified as "Port" which is responsible for communication with RS232 hardware, while "form" tags will comprise interactive user interface (see next step).

Step 2 - planning user interface

In order to control data acquisition process, you may require following set of elements:

Every button has a name and associated event handler (which is actually script procedure). Following HTML tags that define UI controls should be placed between <form> and </form> tags as shown below:

<form name="Frm">
  <input language="VBScript" type="button" 
  value="Show" name="ShowHideBtn" onclick="ShowHide()">
  <input language="VBScript" type="button" 
  value="Open" name="OpenCloseBtn" onclick="OpenClose()">
  <input language="VBScript" type="button" 
  value="Trigger" name="TriggerBtn" onclick="Trigger()">
  <br><input type="checkbox" name="AutoCb">Trigger automatically
</form>

In addition, you should insert some container tag (e.g. <h3>) after form which will display current instrument readout:

<h3 id="Display">&nbsp;</h3>

Step 3 - writing script code

Now it's time to animate your application! Place following script code between <script> and </script> tags:

<script language="VBScript">

dim Win
set Win=window.external.CreateDocument("")
Win.WindowCaption="Data Window"
Win.IsRecording=true
Win.Worksheet.ColumnLabels(1)="Time, S"
Win.Worksheet.ColumnLabels(2)="Voltage"
Win.Plot.XAxis.AutoScale=false         
Win.Plot.XAxis.Min=0
Win.Plot.XAxis.Max=1000
Win.Plot.YAxis.AutoScale=true
Win.Plot.Series(0).XColumn=1
Win.Plot.Series(0).YColumn=2

sub ShowHide()
  Port.Visible=not Port.Visible
  if Port.Visible then
    Port.style.visibility="visible"
    Frm.ShowHideBtn.value="Hide"   
  else
    Port.style.visibility="hidden"   
    Frm.ShowHideBtn.value="Show"   
  end if
end sub

sub OpenClose()
  if Port.Active then
    Frm.OpenCloseBtn.value="Open"   
    Port.Active=false
  else
    Frm.OpenCloseBtn.value="Close"   
    call Port.Open(3,9600,0,8,0)
    call Port.Write(":INIT:CONT OFF;:ABORT;:TRIG:COUN 1;" & vbCr)
    call Port.Write(":TRIG:DEL 0;:TRIG:SOUR IMM;:INIT;" & vbCr)
  end if
end sub

Buffer=""
StartTime=Now

sub Port_OnRead(Str)
  Buffer=Buffer+Str
  if InStr(buffer, vbCr)>0 then
    Display.innerHTML=Buffer
    if IsNumeric(Buffer) then 
      Win.Container.AddItem(DateDiff("S",StartTime,Now) & " " & CDbl(Buffer))
      Win.Container.Modified=true
      Win.Plot.Series(0).AddPoint
    end if
    Buffer=""
    if Frm.AutoCb.checked then call SetTimeout("Trigger", 300)
  end if
end sub

sub Trigger()
  call Port.Write(":SENSE:CHAN 1;:READ?" & vbCr)
end sub

</script>

Global statements used to create and reference data window required to accumulate and display voltmeter readouts (window.external always holds reference to the IDMApplication interface). Notice that this window is created and configured when page is loaded without any user action! Code within "sub".."end sub" keywords are procedures. Procedures ShowHide(), OpenClose() and Trigger() are invoked by appropriate buttons (notice that procedure Trigger() also called by timer). Port_OnRead(Str) called implicitly by ActiveX control when data arrived from the RS232 port. Since data string may be broken at arbitrary position, some kind of bufferization used to determine actual termination of the transmission. IsNumeric(Buffer) call used to ensure data integrity since usually there's no any validation in the device communication protocol and sometimes data may be corrupted.

Of course, you need to know logical number of the COM port and communication settings used in Port.Open(...) call, and, in addition, consult instrument manual for details about device initialization, trigger and output data format (probably you will have to parse output string to extract data). Port.Open() parameters listed below (see also cportlib sources for more information):

  1. port number: 1,2,3 or 4
  2. baud rate: 300-256000
  3. parity: 0=None, 1=Odd, 2=Even, 3=Mark, 4=Space
  4. data bits: 5,6,7, or 8
  5. stop bits: 0=1, 1=1.5, 2=2

The result: working data acquisition application (see photo)

See also:

If you are interested in more details about ActiveX scripting, use DHTML authoring guides and VBScript references from Microsoft (bundled with MS products or available online at their website as a part of MSDN or downloadable archives).