[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