Read EtherCAT CoE SDO via Datalayer (Golang)

Hi,

I'm trying to read a CoE object from SAFEX-C.15 via Golang application. When using the Datalayer UI directly I can read successfuly:

The schema used for the flatbuffers is as per below:

include "addresstype.fbs";

namespace schema;

enum SDOFlags: uint32 (bit_flags)
{
  noFlags        = 0,
  completeAccess = 1,
}

table SDORequest
{
  addressType: Addresstype;
  address: uint16;
  objectIndex: uint16;
  subIndex: uint8;
  flags: SDOFlags;
  data: [uint8];
  maxLength: uint32;
}

table SDOResponse
{
  data: [uint8];
}

table SDO
{
  request: SDORequest;
  response: SDOResponse;
}

root_type SDO;
 
 

The Golang code that implements the CoE request is as follows:

 

func (c *CallDatalayerClient) RequestCoE(node string) (w string){
    var atype schema.Addresstype = schema.Addresstypefixedphysical
    var sFlag schema.SDOFlags = schema.SDOFlagsnoFlags

    builder := flatbuffers.NewBuilder(1)
    schema.SDORequestStartDataVector(builder, 2)
    for i := 1; i >= 0; i-- {
        builder.PrependUint8(0)
    }
    dataRequest := builder.EndVector(0)

    schema.SDOResponseStartDataVector(builder, 2)
    for i := 1; i >= 0; i-- {
        builder.PrependUint8(0)
    }
    dataResponse := builder.EndVector(0)

    schema.SDORequestStart(builder)
    schema.SDORequestAddAddressType(builder, atype)
    schema.SDORequestAddAddress(builder, 1001)
    schema.SDORequestAddObjectIndex(builder, 4104)
    schema.SDORequestAddSubIndex(builder, 0)
    schema.SDORequestAddFlags(builder, sFlag)
    schema.SDORequestAddData(builder, dataRequest)
    schema.SDORequestAddMaxLength(builder, 1024)
    request := schema.SDORequestEnd(builder)
    builder.Finish(request)

    schema.SDOResponseStart(builder)
    schema.SDOResponseAddData(builder, dataResponse)
    response := schema.SDOResponseEnd(builder)
    builder.Finish(response)

    schema.SDOStart(builder)
    schema.SDOAddRequest(builder, request)
    schema.SDOAddResponse(builder, response)
    requestObject := schema.SDOEnd(builder)

    builder.Finish(requestObject)

    v := datalayer.NewVariant()
    v.SetFlatbuffers(builder.FinishedBytes())
    //defer datalayer.DeleteVariant(v)

    res := c.client.ReadSyncArgs(node, v)
    fmt.Println("CoE request: %s", res)

    if res != datalayer.ResultOk {
        w = "Error!"
        return
    }

    w = fmt.Sprintf("CoE request OK: %s", res)
    return
}

 

The node is "fieldbuses/ethercat/master/instances/ethercatmaster/device_access/coe/sdo"

After the ReadSyncArgs function call the result reports DL_TYPE_MISMATCH.

Can you please help in understanding what is the problem? I believe the flatbuffer implementation is correct and there is no reason for the type mismatch error.

Thanks in advance.

 

Best reply by CodeShepherd

As we are in direct contact, topic is closed for now.

View original
2 replies