JurasskPark

Ответы в темах

Просмотр 15 сообщений - с 961 по 975 (из 1,155 всего)
  • Автор
    Сообщения
  • в ответ на: Время ожидания или Timeout #27189
    JurasskPark
    Участник

    Мы про разные вещи говорим.
    Вы думаете, что я не знаю как обрабатывать входящие данные, а я не хочу ждать Timeout и лишний код писать об вычислении этого readCNT чтобы выйти из while().

    • Ответ изменён 3 года, 2 месяца назад пользователем JurasskPark.
    в ответ на: Время ожидания или Timeout #27187
    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?

    в ответ на: Время ожидания или Timeout #27185
    JurasskPark
    Участник

    Меня смущает как рассчитать получаемый ответ в количестве байт. Проблема же «надо знать сколько получать», а не как обработать. ) Чтобы при получении пакета не выжидать время.

    • Ответ изменён 3 года, 2 месяца назад пользователем JurasskPark.
    в ответ на: Время ожидания или Timeout #27180
    JurasskPark
    Участник

    Вот пример логов, скриншоты
    https://disk.yandex.ru/d/2raCFg10venzSQ

    в ответ на: Время ожидания или Timeout #27174
    JurasskPark
    Участник

    Ну сделайте, пожалуйста! И я буду счастливым 🙂
    Не хочу я сидеть и считать размер пакеты под каждый вид команды…
    Около 40 видов разновидностей команд примерно получается… 🙁

    в ответ на: Время ожидания или Timeout #27173
    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;
            }
        }
    
    в ответ на: Время ожидания или Timeout #27167
    JurasskPark
    Участник

    Условие прекращение ожидания напишите словами, одним предложением, если возможно.

    Количество полученных данных больше нуля.

    • Ответ изменён 3 года, 2 месяца назад пользователем JurasskPark.
    в ответ на: Время ожидания или Timeout #27163
    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) не делается…

    в ответ на: Ошибки при чтении по ModBus #27162
    JurasskPark
    Участник

    Огоооо… 4 байта… Мои любимый размер регистра. ?
    Скажу, что я бы с вами поделился драйвером modbus c поддержкой 4 байтового регистра… Но он вам не поможет, т.к. нужно считать количество регистров. А в моем драйвере я ещё не сделал. ?

    в ответ на: Время ожидания или Timeout #27161
    JurasskPark
    Участник

    Хотя ладно… Буду каждую отдельно команду проверять…
    Эх…

    в ответ на: Время ожидания или Timeout #27160
    JurasskPark
    Участник

    Да, так обычно и делается.

    Если протокол этот поддерживает.
    А если нет?

    в ответ на: Время ожидания или Timeout #27148
    JurasskPark
    Участник

    Ну тут три варианта:
    1) Михаил добавит в CnlBasic ещё один вариант чтения и я буду доволен как слон 🙂
    2) Я использую свой CnlBasic и только с ним драйвер булет работать.
    3) Я отказываюсь и в драйвере реализую чтение через свои драйвера.

    P.S. Я не вижу большой сложности и проблемы, почему бы Михаил отказался реализовать ещё один вариант чтения данных, когда 4 штуки уже есть. 🙂

    в ответ на: Время ожидания или Timeout #27139
    JurasskPark
    Участник

    Архив за часы и за сутки? Я там не увидел такого… Может я не прав…

    в ответ на: Время ожидания или Timeout #27133
    JurasskPark
    Участник

    Размер блока передаваемых данных. Суть та же, что и в Modbus, считали первые три байта, узнали размер блока + CRC и дочитали остальное…

    Нет там такого. 🙂

    в ответ на: Время ожидания или Timeout #27127
    JurasskPark
    Участник

    В драйверах есть возможность остановки по байту, по массиву байт, по массивам байт при необходимости.

    А можете рассказать как для маленького ребёнка? Поподробнее. А то может и придётся Михаила дорабатывать. 🙂

Просмотр 15 сообщений - с 961 по 975 (из 1,155 всего)