using PLC.Siemens.Protocol.ReadData; using PlcSiemens.Core.Extension; using PlcSiemens.O; using PlcSiemens.Protocol.Common; namespace PlcSiemens.Protocol.ReadData { public class ReadParamsRequest { public byte FunRead { get; set; } public byte ItemsCount { get; set; } public ReadItemRequest[] Items { get; set; }//最大长度20 public byte PacketLength { get { return (byte)(0x0C * Items.Length + 2); } } public void Build(List dataItems) { //Header FunRead = (byte)PduFuncType.PduFuncRead; ItemsCount = (byte)dataItems.Count; //项处理 Items = new ReadItemRequest[ItemsCount]; for (var i = 0; i < dataItems.Count; i++) { var dataItem = dataItems[i]; var item = new ReadItemRequest(); Items[i] = item; item.ItemHead[0] = 0x12; item.ItemHead[1] = 0x0A; item.ItemHead[2] = 0x10; item.TransportSize = (byte)dataItem.DataType; item.Length = dataItem.Length; if (dataItem.AreaType == AreaType.DB) item.DB = dataItem.Db; else item.DB = 0x0000; item.Area = (byte)dataItem.AreaType; long address; if ((dataItem.DataType == DataType.Bit) || (dataItem.DataType == DataType.Counter) || (dataItem.DataType == DataType.Timer)) address = dataItem.Start; else address = (dataItem.Start * 8); item.Address[2] = (byte)(address & 0x000000FF); address = (ushort)(address >> 8); item.Address[1] = (byte)(address & 0x000000FF); address = (ushort)(address >> 8); item.Address[0] = (byte)(address & 0x000000FF); } } public void GetByteBuffer(ByteBuffer buffer) { buffer.Push(FunRead); buffer.Push(ItemsCount); Items.ForEach(t => { buffer.Push(t.ItemHead); buffer.Push(t.TransportSize); buffer.Push(t.Length); buffer.Push(t.DB); buffer.Push(t.Area); buffer.Push(t.Address); }); } } }