User Tools

Site Tools


datasourceconnectionsinmistudio

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
datasourceconnectionsinmistudio [2024/02/23 13:53] – [JavaScript Referencing Data Source] amywdatasourceconnectionsinmistudio [2024/02/23 16:50] (current) – [Debugging JavaScript] amyw
Line 25: Line 25:
  
 To get data flow from the Increment Server (data source) to the annunciator (target), To get data flow from the Increment Server (data source) to the annunciator (target),
 +<code>
   - Right click on the Increment Server and select "Manage Connections''.   - Right click on the Increment Server and select "Manage Connections''.
   - Right click on "output" and you will be able to "Add Targets".    - Right click on "output" and you will be able to "Add Targets". 
   - Click on "Add Targets" and you will be shown another panel with all the available targets for the Increment Server.   - Click on "Add Targets" and you will be shown another panel with all the available targets for the Increment Server.
-  - Select Target. Find the target entry of your intention (The annunciator),  click on it and you will see the "Input" for data input. Select it and click. Press “Done” and Close the Select Target window. +  - Select Target. Find the target entry of your intention (The annunciator),  click on it and you will see the "Input" for data input.  
 +    Select it and click. Press “Done” and Close the Select Target window.  
 +</code>
  
 To check if  the Increment server output is connected to the input of the target com (annunciator), right click on the annunciator, select “Manage Connections”, you will see that the input is the output of the Increment Server, even though there is no connector line wired them together. To check if  the Increment server output is connected to the input of the target com (annunciator), right click on the annunciator, select “Manage Connections”, you will see that the input is the output of the Increment Server, even though there is no connector line wired them together.
Line 41: Line 43:
  
 JavaScript is used as a manipulator in MIStudio. JavaScript could get data by referencing data source and scripting input value, and pass data by scripting output value, and sending data to manupulator inputs. JavaScript is used as a manipulator in MIStudio. JavaScript could get data by referencing data source and scripting input value, and pass data by scripting output value, and sending data to manupulator inputs.
 +
 +
 +
 +
 +
 +
  
 === JavaScript Referencing Data Source === === JavaScript Referencing Data Source ===
Line 81: Line 89:
 </code> </code>
  
-Etc.+etc.
  
 You can also get an element of an AVO using getValue(). For example, to get the 4th element of the array (array indexes are zero based): You can also get an element of an AVO using getValue(). For example, to get the 4th element of the array (array indexes are zero based):
Line 98: Line 106:
  
 === Scripting Input Value === === Scripting Input Value ===
 +
 +When a script is used in a Manipulator, the script is executed after the manipulator's function on the incoming Value Object. 
 +
 +The Value Object that was used to trigger the script can be accessed using "incomingValue" as its name. This is a Value Object so the data contained in it is accessed using the "dot" operator.
 +
 +For example: in your application you need  to use the time from the incomingValue which triggers the script, it is like this:
 +
 +<code> timestamp=incomingValue.getDate(); </code>
 +
 +To get the String Value of the Value Object,
 +
 +<code> string = incomingValue.getStringValue();</code>
 +
 +To get the Long (or integer) value of a numeric input,
 +
 +<code> value = incomingValue.getLongValue(); </code>
 +
 === Scripting Output Value === === Scripting Output Value ===
 +
 +The last line of the script will generate the output of the script. For example, if the following were the last line of the script a String Value Object would be automatically generated with the value "Hello":
 +
 +<code>
 +output = "Hello";
 +</code>
 +
 +You may explicitly create other types of Value Objects and use them for the output. In this next script the Double Value Object "dvo" will be the output of the JavaScript bean when it is triggered:
 +
 +<code>
 +output = "something";
 +svo = new StringValueObject(output);
 +dvo = new DoubleValueObject(43.128);
 +output = dvo;
 +</code>
 +
 +And the next script does the same thing (no need to use "output = " as the dvo creation was the last line of the script) :
 +
 +<code>
 +output = "something";
 +svo = new StringValueObject(output);
 +dvo = new DoubleValueObject(43.128);
 +</code>
 +
 +which is also equivalent to:
 +<code>
 +output = "something";
 +svo = new StringValueObject(output);
 +new DoubleValueObject(43.128);
 +</code>
 === Sending Data to manupulator Inputs === === Sending Data to manupulator Inputs ===
 +
 +In many cases, you may want to send values in Javascript to another named manipulator (or Broadcast Server) in your project's application logic. For example, you want to put the value you get from a data source IncrementServer in a sql  statement and insert the data into a table in a database. All you need to do is to put the Broadcast Server ( we call it “BCS”) next to the Javascript component in the Diagram Window. In the Javascript, write this codes like this: 
 +
 +<code>
 +Value1 = IncrementServer->getStringValue();
 +</code>
 +
 +assume there is a "test.sqlite" database, and a table called "test", the column is "TheTestValue". 
 +
 +<code>
 +sql = "INSERT INTO test set TheTestValue";
 +sql = sql + "'" + Value1 + "'";
 +BCS -> setStringValue(sql);
 +sql;
 +</code>
 +
 +When the BCS connects to the DatabaseRawWrite component ( the component writes to the database), the BCS should handle the SQL statement first, then trigger the write. Therefore, right click on the DatabaseRawWrite to bring up “Expose properties”, check “SQL statement”, connect the output of the BCS to this port; then connect the BCS output to the “Trigger” port. After this, check “Manage Connections” on the BCS, make sure the connections are in the order of “SQL statement” first, “Trigger” second.
 + 
 +If the data source, or the target  is in a different application screen, you must qualify the name using the forward slashes around the application name.
 +
 +For example:
 +<code>
 +DataValue=/ApplicationName/TheExactDataSource->getStringValue();
 +</code>
 +
 +In this script:
 +<code>
 +/Overview/BCS -> valueInput(ValueChangedEvent(this,vo));
 +</code>
 +
 +The above example creates a Value Changed Event to send the Value Object "vo" to the manipulator called "BCS" in the "Overview" screen's logic.
 +
 +Similarly to this, “Manage Connections” has the same function. You could set up a Broadcast Server to receive data from another application, just specify the source and the target in the “Manage Connections”.
 +
 +=== Debugging JavaScript ===
 +
 +When you trigger the JavaScript bean to start its script, you can easily determine whether a mistake has been made in the JavaScript program because the connection line between the trigger data source and the JavaScript bean will be red. If it was successful, the line would be green. This does not mean that your program is correct, but that there were no errors.
 +
 +If the connection line is red, select the connection and look at the description line at the bottom of the Diagram Window to get some information about the problem.
 +
 +**Syntax Errors**
 +
 +The script is interpreted in two passes. The first pass checks the syntax of the program lines (does not try to evaluate any statements). In this pass, the script will stop immediately if there is an error and produce an error line that has "SyntaxError:" with a short message and a line number in it, such as: <code>"SyntaxError: missing ( before condition (JavaScript1; line 35)"</code>
 +
 +You have to go to the 35th line in the JavaScript code and find that you forgot to enclose a boolean condition statement with parentheses. Sometimes it is easier to find the nth line in the code by copying the JavaScript into a text editor that will display line numbers.
 +
 +Another common syntax error is forgetting a quote on a String. If you see 
 +<code> "SyntaxError: unterminated string literal (JavaScript; line 12)"</code>
 +look on line 12 of the script and make sure you have quotes around the string in the line. For example, 
 +
 +<code> sql="SELECT "+ mno + " from table1); needs to be changed to sql="SELECT "+ mno + " from table1");</code>
 +
 +**Execution Errors**
 +
 +Once the interpreter gets past the syntax check, it will try to execute the code, top down. Functions are not evaluated until called. Typical errors at this stage do not tell you any line numbers. Here are some examples and causes.
 +
 +
 +**TypeError: Cannot convert null to an object**
 +
 +<code> JavaScript Error: Internal Error: TypeError: Cannot convert null to an object.</code>
 +
 +When you get a "Cannot convert null to an object" this means you have referenced something in the Javascript that is not a server or manipulator in the Diagram Window logic. Look for mistakes such as:
 +
 +  1. Referencing graphical objects
 +
 +<code> source = Button->getLongValue();</code>
 +
 +This will cause an error because "Button" is a graphical object (a Button on the Design Window). Do not reference graphical objects in the JavaScript, even if you copy its icon to the Diagram Window. The way to get the value from the Button in JavaScript is to connect a Broadcast Server to the output of the Button and reference the Broadcast Server in the script.
 +
 +  2. Referencing beans that do not exist (wrong name)
 +
 +<code> MyServer -> getValueObject();</code>
 +
 +if there is no logic component named "MyServer" in the logic, or it is on a different screen, or if you mistype the name (look for upper vs. lower case in the server name). Unfortunately the error message does not indicate what name is null (does not exist) so you will need to look at your JavaScript carefully to find the problem.
 +
 +
 +**TypeError: undefined is not a function**
 +
 +This error will say 
 +
 +<code> "JavaScript Error: Internal Error: TypeError: undefined is not a function."</code>
 +
 +This will happen if you are calling a server method such as <code> myServer->getValueObject()</code> and you mistype the method name or if the method does not exist for the bean. For example, this will cause an error:
 +
 +<code>
 +Ivo = IncrementServer->getLongValue();
 +test = lvo.getLength();
 +</code>
 +
 +because getLength() does not exist as a method for a Value Object.
 +
 +Unfortunately for this error there is no indication of what the faulty method name is so you have to study your JavaScript carefully to see the problem.
 +
 +**ReferenceError: "myVariable" is not defined**
 +
 +If you reference a variable that does exit you will get an 
 +<code> "Internal Error: ReferenceError: "myVariable" is not defined." error </code> 
 +
 +For example, if your code says:
 +
 +<code>
 +vo = new StringValueObject(stateString);
 +</code>
 +
 +and the variable "stateString" has not been defined yet or is misspelled, the error will say:
 +<code>"Internal Error: ReferenceError: "stateString" is not defined."</code>
 +
 + Define "stateString" with a statement such as:
 +<code>
 +stateString = CombineStrings -> getStringValue();
 +</code>
 +
 +or
 +
 +<code>
 +stateString = "Hello";
 +</code>
 +
 +**ReferenceError: "functionName" is not defined**
 +
 +This error is caused by referencing a defined function called "functionName" that does not exist. It will say something like: "JavaScript Error: Internal Error: ReferenceError: "functionName" is not defined". This will happen if you are using a function called "functionName" and you have not defined it in the JavaScript, or if you have misspelled the function name.
 +
 +
 +((**A DataSourceConnections.frx file is attached for you to download and add to your applications directory. You could open the DataSourceConnections application to see the examples. The Design Window has descriptions and the Diagram window is the place to see all the connections and data flows.**
 + ))
 +
  
  
datasourceconnectionsinmistudio.1708714435.txt.gz · Last modified: by amyw

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki