Read/Write PlcOpen types (DATE, TIME ...)

The following PLCOpen types have specific representations within the TwinCAT.Ads Communication Library: DT

The following section shows the different scenarios as code snippets.

HowTo Read/Write PlcOpen values

Reading writing by streams:

Read/Write PlcOpen types (streamed, async)

CancellationToken cancel = CancellationToken.None;

using (AdsClient client = new AdsClient())
{
    client.Connect(AmsNetId.Local, 851); // Connect to local plc

    ResultHandle resultHandleTime = await client.CreateVariableHandleAsync("MAIN.time", cancel); // TIME
    ResultHandle resultHandleLTime = await client.CreateVariableHandleAsync("MAIN.lTime", cancel); // LTIME
    ResultHandle resultHandleDate = await client.CreateVariableHandleAsync("MAIN.date", cancel); // DATE

    if (resultHandleTime.Succeeded && resultHandleLTime.Succeeded && resultHandleDate.Succeeded)
    {
    try
    {
        byte[] readBuffer = new byte[LTIME.MarshalSize]; // Largest PlcOpen Type is 8 Bytes
        byte[] writeBuffer = new byte[LTIME.MarshalSize];

        // Reading raw value TIME
        await client.ReadAsync(resultHandleTime.Handle, readBuffer.AsMemory(0, TIME.MarshalSize), cancel);

        // Unmarshalling
        TIME plcTime = null;
        PrimitiveTypeMarshaler.Default.Unmarshal(readBuffer.AsSpan(0, TIME.MarshalSize), out plcTime);
        TimeSpan time = plcTime.Time;

        // Writing raw value TIME
        PrimitiveTypeMarshaler.Default.Marshal(time, writeBuffer.AsSpan());
        await client.WriteAsync(resultHandleTime.Handle, writeBuffer.AsMemory(0, TIME.MarshalSize), cancel);

        // Reading raw value LTIME
        await client.ReadAsync(resultHandleLTime.Handle, readBuffer.AsMemory(0, LTIME.MarshalSize), cancel);

        // Unmarshalling
        LTIME plcLTime = null;
        PrimitiveTypeMarshaler.Default.Unmarshal(readBuffer.AsSpan(0, LTIME.MarshalSize), out plcLTime);
        TimeSpan lTime = plcLTime.Time;

        // Writing raw value LTIME
        PrimitiveTypeMarshaler.Default.Marshal(lTime, writeBuffer.AsSpan());
        await client.WriteAsync(resultHandleLTime.Handle, writeBuffer.AsMemory(0, LTIME.MarshalSize), cancel);

        // Reading raw value DATE
        DATE plcDate = null;
        await client.ReadAsync(resultHandleDate.Handle, readBuffer.AsMemory(0, DATE.MarshalSize), cancel);

        // Unmarshalling
        PrimitiveTypeMarshaler.Default.Unmarshal(readBuffer.AsSpan(0, DATE.MarshalSize), out plcDate);
        DateTimeOffset dateTime = plcDate.Date;

        // Writeing raw value DATE
        PrimitiveTypeMarshaler.Default.Marshal(plcDate, writeBuffer.AsSpan());
        await client.WriteAsync(resultHandleDate.Handle, writeBuffer.AsMemory(0, DATE.MarshalSize), cancel);
    }
    finally
    {
        ResultAds r1 = await client.DeleteVariableHandleAsync(resultHandleLTime.Handle, cancel);
        ResultAds r2 = await client.DeleteVariableHandleAsync(resultHandleTime.Handle, cancel);
        ResultAds r3 = await client.DeleteVariableHandleAsync(resultHandleDate.Handle, cancel);
    }
    }
}

Read/Write PlcOpen types (streamed, sync)

using (AdsClient client = new AdsClient())
{
    client.Connect(AmsNetId.Local, 851); // Connect to local plc

    uint handleTime = 0;
    uint handleLTime = 0;
    uint handleDate = 0;

    try
    {
    handleTime = client.CreateVariableHandle("MAIN.time"); // TIME
    handleLTime = client.CreateVariableHandle("MAIN.lTime"); // LTIME
    handleDate = client.CreateVariableHandle("MAIN.date"); // DATE

    byte[] readBuffer = new byte[LTIME.MarshalSize]; // Largest PlcOpen Type is 8 Bytes
    byte[] writeBuffer = new byte[LTIME.MarshalSize];

    // Reading raw value TIME
    client.Read(handleTime, readBuffer.AsMemory(0,TIME.MarshalSize));

    // Unmarshalling
    TIME plcTime = null;
    PrimitiveTypeMarshaler.Default.Unmarshal(readBuffer.AsSpan(0, TIME.MarshalSize), out plcTime);
    TimeSpan time = plcTime.Time;

    // Writing raw value TIME
    PrimitiveTypeMarshaler.Default.Marshal(time, writeBuffer.AsSpan());
    client.Write(handleTime, writeBuffer.AsMemory(0,TIME.MarshalSize));

    // Reading raw value LTIME
    client.Read(handleLTime, readBuffer.AsMemory(0, LTIME.MarshalSize));

    // Unmarshalling
    LTIME plcLTime = null;
    PrimitiveTypeMarshaler.Default.Unmarshal(readBuffer.AsSpan(0, LTIME.MarshalSize), out plcLTime);
    TimeSpan lTime = plcLTime.Time;

    // Writing raw value LTIME
    PrimitiveTypeMarshaler.Default.Marshal(lTime, writeBuffer.AsSpan());
    client.Write(handleLTime, writeBuffer.AsMemory(0, LTIME.MarshalSize));

    // Reading raw value DATE
    DATE plcDate = null;
    client.Read(handleDate, readBuffer.AsMemory(0, DATE.MarshalSize));

    // Unmarshalling
    PrimitiveTypeMarshaler.Default.Unmarshal(readBuffer.AsSpan(0, DATE.MarshalSize), out plcDate);
    DateTimeOffset dateTime = plcDate.Date;

    // Writeing raw value DATE
    PrimitiveTypeMarshaler.Default.Marshal(plcDate, writeBuffer.AsSpan());
    client.Write(handleDate, writeBuffer.AsMemory(0, DATE.MarshalSize));
    }
    finally
    {
    client.DeleteVariableHandle(handleLTime);
    client.DeleteVariableHandle(handleTime);
    client.DeleteVariableHandle(handleDate);
    }
}

Reading writing by ANY type concept:

Read/Write PlcOpen types (ANY, async)

CancellationToken cancel = CancellationToken.None;

using (AdsClient client = new AdsClient())
{
    client.Connect(AmsNetId.Local, 851); // Connect to local plc

    ResultHandle resultHandleTime = await client.CreateVariableHandleAsync("MAIN.time",cancel); // TIME
    ResultHandle resultHandleDate = await client.CreateVariableHandleAsync("MAIN.date", cancel); // DATE
    ResultHandle resultHandleLTime = await client.CreateVariableHandleAsync("MAIN.lTime", cancel); // LTIME

    if (resultHandleTime.Succeeded && resultHandleDate.Succeeded && resultHandleLTime.Succeeded)
    {
    try
    {
        ResultAnyValue resultTime = await client.ReadAnyAsync(resultHandleTime.Handle, typeof(TIME), cancel); // TIME

        TIME time = (TIME)resultTime.Value;
        TimeSpan timeSpan = time.Time;

        await client.WriteAnyAsync(resultHandleTime.Handle, time, cancel);

        ResultAnyValue resultData = await client.ReadAnyAsync(resultHandleDate.Handle, typeof(DATE), cancel); // DATE
        DATE date = (DATE)resultTime.Value;
        DateTimeOffset dateTime = date.Date;

        await client.WriteAnyAsync(resultHandleDate.Handle, date, cancel);

        ResultAnyValue resultLTime = await client.ReadAnyAsync(resultHandleLTime.Handle, typeof(LTIME), cancel); // LTIME
        LTIME lTime = (LTIME)resultTime.Value;
        TimeSpan lTimeSpan = lTime.Time;

        await client.WriteAnyAsync(resultHandleLTime.Handle, lTime, cancel);
    }
    finally
    {
        ResultAds r1 = await client.DeleteVariableHandleAsync(resultHandleTime.Handle,cancel);
        ResultAds r2 = await client.DeleteVariableHandleAsync(resultHandleDate.Handle,cancel);
        ResultAds r3 = await client.DeleteVariableHandleAsync(resultHandleLTime.Handle,cancel);
    }
    }
}

Read/Write PlcOpen types (ANY, sync)

using (AdsClient client = new AdsClient())
{
    client.Connect(AmsNetId.Local, 851); // Connect to local plc

    uint handleTime = 0;
    uint handleDate = 0;
    uint handleLTime = 0;

    try
    {
    handleTime = client.CreateVariableHandle("MAIN.time"); // TIME
    handleDate = client.CreateVariableHandle("MAIN.date"); // DATE
    handleLTime = client.CreateVariableHandle("MAIN.lTime"); // LTIME

    TIME time = (TIME)client.ReadAny(handleTime, typeof(TIME)); // TIME
    TimeSpan timeSpan = time.Time;
    client.WriteAny(handleTime, time);

    DATE date = (DATE)client.ReadAny(handleDate, typeof(DATE)); // DATE
    DateTimeOffset dateTime = date.Date;
    client.WriteAny(handleDate, date);

    LTIME ltime = (LTIME)client.ReadAny(handleLTime, typeof(LTIME)); // LTIME
    TimeSpan lTimeSpan = ltime.Time;
    client.WriteAny(handleLTime, ltime);
    }
    finally
    {
    client.DeleteVariableHandle(handleTime);
    client.DeleteVariableHandle(handleDate);
    client.DeleteVariableHandle(handleLTime);
    }
}