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; }
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; }
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"; } } } }
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"; } } } }
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; }
// 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; } }
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); }
// 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); } }
public void SetType(BACnetEnums.BACNET_OBJECT_TYPE objectType) { // Todo, check legal values here... this.objectType = objectType; }
public BACnetObjectIdentifier(BACnetEnums.BACNET_OBJECT_TYPE objectType) { this.objectType = objectType; this.objectInstance = 4194303; // wildcard }
public void SetType(BACnetEnums.BACNET_OBJECT_TYPE objectType) { this.objectType = objectType; }