/// <summary> /// Creates the set request file. /// </summary> /// <param name="portId">The port id.</param> /// <param name="param">The param.</param> /// <returns></returns> public static SmlFile CreateSetRequestFile(string portId, IntegerParam param) { var handler = new SmlHandler(portId); var smlFile = new SmlFile(); handler.AddOpenRequest(smlFile); handler.AddSetIntegerParamRequest(smlFile, param); handler.AddCloseRequest(smlFile); return smlFile; }
/// <summary> /// Adds the set integer param request. /// </summary> /// <param name="reqFile">The req file.</param> /// <param name="param">The param.</param> private void AddSetIntegerParamRequest(SmlFile reqFile, IntegerParam param) { var msg = new Core.Sml.Messages.Message() { TransactionId = new[] { (byte)(reqFile.Count + 1) }, GroupNo = 0x00, SetProcParameterRequest = new Core.Sml.Messages.SetProcParameterRequest() { TreePath = new List<Core.Obis.ObisId>() { new Core.Obis.ObisId((ulong)param.ObisCode) }, Tree = new Tree(new Core.Obis.ObisId((ulong)param.ObisCode), param.Data.Value) } }; //var obisId = (ObisId)param.ObisCode; //var paramTreePath = new SmlTreePath(obisId); //var tree = new SmlTree { ParameterName = new SmlOctetstring(ObisUtil.GetBytes(obisId)) }; //if (param.Data.HasValue == false) //{ // throw new ArgumentNullException("param"); //} //tree.ParameterValue = new SmlProcParValue(new SmlInteger64(param.Data.Value)); //var msg = SmlMessageFactory.SetProcParamReq(paramTreePath, tree); //var transactionId = new byte[] { (byte)(reqFile.Count + 1) }; //msg.TransactionId = new SmlOctetstring(transactionId); //msg.GroupNo = 0x00; reqFile.Add(msg); }
public async Task WriteParameter(IntegerParam param, bool enableManufacturerMode = false) { var obis = new ObisId((ulong) param.ObisCode); var result = await this.baseMeterDevice.WriteRegisterAsync(obis, param.Data.Value).ConfigureAwait(false); if (result != ResultCode.Ok) { throw new InvalidOperationException("Write failed with code: " + result); } //return Task.CompletedTask; }
public async Task<IntegerParam> ReadParameter(IntegerParam param) { var obis = new ObisId((ulong) param.ObisCode); var result = await this.baseMeterDevice.ReadRegisterAsync(obis).ConfigureAwait(false); if (result == null) { throw new NullReferenceException(); } return new IntegerParam() { ObisCode = param.ObisCode, Data = result.GetAsLong() }; }
/// <summary> /// Writes the parameter. /// </summary> /// <param name="param">The param.</param> public async Task WriteParameter(IntegerParam param, bool enableManufacturerMode = false) { logger.Info( "Writing integer parameter {0} with value {1}.", (ObisId)param.ObisCode, BitConverter.ToString(BitConverter.GetBytes(param.Data.Value))); await Retry.DoTask( async () => { var requestFile = SmlHandler.CreateSetRequestFile(portName, param); await SendRequestFile(requestFile, enableManufacturerMode).ConfigureAwait(false); if (writeOnlyParams.Contains(param.ObisCode)) { return; } var result = await ReadParameter(new IntegerParam { ObisCode = param.ObisCode }); if (param.Data != result.Data) { throw new DataException( string.Format( "Failed to write and verify {0:X12}: written: {1}, read: {2}", param.ObisCode, param.Data, result.Data)); } }); }
/// <summary> /// Reads the parameter. /// </summary> /// <param name="param">The param.</param> /// <returns></returns> public async Task<IntegerParam> ReadParameter(IntegerParam param) { logger.Info("Reading integer parameter."); var requestFile = SmlHandler.CreateGetRequestFile(portName, param.ObisCode); return await Retry.Do( async () => { var resVal = await SendFile(requestFile).ConfigureAwait(false); CheckAttentionResponse(param.ObisCode, resVal); if (resVal != null) { var valB = Convert.ToInt64(resVal); param.Data = valB; logger.Info("Responding with result: {0}.", param.Data); return param; } logger.Info("No response for reading integer parameter."); throw new NullReferenceException(); }); }
/// <summary> /// Writes the parameter. /// </summary> /// <param name="param">The param.</param> public async Task WriteParameter(IntegerParam param, bool enableManufacturerMode = false) { this.logger.Info( "Writing integer parameter {0} with value {1}.", (ObisId)param.ObisCode, BitConverter.ToString(BitConverter.GetBytes(param.Data.Value))); await Retry.DoTask( async () => { var requestFile = SmlHandler.CreateSetRequestFile(this.endpoint, param); await this.SendRequestFile(requestFile, enableManufacturerMode); if (writeOnlyParams.Contains(param.ObisCode)) { return; } var result = await this.ReadParameter(new IntegerParam() { ObisCode = param.ObisCode }); if (param.Data != result.Data) { throw new DataException( $"Failed to write and verify {param.ObisCode:X12}: written: {param.Data}, read: {result.Data}"); } }); }