Ответы в темах
-
АвторСообщения
-
JurasskParkУчастникМы про разные вещи говорим.
Вы думаете, что я не знаю как обрабатывать входящие данные, а я не хочу ждать Timeout и лишний код писать об вычислении этого readCNT чтобы выйти из while().-
Ответ изменён 3 года, 2 месяца назад пользователем
JurasskPark.
JurasskParkУчастникТекущие значения:
Тип параметра 0
Количество регистров на чтение 127
FE 51 00 00 00 00 00 00 8E 06
FE 51 7F 18 01 17 12 10 0C 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 B6 AF CC BE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5C 0C C8 C1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E6 29
Текущие значения:
Тип параметра 2
Количество регистров на чтение 37
FE 51 02 00 00 00 00 00 8F E4
FE 51 25 18 01 17 13 10 0C 0A 00 00 00 00 00 00 00 00 00 00 04 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C2 3C
Текущие значения:
Тип параметра 3
Количество регистров на чтение 87
FE 51 03 00 00 00 00 00 8E 35
FE 51 57 18 01 17 14 10 0C 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 9D 8E
Текущие значения:
Тип параметра 4
Количество регистров на чтение 87
FE 51 04 00 00 00 00 00 8F 82
FE 51 57 18 01 17 15 10 0C 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C2 5B
По какому условию понимать что при типе 0 количеством байт 127, при типе 2 — 37 байт, при типе 3 и 4 — 87?
JurasskParkУчастникМеня смущает как рассчитать получаемый ответ в количестве байт. Проблема же «надо знать сколько получать», а не как обработать. ) Чтобы при получении пакета не выжидать время.
-
Ответ изменён 3 года, 2 месяца назад пользователем
JurasskPark.
JurasskParkУчастникВот пример логов, скриншоты
https://disk.yandex.ru/d/2raCFg10venzSQ
JurasskParkУчастникНу сделайте, пожалуйста! И я буду счастливым 🙂
Не хочу я сидеть и считать размер пакеты под каждый вид команды…
Около 40 видов разновидностей команд примерно получается… 🙁
JurasskParkУчастникЯ могу сказать одно… не доставку пакета всё равно ничего не спасет.
А так чтобы NetworkStream что-то досылал… и это вот прям нужно… я не встречал…Даже вот такой простой пример отлично работал.
using System; using System.Net; using System.Net.Sockets; using System.Threading; public class TCPClientLight { public byte[] Connect(IPAddress IP, int Port, int WriteTimeout, int ReadTimeout, byte[] byteData, ref string MessageError) { byte[] numArray = (byte[])null; try { IPAddress Address = IP; TcpClient tcpClient = new TcpClient(); IAsyncResult asyncResult = tcpClient.BeginConnect(Address, Port, (AsyncCallback)null, (object)null); WaitHandle asyncWaitHandle = asyncResult.AsyncWaitHandle; if (!asyncResult.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(Convert.ToDouble(ReadTimeout / 1000)), false)) { tcpClient.Close(); throw new TimeoutException(); } NetworkStream stream = tcpClient.GetStream(); stream.WriteTimeout = WriteTimeout; stream.ReadTimeout = ReadTimeout; stream.Write(byteData, 0, byteData.Length); byteData = new byte[256]; int length = stream.Read(byteData, 0, byteData.Length); numArray = new byte[length]; Array.Copy((Array)byteData, (Array)numArray, length); // Прекратим ожидания, вызвав метод Close через дискриптор ожидания. tcpClient.EndConnect(asyncResult); asyncWaitHandle.Close(); tcpClient.Close(); } catch (SocketException) { MessageError = "Невозможно подключиться к " + IP + ":" + Port.ToString(); } catch (TimeoutException) { MessageError = "Превышено время подключения"; } catch (FormatException) { MessageError = "Неправильный формат IP адреса"; } catch (ArgumentOutOfRangeException) { MessageError = "Превышено значение порта"; } catch (Exception ex) { MessageError = ex.Message; } return numArray; } }
JurasskParkУчастникУсловие прекращение ожидания напишите словами, одним предложением, если возможно.
Количество полученных данных больше нуля.
-
Ответ изменён 3 года, 2 месяца назад пользователем
JurasskPark.
JurasskParkУчастникКакой дополнительный вариант завершения запроса Вы хотите предложить?
Без условия указания количества получаемых байт.
/// <summary> /// Reads data. /// </summary> public override int Read(byte[] buffer, int offset, int timeout, ProtocolFormat format, out string logText) { try { int readCnt = 0; NetStream.ReadTimeout = timeout; // timeout is not maintained if all available data has been read Stopwatch stopwatch = Stopwatch.StartNew(); while (readCnt == 0 && stopwatch.ElapsedMilliseconds <= timeout) { // read data try { if (NetStream.DataAvailable) // checking DataAvailable is critical on Linux readCnt += NetStream.Read(buffer, offset, buffer.Length); } catch (IOException) { } } logText = BuildReadLogText(buffer, offset, readCnt, format); if (readCnt > 0) { logText = BuildReadLogText(buffer, offset, readCnt, format); UpdateActivityTime(); } return readCnt; } catch (Exception ex) { throw new ScadaException(CommPhrases.ReadDataError + ": " + ex.Message, ex);Я бы понимал, когда отдаем buffer[] размером 1000 байт, отдаем int count (количество получаемых данных), то в ответе у нас buffer[] размером count.
Но там нигде Array.Resize(ref buffer, readCnt) не делается…
JurasskParkУчастникОгоооо… 4 байта… Мои любимый размер регистра. ?
Скажу, что я бы с вами поделился драйвером modbus c поддержкой 4 байтового регистра… Но он вам не поможет, т.к. нужно считать количество регистров. А в моем драйвере я ещё не сделал. ?
JurasskParkУчастникХотя ладно… Буду каждую отдельно команду проверять…
Эх…
JurasskParkУчастникДа, так обычно и делается.
Если протокол этот поддерживает.
А если нет?
JurasskParkУчастникНу тут три варианта:
1) Михаил добавит в CnlBasic ещё один вариант чтения и я буду доволен как слон 🙂
2) Я использую свой CnlBasic и только с ним драйвер булет работать.
3) Я отказываюсь и в драйвере реализую чтение через свои драйвера.P.S. Я не вижу большой сложности и проблемы, почему бы Михаил отказался реализовать ещё один вариант чтения данных, когда 4 штуки уже есть. 🙂
JurasskParkУчастникАрхив за часы и за сутки? Я там не увидел такого… Может я не прав…
JurasskParkУчастникРазмер блока передаваемых данных. Суть та же, что и в Modbus, считали первые три байта, узнали размер блока + CRC и дочитали остальное…
Нет там такого. 🙂
JurasskParkУчастникВ драйверах есть возможность остановки по байту, по массиву байт, по массивам байт при необходимости.
А можете рассказать как для маленького ребёнка? Поподробнее. А то может и придётся Михаила дорабатывать. 🙂
-
Ответ изменён 3 года, 2 месяца назад пользователем
-
АвторСообщения