Мне удалось прочитать мое строковое значение методом ReadBytes. В моем примере мне нужно было передать такие значения:
plc.Read(DataType.DataBlock, 105, 12, VarType.String, 40);
Почему 12? Потому что 2 первых октета байтовой строки относятся к длине. Таким образом, от 10 до 12 возвращают значение как 40, которое является длиной.
Я переопределил метод read, чтобы принять вызов 'easy string' следующим образом:
public T Read<T>(object pValue)
{
var splitValue = pValue.ToString().Split('.');
//check if it is a string template (3 separation ., 2 if not)
if (splitValue.Count() > 3 && splitValue[1].Substring(2, 1) == "S")
{
DataType dType;
//If we have to read string in other dataType need development to make here.
if (splitValue[0].Substring(0, 2) == "DB")
dType = DataType.DataBlock;
else
throw new Exception("Data Type not supported for string value yet.");
int length = Convert.ToInt32(splitValue[3]);
int start = Convert.ToInt32(splitValue[1].Substring(3, splitValue[1].Length - 3));
int MemoryNumber = Convert.ToInt32(splitValue[0].Substring(2, splitValue[0].Length - 2));
// the 2 first bits are for the length of the string. So we have to pass it
int startString = start + 2;
var value = ReadFull(dType, MemoryNumber, startString, VarType.String, length);
return (T)value;
}
else
{
var value = plc.Read(pValue.ToString());
//Cast with good format.
return (T)value;
}
}
Так что теперь я могувызовите мою функцию чтения следующим образом: при существующем базовом вызове:
var element = mPlc.Read<bool>("DB10.DBX1.4").ToString();
=> прочитайте в блоке данных 10 логическое значение байта 1 и октета 4 var element = mPlc.Read<uint>("DB10.DBD4.0").ToString();
=> прочитать в блоке данных 10 значение int в байте 4 и октет 0
с переопределенным вызовом для строки:
var element = mPlc.Read<string>("DB105.DBS10.0.40").ToString()
=> прочитать в блоке данных105 строковое значение в байте 10 и октете 0 длиной 40
Надеюсь, это может помочь кому-либо еще:)