[etherlab-users] new beckhoff xml has DWORD variables
Julian Stoev
julian.stoev at gmail.com
Fri Jun 5 13:46:12 CEST 2009
Hello,
I have trouble to make my encoder EL5101 work with etherlab-rc5. A
colleague of mine tests it with LabView and it works. We concluded
that the only difference is that he downloaded last XML files.
I found a _huge_ difference in the file size of EL5101 xml between the
version in rc5 and the last available.
I downloaded the last available files and started the setup.m file in
the xml directory. I hope this is the right thing to do. (???)
I got a message that there is unrecognised DWORD in the EL5101 xml file.
I changed the XMLparsePDOEntry file and included the DWORD same as
UINT32. Hope this is the right thing. (???)
It now parses all the XML files
I attach the file modified m file for your reference.
--
Julian Stoev, PhD.
Control Researcher
-------------- next part --------------
function pdo_entry = XML_ParsePdoEntry(xml)
pdo_entry.Index = [];
pdo_entry.SubIndex = [];
pdo_entry.BitLen = [];
pdo_entry.DataType = [];
if ~nargin
return
end
%% Get the Index and BitLen - required
try
index = xml.getElementsByTagName('Index').item(0);
pdo_entry.Index = fromHexString(index.getTextContent.trim);
bit_len = xml.getElementsByTagName('BitLen').item(0);
pdo_entry.BitLen= fromHexString(bit_len.getTextContent.trim);
catch
end
if isempty(pdo_entry.Index) || isempty(pdo_entry.BitLen)
invalidDocument
end
if ~pdo_entry.Index
return
end
%% Parse SubIndex and DataType
try
subindex = xml.getElementsByTagName('SubIndex').item(0);
pdo_entry.SubIndex = fromHexString(subindex.getTextContent.trim);
data_type = xml.getElementsByTagName('DataType').item(0);
data_type = data_type.getTextContent.trim;
catch
invalidDocument
end
pdo_entry.DataType = getDataType(data_type, pdo_entry.BitLen);
%%
function w = getDataType(dt,bitlen)
if dt.startsWith('BOOL')
w = 1;
elseif dt.startsWith('USINT') || dt.startsWith('UINT8') ...
|| dt.startsWith('BYTE') || dt.startsWith('STRING')
w = 8;
elseif dt.equals('UINT') || dt.startsWith('UINT16')
w = 16;
elseif dt.startsWith('UDINT') || dt.startsWith('UINT32') || dt.startsWith('DWORD')
w = 32;
elseif dt.startsWith('ULINT') || dt.startsWith('UINT64')
w = 64;
elseif dt.startsWith('SINT') || dt.startsWith('INT8')
w = -8;
elseif dt.equals('INT') || dt.startsWith('INT16')
w = -16;
elseif dt.startsWith('DINT') || dt.startsWith('INT32')
w = -32;
elseif dt.startsWith('LINT') || dt.startsWith('INT64')
w = -64;
elseif dt.startsWith('UINT')
w = str2double(dt.substring(4));
if bitlen ~= w
warning('EtherCATDevice:XML_ParsePdoEntry:checkBitlen', ...
['Check the data types - <DataType> said %s, ', ...
'<BitLength> said %u'], char(dt), bitlen);
if isnan(w)
w = bitlen;
end
end
elseif dt.startsWith('BIT')
w = str2double(dt.substring(3));
if isnan(w)
w = bitlen;
end
if bitlen ~= w
warning('EtherCATDevice:XML_ParsePdoEntry:checkBitlen', ...
['Check the data types - <DataType> said %s, ', ...
'<BitLength> said %u'], char(dt), bitlen);
if isnan(w)
w = bitlen;
end
end
else
error('Unknown data type %s', char(dt))
end
%%
function invalidDocument
error('XML file is not a valid EtherCATInfo Document');
More information about the Etherlab-users
mailing list