public static S7UserDataDatagram BuildPendingAlarmRequest(SiemensPlcProtocolContext context, ushort id, byte sequenceNumber) { var data = sequenceNumber == 0 ? new byte[] { 0x00, 0x01, 0x12, 0x08, 0x1a, 0x00, 0x01, 0x34, 0x00, 0x00, 0x00, 0x04 } : Array.Empty <byte>();; var result = new S7UserDataDatagram { Parameter = new S7UserDataParameter { ParamDataLength = sequenceNumber == 0 ? (byte)4 : (byte)8, TypeAndGroup = ((byte)UserDataFunctionType.Request << 4) | (byte)UserDataFunctionGroup.Cpu, SubFunction = (byte)UserDataSubFunctionCpu.AlarmInit, SequenceNumber = sequenceNumber, ParameterType = sequenceNumber == 0 ? (byte)UserDataParamTypeType.Request : (byte)UserDataParamTypeType.Response }, Data = new S7UserData { Data = data, UserDataLength = (ushort)data.Length, ReturnCode = data.Length > 0 ? (byte)ItemResponseRetValue.Success : (byte)ItemResponseRetValue.DataError, TransportSize = data.Length > 0 ? (byte)DataTransportSize.OctetString : (byte)DataTransportSize.Null } }; result.Header.ProtocolDataUnitReference = id; result.Header.DataLength = sequenceNumber == 0 ? (ushort)16 : (ushort)4; result.Header.ParamLength = sequenceNumber == 0 ? (ushort)8 : (ushort)12; return(result); }
public static S7UserDataDatagram BuildAlarmUpdateRequest(SiemensPlcProtocolContext context, ushort id, bool activate = true) { var data = new byte[] { 0x86, 0x00, 0x61, 0x73, 0x6d, 0x65, 0x73, 0x73, 0x00, 0x00, activate ? (byte)0x09 : (byte)0x08, 0x00 }; var result = new S7UserDataDatagram { Parameter = new S7UserDataParameter { ParamDataLength = 4, TypeAndGroup = ((byte)UserDataFunctionType.Request << 4) | (byte)UserDataFunctionGroup.Cpu, SubFunction = (byte)UserDataSubFunctionCpu.Msgs, SequenceNumber = 0, ParameterType = (byte)UserDataParamTypeType.Request }, Data = new S7UserData { Data = data, UserDataLength = (ushort)data.Length, ReturnCode = data.Length > 0 ? (byte)ItemResponseRetValue.Success : (byte)ItemResponseRetValue.DataError, TransportSize = data.Length > 0 ? (byte)DataTransportSize.OctetString : (byte)DataTransportSize.Null } }; result.Header.ProtocolDataUnitReference = id; result.Header.DataLength = 16; result.Header.ParamLength = 8; return(result); }
public static S7UserDataDatagram BuildBlocksOfTypeRequest(SiemensPlcProtocolContext context, int id, PlcBlockType type, byte sequenceNumber) { var result = new S7UserDataDatagram { Parameter = new S7UserDataParameter { ParamDataLength = sequenceNumber == 0x00 ? (byte)4 : (byte)8, TypeAndGroup = ((byte)UserDataFunctionType.Request << 4) | (byte)UserDataFunctionGroup.Block, SubFunction = (byte)UserDataSubFunctionBlock.ListType, SequenceNumber = sequenceNumber, ParameterType = sequenceNumber == 0x00 ? (byte)UserDataParamTypeType.Request : (byte)UserDataParamTypeType.Response }, Data = new S7UserData { ReturnCode = (byte)ItemResponseRetValue.DataError, TransportSize = (byte)DataTransportSize.Null } }; result.Header.ProtocolDataUnitReference = (ushort)id; result.Header.DataLength = sequenceNumber == 0x00 ? (ushort)6 : (ushort)4; result.Header.ParamLength = sequenceNumber == 0x00 ? (ushort)8 : (ushort)12; result.Data.Data = sequenceNumber == 0 ? new byte[] { 0x30, (byte)type } : Array.Empty <byte>(); result.Data.UserDataLength = (ushort)result.Data.Data.Length; return(result); }
public static S7UserDataDatagram BuildBlockInfoRequest(SiemensPlcProtocolContext context, int id, PlcBlockType blockType, int blockNumber) { var result = new S7UserDataDatagram { Parameter = new S7UserDataParameter { ParamDataLength = 4, TypeAndGroup = ((byte)UserDataFunctionType.Request << 4) | (byte)UserDataFunctionGroup.Block, SubFunction = (byte)UserDataSubFunctionBlock.BlockInfo, SequenceNumber = 0, ParameterType = (byte)UserDataParamTypeType.Request }, Data = new S7UserData { ReturnCode = (byte)ItemResponseRetValue.Success, TransportSize = (byte)DataTransportSize.OctetString, } }; result.Header.ProtocolDataUnitReference = (ushort)id; result.Header.DataLength = 12; result.Header.ParamLength = 8; result.Data.Data = new byte[] { 0x30, (byte)blockType, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41 }; Encoding.Default.GetBytes(string.Format(CultureInfo.InvariantCulture, "{0:00000}", blockNumber)).AsSpan().CopyTo(result.Data.Data.Span.Slice(2, 5)); result.Data.UserDataLength = (ushort)result.Data.Data.Length; return(result); }
public static S7UserDataDatagram BuildBlocksCountRequest(SiemensPlcProtocolContext context, int id) { var result = new S7UserDataDatagram { Parameter = new S7UserDataParameter { ParamDataLength = 4, TypeAndGroup = ((byte)UserDataFunctionType.Request << 4) | (byte)UserDataFunctionGroup.Block, SubFunction = (byte)UserDataSubFunctionBlock.List, SequenceNumber = 0, ParameterType = (byte)UserDataParamTypeType.Request }, Data = new S7UserData { ReturnCode = (byte)ItemResponseRetValue.DataError, TransportSize = (byte)DataTransportSize.Null, Data = Array.Empty <byte>(), UserDataLength = 0 } }; result.Header.ProtocolDataUnitReference = (ushort)id; result.Header.DataLength = 4; result.Header.ParamLength = 8; return(result); }
public static S7WriteJobAckDatagram Build(SiemensPlcProtocolContext context, int id, IEnumerable <WriteResultItem> vars) { var result = new S7WriteJobAckDatagram(); result.Header.Header.ProtocolDataUnitReference = (ushort)id; if (vars != null) { result.ItemCount = (byte)vars.Count(); var numberOfItems = result.ItemCount; foreach (var item in vars) { numberOfItems--; result.Data.Add(new S7DataItemWriteResult { ReturnCode = (byte)item.ReturnCode }); } } result.Header.Header.ParamLength = (ushort)2; result.Header.Header.DataLength = (ushort)result.Data.Count; result.ItemCount = (byte)result.Data.Count; return(result); }
public static S7CommSetupDatagram Build(SiemensPlcProtocolContext context) { //TODO we need a parameter for the UnitId var result = new S7CommSetupDatagram { Parameter = new S7CommSetupParameterDatagram { MaxAmQCalling = context.MaxParallelJobs, MaxAmQCalled = context.MaxParallelJobs, PduLength = context.PduSize } }; return(result); }
public static S7CommSetupDatagram Build(SiemensPlcProtocolContext context, int id) { //TODO we need a parameter for the UnitId var result = new S7CommSetupDatagram { Parameter = new S7CommSetupParameterDatagram { MaxAmQCalling = context.MaxAmQCalling, MaxAmQCalled = context.MaxAmQCalled, PduLength = context.PduSize } }; result.Header.ProtocolDataUnitReference = (ushort)id; return(result); }
public static S7CommSetupAckDataDatagram BuildFrom(SiemensPlcProtocolContext context, S7CommSetupDatagram incoming) { context.MaxAmQCalling = Math.Min(incoming.Parameter.MaxAmQCalling, context.MaxAmQCalling); context.MaxAmQCalled = Math.Min(incoming.Parameter.MaxAmQCalled, context.MaxAmQCalled); context.PduSize = Math.Min(incoming.Parameter.PduLength, context.PduSize); //TODO we need a parameter for the UnitId var result = new S7CommSetupAckDataDatagram { Parameter = new S7CommSetupParameterDatagram { MaxAmQCalling = context.MaxAmQCalling, MaxAmQCalled = context.MaxAmQCalled, PduLength = context.PduSize } }; result.Header.Header.ParamLength = 8; return(result); }
public static S7WriteJobDatagram BuildWrite(SiemensPlcProtocolContext context, int id, IEnumerable <WriteItem> vars) { var numberOfItems = 0; var result = new S7WriteJobDatagram(); result.Header.ProtocolDataUnitReference = (ushort)id; if (vars != null) { foreach (var item in vars) { numberOfItems++; result.Items.Add(new S7AddressItemSpecificationDatagram { TransportSize = S7AddressItemSpecificationDatagram.GetTransportSize(item.Area, item.VarType), ItemSpecLength = item.NumberOfItems, DbNumber = item.DbNumber, Area = (byte)item.Area, Address = S7AddressItemSpecificationDatagram.GetAddress(item.Offset, item.VarType) }); } foreach (var item in vars) { numberOfItems--; result.Data.Add(new S7DataItemSpecification { ReturnCode = 0x00, TransportSize = S7DataItemSpecification.GetTransportSize(item.Area, item.VarType), Length = item.NumberOfItems, Data = item.Data, FillByte = numberOfItems == 0 || item.NumberOfItems % 2 == 0 ? Array.Empty <byte>() : new byte[1], ElementSize = item.ElementSize }); } } result.Header.ParamLength = (ushort)(2 + result.Items.Count * 12); result.Header.DataLength = (ushort)(S7DataItemSpecification.GetDataLength(vars) + result.Items.Count * 4); result.ItemCount = (byte)result.Items.Count; return(result); }
public static S7ReadJobAckDatagram Build(SiemensPlcProtocolContext context, int id, IEnumerable <ReadResultItem> vars) { var result = new S7ReadJobAckDatagram(); ushort dataLength = 0; result.Header.Header.ProtocolDataUnitReference = (ushort)id; if (vars != null) { result.ItemCount = (byte)vars.Count(); var numberOfItems = result.ItemCount; foreach (var item in vars) { numberOfItems--; result.Data.Add(new S7DataItemSpecification { ReturnCode = (byte)item.ReturnCode, TransportSize = (byte)item.TransportSize, Length = item.NumberOfItems, Data = item.Data, FillByte = numberOfItems == 0 || item.NumberOfItems % 2 == 0 ? Array.Empty <byte>() : new byte[1], ElementSize = item.ElementSize }); if ((dataLength % 2) != 0) { dataLength++; } dataLength += (ushort)item.Data.Length; } } result.Header.Header.ParamLength = (ushort)2; result.Header.Header.DataLength = (ushort)(dataLength + result.Data.Count * 4); result.ItemCount = (byte)result.Data.Count; return(result); }
public static S7ReadJobDatagram BuildRead(SiemensPlcProtocolContext context, int id, IEnumerable <ReadItem> vars) { var result = new S7ReadJobDatagram(); result.Header.ProtocolDataUnitReference = (ushort)id; if (vars != null) { foreach (var item in vars) { result.Items.Add(new S7AddressItemSpecificationDatagram { TransportSize = S7AddressItemSpecificationDatagram.GetTransportSize(item.Area, item.VarType), ItemSpecLength = item.Length, DbNumber = item.DbNumber, Area = (byte)item.Area, Address = S7AddressItemSpecificationDatagram.GetAddress(item.Offset, item.VarType) }); } } result.Header.ParamLength = (ushort)(2 + result.Items.Count * 12); result.ItemCount = (byte)result.Items.Count; return(result); }