public override byte[] PackRequest() { byte[] request = new byte[25]; DNP3WriteCommandParameters commandParam = (DNP3WriteCommandParameters)CommandParameters; CommandParameters.Length = 18; Buffer.BlockCopy(headerBuilder.Build(CommandParameters), 0, request, 0, 10); request[10] = commandParam.TransportControl; request[11] = commandParam.AplicationControl; request[12] = commandParam.FunctionCode; Buffer.BlockCopy(BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)commandParam.ObjectTypeField)), 0, request, 13, 2); request[15] = commandParam.Qualifier; Buffer.BlockCopy(BitConverter.GetBytes(Convert.ToUInt16(commandParam.RangeField)), 0, request, 16, 2); Buffer.BlockCopy(BitConverter.GetBytes(Convert.ToUInt16(commandParam.Prefix)), 0, request, 18, 2); Buffer.BlockCopy(BitConverter.GetBytes(Convert.ToUInt16(commandParam.Value)), 0, request, 20, 2); request[22] = 0x00; ushort crc1 = 0; for (int i = 10; i < 23; i++) { CrcCalculator.computeCRC(request[i], ref crc1); } crc1 = (ushort)(~crc1); Buffer.BlockCopy(BitConverter.GetBytes(crc1), 0, request, 23, 2); return(request); }
public static IDNP3Function CreateWriteFunction(DNP3WriteCommandParameters parameters) { switch ((TypeField)parameters.ObjectTypeField) { case TypeField.BINARY_COMMAND: return(new WriteDiscreteOutput(parameters)); case TypeField.ANALOG_OUTPUT_16BIT: return(new WriteAnalogOutput(parameters)); default: return(null); } }
public void ExecuteWriteCommand(RegisterType type, uint index, uint value) { DNP3WriteCommandParameters dnp3CommandParam = new DNP3WriteCommandParameters(GetApplicationSequence(), (byte)DNP3FunctionCode.DIRECT_OPERATE, GetTypeField(type, true), (byte)Qualifier.PREFIX_2_OCTET_COUNT_OF_OBJECTS_2_OCTET, 1, index, value, GetTransportSequence()); IDNP3Function dnp3Fn = DNP3FunctionFactory.CreateWriteFunction(dnp3CommandParam); this.functionExecutor.EnqueueCommand(dnp3Fn); var point = storage.GetSingle(type, (int)index); if (point != null && point.RegisterType == RegisterType.BINARY_OUTPUT) { dom.AddOrUpdate(new SCADA.Common.Models.DomDbModel() { Mrid = point.Mrid, TimeStamp = DateTime.Now.ToString() }); } }