Стартовая страница › Форумы › Разработка и интеграция › Считать массив строк из файла ?
- В этой теме 40 ответов, 3 участника, последнее обновление 8 лет, 11 месяцев назад сделано
OldManSpb.
-
АвторЗаписи
-
17.07.2017 в 12:34 #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) то он открывается мгновенно, хотя записей в нем больше)..18.07.2017 в 16:27 #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
В файле желательно сделать признак успешного завершения — дополнительную строку в конце с кодовыми символами.
18.07.2017 в 16:27 #6667
MikhailМодераторИли Вы не можете изменить формат формирования файла?
18.07.2017 в 16:51 #6677
manjey73УчастникНикак не могу, это выдает драйвер 1-Wire встроенный в Raspberry Pi.
Так как в Linux все является файлом, то и обращению к датчику идет как к файлу. При успешном опросе он выдает указанных две строки. Если контрольная сумма совпала, то в первой строке пишет YES, во второй соответственно температуру.
19.07.2017 в 16:41 #6689
MikhailМодераторТогда придётся отлаживать на РПи через записи в логи.
19.07.2017 в 16:57 #6694
manjey73УчастникВот если бы так же себя вел и второй Pi, было бы проще.
А экспериментировать уже на запущенном экземпляре уже не могу. Только на своем проверять и уже отлаженное переносить.
Ладно, как нибудь добью…19.07.2017 в 17:18 #6703
manjey73УчастникДа, после добавления в настройках Коммуникатора дополнительной задержки после цикла опроса второй день полет нормальный.
В любом случае драйвер переделывать по другим причинам…
20.07.2017 в 16:30 #6712
MikhailМодераторТакие вещи довольно сложно поймать.
31.07.2017 в 14:47 #6830
manjey73УчастникКак в public override void Session()
{
base.Session();Сделать открытие потока один раз до получения данных, после чего закрывать поток ?
например применительно к
StreamReader sr = new StreamReader(путь_к_файлу);31.07.2017 в 15:22 #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; }31.07.2017 в 15:25 #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 линии пишет «норма», если не успел опросить то будет надпись «неопределенно»31.07.2017 в 19:55 #6840
MikhailМодераторСделать открытие потока один раз до получения данных, после чего закрывать поток ?
Используйте using
31.07.2017 в 19:56 #6841
MikhailМодераторНужно точно определить, что значит зависает.
31.07.2017 в 21:58 #6843
manjey73УчастникЕсли бы я знал почему ?
например если в папке датчика дать команду cat w1_slave то вывод данных происходит наверное меньше секунды.
Но если данный файл открыть в mc по F3 то до открытия проходит 5 секундМожет в С# такая же песня, 5 секунд и висит по таймауту или что-то в этом роде ?
01.08.2017 в 09:40 #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 не помог, ничего не изменилось. -
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.