示例#1
0
        public BACnetObjectIdentifier(BACnetEnums.BACNET_OBJECT_TYPE objectType, uint objectInstance)
        {
            if (objectInstance >= BACnetEnums.BACNET_MAX_INSTANCE)
            {
                throw new Exception("m0183 - Illegal instance value");
            }

            this.objectType     = objectType;
            this.objectInstance = objectInstance;
        }
示例#2
0
        public void DecodeContextTag(byte[] buffer, ref int pos)
        {
            if ((buffer[pos++] & 0x0f) != (0x08 | 0x04))
            {
                throw new Exception("m0045 - Illegal context tag for Object Identifier");
            }
            this.objectType = (BACnetEnums.BACNET_OBJECT_TYPE)(((uint)buffer[pos] << 2) | ((uint)buffer[pos + 1] >> 6));

            objectInstance  = ((uint)buffer[pos + 1] & 0x3f) << 16;
            objectInstance |= ((uint)buffer[pos + 2]) << 8;
            objectInstance |= ((uint)buffer[pos + 3]);

            pos += 4;
        }
示例#3
0
        private void SendBinaryOutput(bool OnState)
        {
            TestWriteLabel.Text = "...";

            // Assume just Binary Output for now ...
            BACnetEnums.BACNET_OBJECT_TYPE objtype = BACnetEnums.BACNET_OBJECT_TYPE.OBJECT_BINARY_OUTPUT;
            BACnetEnums.BACNET_PROPERTY_ID propid  = BACnetEnums.BACNET_PROPERTY_ID.PROP_PRESENT_VALUE;
            int idx = ObjectList.SelectedIndex;

            if (idx >= 0)
            {
                string s  = ObjectList.Items[idx].ToString();
                string s1 = s.Substring(15);
                if (s1.Length > 0)
                {
                    uint     objinst  = Convert.ToUInt32(s1);
                    Property property = new Property();
                    property.Tag = BACnetEnums.BACNET_APPLICATION_TAG.BACNET_APPLICATION_TAG_ENUMERATED;
                    if (OnState)
                    {
                        property.ValueEnum = 1; // Turn it on
                    }
                    else
                    {
                        property.ValueEnum = 0; // Turn it off
                    }
                    if (BACStack.SendWriteProperty(
                            BACnetData.DeviceIndex,
                            (uint)objinst,
                            -1,
                            objtype,
                            propid,
                            property,
                            1))
                    {
                        TestWriteLabel.Text = "Binary Output " + (OnState ? "On" : "Off");
                    }
                    else
                    {
                        TestWriteLabel.Text = "Binary Output On Error";
                    }
                }
            }
        }
示例#4
0
        private void ReadPresentValueBtn_Click(object sender, EventArgs e)
        {
            PresentValueLabel.Text = "...";

            // Assume just Binary Output for now ...
            BACnetEnums.BACNET_OBJECT_TYPE objtype = BACnetEnums.BACNET_OBJECT_TYPE.OBJECT_BINARY_OUTPUT;
            BACnetEnums.BACNET_PROPERTY_ID propid  = BACnetEnums.BACNET_PROPERTY_ID.PROP_PRESENT_VALUE;
            int idx = ObjectList.SelectedIndex;

            if (idx >= 0)
            {
                string s  = ObjectList.Items[idx].ToString();
                string s1 = s.Substring(15);
                if (s1.Length > 0)
                {
                    uint     objinst  = Convert.ToUInt32(s1);
                    Property property = new Property();

                    if (!BACStack.SendReadProperty(BACnetData.DeviceIndex,
                                                   (uint)objinst,
                                                   -1,
                                                   objtype,
                                                   propid,
                                                   property))
                    {
                        PresentValueLabel.Text = "Read Present Value Error (1)";
                        return;
                    }
                    if (property.Tag != BACnetEnums.BACNET_APPLICATION_TAG.BACNET_APPLICATION_TAG_ENUMERATED)
                    {
                        PresentValueLabel.Text = "Read Present Value Error (2)";
                        return;
                    }
                    if (property.ValueEnum == 1)
                    {
                        PresentValueLabel.Text = "Binary Output On";
                    }
                    else
                    {
                        PresentValueLabel.Text = "Binary Output Off";
                    }
                }
            }
        }
示例#5
0
        public void Decode(byte[] buffer, ref int pos)
        {
            // get the tag class, length

            uint cl = buffer[pos++];

            if (cl != 0xc4)
            {
                throw new Exception("m0041 - Missing Application Tag for Object Identifier");
            }

            this.objectType = (BACnetEnums.BACNET_OBJECT_TYPE)(((uint)buffer[pos] << 2) | ((uint)buffer[pos + 1] >> 6));

            objectInstance  = ((uint)buffer[pos + 1] & 0x3f) << 16;
            objectInstance |= ((uint)buffer[pos + 2]) << 8;
            objectInstance |= ((uint)buffer[pos + 3]);

            pos += 4;
        }
示例#6
0
        // Create a new Application Tag

        public BACnetObjectIdentifier(byte[] buf, ref int offset, BACnetEnums.TAG tagType, BACnetEnums.BACNET_APPLICATION_TAG appTag)
        {
            // is the next parameter even an application tag
            if ((buf[offset] & 0x08) != 0x00)
            {
                // we have an unexpected context tag, sort this out
                BACnetLibraryCL.Panic("Not a context tag");
                // todo, now is there a way to avoid creating the object? Have to flag it at least...
                return;
            }

            if ((BACnetEnums.BACNET_APPLICATION_TAG)(((buf[offset] & 0xf0) >> 4)) != appTag)
            {
                // we have an unexpected context tag, sort this out
                BACnetLibraryCL.Panic("Unexpected application tag");
                // todo, now is there a way to avoid creating the object? Have to flag it at least...
                return;
            }

            int contextTagSize = buf[offset] & 0x07;

            offset++;

            switch (appTag)
            {
            case BACnetEnums.BACNET_APPLICATION_TAG.BACNET_APPLICATION_TAG_OBJECT_ID:
                if (contextTagSize != 4)
                {
                    // we dont have a legal object ID!
                    BACnetLibraryCL.Panic("Illegal length");
                    return;
                }

                this.objectType = (BACnetEnums.BACNET_OBJECT_TYPE)(((uint)buf[offset] << 2) | ((uint)buf[offset + 1] >> 6));

                objectInstance  = ((uint)buf[offset + 1] & 0x3f) << 16;
                objectInstance |= ((uint)buf[offset + 2]) << 8;
                objectInstance |= ((uint)buf[offset + 3]);

                offset += 4;
                return;
            }
        }
示例#7
0
        public dynamic ReadValue(Device device, BACnetEnums.BACNET_OBJECT_TYPE bacnetObjectType, uint instance,
                                 BACnetEnums.BACNET_PROPERTY_ID bacnetPropertyId = BACnetEnums.BACNET_PROPERTY_ID.PROP_PRESENT_VALUE)
        {
            BACnetEnums.BACNET_OBJECT_TYPE objtype = bacnetObjectType;
            BACnetEnums.BACNET_PROPERTY_ID propid  = bacnetPropertyId;

            uint     objinst  = instance;
            Property property = new Property();

            if (!BACStack.SendReadProperty(device,
                                           (uint)objinst,
                                           -1,
                                           objtype,
                                           propid,
                                           property))
            {
                return(-1);
            }

            return(property);
        }
示例#8
0
        // Create a new Context Tag

        public BACnetObjectIdentifier(byte[] buf, ref int offset, BACnetEnums.TAG tagType, int tagValue)
        {
            // is the next parameter even a context tag
            if ((buf[offset] & 0x08) != 0x08)
            {
                // we have an unexpected context tag, sort this out
                throw new Exception("m0177-Not a context tag");
                // todo, now is there a way to avoid creating the object? Have to flag it at least...
                //return;
            }

            if ((buf[offset] & 0xf0) != (tagValue << 4))
            {
                // we have an unexpected context tag, sort this out
                throw new Exception("m0174-Unexpected context tag");
                // todo, now is there a way to avoid creating the object? Have to flag it at least...
                //return;
            }

            int contextTagSize = buf[offset] & 0x07;

            // the length of a bacnet object identifier better be 4

            if (contextTagSize != 4)
            {
                // we have an unexpected context tag, sort this out
                throw new Exception("m0175-Unbelievable length of object identifier");
                // todo, now is there a way to avoid creating the object? Have to flag it at least...
                //return;
            }


            objectType = (BACnetEnums.BACNET_OBJECT_TYPE)(((uint)buf[offset + 1] << 2) | ((uint)buf[offset + 2] >> 6));

            objectInstance  = ((uint)buf[offset + 2] & 0x3f) << 16;
            objectInstance |= ((uint)buf[offset + 3]) << 8;
            objectInstance |= ((uint)buf[offset + 4]);

            offset += 5;
        }
        public async Task ReadValue()
        {
            try
            {
                Entities = new IndustrialMonitoringEntities();

                if (this.DefinationType == ItemDefinationType.SqlDefined)
                {
                    if (this.Type == ItemType.Digital)
                    {
                        SubscriberBool = new NetworkVariableBufferedSubscriber <bool>(this.Location);
                        SubscriberBool.Connect();
                    }
                    else if (this.Type == ItemType.Analog)
                    {
                        SubscriberInt = new NetworkVariableBufferedSubscriber <dynamic>(this.Location);
                        SubscriberInt.Connect();
                    }
                }
                else if (this.DefinationType == ItemDefinationType.BACnet)
                {
                    if (BACnetDevice == null)
                    {
                        this.BACnetDevice = BACnetDevice.Instance;
                    }

                    string     ip       = ItemObj.BACnetIP;
                    int        port     = ItemObj.BACnetPort.Value;
                    IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), port);
                    uint       instance = (uint)ItemObj.BACnetControllerInstance.Value;

                    DeviceBaCnet = new Device("Device", 0, 0, endPoint, 0, instance);
                }


                string value = "-1000";

                if (this.DefinationType == ItemDefinationType.SqlDefined)
                {
                    if (this.Type == ItemType.Digital)
                    {
                        var data = SubscriberBool.ReadData();
                        value = Convert.ToInt32(data.GetValue()).ToString();
                    }
                    else if (this.Type == ItemType.Analog)
                    {
                        var data = SubscriberInt.ReadData();
                        value = Math.Round(data.GetValue(), 2).ToString();
                    }
                }
                else if (this.DefinationType == ItemDefinationType.CustomDefiend)
                {
                    switch (this.ItemId)
                    {
                    case 10:
                        value = (BSProcessDataServiceClient.GetPreHeatingZoneTemperature() / 10).ToString();
                        break;

                    case 13:
                        value = BSProcessDataServiceClient.GetSterilizerZoneTemperature().ToString();
                        break;

                    case 14:
                        value = (BSProcessDataServiceClient.GetCoolingZoneTemperature() / 10).ToString();
                        break;
                    }
                }
                else if (this.DefinationType == ItemDefinationType.BACnet)
                {
                    if (this.Type == ItemType.Digital)
                    {
                        BACnetEnums.BACNET_OBJECT_TYPE bacnetType = (BACnetEnums.BACNET_OBJECT_TYPE)ItemObj.BACnetItemType.Value;
                        uint itemInstance = (uint)ItemObj.BACnetItemInstance.Value;
                        value = BACnetDevice.ReadValue(DeviceBaCnet, bacnetType, itemInstance).ToString();
                    }
                    else if (Type == ItemType.Analog)
                    {
                        BACnetEnums.BACNET_OBJECT_TYPE bacnetType = (BACnetEnums.BACNET_OBJECT_TYPE)ItemObj.BACnetItemType.Value;
                        uint itemInstance = (uint)ItemObj.BACnetItemInstance.Value;

                        string preValue       = BACnetDevice.ReadValue(DeviceBaCnet, bacnetType, itemInstance).ToString();
                        double preValueDouble = double.Parse(preValue);
                        value = Math.Round(preValueDouble, 2).ToString();
                    }
                }

                lock (padlock)
                {
                    if (value == null)
                    {
                        return;
                    }

                    if (value == "-1000")
                    {
                        return;
                    }

                    double valueDouble = double.Parse(value);

                    bool condition = !string.IsNullOrEmpty(ItemObj.MinRange) && !string.IsNullOrEmpty(ItemObj.MaxRange);
                    if (condition)
                    {
                        double minRange = double.Parse(ItemObj.MinRange);
                        double maxRange = double.Parse(ItemObj.MaxRange);

                        bool shouldNormalize = false;

                        if (ItemObj.NormalizeWhenOutOfRange != null)
                        {
                            shouldNormalize = ItemObj.NormalizeWhenOutOfRange.Value;
                        }

                        if (valueDouble < minRange)
                        {
                            if (shouldNormalize)
                            {
                                value = ItemObj.MinRange;
                            }
                            else
                            {
                                return;
                            }
                        }

                        if (valueDouble > maxRange)
                        {
                            if (shouldNormalize)
                            {
                                value = ItemObj.MaxRange;
                            }
                            else
                            {
                                return;
                            }
                        }
                    }

                    // detect outliers

                    bool isOutlier = false;
                    int  outlierId = 0;

                    int numberOfDataForBoxplot = 0;

                    if (ItemObj.NumberOfDataForBoxplot != null)
                    {
                        numberOfDataForBoxplot = ItemObj.NumberOfDataForBoxplot.Value;
                    }

                    if (numberOfDataForBoxplot > 2)
                    {
                        if (this.Type == ItemType.Analog)
                        {
                            var lastData = Entities.ItemsLogRawDatas.Where(x => x.ItemId == ItemId).OrderByDescending(x => x.ItemLogRawDataId).Take(numberOfDataForBoxplot).ToList();

                            if (lastData.Count > 3)
                            {
                                List <double> lastDataInDouble = new List <double>();

                                foreach (var itemsLog in lastData)
                                {
                                    double currentValue = double.Parse(itemsLog.Value);

                                    lastDataInDouble.Add(currentValue);
                                }

                                var iqr = Statistics.InterquartileRange(lastDataInDouble);
                                var lqr = Statistics.LowerQuartile(lastDataInDouble);
                                var uqr = Statistics.UpperQuartile(lastDataInDouble);


                                if (valueDouble > 3 * iqr + uqr)
                                {
                                    isOutlier = true;
                                }

                                if (valueDouble < lqr - 3 * iqr)
                                {
                                    isOutlier = true;
                                }

                                if (isOutlier)
                                {
                                    LogOutlier logOutlier = new LogOutlier();
                                    logOutlier.ItemId = this.ItemId;
                                    logOutlier.IQR    = iqr.ToString();
                                    logOutlier.LQR    = lqr.ToString();
                                    logOutlier.UQR    = uqr.ToString();
                                    logOutlier.Value  = valueDouble.ToString();
                                    logOutlier.Time   = DateTime.Now;

                                    Entities.LogOutliers.Add(logOutlier);
                                    Entities.SaveChanges();

                                    outlierId = logOutlier.OutlierId;
                                }
                            }
                        }
                    }

                    //


                    // Save in ItemsLogRawData

                    var lastItemLogRaw = Entities.ItemsLogRawDatas.OrderByDescending(x => x.ItemLogRawDataId).FirstOrDefault(x => x.ItemId == ItemId);

                    if (lastItemLogRaw == null)
                    {
                        ItemsLogRawData rawData = new ItemsLogRawData();
                        rawData.ItemId = ItemId;
                        rawData.Value  = value;
                        rawData.Time   = DateTime.Now;

                        if (outlierId > 0)
                        {
                            rawData.OutlierId = outlierId;
                        }

                        Entities.ItemsLogRawDatas.Add(rawData);
                        Entities.SaveChanges();

                        lastItemLogRaw = rawData;
                    }

                    if (SaveInItemsLogWhen == WhenToLog.OnTimerElapsed)
                    {
                        TimeSpan timeSpan = DateTime.Now - lastItemLogRaw.Time;

                        if (timeSpan.TotalSeconds >= SaveInItemsLogTimeInterval)
                        {
                            ItemsLogRawData rawData = new ItemsLogRawData();
                            rawData.ItemId = ItemId;
                            rawData.Value  = value;
                            rawData.Time   = DateTime.Now;

                            if (outlierId > 0)
                            {
                                rawData.OutlierId = outlierId;
                            }

                            Entities.ItemsLogRawDatas.Add(rawData);
                            Entities.SaveChanges();
                        }
                    }
                    else if (SaveInItemsLogWhen == WhenToLog.OnChange)
                    {
                        if (lastItemLogRaw.Value != value)
                        {
                            ItemsLogRawData rawData = new ItemsLogRawData();
                            rawData.ItemId = ItemId;
                            rawData.Value  = value;
                            rawData.Time   = DateTime.Now;

                            if (outlierId > 0)
                            {
                                rawData.OutlierId = outlierId;
                            }

                            Entities.ItemsLogRawDatas.Add(rawData);
                            Entities.SaveChanges();
                        }
                        else
                        {
                            if (DateTime.Now - lastItemLogRaw.Time > new TimeSpan(0, 0, 1, 0))
                            {
                                ItemsLogRawData rawData = new ItemsLogRawData();
                                rawData.ItemId = ItemId;
                                rawData.Value  = value;
                                rawData.Time   = DateTime.Now;

                                if (outlierId > 0)
                                {
                                    rawData.OutlierId = outlierId;
                                }

                                Entities.ItemsLogRawDatas.Add(rawData);
                                Entities.SaveChanges();
                            }
                        }
                    }
                    //

                    if (!isOutlier)
                    {
                        var lastItemLog = Entities.ItemsLogs.OrderByDescending(x => x.ItemLogId).FirstOrDefault(x => x.ItemId == ItemId);

                        if (lastItemLog == null)
                        {
                            ItemsLog itemsLog = new ItemsLog();
                            itemsLog.ItemId = this.ItemId;
                            itemsLog.Time   = DateTime.Now;
                            itemsLog.Value  = value;
                            Entities.ItemsLogs.Add(itemsLog);

                            Entities.SaveChanges();

                            lastItemLog = itemsLog;
                        }

                        if (SaveInItemsLogWhen == WhenToLog.OnTimerElapsed)
                        {
                            TimeSpan timeSpan = DateTime.Now - lastItemLog.Time;

                            if (timeSpan.TotalSeconds >= SaveInItemsLogTimeInterval)
                            {
                                ItemsLog itemsLog = new ItemsLog();
                                itemsLog.ItemId = this.ItemId;
                                itemsLog.Time   = DateTime.Now;
                                itemsLog.Value  = value;
                                Entities.ItemsLogs.Add(itemsLog);

                                Entities.SaveChanges();
                            }
                        }
                        else if (SaveInItemsLogWhen == WhenToLog.OnChange)
                        {
                            if (lastItemLog.Value != value)
                            {
                                ItemsLog itemsLog = new ItemsLog();
                                itemsLog.ItemId = this.ItemId;
                                itemsLog.Time   = DateTime.Now;
                                itemsLog.Value  = value;
                                Entities.ItemsLogs.Add(itemsLog);

                                Entities.SaveChanges();
                            }
                            else
                            {
                                if (DateTime.Now - lastItemLog.Time > new TimeSpan(0, 0, 1, 0))
                                {
                                    ItemsLog itemsLog = new ItemsLog();
                                    itemsLog.ItemId = this.ItemId;
                                    itemsLog.Time   = DateTime.Now;
                                    itemsLog.Value  = value;
                                    Entities.ItemsLogs.Add(itemsLog);

                                    Entities.SaveChanges();
                                }
                            }
                        }


                        var lastItemLogLatest = Entities.ItemsLogLatests.FirstOrDefault(x => x.ItemId == ItemId);

                        if (lastItemLogLatest == null)
                        {
                            ItemsLogLatest itemsLogLatest = null;
                            if (Entities.ItemsLogLatests.Any(x => x.ItemId == this.ItemId))
                            {
                                itemsLogLatest       = Entities.ItemsLogLatests.FirstOrDefault(x => x.ItemId == this.ItemId);
                                itemsLogLatest.Time  = DateTime.Now;
                                itemsLogLatest.Value = value;
                            }
                            else
                            {
                                itemsLogLatest        = new ItemsLogLatest();
                                itemsLogLatest.ItemId = this.ItemId;
                                itemsLogLatest.Time   = DateTime.Now;
                                itemsLogLatest.Value  = value;
                                Entities.ItemsLogLatests.Add(itemsLogLatest);
                            }

                            Entities.SaveChanges();

                            lastItemLogLatest = itemsLogLatest;
                        }

                        if (SaveInItemsLogLastWhen == WhenToLog.OnTimerElapsed)
                        {
                            TimeSpan timeSpan = DateTime.Now - lastItemLogLatest.Time;

                            if (timeSpan.TotalSeconds >= SaveInItemsLogLastesTimeInterval)
                            {
                                ItemsLogLatest itemsLogLatest = null;
                                if (Entities.ItemsLogLatests.Any(x => x.ItemId == this.ItemId))
                                {
                                    itemsLogLatest       = Entities.ItemsLogLatests.FirstOrDefault(x => x.ItemId == this.ItemId);
                                    itemsLogLatest.Time  = DateTime.Now;
                                    itemsLogLatest.Value = value;
                                }
                                else
                                {
                                    itemsLogLatest        = new ItemsLogLatest();
                                    itemsLogLatest.ItemId = this.ItemId;
                                    itemsLogLatest.Time   = DateTime.Now;
                                    itemsLogLatest.Value  = value;
                                    Entities.ItemsLogLatests.Add(itemsLogLatest);
                                }

                                Entities.SaveChanges();
                            }
                        }
                        else if (SaveInItemsLogLastWhen == WhenToLog.OnChange)
                        {
                            if (lastItemLogLatest.Value != value)
                            {
                                ItemsLogLatest itemsLogLatest = null;
                                if (Entities.ItemsLogLatests.Any(x => x.ItemId == this.ItemId))
                                {
                                    itemsLogLatest       = Entities.ItemsLogLatests.FirstOrDefault(x => x.ItemId == this.ItemId);
                                    itemsLogLatest.Time  = DateTime.Now;
                                    itemsLogLatest.Value = value;
                                }
                                else
                                {
                                    itemsLogLatest        = new ItemsLogLatest();
                                    itemsLogLatest.ItemId = this.ItemId;
                                    itemsLogLatest.Time   = DateTime.Now;
                                    itemsLogLatest.Value  = value;
                                    Entities.ItemsLogLatests.Add(itemsLogLatest);
                                }

                                Entities.SaveChanges();
                            }
                            else
                            {
                                if (DateTime.Now - lastItemLogLatest.Time > new TimeSpan(0, 0, 1, 0))
                                {
                                    ItemsLogLatest itemsLogLatest = null;
                                    if (Entities.ItemsLogLatests.Any(x => x.ItemId == this.ItemId))
                                    {
                                        itemsLogLatest       = Entities.ItemsLogLatests.FirstOrDefault(x => x.ItemId == this.ItemId);
                                        itemsLogLatest.Time  = DateTime.Now;
                                        itemsLogLatest.Value = value;
                                    }
                                    else
                                    {
                                        itemsLogLatest        = new ItemsLogLatest();
                                        itemsLogLatest.ItemId = this.ItemId;
                                        itemsLogLatest.Time   = DateTime.Now;
                                        itemsLogLatest.Value  = value;
                                        Entities.ItemsLogLatests.Add(itemsLogLatest);
                                    }

                                    Entities.SaveChanges();
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.LogMonitoringServiceLibrary(ex);
            }
        }
示例#10
0
        public void SetType(BACnetEnums.BACNET_OBJECT_TYPE objectType)
        {
            // Todo, check legal values here...

            this.objectType = objectType;
        }
示例#11
0
 public BACnetObjectIdentifier(BACnetEnums.BACNET_OBJECT_TYPE objectType)
 {
     this.objectType     = objectType;
     this.objectInstance = 4194303;  // wildcard
 }
示例#12
0
 public void SetType(BACnetEnums.BACNET_OBJECT_TYPE objectType)
 {
     this.objectType = objectType;
 }