matlabtest.g — test a connection to Matlab.
![]() | The code for this and other example scripts can be found in the DataHub distribution archive, typically at one of these locations: C:\Program Files\Cogent\OPC DataHub\scripts\ C:\Program Files\Cogent\Cascade DataHub\scripts\ Please refer to Section 3.1, “How to Run a Script” for more information on using scripts. |
require ("Application");
require ("MatlabSupport");
class MatlabTest Application
{
engine;
}
method MatlabTest.destructor ()
{
if (.engine)
destroy (.engine);
}
/* This function does several reads and writes to MATLAB to ensure that
we can translate back and forth between Gamma and MATLAB formats. */
method MatlabTest.send (str, var)
{
local gval1, gval3, errmsg;
// For speed testing, squelch all princ statements
//local princ = listq;
// Evaluate incoming string. It sets var in the MATLAB instance
if (str)
{
.engine.EvalString (str);
errmsg = .engine.GetError();
}
// Read var from MATLAB. Get its real part.
gval1 = .engine.GetVariable(var).GetPr();
// Write back to var with the result from MATLAB
.engine.PutVariable (var, gval1);
// Read it again, but this time write directly from the mxArray
// instead of translating to Gamma form first.
.engine.PutVariable (var, .engine.GetVariable(var));
// Read it again and print it. It should make sense.
gval3 = .engine.GetVariable(var).GetPr();
if (str)
princ ("The statement: ", str, "\n");
else
princ ("The variable: ", var, "\n");
if (errmsg)
princ (" produced: ", errmsg, "\n");
else
princ (" produced: ", var, " = ", stringc(gval3), " with dimensions ",
.engine.GetVariable(var).GetDimensions(), "\n");
}
method MatlabTest.constructor ()
{
.engine = engOpen("");
if (!.engine)
error ("Could not open MATLAB engine");
.engine.SetVisible (1);
// Simple numeric
.send ("x = 5;", "x");
// Simple string
.send ("z = 'hello';", "z");
// One-dimensional numeric array
.send ("y = [1 2 3];", "y");
// Two-dimension numeric arrays
.send ("w = [1 2 3; 4 5 6; 7 8 9];", "w");
.send ("w = [1 2; 4 5; 7 8];", "w");
// MATLAB requires all strings to be the same length when evaluating
// a MATLAB immediate array
.send ("v = ['hello';'there';'folks']", "v");
.send ("v = ['hello';'there';'guys']", "v");
// But it handles variable length strings when taking an array
// from Gamma.
.engine.PutVariable ("u", ["this","is","a","test"]);
.send (nil, "u");
// We cannot handle matrices of strings, though. The string length
// is one of the two supported dimensions.
try
{
.engine.PutVariable ("s", [["this","is"],["a","test"]]);
.send (nil, "s");
}
catch
{
princ ("Expected error setting matrix of strings: ", _last_error_, "\n");
}
// Map variable x in MATLAB to variable xt in Gamma, updating once per second
.engine.AutomaticVariable ("x", #xt, 1);
// Create a DataHub point for z, then map MATLAB's z to it and
// poll MATLAB for changes 5 times per second.
datahub_command ("(create default:z)", 1);
.engine.AutomaticVariable ("z", #$default:z, 0.2);
}
ApplicationSingleton (MatlabTest);
Copyright © 1995-2010 by Cogent Real-Time Systems, Inc. All rights reserved.