Считать массив строк из файла ?

Стартовая страница Форумы Разработка и интеграция Считать массив строк из файла ?

Просмотр 15 сообщений - с 1 по 15 (из 41 всего)
  • Автор
    Записи
  • #6652
    manjey73
    Участник

    Добрый день, Михаил.
    Применял для чтения ReadAllLines, но вы написали что данная функция не учитывает блокировки файлов. На что поменять данную функцию, чтобы на выходе получить тот же самый массив строк.

    Датчик 1-Wire выдает такую информацию
    72 01 4b 46 7f ff 0e 10 57 : crc=57 YES
    72 01 4b 46 7f ff 0e 10 57 t=23125

    И как я понимаю, это не файл в чистом виде, открытие файла приводит к опросу датчика.
    Так как если открыть просто файл в системе (например fstab) то он открывается мгновенно, хотя записей в нем больше)..

    #6666
    Mikhail
    Модератор

    Обычно я использую

    fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    streamReader = new StreamReader(fileStream, Encoding.Default);
    

    Пример: https://github.com/RapidScada/scada/blob/master/ScadaComm/ScadaCommSvc/CommandReader.cs#L167

    В файле желательно сделать признак успешного завершения — дополнительную строку в конце с кодовыми символами.

    #6667
    Mikhail
    Модератор

    Или Вы не можете изменить формат формирования файла?

    #6677
    manjey73
    Участник

    Никак не могу, это выдает драйвер 1-Wire встроенный в Raspberry Pi.

    Так как в Linux все является файлом, то и обращению к датчику идет как к файлу. При успешном опросе он выдает указанных две строки. Если контрольная сумма совпала, то в первой строке пишет YES, во второй соответственно температуру.

    #6689
    Mikhail
    Модератор

    Тогда придётся отлаживать на РПи через записи в логи.

    #6694
    manjey73
    Участник

    Вот если бы так же себя вел и второй Pi, было бы проще.
    А экспериментировать уже на запущенном экземпляре уже не могу. Только на своем проверять и уже отлаженное переносить.
    Ладно, как нибудь добью…

    #6703
    manjey73
    Участник

    Да, после добавления в настройках Коммуникатора дополнительной задержки после цикла опроса второй день полет нормальный.

    В любом случае драйвер переделывать по другим причинам…

    #6712
    Mikhail
    Модератор

    Такие вещи довольно сложно поймать.

    #6830
    manjey73
    Участник

    Как в public override void Session()
    {
    base.Session();

    Сделать открытие потока один раз до получения данных, после чего закрывать поток ?
    например применительно к
    StreamReader sr = new StreamReader(путь_к_файлу);

    #6831
    manjey73
    Участник

    Блин, бесит просто, почему на 2-х одинаковых ПК разное поведение ?
    Вот код опроса датчика

            public override void Session()
    
            {
                base.Session();
    
                for (int i = 0; i < dsNum.Length; i++)
                {
                    lastCommSucc = false;
                    string[] dsValue = new string[2];
    
                    string line;
                    int indexstr = 0;
                    WriteToLog("Опрос " + dsNum[i]);
    
                    try
                    {
                        sr = new StreamReader(path + dsNum[i] + path1);
                        while (!sr.EndOfStream)
                        {
                            line = sr.ReadToEnd();
                            if (line.Contains("YES"))
                            {
                                WriteToLog(line);
                                indexstr = line.IndexOf("t=");
                                SetCurData(tag, Convert.ToDouble(Convert.ToInt32(line.Substring(indexstr + 2, 5), 10)) / 1000, 1);
                                lastCommSucc = true;
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        WriteToLog("Не случилось ");
                        WriteToLog(e.Message);
                    }
                    finally
                    {
                        if (sr != null)
                            sr.Close();
                    }
    
                    //dsValue = File.ReadAllLines(path + dsNum[i] + path1); // Чтение температуры датчиков
                    //if (dsValue[0].Contains("YES"))
                    //{
                    //    SetCurData(tag, Convert.ToDouble(Convert.ToInt32(dsValue[1].Substring(dsValue[1].Length - 5), 10)) / 1000, 1);
                    //    lastCommSucc = true;
                    //}
                    //else
                    //{
                    //    WriteToLog(dsNum[i] + " нет датчика");
                    //}
    
                    tag++;
                }
                CalcSessStats();
                tag = 0;
            }
    
    #6832
    manjey73
    Участник

    И не зависимо от типа опроса, хоть через Stream хоть ReadAllLine один читает датчик, а второй зависает, отловить ошибки не получается из-за чего. В логах все чисто

    Два ПК отличаются тем, что к одному прицеплены 2 платы реле с Modbus и счетчик электроэнергии. На втором их нет, линии переведены в false.
    Но при чем тут это не понимаю, если Коммуникатор должен опрашивать все по очереди.

    Лог линии связи датчика

    
    2017-07-31 15:21:49 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Опрос 28-0215c221ebff
    9e 02 4b 46 7f ff 0c 10 cd : crc=cd YES
    9e 02 4b 46 7f ff 0c 10 cd t=41875
    
    2017-07-31 15:22:00 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Опрос 28-0215c221ebff

    Вот такая картина на ПК, который зависает, стоит перезапустить Scada как тут же после Опрос 28-0215c221ebff
    появятся данные. В данном случае он еще умудрился один раз считать датчик, мог бы так и висеть с надписью Опрос…
    В случае если успевает опросить то в txt линии пишет «норма», если не успел опросить то будет надпись «неопределенно»

    • Ответ изменён 8 лет, 12 месяцев назад пользователем manjey73.
    • Ответ изменён 8 лет, 12 месяцев назад пользователем manjey73.
    #6840
    Mikhail
    Модератор

    Сделать открытие потока один раз до получения данных, после чего закрывать поток ?

    Используйте using

    #6841
    Mikhail
    Модератор

    Нужно точно определить, что значит зависает.

    #6843
    manjey73
    Участник

    Если бы я знал почему ?
    например если в папке датчика дать команду cat w1_slave то вывод данных происходит наверное меньше секунды.
    Но если данный файл открыть в mc по F3 то до открытия проходит 5 секунд

    Может в С# такая же песня, 5 секунд и висит по таймауту или что-то в этом роде ?

    #6844
    manjey73
    Участник
    2017-08-01 09:37:48 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Опрос 28-0215c221ebff
    Чтение датчика
    Попытка номер х
    9b 02 4b 46 7f ff 0c 10 9b : crc=9b YES
    9b 02 4b 46 7f ff 0c 10 9b t=41687
    
    2017-08-01 09:38:05 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Опрос 28-0215c221ebff
    Чтение датчика

    Даже на работающем ПК вот тут происходит задержка если смотреть файл лога линии, потом появляются данные от датчика.

    Опрос 28-0215c221ebff
    Чтение датчика

    На не работающем может сразу так зависнуть и висеть.
    using не помог, ничего не изменилось.

Просмотр 15 сообщений - с 1 по 15 (из 41 всего)
  • Для ответа в этой теме необходимо авторизоваться.