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.
Â