Ответы в темах
-
АвторСообщения
-
JurasskParkУчастникМодуль подразумевает не только выгрузку, но еще и синхронизацию данных.
Пока сделал хранения данных в таблицах по типу:
— мгновенные значения
— тренды
— минутные
— часовые
— суточные
Данные передаются только мгновенные, а уже на основе их данные запись появляется в нужной таблице.
Думал, о том чтобы считать среднее у часовых или суточных… Но не знаю.
А вот писать значение, когда изменилось часовое или суточное… Я думаю это нужно, т.к. постоянная проблема с обнаружением, когда часовое на самом деле сформировалось, например, в 14:00 или 14:03, а может в 13:59.
JurasskParkУчастникПосле смены пароля, пароль в конфигурации, надо менять вручную и потом перезапустить вручную.
JurasskParkУчастникТоже самое что и ModArcMSSql, только теперь данные текущие не складывает. 🙂
JurasskParkУчастникhttps://youtu.be/VwQ8EEK8Mfg?si=1G55K8jKZBRhG-g2
Промежуточная версия.
JurasskParkУчастникВсё. Теперь понятно. Тогда возвращаю ScadaClient. 🙂
JurasskParkУчастникmanjey73, в моём варианте проще. Так как module сервера… Хотя стоп… Администратор и проект всё равно на одном ПК находится.
P.S. я уже склоняюсь не мучиться и вернуть ScadaClient чтобы считывать конфигурацию…
JurasskParkУчастникХм… Была идея еще через BaseTableAdapter читать файл с диска…
Но не хочется писать костыли, если вы говорите, что всё уже есть.
Помогите, пожалуйста, как из Module.View обратиться к таблицам, чтобы их считать со значениями. =)
JurasskParkУчастникЯ немного запутался.
Вопрос №1. Можно ли обратиться из Module.View к ServerContext? Если да, то как? Я тупой. 😀
У меня клиент прописан в у модуля и для Logic и для View.Я понимаю, чтобы обратиться к interface, нужно создать Class, реализовать интерфейсы в нем ServerContext. Но если честно, я думал, что есть что-то попроще…
Объявить Manager, в нем объявить Storage… Вот как этот Storage инициализировать я опять не понял… Тупой. 😀
/// <summary> /// Reads the configuration database from the storage. /// </summary> private bool ReadConfigDatabase() { string tableTitle = CommonPhrases.UndefinedTable; try { configDatabase = new ConfigDatabase(); foreach (IBaseTable baseTable in configDatabase.AllTables) { tableTitle = baseTable.Title; storage.ReadBaseTable(baseTable); } tableTitle = CommonPhrases.UndefinedTable; configDatabase.Init(); DebugerLog(Locale.IsRussian ? "База конфигурации считана успешно" : "The configuration database has been read successfully"); return true; } catch (Exception ex) { DebugerLog(Locale.IsRussian ? "Ошибка при чтении базы конфигурации, таблица {0}" : "Error reading the configuration database, the {0} table"); return false; } }
JurasskParkУчастникprivate void dgvComm_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) { if (this.dgvComm.CurrentCell.RowIndex == -1) return; switchCellCommFormat(e); } private void switchCellCommFormat(DataGridViewCellMouseEventArgs e) { if (e.ColumnIndex == 4) { DataGridViewComboBoxCell viewComboBoxCell = new DataGridViewComboBoxCell(); viewComboBoxCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing; viewComboBoxCell.Style.BackColor = Color.White; //viewComboBoxCell.DataSource = (object)this.Format; this.dgvComm[e.ColumnIndex, e.RowIndex] = (DataGridViewCell)viewComboBoxCell; } }Поменяйте логику.
dgvComm_CellMouseClick замените на CellClick.
e.ColumnIndex замените на dgvComm.CurrentCell.ColumnIndex (у Row тоже).Если коротко, то структура и смысл остаются тот же самый, но вот так. Пример.
private void dgvComm_CellClick(object sender, DataGridViewCellEventArgs e) { if (dgvComm.CurrentCell.ColumnIndex == 4) { dgvComm.Tag = dgvComm.CurrentCell.ColumnIndex.ToString();//запоминаем ячейку DataGridViewComboBoxCell dcombo = new DataGridViewComboBoxCell();//создаём ComboBox dcombo.Items.Add("0");//заполняем ComboBox dcombo.Items.Add("1"); dgvComm.Rows[dgvComm.CurrentRow.Index].Cells[dgvComm.CurrentCell.ColumnIndex] = dcombo;//показываем в ячейке ComboBox } }P.S. А если честно, то я тоже поломал голову над этим. Короче, смысл в том, что если номер строки и столбца одинаковый, то CellMouseClick так себя ведёт. 😀
JurasskParkУчастникБез аргументов схема грузится
Ну вот вы и сами ответил на свой вопрос. В аргументах нельзя передавать слэш \
🙂
JurasskParkУчастникА сама то мнемосхема по этому пути есть?:)
JurasskParkУчастникМихаил, прошу прощения. Вопрос снят. Как всегда — сначала написал, потом подумал.
Вопрос был в том, что я через клиент — скачивал таблицы.
foreach (IBaseTable baseTable in configDatabase.AllTables) { client.DownloadBaseTable(baseTable); }А как получить структуру таблицы из модуля без client.DownloadBaseTable?
И теперь понял, что я забыл объявить переменную configDatabase = new ConfigDatabase(); 🙂
JurasskParkУчастникВосстанавливаю тему. 😀
https://www.youtube.com/watch?v=RMP2D3e0IBE
Если коротко, то драйвер был написан, часть функционала уже неактуальна по причине того, что Михаил доделал Export.
Если коротко, то модуль хранит в БД структуру проекта со всеми записями и позволяет из названия устройства, канал и девайса сделать тег, который позволит другим системам обращаться за данными по названию тегу, а не его номеру.Вводная часть закончилась.
Сейчас я хочу перенести драйвер коммуникатора в модуль сервера.
Вопрос. Если из драйвера коммуникатора я подключаюсь к серверу через клиент, то как я могу из модуля обратиться к структуре таблиц? 🙂
JurasskParkУчастникИдея для размышления.
Если канал работает, значет он посылает логи серверу. Мы же в админке видим эти логи. Значит если канал работает, значит логи поступают. Отсюда надо смотреть приходят логи по каналу — значит канал запущен. ?
JurasskParkУчастниквопрос как контролировать в WEB что линия запущена/остановлена ?
Тег, который всегда будет больше нуля, если линия запущена. Например, мгновенное значение чего-либо, например, температуры. И по формуле определять истина или ложь. ?
Шутка.
-
АвторСообщения