Первые 2 байта строки типа S7 имеют следующий вид:
Позиция n: максимальная длина
Позиция n + 1: текущая длина
Из-за этого первый символ находится не в позиции n, а в позиции n + 2.
byte[] data = new byte[14];
client.ReadArea(S7.S7AreaDB, 560, 0, 14, data);
String ret = S7.GetStringAt(data,0+2,12);
Альтернатива:
byte[] data = new byte[12];
client.ReadArea(S7.S7AreaDB, 560, 2, 12, data);
String ret = S7.GetStringAt(data,0,12);
Или вы меняете код moka7 на что-то вроде этого (это код sharp7):
public static string GetStringAt(byte[] Buffer, int Pos)
{
int size = (int)Buffer[Pos + 1]; //Current length of the string
return Encoding.UTF8.GetString(Buffer, Pos + 2, size);
}