예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
        }
예제 #8
0
        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);
        }
예제 #9
0
        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);
        }
예제 #10
0
        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);
        }
예제 #11
0
        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);
        }
예제 #12
0
        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);
        }