24.11.2024
Эффективная Навигация М2М
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Процедура срабатывания виртуального датчика
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
 
  • Страница 1 из 1
  • 1
Поиск:

LogOff © 2024
Сайт создан в системе uCoz Рейтинг GPS Клуба. GPS навигаторы. GPS мониториг. GPS трекеры. ГЛОНАСС