Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26

Нужна помощь в понимании как реализовать сбор данных и их обработку

30.01.2024, 19:40. Показов 3029. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый. Имеется контроллер, с которого читаю время его работы. я получаю это время, далее через час я получаю еще раз время работы с устройства, с этих данных мне надо получить разницу. И так в течении всего дня собирать данные, и каждый час получать статистику)
С этих параметров получаю часы и миллисекунды с контроллера 6752 6751 .

у меня неделя программирования, самообучение)
Не представляю как мне закрутить программу, так что бы все работало. может кто поможет?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
TimeSpan[] all_day = new TimeSpan[250];
TimeSpan[] all_day_sub = new TimeSpan[250];
void run_time()
{
    //6752 hours   6751 milisec
    
    ret = FanucOpe.cnc_rdparam(FanucOpe.h, 6751, 0, 8 + 4, param6751);
    ret1 = FanucOpe.cnc_rdparam(FanucOpe.h, 6752, 0, 8, param6752);
    if (ret == FanucOpe.EW_OK && ret1 == FanucOpe.EW_OK)
    {
        textBox2.Text = convert_param_to_TimeSpan(param6751.ldata, param6752.ldata).ToString();
        textBox1.Text = convert_TimeSpan_to_Hours(convert_param_to_TimeSpan(param6751.ldata, param6752.ldata));
    }
    void writeToList(TimeSpan[] all_day)
    {
        listBox1.Items.Clear();
        for (int i = 0; i <= 23; i++)
        {
            all_day_sub[i] = this.all_day[i].Subtract(this.all_day[i + 1]);
            listBox1.Items.Add(this.all_day_sub[i]);
        }
    }
 
 
    TimeSpan convert_param_to_TimeSpan(int _param6751, int _param6752)  //
    {
        //hh:mm:ss
        var mils = TimeSpan.FromMinutes(_param6752).TotalMilliseconds;  //из минут в лиллисикунды
        var out_milisec = mils + _param6751;   //сложение двух полей милисикундных
        var timeSpan = TimeSpan.FromMilliseconds(out_milisec);
        int dd = timeSpan.Days;
        int hh = (int)timeSpan.TotalHours;
        int mm = timeSpan.Minutes;
        int ss = timeSpan.Seconds;
        // TimeSpan ts = timeSpan.Subtract();
        var currenttime = DateTime.Now;
 
        // if (currenttime.Minute == 0 && currenttime.Second <= 1)
        if (currenttime.Second == 0 || currenttime.Second == 5 || currenttime.Second == 10 || currenttime.Second == 15 ||
            currenttime.Second == 20 || currenttime.Second == 25 || currenttime.Second == 30 || currenttime.Second == 35 ||
            currenttime.Second == 40 || currenttime.Second == 45 || currenttime.Second == 50 || currenttime.Second == 55)
        {
            all_day[currenttime.Second] = timeSpan;
            writeToList(all_day);
        }
 
        return timeSpan;
    }
    string convert_TimeSpan_to_Hours(TimeSpan ts)  // timespan to hours
    {
        int dd = ts.Days;
        int hh = (int)ts.TotalHours;
        int mm = ts.Minutes;
        int ss = ts.Seconds;
        return string.Format("H{0}:M{1}:S{2} -ts:{3}", hh, mm, ss, ts); ;
    }
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.01.2024, 19:40
Ответы с готовыми решениями:

Помощь в понимании
const char х = {&quot;Jason &quot;, &quot;at your service\n&quot;}; const char * у = &quot;Quillstone &quot;; for (int і = 0; і &lt; 3; і++) cout « ((i&lt;2) ? !i ? x :...

Помощь в понимании RowViewModel
Есть ли у кого внятные примеры, как использовать RowViewModel&lt;TEntity&gt; и CellViewModel&lt;TValue&gt; Спасибо.

Реализовать сбор данных
Здравствуйте. Имеется следующая задача: нужно с любого сайта по поиску работы собрать список вакансий полученных по своему поисковому...

37
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26
01.02.2024, 19:21  [ТС]
Студворк — интернет-сервис помощи студентам
Вот кусок документации
Миниатюры
Нужна помощь в понимании как реализовать сбор данных и их обработку  
0
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26
01.02.2024, 19:24  [ТС]
TimeSpan convert_param_to_TimeSpan(int _param6751, int _param6752) //
{
//hh:mm:ss
var mils = TimeSpan.FromMinutes(_param6752).TotalMi lliseconds; //из минут в лиллисикунды
var out_milisec = mils + _param6751; //сложение двух полей милисикундных
var timeSpan = TimeSpan.FromMilliseconds(out_milisec);
int dd = timeSpan.Days;
int hh = (int)timeSpan.TotalHours;
int mm = timeSpan.Minutes;
int ss = timeSpan.Seconds;
return timeSpan;
}

так вот этот блок этим и занимается
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
01.02.2024, 19:26
Ну и не раскрыт вопрос: что берется в качестве интервала - разница времен текущего и прошлого получения значения или общее (накопленное)...
Допустим, опросили контроллер, он прислал "61 37488". Через 5 часов опросили еще раз: "85 40500". И что дальше?
0
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26
01.02.2024, 19:34  [ТС]
ну вот эти параметры я и опрашиваю каждый час, записываюся они в массив all_day[_hours] = _timeSpan; где _hours это время соответственно, допустим 8часов было, соотвественно ячейка массива all_day[8], далее пишется туда в 9 часов all_day[9] , а потом все это хозяйство вычитается и записывается в другой массив all_day_sub[8] = _all_day[8].Subtract(_all_day[9]);

как-то так)) п.с. мой мозг не особо молод и восприимчив к новой информации, если я что-то сегодня пишу, завтра могу в своем коде пол часа разбираться)
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
01.02.2024, 19:35
Цитата Сообщение от ssuss Посмотреть сообщение
так вот этот блок этим и занимается
Фигней этот блок занимается. Куча переменных нигде не участвующих, а возвращает снова TimeSpan... Смысл его какой?
0
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26
01.02.2024, 19:36  [ТС]
идея проста . сохранить со станка время в 8 часов утра, а потом в 9 часов утра, и получить эту разницу, что и будет являтся временим, работы станка 0_о
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
01.02.2024, 20:07
ssuss,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct TimeDataFromMCU
{
    int Minute { get; }
    int Millisec { get; }
 
    public TimeDataFromMCU(int min, int msec)
    {
        Minute = min;
        Millisec = msec;
    }
 
    public readonly int GetTotalSeconds() => Minute * 60 + Millisec / 1000;
 
    public readonly int GetDiffSecondFromAnother(TimeDataFromMCU other) =>
        Math.Abs(this.GetTotalSeconds() - other.GetTotalSeconds());
 
    public static (int day, int hrs, int min, int sec) GetSpanToDdHhMmSs(int totalsec)
    {
        TimeSpan tspan = TimeSpan.FromSeconds(totalsec);
        return (tspan.Days, tspan.Hours, tspan.Minutes, tspan.Seconds);
    }
}
C#
1
2
3
4
5
// Получили времена от контроллера...
TimeDataFromMCU td1 = new TimeDataFromMCU(61, 37488);
TimeDataFromMCU td2 = new TimeDataFromMCU(99, 40555);
Console.WriteLine(TimeDataFromMCU.GetSpanToDdHhMmSs(td1.GetDiffSecondFromAnother(td2)));
Console.Read();
Code
1
(0, 0, 38, 3)
1
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26
01.02.2024, 20:19  [ТС]
Спасибо, попробую разобраться что вы написали)
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
01.02.2024, 21:42
ssuss, может такой вариант вам пригодится (см. вложение)?
Несколько замечаний по коду:
1. В примере использован ридер заглушка, то есть он возвращает одно и тоже время. Его реализацию надо заменить на реальное чтение данных (см. комментарии в коде).
2. Возможно в список нужно помещать не сами отметки, а разницу между текущей и предыдущей. Эта логика легко реализуется, но нужно понимать что же именно требуется.
3. Форматирование временных меток можно настроить в методе ToString класса CNCWorkTime, причём можно наделать кучу перегрузок с форматтерами и без, это дело вкуса.
4. Метод Read класса CNCWorker можно/нужно обернуть в Task для освобождения потока UI. Но я не стал этого делать , так как:
Цитата Сообщение от ssuss Посмотреть сообщение
у меня неделя программирования
Да и вообще всю логику чтения станка можно загнать в отдельный поток чтобы не мешалась.
5. В примере показано как работают Binding-и на примере использования BindingList. Обратите внимание, что с листбоксом в коде мы никак не взаимодействуем, а он сам обновляется.
6. Таймер может быть настроен на любой интервал времени. Для демонстрации интервал 1 сек., но по вашим словам это должен быть час. Решается изменением одного значения.

В общем будут вопросы спрашивайте.
Вложения
Тип файла: zip CNCMachineReader.zip (14.7 Кб, 11 просмотров)
0
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26
01.02.2024, 23:01  [ТС]
Цитата Сообщение от Uswer Посмотреть сообщение
ssuss, может такой вариант вам пригодится (см. вложение)?
Несколько замечаний по коду:
1. В примере использован ридер заглушка, то есть он возвращает одно и тоже время. Его реализацию надо заменить на реальное чтение данных (см. комментарии в коде).
2. Возможно в список нужно помещать не сами отметки, а разницу между текущей и предыдущей. Эта логика легко реализуется, но нужно понимать что же именно требуется.
3. Форматирование временных меток можно настроить в методе ToString класса CNCWorkTime, причём можно наделать кучу перегрузок с форматтерами и без, это дело вкуса.
4. Метод Read класса CNCWorker можно/нужно обернуть в Task для освобождения потока UI. Но я не стал этого делать , так как:
Сообщение от ssuss
у меня неделя программирования
Да и вообще всю логику чтения станка можно загнать в отдельный поток чтобы не мешалась.
5. В примере показано как работают Binding-и на примере использования BindingList. Обратите внимание, что с листбоксом в коде мы никак не взаимодействуем, а он сам обновляется.
6. Таймер может быть настроен на любой интервал времени. Для демонстрации интервал 1 сек., но по вашим словам это должен быть час. Решается изменением одного значения.
В общем будут вопросы спрашивайте.

спасибо. буду изучать
0
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26
02.02.2024, 09:31  [ТС]
Цитата Сообщение от ssuss Посмотреть сообщение
2. Возможно в список нужно помещать не сами отметки, а разницу между текущей и предыдущей. Эта логика легко реализуется, но нужно понимать что же именно требуется.
да, именно и надо в списке видеть разницу, между текущей и предыдущей.
________________________________________ ________
Период работы | Время работы станка | Кол-во деталей
________________________________________ ________
8:00-9:00 | 40м 45с | 120
________________________________________ ________
9:00-10:00 | 35м 10с | 100
и тд. 24 часа

Примерно так табличка должна выглядеть .

Прикрутил ваш код к своей программе. Работает добавление времени в лист и тд, но что тут происходит мне понять сложно, интерфесы их реализация и все такое, и я не в состоянии что-то править под себя , к сожалению.
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
02.02.2024, 11:42
Цитата Сообщение от ssuss Посмотреть сообщение
что тут происходит мне понять сложно, интерфесы их реализация и все такое
Вкратце так - на форме листбокс, к которому привязан список отметок времени workTimes. В потоке формы работает таймер с заданным интервалом, т.е. периодически вызывается метод timer1_Tick. В этом методе вызывается метод Read класса CNCWorker, который возвращает текущую отметку времени работы станка. Эта отметка добавляется в список workTimes, при этом текущая отметка отображается в листбоксе. Всё.

Теперь о том, что является вспомогательным. Это ридер FanucReader, именно он выполняет чтение данных из станка. Его методы ReadHighParameter и ReadLowParameter вызываются в методе Read класса CNCWorker. Ридер устанавливается для класса CNCWorker при помощи инжекции через конструктор, но можно установить его и через свойство CNCReader.
Зачем интерфейс ICNCReader? У разных ЧПУ могут быть разные методы или адреса ячеек памяти (регистры) возвращающие время работы станка. Поэтому под конкретный станок (ЧПУ) надо написать свой ридер и всё, остаётся только установить у класса CNCWorker новый ридер и он будет работать с другим станком (ЧПУ). Интерфейс определяет обязательность двух методов чтения данных ReadHighParameter и ReadLowParameter в любом ридере реализующем данный интерфейс. То есть это такой контракт между конкретным ридером и классом CNCWorker.
Есть ещё конвертер CNCWorkTimeConverter, но его назначение думаю понятно.

Добавлено через 7 минут
Цитата Сообщение от ssuss Посмотреть сообщение
надо в списке видеть разницу, между текущей и предыдущей
Я бы добавил ещё один класс типа
C#
1
2
3
4
5
6
7
class CNCWorkTimePeriod
{
  public CNCWorkTime StartTime {get;set;}
  public CNCWorkTime EndTime {get;set;}
  public TimeSpan WorkTime {get;}
  public int Details {get;set;}
}
Всё что надо реализовать дополнительно это расчёт значения WorkTime из двух CNCWorkTime.
0
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26
02.02.2024, 18:59  [ТС]
Цитата Сообщение от Uswer Посмотреть сообщение
Я бы добавил ещё один класс типа
C#Выделить код
1
2
3
4
5
6
7
class CNCWorkTimePeriod
{
  public CNCWorkTime StartTime {get;set;}
  public CNCWorkTime EndTime {get;set;}
  public TimeSpan WorkTime {get;}
  public int Details {get;set;}
}
Всё что надо реализовать дополнительно это расчёт значения WorkTime из двух CNCWorkTime.
я так и сделал, теперь дальше двигаюсь)

Добавлено через 5 часов 49 минут
Uswer, я дико запутался. ничего не получается(
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
03.02.2024, 20:32
Цитата Сообщение от ssuss Посмотреть сообщение
ничего не получается(
Понимаю, новичку сложно. Лови.
С отображением временного интервала сам по колдуй, мне лень если честно.
Изображения
 
Вложения
Тип файла: zip CNCMachineReader.zip (14.8 Кб, 2 просмотров)
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
03.02.2024, 20:46
Деталей 100шт. всегда летит в конструктор класса периода, т.к. я не знаю как ты их получаешь и как лучше всего их описать классами.
Второй параметр время работы станка, т.к. используется всё та же заглушка, то время не меняется, а значит станок стоит, т.е. время его работы = 0.

Добавлено через 11 минут
Ошибку допустил, в форме замени if на этот
C#
1
2
3
4
5
6
      if (prevWorkTime != null)
      {
        CNCWorkTimePeriod newPeriod = new CNCWorkTimePeriod(prevWorkTime, currentWorkTime, 100);
        periods.Add(newPeriod);
      }
      prevWorkTime = currentWorkTime;
0
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26
03.02.2024, 21:11  [ТС]
Цитата Сообщение от Uswer Посмотреть сообщение
Деталей 100шт. всегда летит в конструктор класса периода, т.к. я не знаю как ты их получаешь и как лучше всего их описать классами.
Второй параметр время работы станка, т.к. используется всё та же заглушка, то время не меняется, а значит станок стоит, т.е. время его работы = 0.
Добавлено через 11 минут
Ошибку допустил, в форме замени if на этот
C#Выделить код
1
2
3
4
5
6
      if (prevWorkTime != null)
      {
        CNCWorkTimePeriod newPeriod = new CNCWorkTimePeriod(prevWorkTime, currentWorkTime, 100);
        periods.Add(newPeriod);
      }
      prevWorkTime = currentWorkTime;
Последний раз редактировалось Uswer; Сегодня в 20:36.
спасибо, посмотрю. Детали получаю так же запросом , где у тебя заглушки, можно и туда внедрить.
У меня не получалось, пошел другим способом, пишу сразу в БД access ,а потом хочу оттуда вытягивать данные ну и сними както уже работать)

Добавлено через 9 минут
C#
1
2
3
4
5
6
7
8
 if (prevWorkTime == null)
 {
   prevWorkTime = currentWorkTime;
 }
 else
 {
   CNCWorkTimePeriod newPeriod = new CNCWorkTimePeriod(prevWorkTime, currentWorkTime, 100);
   periods.Add(newPeriod);
вот это все заменить?
0
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26
03.02.2024, 22:38  [ТС]
получилось , работает. а мона сделать что бы лишние столбцы не выводились с timeSpan значениями?
Миниатюры
Нужна помощь в понимании как реализовать сбор данных и их обработку  
0
0 / 0 / 0
Регистрация: 30.01.2024
Сообщений: 26
03.02.2024, 23:00  [ТС]
dataGridView2.Columns[1].Visible = false; так склыл)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2024, 23:00

Помощь в понимании чужого кода
Сижу разбираю чужой ,код пытаюсь разобраться в нем , и ни как не пойму зачем вот эти поля ? private int FPS = 30; private int...

Помощь в понимании части программы
Всем доброго вечера! Я был бы очень благодарен, если бы поможете мне в понимании части кода программы. Это функция, через которую...

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

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

Как ускорить обработку обработку данных в Пайтон?!?!
Можно ли как-то ускорить обработку данных в Пайтон?!?! Мне нужно таблицу умножения I строк на J столбцов, где потом посчитать количество...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru