public static bool WriteWords(Slot slot) { lock (typeof(DataTransfer)) { bool res = true; List <byte[]> querys = new List <byte[]>(); List <byte[]> answers = new List <byte[]>(); try { if (_connector.Connect()) { if (slot.Size >= 120) { PrepareListWriteWords(ref querys, ref answers, slot); } else { byte[] query = Modbus.CreateWriteWordsArray(_connector.KNNumber, _connector.DeviceNumber, slot.Start, slot.Value); querys.Add(query); byte[] answer = _connector.ReadWrite(query); if (answer.Length != 8) { throw new Exception("Считано неверное количество байт"); } answers.Add(answer); } } else { res = false; } } catch (Exception) { res = false; } finally { //if (_connector.Disconnect() || !res) //{ // res = false; //} } return(res); } }
private static void PrepareListWriteWords(ref List <byte[]> querys, ref List <byte[]> answers, Slot slot) { lock (typeof(DataTransfer)) { int temp = 0; ushort oneSlotSize = 0x64; List <ushort[]> values = new List <ushort[]>(); // мы не можем записывать в устройство больше 256 байт. // поэтому большой запрос мы разбиваем на несколько int queryCount = slot.Size / oneSlotSize; ushort lastQuerySize = (ushort)(slot.Size % oneSlotSize); ushort addressTmp = slot.Start; if (lastQuerySize != 0) { temp = 1; } // заполнение раздробленных частей int lastByteIndex = 0; for (int i = 0; i < queryCount + temp; i++) { ushort[] value = null; if (i == queryCount + temp - 1 && temp == 1) { value = new ushort[lastQuerySize]; Array.ConstrainedCopy((slot.Value), lastByteIndex, value, 0, value.Length); lastByteIndex += value.Length; } else { value = new ushort[oneSlotSize]; Array.ConstrainedCopy((slot.Value), lastByteIndex, value, 0, value.Length); lastByteIndex += value.Length; } values.Add(value); } // создание модбас запросов для каждой части for (int i = 0; i < queryCount + temp; i++) { if (i == queryCount + temp - 2 && temp == 1) { byte[] query = Modbus.CreateWriteWordsArray(_connector.KNNumber, _connector.DeviceNumber, addressTmp, values[i]); querys.Add(query); addressTmp += oneSlotSize; } else if (i == queryCount + temp - 1 && temp == 1) { byte[] query = Modbus.CreateWriteWordsArray(_connector.KNNumber, _connector.DeviceNumber, addressTmp, values[i]); querys.Add(query); addressTmp += oneSlotSize; } else { byte[] query = Modbus.CreateWriteWordsArray(_connector.KNNumber, _connector.DeviceNumber, addressTmp, values[i]); querys.Add(query); addressTmp += oneSlotSize; } } //TODO: отправка запроса в устройство foreach (byte[] q in querys) { byte[] answer = _connector.ReadWrite(q); // проверить ответ answers.Add(answer); } } }