logoff | Дата: Вторник, 27.09.2011, 21:00 | Сообщение # 1 |
Тамбов
Группа: Администраторы
Сообщений: 655
Репутация: 19
Статус: Offline
| Для статьи CyberFleet: реализация своего датчика (виртуального)
Для среды: MSDE или старше
Code USE [BN_Jobs] GO /****** Object: StoredProcedure [dbo].[Alarm_on_No_Action] Script Date: 09/27/2011 20:03:29 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Бондарь Михаил aka LogOff -- Create date: 27/09/2011 -- Description: Процедура вывода тревожного датчика при отсутствии ДУТ более 30 мин. -- ============================================= Create PROCEDURE [dbo].[Alarm_on_no_DUT] AS BEGIN SET NOCOUNT ON;
declare @d datetime set @d=getdate() declare @sens_num int -- номер датчика для срабатывания declare @check_det int-- период срабатывания declare @check_AlarmPeriod int-- период вывода информации не чаще set @sens_num=30 set @check_det=30*60 -- разница между послдениеми данные и ДУТ не больше чем сек set @check_AlarmPeriod=60*60; -- время для фильтра о последних данных сек
-- если пользователь забыл указать какие-то значения по умолчанию то сделаем это за него print '@sens_num='+cast(@sens_num as varchar) print '@check_det='+cast(@check_det as varchar) --print '@check_AlarmPeriod='+cast(@check_AlarmPeriod as varchar) print '--------------------' -- получение списка приборов на проверку. declare devices cursor local read_only for select s.device_id,code,o.ObjectID,cd.tele_time tele_time,cd.long,cd.lat,cd.direction from bn.dbo.SYS_DEV_Sensor as s inner join bn.dbo.SYS_DEV_Device as D on d.DeviceActive=1 and d.id=s.device_id inner join bn.dbo.FLEET_Object as O on o.Device_ID=s.device_id -- присоединим таблицу сенсоров, но с фильтром по датчику ДУТ - она сработает фильтром inner join bn.dbo.SYS_DEV_Sensor as Sdut on Sdut.device_id=s.device_id and Sdut.num=10 and sdut.[sensor_type_id]=0 and sdut.sensoractive=1 inner join bn.dbo.SYS_DEV_CurrentData as CD on cd.device_id=s.device_id where s.SensorActive=1 and s.num=30 and s.[sensor_type_id]=1 -- фильтр что есть наш датчик и что он активен and datediff(ss,sdut.[tele_time],cd.tele_time)>@check_det -- фильтр, что данные от датчика и данные о координатах не разнесены больше чем на указанное количество секунд and datediff(ss,sdut.[tele_time],@d)<=@check_AlarmPeriod -- фильтр, что данные от датчика и данные о координатах не разнесены больше чем на указанное количество секунд
declare @Object_id int, @long float,@lat float,@dir int declare @dev_id int,@device_code varchar(16),@tele_time datetime open devices fetch next from devices into @dev_id,@device_code,@Object_id,@tele_time,@long,@lat,@dir while @@fetch_status=0 begin -- сначала проверим, что тс входит в группу для которой в это время нужно делать проверку print '@dev_id='+cast(@dev_id as varchar(10)) print 'INSERT INTO [BN].[dbo].[SYS_DEV_DirtyData]' INSERT INTO [BN].[dbo].[SYS_DEV_DirtyData] ([device_code] ,[tele_time] ,[server_time] ,[transfer_time] ,[long] ,[lat] ,[valid] ,[speed] ,[direction] ,[height] ,[digit_sens_num] ,[analog_sens_num] ,[analog_data] ,[flags]) VALUES (@device_code ,getdate() ,getdate() ,getdate() ,@long ,@lat ,0 -- данные не валидные ,0 ,@dir ,0 ,power(2,@sens_num-1) ,null ,-1 -- флаг, что пробег не учитывать ,null) fetch next from devices into @dev_id,@device_code,@Object_id,@tele_time,@long,@lat,@dir end close devices deallocate devices END где
set @sens_num=30 -- номер нашего датчика - единый для всех приборов set @check_det=30*60 -- разница между послдениеми данные и ДУТ не больше чем сек set @check_AlarmPeriod=60*60; -- время для фильтра о последних данных сек
Процедура рассчитана на то, что БД КиберФлита у вас находится на том же сервере, под именем BN Процедура для базы данных BN_Jobs
|
|
| |