Skip to content

Commit

Permalink
Fixed a problem with parsing the TPY file (issue with TC3 an OSCAT).
Browse files Browse the repository at this point in the history
  • Loading branch information
tomcx committed Sep 23, 2017
1 parent 3cabb8d commit 411f1d3
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 92 deletions.
6 changes: 3 additions & 3 deletions examples/tamex/resources/tame.js

Large diffs are not rendered by default.

14 changes: 14 additions & 0 deletions release_notes.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
TAME V4.1.1 Release Notes
-------------------------

- Bugfix: The TPY file generated by TwinCAT 3 can contain data types with
no type information (especially if OSCAT is used). The parser stopped
there with an error. Now there will be just a message logged in the
console.

- New feature: There is a new example using SVG graphics. Thanks to Niels
Linnemann for providing this example.




TAME V4.1 Release Notes
-----------------------

Expand Down
182 changes: 95 additions & 87 deletions tame-w-comments.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*!
* TAME [TwinCAT ADS Made Easy] V4.1 170712
* TAME [TwinCAT ADS Made Easy] V4.1.1 170923
*
* Copyright (c) 2009-2017 Thomas Schmidt; t.schmidt.p1 at freenet.de
*
Expand All @@ -17,7 +17,7 @@
*/
var TAME = {
//Version
version:'V4.1 170712',
version:'V4.1.1 170923',
//Names of days and months. This is for the formatted output of date values. You can
//simply add your own values if you need.
weekdShortNames: {
Expand Down Expand Up @@ -4641,106 +4641,114 @@ TAME.WebServiceClient = function (service) {
subItems: {}
};
dataTypeTable[name].size = dataTypeTable[name].bitSize / 8;

//Get the SubItems
subItemArray = dataTypeArray[i].getElementsByTagName('SubItem');

for (var j = 0; j < subItemArray.length; j++) {
sName = subItemArray[j].getElementsByTagName('Name')[0].childNodes[0].nodeValue.toUpperCase();
dataTypeTable[name].subItems[sName] = {
typeString: subItemArray[j].getElementsByTagName('Type')[0].childNodes[0].nodeValue.toUpperCase(),
pointer: subItemArray[j].getElementsByTagName('Type')[0].hasAttribute('Pointer'),
bitSize: parseInt(subItemArray[j].getElementsByTagName('BitSize')[0].childNodes[0].nodeValue, 10),
};
if (subItemArray[j].getElementsByTagName('BitOffs')[0] !== undefined) {
dataTypeTable[name].subItems[sName].bitOffset = parseInt(subItemArray[j].getElementsByTagName('BitOffs')[0].childNodes[0].nodeValue, 10);
}
//Only SubItems with type information (problem occurs with TC3 and some libs)
if (subItemArray[j].getElementsByTagName('Type').length > 0) {


dataTypeTable[name].subItems[sName].size = (dataTypeTable[name].subItems[sName].bitSize >= 8) ? dataTypeTable[name].subItems[sName].bitSize/8 : dataTypeTable[name].subItems[sName].bitSize;

//Set additional information
typeArr = dataTypeTable[name].subItems[sName].typeString.split(" ");

if (typeArr[0] === 'ARRAY') {

//Type
dataTypeTable[name].subItems[sName].type = typeArr[0];

//Array Length
arrayLength = typeArr[1].substring(1, typeArr[1].length - 1);
arrayLength = arrayLength.split('..');
dataTypeTable[name].subItems[sName].arrStartIdx = parseInt(arrayLength[0], 10);
arrayLength = parseInt(arrayLength[1], 10) - parseInt(arrayLength[0], 10) + 1;
dataTypeTable[name].subItems[sName].arrayLength = arrayLength;


//Data type of the array.
type = typeArr[3].split('(');
if (type[1] !== undefined) {
type[1] = type[1].substr(0, type[1].length - 1);
dataTypeTable[name].subItems[sName].fullType = typeArr[0] + '.' + arrayLength + '.' + type[0] + '.' + type[1];
dataTypeTable[name].subItems[sName].stringLength = parseInt(type[1], 10);
} else {
dataTypeTable[name].subItems[sName].fullType = typeArr[0] + '.' + arrayLength + '.' + type[0];
//sName = subItemArray[j].getElementsByTagName('Name')[0].childNodes[0].nodeValue.toUpperCase();
dataTypeTable[name].subItems[sName] = {
typeString: subItemArray[j].getElementsByTagName('Type')[0].childNodes[0].nodeValue.toUpperCase(),
pointer: subItemArray[j].getElementsByTagName('Type')[0].hasAttribute('Pointer'),
bitSize: parseInt(subItemArray[j].getElementsByTagName('BitSize')[0].childNodes[0].nodeValue, 10),
};
if (subItemArray[j].getElementsByTagName('BitOffs')[0] !== undefined) {
dataTypeTable[name].subItems[sName].bitOffset = parseInt(subItemArray[j].getElementsByTagName('BitOffs')[0].childNodes[0].nodeValue, 10);
}

//Check added cause there are undefined data types some TwinCAT libs
if (service.skipMissingTypes === true && dataTypeTable[dataTypeTable[name].subItems[sName].typeString] === undefined) {
log('TAME library error: Data type missing in TPY file:');
log(dataTypeTable[name].subItems[sName]);
log('TAME library warning: Access to symbols using this data type will return wrong results:');
log(name);
log('TAME library info: Use handles to access symbols using this data type.');
} else {
if (dataTypeTable[dataTypeTable[name].subItems[sName].typeString] === undefined) {
log('TAME library error: Data type missing in TPY file!');
log('TAME library info: If you don\'t use this data type you can set the client parameter "skipMissingTypes" to true.');

dataTypeTable[name].subItems[sName].size = (dataTypeTable[name].subItems[sName].bitSize >= 8) ? dataTypeTable[name].subItems[sName].bitSize/8 : dataTypeTable[name].subItems[sName].bitSize;

//Set additional information
typeArr = dataTypeTable[name].subItems[sName].typeString.split(" ");

if (typeArr[0] === 'ARRAY') {

//Type
dataTypeTable[name].subItems[sName].type = typeArr[0];

//Array Length
arrayLength = typeArr[1].substring(1, typeArr[1].length - 1);
arrayLength = arrayLength.split('..');
dataTypeTable[name].subItems[sName].arrStartIdx = parseInt(arrayLength[0], 10);
arrayLength = parseInt(arrayLength[1], 10) - parseInt(arrayLength[0], 10) + 1;
dataTypeTable[name].subItems[sName].arrayLength = arrayLength;


//Data type of the array.
type = typeArr[3].split('(');
if (type[1] !== undefined) {
type[1] = type[1].substr(0, type[1].length - 1);
dataTypeTable[name].subItems[sName].fullType = typeArr[0] + '.' + arrayLength + '.' + type[0] + '.' + type[1];
dataTypeTable[name].subItems[sName].stringLength = parseInt(type[1], 10);
} else {
dataTypeTable[name].subItems[sName].fullType = typeArr[0] + '.' + arrayLength + '.' + type[0];
}
dataTypeTable[name].subItems[sName].bitSize = dataTypeTable[dataTypeTable[name].subItems[sName].typeString].bitSize;
dataTypeTable[name].subItems[sName].size = dataTypeTable[dataTypeTable[name].subItems[sName].typeString].size;
}


//Item length
dataTypeTable[name].subItems[sName].itemSize = dataTypeTable[name].subItems[sName].size / arrayLength;

//Check if variable is a user defined data type,
dataTypeTable[name].subItems[sName].arrayDataType = 'USER';
for (elem in plcTypeLen) {
if (plcTypeLen.hasOwnProperty(elem)) {
if (type[0] === elem) {
dataTypeTable[name].subItems[sName].arrayDataType = type[0];

//Check added cause there are undefined data types some TwinCAT libs
if (service.skipMissingTypes === true && dataTypeTable[dataTypeTable[name].subItems[sName].typeString] === undefined) {
log('TAME library error: Data type missing in TPY file:');
log(dataTypeTable[name].subItems[sName]);
log('TAME library warning: Access to symbols using this data type will return wrong results:');
log(name);
log('TAME library info: Use handles to access symbols using this data type.');
} else {
if (dataTypeTable[dataTypeTable[name].subItems[sName].typeString] === undefined) {
log('TAME library error: Data type missing in TPY file!');
log('TAME library info: If you don\'t use this data type you can set the client parameter "skipMissingTypes" to true.');
}
dataTypeTable[name].subItems[sName].bitSize = dataTypeTable[dataTypeTable[name].subItems[sName].typeString].bitSize;
dataTypeTable[name].subItems[sName].size = dataTypeTable[dataTypeTable[name].subItems[sName].typeString].size;
}
}
if (dataTypeTable[name].subItems[sName].arrayDataType === 'USER') {
dataTypeTable[name].subItems[sName].dataType = type[0];
}

} else {
type = typeArr[0].split('(');

if (type[1] !== undefined) {
//String
type[1] = type[1].substr(0, type[1].length - 1);
dataTypeTable[name].subItems[sName].fullType = type[0] + '.' + type[1];
dataTypeTable[name].subItems[sName].stringLength = parseInt(type[1], 10);


//Item length
dataTypeTable[name].subItems[sName].itemSize = dataTypeTable[name].subItems[sName].size / arrayLength;

//Check if variable is a user defined data type,
dataTypeTable[name].subItems[sName].arrayDataType = 'USER';
for (elem in plcTypeLen) {
if (plcTypeLen.hasOwnProperty(elem)) {
if (type[0] === elem) {
dataTypeTable[name].subItems[sName].arrayDataType = type[0];
}
}
}
if (dataTypeTable[name].subItems[sName].arrayDataType === 'USER') {
dataTypeTable[name].subItems[sName].dataType = type[0];
}

} else {
dataTypeTable[name].subItems[sName].fullType = type[0];
}

//Check if variable is a user defined data type,
dataTypeTable[name].subItems[sName].type = 'USER';
for (elem in plcTypeLen) {
if (plcTypeLen.hasOwnProperty(elem)) {
if (type[0] === elem) {
dataTypeTable[name].subItems[sName].type = type[0];
type = typeArr[0].split('(');

if (type[1] !== undefined) {
//String
type[1] = type[1].substr(0, type[1].length - 1);
dataTypeTable[name].subItems[sName].fullType = type[0] + '.' + type[1];
dataTypeTable[name].subItems[sName].stringLength = parseInt(type[1], 10);
} else {
dataTypeTable[name].subItems[sName].fullType = type[0];
}

//Check if variable is a user defined data type,
dataTypeTable[name].subItems[sName].type = 'USER';
for (elem in plcTypeLen) {
if (plcTypeLen.hasOwnProperty(elem)) {
if (type[0] === elem) {
dataTypeTable[name].subItems[sName].type = type[0];
}
}
}
if (dataTypeTable[name].subItems[sName].type === 'USER') {
dataTypeTable[name].subItems[sName].dataType = type[0];
}
}
if (dataTypeTable[name].subItems[sName].type === 'USER') {
dataTypeTable[name].subItems[sName].dataType = type[0];
}
} else {
log('TAME library warning: Skipping SubItem with no type information: Data type: ' + name + ' ,SubItem: ' + sName);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions tame.js

Large diffs are not rendered by default.

0 comments on commit 411f1d3

Please sign in to comment.