public void ProcessProductionSchedule() { // ProcessProductionSchedule request test // Creating a message object for testing var request = new MsgBiz.ProcessProductionSchedule() { ProductionSchedules = new System.Collections.Generic.List <MsgBiz.ProductionSchedule> { new MsgBiz.ProductionSchedule() { ProductionRequests = new System.Collections.Generic.List <MsgBiz.ProductionRequest> { new MsgBiz.ProductionRequest() { HierarchyScopeObj = new MsgBiz.HierarchyScope( new MsgBiz.IdentifierType("my-equipment"), MsgBiz.EquipmentElementLevelType.ProcessCell ) } } } } }; var msg = request.ToXmlBytes(); // Extracting metadata var testObject = MetadataExtractor.Build(msg); Assert.AreEqual(ContentTypeType.Xml, testObject.ContentType); Assert.AreEqual("Production schedule", testObject.Name); Assert.AreEqual("Production schedule", testObject.PayloadSummary); Assert.AreEqual(PayloadTypeType.ProcessProductionScheduleXml, testObject.PayloadType); }
public void ReadXml(byte[] xmlBytes) { MsgBiz.ProcessProductionSchedule processRequest; // Reading the message try { processRequest = new MsgBiz.ProcessProductionSchedule(xmlBytes); } catch (MsgBiz.Neutral.InvalidMessageException e) { throw new InvalidOperationException("Failed to read message: " + e.Message); } // Now, read message content and realise the schedule if possible //processRequest.ProductionSchedules[0].ProductionRequests[0].SegmentRequirements ... }
private void VisualiseProductionSchedule(string filepath) { MessageTreeView.Items.Clear(); try { // Deserialising the document var msg = System.IO.File.ReadAllBytes(filepath); var requestMsg = new MsgBiz.ProcessProductionSchedule(msg); // Adding metadata var root = AddNodeToTreeview(MessageTreeView, "ProcessProductionSchedule"); AddNodeToTreeview(root, "CreationDateTime", FormatDateTimeForTreeview(requestMsg.CreationDateTime)); // Adding production schedules AddProductionSchedules(root, requestMsg.ProductionSchedules); } catch (Exception e) { AddMessageToTreeview("Error: " + e.Message); m_appLogic.AddUnexpectedErrorToLog(e); } }
// This example shows how to create and read a ProcessProductionSchedule // message in XML (based on the XML schemata of B2MML). // // Please note that this example does not use all fields available in the API. // On the other hand, the API only implements are fraction of B2MML. // "ProcessProductionSchedule" is only one of the message types of B2MML. // Please see the ANSI/ISA-95 standard or B2MML documentation to learn more // about message types and messaging patterns. public byte[] CreateXml() { // This function procudes a schedule for an imaginary batch process, // where materials are cooked in a "cooker". // There are 3 segments: "charge", "cook" and "discharge". // Charge takes raw material in, whereas discharge takes the end product out. var processStart = DateTime.Now.AddMinutes(40).ToUniversalTime(); // Creating segment requirements. The segments are "charge", "cook" and "discharge". var segmentCharge = new MsgBiz.SegmentRequirement { ProcessSegmentIdentifier = new MsgBiz.IdentifierType("charge"), EarliestStartTime = processStart, LatestEndTime = processStart.AddMinutes(15) }; var segmentCook = new MsgBiz.SegmentRequirement { ProcessSegmentIdentifier = new MsgBiz.IdentifierType("cook"), EarliestStartTime = processStart.AddMinutes(15), LatestEndTime = processStart.AddMinutes(75) }; var segmentDischarge = new MsgBiz.SegmentRequirement { ProcessSegmentIdentifier = new MsgBiz.IdentifierType("discharge"), EarliestStartTime = processStart.AddMinutes(75), LatestEndTime = processStart.AddMinutes(90) }; // Specifying the required equipment var equipmentReq = new MsgBiz.EquipmentRequirement() { Quantities = new SysColl.List <MsgBiz.QuantityValue>() { // One cooker is required for the process new MsgBiz.QuantityValue(1) { Key = new MsgBiz.IdentifierType("cooker") } } }; segmentCharge.EquipmentRequirements.Add(equipmentReq); segmentCook.EquipmentRequirements.Add(equipmentReq); segmentDischarge.EquipmentRequirements.Add(equipmentReq); // Specifying the required raw materials var materialWater = CreateMaterialReq( use: MsgBiz.MaterialUseType.Consumed, id: "water", // This could be more specific quantity: 3.2, uom: "m3"); var materialConcentrate = CreateMaterialReq( use: MsgBiz.MaterialUseType.Consumed, id: "concentrate-A2", quantity: 220, uom: "kg"); segmentCharge.MaterialRequirements.Add(materialWater); segmentCharge.MaterialRequirements.Add(materialConcentrate); // Specifying the expected material output var materialEndProduct = CreateMaterialReq( use: MsgBiz.MaterialUseType.Produced, id: "product-A2", quantity: 3.1, uom: "t"); // Specify a lot ID for the output materialEndProduct.MaterialLotIdentifiers.Add( new MsgBiz.IdentifierType("lot-A2-3101") ); segmentDischarge.MaterialRequirements.Add(materialEndProduct); // Creating a production request. The schedule could contain multiple of these. // You could add multiple requests, one for each production unit, for instance. var productionRequest = new MsgBiz.ProductionRequest { // Set hierarchy scope HierarchyScopeObj = new MsgBiz.HierarchyScope( new MsgBiz.IdentifierType("cooker-3"), MsgBiz.EquipmentElementLevelType.ProcessCell ), // Set segments SegmentRequirements = new SysColl.List <MsgBiz.SegmentRequirement>() { segmentCharge, segmentCook, segmentDischarge } }; // Creating a schedule object var schedule = new MsgBiz.ProductionSchedule() { ProductionRequests = new SysColl.List <MsgBiz.ProductionRequest>() { productionRequest } }; var processScheduleRequest = new MsgBiz.ProcessProductionSchedule() { CreationDateTime = DateTime.Now.ToUniversalTime(), ProductionSchedules = new SysColl.List <MsgBiz.ProductionSchedule>() { schedule } }; // Serialising to XML return(processScheduleRequest.ToXmlBytes()); }
private byte[] GetProcessProductionSchedule() { try { // Fabricating a message var baseDateTime = DateTime.Now.ToUniversalTime().AddMinutes(30); var materialReq = new MsgBiz.MaterialRequirement() { MaterialDefinitionIdentifiers = new System.Collections.Generic.List <MsgBiz.IdentifierType> { new MsgBiz.IdentifierType("material_x") }, MaterialLotIdentifiers = new System.Collections.Generic.List <MsgBiz.IdentifierType> { new MsgBiz.IdentifierType("batch-119") }, MaterialUse = new MsgBiz.MaterialUse(MsgBiz.MaterialUseType.Produced), Quantities = new System.Collections.Generic.List <MsgBiz.QuantityValue> { new MsgBiz.QuantityValue(41.9) { UnitOfMeasure = "t/h" } } }; var messageObj = new MsgBiz.ProcessProductionSchedule() { ProductionSchedules = new System.Collections.Generic.List <MsgBiz.ProductionSchedule> { new MsgBiz.ProductionSchedule() { ProductionRequests = new System.Collections.Generic.List <MsgBiz.ProductionRequest> { new MsgBiz.ProductionRequest() { Identifier = new MsgBiz.IdentifierType("my-identifier-1"), HierarchyScopeObj = new MsgBiz.HierarchyScope( new MsgBiz.IdentifierType("process_a"), MsgBiz.EquipmentElementLevelType.ProcessCell ), SegmentRequirements = new System.Collections.Generic.List <MsgBiz.SegmentRequirement> { new MsgBiz.SegmentRequirement() { EarliestStartTime = baseDateTime.AddMinutes(1), LatestEndTime = baseDateTime.AddMinutes(30), MaterialRequirements = new System.Collections.Generic.List <MsgBiz.MaterialRequirement> { materialReq } }, new MsgBiz.SegmentRequirement() { EarliestStartTime = baseDateTime.AddMinutes(31), LatestEndTime = baseDateTime.AddMinutes(60) } } }, new MsgBiz.ProductionRequest() { Identifier = new MsgBiz.IdentifierType("my-identifier-2") } } } } }; // String to bytes return(messageObj.ToXmlBytes()); } catch { // Fallback: use empty message return(new byte[0]); } }
private void SendSchedule(Rmq.IModel channel) { // Creating an imaginary schedule for two tanks, T300 and T400. // It helps to create a "base DateTime", because the message API requires all DateTimes in UTC var dateTimeBase = DateTime.Now.ToUniversalTime(); // Creating material requirements for the production requests var matReqLoad = CreateMaterialReqForSchedule(MsgBiz.MaterialUseType.Consumed, "liquid_422", 1.3); var matReqUnload = CreateMaterialReqForSchedule(MsgBiz.MaterialUseType.Produced, "liquid_429", 1.1); // Creating scheduling parameters var schedulingParams = new MsgMeas.Item_DataRecord() { { "scheduling-method", new MsgMeas.Item_Category("default") }, { "scheduling-horizon", new MsgMeas.Item_Measurement("min", 120) } }; // Creating production requests var prodReqT300 = new MsgBiz.ProductionRequest() { HierarchyScopeObj = new MsgBiz.HierarchyScope( new MsgBiz.IdentifierType("T300"), MsgBiz.EquipmentElementLevelType.ProcessCell ), SegmentRequirements = new SysColl.List <MsgBiz.SegmentRequirement>() { CreateSegmentForSchedule(dateTimeBase.AddMinutes(29), dateTimeBase.AddMinutes(49), "load", matReqLoad), CreateSegmentForSchedule(dateTimeBase.AddMinutes(62), dateTimeBase.AddMinutes(82), "unload", matReqUnload), }, SchedulingParameters = schedulingParams.ToDataRecordPropertyProxy() }; var prodReqT400 = new MsgBiz.ProductionRequest() { HierarchyScopeObj = new MsgBiz.HierarchyScope( new MsgBiz.IdentifierType("T400"), MsgBiz.EquipmentElementLevelType.ProcessCell ), SegmentRequirements = new SysColl.List <MsgBiz.SegmentRequirement>() { CreateSegmentForSchedule(dateTimeBase.AddMinutes(19), dateTimeBase.AddMinutes(39), "load", matReqLoad), CreateSegmentForSchedule(dateTimeBase.AddMinutes(52), dateTimeBase.AddMinutes(72), "unload", matReqUnload), }, SchedulingParameters = schedulingParams.ToDataRecordPropertyProxy() }; // Creating a request to process the schedule var processScheduleRequest = new MsgBiz.ProcessProductionSchedule() { // This is the current time by default, but setting it explicitly CreationDateTime = DateTime.Now.ToUniversalTime(), ProductionSchedules = new SysColl.List <MsgBiz.ProductionSchedule> { new MsgBiz.ProductionSchedule() } }; // Adding the production requests to the message processScheduleRequest.ProductionSchedules[0].ProductionRequests.Add(prodReqT300); processScheduleRequest.ProductionSchedules[0].ProductionRequests.Add(prodReqT400); // Sending the message to the message bus SendToMessageBus(channel, TopicNameSchedules, processScheduleRequest.ToXmlBytes()); }