|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
26.05.2009, 11:01 | #1 |
Пользователь
Регистрация: 26.05.2009
Сообщений: 26
|
Обновление списка данных без потери данных в переменных
Здравствуйте. Я тут в первый раз. Прошу вашей помощи.
В общем проблема такая. Пишу я проект. Получилось так что пишу один. Это нужно по работе. Проект заключается в том, что по всему городу, думаю в административных зданиях, будут установлены электронные модули датчиков, которые имеют сетевой интерфейс 100BaseT. Каждый такой модуль имеет 8 дискретных датчиков и два аналоговых. На что будут подцеплены такие датчики меня не касается. Они работают на замыкание или размыкание, смотря какое у них исходное состояние. Я пишу сервер. На сервере стоит TServerSocket, который опрашивает все эти модули датчиков поочереди в цикле, т.е. просто перебирает IP-адреса и подключается. При подключении к модулю с него получаю данные, 11 четырехбайтовые числа в шестнадцатиричном формате. Каждое число это счетчик секунд от нуля. Потом происходит Disconnect (в электронном модуле это аппаратно сделано, сосчитал данные и потом он обрубает связь). Так вот. Я сделал базу данных на Firebird. Есть в этой БД таблица Info_Module, в которой содержатся данные о модуле датчиков: ID - ну с этим понятно IP - IP-адрес модуля Enable_IP - включен ли модуль (0 или 1) - тип CHAR[1] MAC - MAC-адрес модуля ADDR - адрес установки (адрес здания, где установлен модуль) Nane_Place - место установки (где он в этом здании установлен) Remark - примечание При загрузке сервера все IP-адреса заносятся в слудующую структуру: Код:
Код:
|
26.05.2009, 11:02 | #2 |
Пользователь
Регистрация: 26.05.2009
Сообщений: 26
|
Потом я запускаю отдельный поток, где происходит циклический перебор IP-адресов:
Код:
|
26.05.2009, 11:02 | #3 |
Пользователь
Регистрация: 26.05.2009
Сообщений: 26
|
Счетчик тикает не бесконечно, а до 64801 значения, потом просто останавливается, но это и не важно, так как если датчик сработает, то он встанет в ноль, а значит новое значение будет меньше или равно нулю чем 64801 и прога зарегистрирует активность датчика. Но вся эта тема затевалась не для рассказа о датчиках.
Вот собственно подошли к самой теме. Сервер должен работать постоянно на компьютере. К нему будут подключены клиенты, которые будут следить за состоянием этих датчиков. Есть программа (доделывается), которая админит базу данных, т.е. добавление, редактирование, удаление. Вот представьте, я загрузил сервер. Все IP-адреса из БД записались в структуру, т.е. в оперативную память. Тут решили установить новые электронные модули датчиков. Подредактировать некоторые IP-адреса, ну случайно ввели неверные и удалить пару старых адресов, может убрали из здания. Пару адресов заблокировали (Enable_IP = 0), может сломались. Получается сто данные в таблице Info_Module поменялись. Вот проблема состоит в том, что мне надо обновить список адресов не перезапуская сервер и не теряя данные об активных датчиках. Раскрою тему. Например сработало несколько датчиков. В структуре fParameters[индекс].Activate[индекс] стало True. Но при считывании списка у меня вся структура обнуляется nil. Я не могу ее не обнулять, т.к. список то поменялся. Вот не знаю что делать. Мне нужен совет или идеи какие-то. Может код какой. Я так думаю. Может создать в БД еще таблицу и вней иметь одно поле в котором будет значение 1 либо 0. При изменении списка в Info_Module значение будет 1. Это даст понять проге что надо обновить список IP-адресов. А вот что делать дальше??? Может я как-то непонятно объяснил, если вопросы есть - задавайте. Может получится разжевать попроще. |
26.05.2009, 15:58 | #4 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
датчики, датчики
многабукф как я понял: у тебя есть куча датчиков, в таблице есть описание какие, где стоят и как к ним добраться по сети теперь про структуры - это все замечательно, но не проще ли было бы получать инфу с датчика и писать его состояние в какую-нить еще таблицу - айди_датчика, дата_время, состояние историю изменений привязки айди_датчика, место_в_городе, айпи можно вести, чтобы понимать как перемещались во времени датчики (плановая замена, переезд и т.п.) инфу о активных датчиках в данный момент можно получать через запрос к соответствующей табличке, либо один запрос в начале, а потом инкрементные добавления в мемори_тейбл - главное, чтобы инфа при поступлении писалась в БД, а уж как ее отобразить дело десятое (короче, вариантов вагон и маленькая тележка) Последний раз редактировалось soleil@mmc; 26.05.2009 в 16:01. |
26.05.2009, 16:18 | #5 |
Пользователь
Регистрация: 26.05.2009
Сообщений: 26
|
Ничего из этого не понял. Мне не надо просматривать жив датчик или нет.
Мне надо, если я например удалил из списка в БД один IP-адрес, чтобы в проге обновился список. Вот как его обновить? Потому что как я уже писал перед обновлением списка прошлый список обнуляется и при этом теряется информация об уже сработавших датчиках. |
26.05.2009, 16:47 | #6 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
ну давай по порядку
список датчиков хранится в БД а где хранится состояние(состояния) датчика? |
27.05.2009, 08:53 | #7 |
Пользователь
Регистрация: 26.05.2009
Сообщений: 26
|
сначало надо определиться по датчикам. Есть электронная коробочка - модуль, у которого есть свой IP. К этому модулю подключаются датчики. Т.е. речь идет не о датчиках, а о модуле датчиков. Вот в БД как раз хранятся IP-адреса этих модуей. Дальше.
Состояние датчиков, которые считываются из модуля, хранятся в оперативной памяти в той структуре что я указал. Каждый раз при считывании данных структура обновляется (функция function TListSocket.FillPars(AText: AnsiString; AIndex: Integer): boolean Вот как бы обновить список IP (а он хранится в этой же структуре, чтобы не потерять данные в переменных: D1, D2, D3, D4, D5, D6, P1, P2, A1, A2, TimeFromOn: WORD; Activated: array [0..8] of boolean; ActivatedPrev: array [0..8] of boolean; Я пробовал делать две структуры. Одна сисок IP и вторая вот эти переменные и просто делать ссылку на список. Но снова при изменении списка IP как определить на какое место переместился нужный IP и снова ничего не получается. А вообще ответ от модуля приходит вот такой: "0049004900140049000800100049000B01 6300DC0001" - 44 байта. Ответ состоит из 11-ти 4-х байтовых чисел в шесстнадцатиричном виде, т.е. в данном случае будет вот так: D1 = 73 секунды, D2 = 73 секунды, D3 = 20 секунд, D4 = 73 секунды, D5 = 8 с, D6 = 16 с, P1 = 73 с, P2 = 11 с, A1 = 355 вольт, A2 = 220 вольт, TimeFromOn = 1 минута Это пример, я просто нажал поочереди через промежуток времени на кнопки датчиков, чтобы они сработали. Я просто разбираю эту строку в функции FillPars Последний раз редактировалось VaBank; 27.05.2009 в 09:12. |
28.05.2009, 10:43 | #8 |
Пользователь
Регистрация: 26.05.2009
Сообщений: 26
|
Ну что так никто и не поможет???
|
28.05.2009, 11:45 | #9 |
SQL-коддинг
Участник клуба
Регистрация: 16.01.2009
Сообщений: 1,192
|
можно с другой стороны подойти
добавить в твою табл. info_module поле Date_add date, в которое на триггере писать дату-время добавления датчика в БД далее по твоей же схеме, после выполнения первого запроса Код:
Код:
и еще, имхо нехорошо так получать кол-во объектов Код:
лучше сделать отдельный запрос по кол-ву записей типа такого Код:
Последний раз редактировалось soleil@mmc; 28.05.2009 в 11:51. |
28.05.2009, 11:50 | #10 |
Пользователь
Регистрация: 26.05.2009
Сообщений: 26
|
Про Count совсем забыл грешен. Но снова не в этом проблема. Снова повторю вопрос:
Как обновить список не теряя данные в структуре? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обновление данных | S@fer | БД в Delphi | 12 | 17.10.2010 16:01 |
Спрятать файл внутри другого файла без потери работоспособности обоих | V@Noff | Общие вопросы Delphi | 9 | 03.11.2009 16:18 |
Корректировка данных в переменных | celovec | Общие вопросы Delphi | 10 | 28.01.2008 02:29 |
Обновление данных в БД | EdNovice | БД в Delphi | 4 | 26.06.2007 14:35 |