//---------------------------------------------------------------------------- public void Read_HR_CurrentShuntValue( ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out OperationResult error) { ushort[] registers; Modbus.OSIModel.Message.Result result; CurrentShuntValues shunt; result = host.ReadHoldingRegisters(_AddressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.CurrentShuntValue, 1, out registers); if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError) { try { shunt = (CurrentShuntValues)Enum.ToObject(typeof(CurrentShuntValues), registers[0]); this.CurrentShuntValue = shunt; error = new OperationResult(OPERATION_RESULT.OK, String.Empty); } catch (Exception ex) { error = new OperationResult(OPERATION_RESULT.FAILURE, ex.Message); } } else { error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); } return; }
//---------------------------------------------------------------------------- public void Read_HR_DateTime( ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out OperationResult error, out DateTime dataTime) { ushort[] registers; Modbus.OSIModel.Message.Result result; DateTime unixStartTime; UInt32 totalSeconds; String msg; dataTime = DateTime.Now; result = host.ReadHoldingRegisters(_AddressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.DateTime, 2, out registers); if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError) { if (registers.Length != 2) { msg = String.Format( "Ответ БИ содержит количесво прочитанных регистров {0}, должно быть 2", registers.Length); error = new OperationResult(OPERATION_RESULT.INCORRECT_ANSWER, msg); } else { // Читать время необходимо из входного регистра. Через регистр // хранения время только записывается в устройство БИ //unixStartTime = DateTime.Parse("01/01/1970 00:00:00", // new System.Globalization.CultureInfo("ru-Ru", false)); unixStartTime = new System.DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); totalSeconds = 0; totalSeconds = registers[0]; // Hi_byte totalSeconds = (totalSeconds << 16); totalSeconds |= registers[1]; // Lo_byte dataTime = unixStartTime.AddSeconds(totalSeconds); this._DateTime = dataTime; error = new OperationResult(OPERATION_RESULT.OK, String.Empty); } } else { error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); } return; }
//---------------------------------------------------------------------------- public void Write_HR_MeasuringVoltagePeriod( ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out OperationResult error) { ushort[] registers; Modbus.OSIModel.Message.Result result; String msg; UInt16 period = this._MeasuringVoltagePeriod; registers = new ushort[] { period }; result = host.WriteMultipleRegisters(_AddressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.MeasuringSupplyVoltagePeriod, registers); if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError) { if (registers.Length != 1) { msg = String.Format( "Ответ БИ содержит количесво прочитанных регистров {0}, должен быть 1", registers.Length); error = new OperationResult(OPERATION_RESULT.INCORRECT_ANSWER, msg); } else { // Проверяем записанное и прочитанное result = host.ReadHoldingRegisters(_AddressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.MeasuringSupplyVoltagePeriod, 1, out registers); if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError) { if (registers.Length != 1) { msg = String.Format( "Ответ БИ содержит количесво прочитанных регистров {0}, должен быть 1", registers.Length); error = new OperationResult(OPERATION_RESULT.INCORRECT_ANSWER, msg); } else { period = registers[0]; if (this.MeasuringVoltagePeriod != period) { msg = String.Format( "Значение записанного прараметра {0} не совподает с прочитанным {1}", this.MeasuringPeriod, period); error = new OperationResult(OPERATION_RESULT.INCORRECT_ANSWER, msg); } else { error = new OperationResult(OPERATION_RESULT.OK, String.Empty); } } } else { error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); } } } else { error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); } return; }
//---------------------------------------------------------------------------- public void Read_HR_PollingPeriodChannel2( ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out OperationResult error) { ushort[] registers; Modbus.OSIModel.Message.Result result; result = host.ReadHoldingRegisters(_AddressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.PollingPeriodChannel2_4_20, 1, out registers); if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError) { try { this.PollingPeriodChannel2 = (UInt32)(registers[0] * 10); error = new OperationResult(OPERATION_RESULT.OK, String.Empty); } catch (Exception ex) { error = new OperationResult(OPERATION_RESULT.FAILURE, ex.Message); } } else { error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); } return; }
//---------------------------------------------------------------------------- public void Read_HR_MeasuringPeriod( ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out OperationResult error) { ushort[] registers; Modbus.OSIModel.Message.Result result; UInt32 period = 0; String msg; result = host.ReadHoldingRegisters(_AddressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.MeasuringPeriod, 2, out registers); if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError) { if (registers.Length != 2) { msg = String.Format( "Ответ БИ содержит количесво прочитанных регистров {0}, должно быть 2", registers.Length); error = new OperationResult(OPERATION_RESULT.INCORRECT_ANSWER, msg); } else { period |= registers[0]; // high period = period << 16; period |= registers[1]; // low try { this.MeasuringPeriod = period; error = new OperationResult(OPERATION_RESULT.OK, String.Empty); } catch (Exception ex) { error = new OperationResult(OPERATION_RESULT.INCORRECT_ANSWER, ex.Message); } } } else { error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); } return; }
//------------------------------------------------------------------------------------------------------ /// <summary> /// Читаем серийный номер устройства. Если данный регистр не доступен, /// то устройство инициализировано. /// В противном случае, необходимо записать серийный номер. /// </summary> /// <param name="host"></param> /// <param name="serialNumber"></param> /// <param name="error"></param> public void Read_HR_SerialNumber( ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out UInt64 serialNumber, out OperationResult error) { ushort[] registers; Modbus.OSIModel.Message.Result result; result = host.ReadHoldingRegisters(_AddressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.SerialNumber, 3, out registers); switch (result.Error) { case Modbus.OSIModel.ApplicationLayer.Error.NoError: { if (registers.Length == 3) { serialNumber = 0; serialNumber = registers[0]; serialNumber = (serialNumber << 16); serialNumber |= registers[1]; serialNumber = (serialNumber << 16); serialNumber |= registers[2]; error = new OperationResult(OPERATION_RESULT.OK, String.Empty); } else { serialNumber = 0; error = new OperationResult(OPERATION_RESULT.INCORRECT_ANSWER, String.Format( "Устройство вернуло неверные данные. Количество регистров {0}, а должно быть 3", registers.Length)); } break; } case Modbus.OSIModel.ApplicationLayer.Error.IllegalDataAddress: { serialNumber = 0; error = new OperationResult(OPERATION_RESULT.IllegalDataAddress, result.Description); break; } default: { serialNumber = 0; error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); break; } } return; }
//------------------------------------------------------------------------------------------------------ #region NetworksCommands //------------------------------------------------------------------------------------------------------ /// <summary> /// Проверяет инициализировано устройство или нет. /// </summary> /// <param name="host">Master-устройство</param> /// <param name="init">TRUE-устройство иницилизировано</param> /// <param name="error">Результат выполнения операции</param> public void Read_HR_VerifyInitDevice( ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out Boolean init, out OperationResult error) { Modbus.OSIModel.Message.Result result; UInt16[] registers; result = host.ReadHoldingRegisters( _AddressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.SerialNumber, 3, out registers); switch (result.Error) { case Modbus.OSIModel.ApplicationLayer.Error.NoError: { // Регистры доступны и значит устройство не инициализировано init = false; error = new OperationResult(OPERATION_RESULT.OK, String.Empty); break; } case Modbus.OSIModel.ApplicationLayer.Error.IllegalDataAddress: { // Регистры не доступны значит устройство инициализировано init = true; error = new OperationResult(OPERATION_RESULT.OK, String.Empty); break; } default: { init = false; String msg = String.Format( "Ошибка выполнения чтения устройства. Устройство венуло ошибку: {0}", result.Description); error = new OperationResult(OPERATION_RESULT.FAILURE, msg); break; } } }
//---------------------------------------------------------------------------- /// <summary> /// Читает серийный номер в устройство БИ при первоначальной инициализации /// </summary> /// <param name="host">Modbus master устройство</param> /// <param name="error">Результат выполнеия операции</param> /// <param name="addressSlave">Адрес подчинённого устройство</param> /// <param name="serialNumber">Серийный номер для записи в устройство</param> public static void Read_HR_SerialNumber(ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out OperationResult error, Byte addressSlave, out UInt64 serialNumber) { ushort[] registers; Modbus.OSIModel.Message.Result result; String msg; serialNumber = 0; result = host.ReadHoldingRegisters(addressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.SerialNumber, 3, out registers); if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError) { if (registers.Length != 3) { msg = String.Format( "Ответ БИ содержит количесво прочитанных регистров {0}, должно быть 3", registers.Length); error = new OperationResult(OPERATION_RESULT.FAILURE, msg); } else { serialNumber = 0; serialNumber = registers[2]; serialNumber |= (serialNumber << 16); serialNumber |= registers[1]; serialNumber |= (serialNumber << 16); serialNumber |= registers[0]; error = new OperationResult(OPERATION_RESULT.OK, String.Empty); } } else { error = new OperationResult(OPERATION_RESULT.FAILURE, String.Empty); } return; }
//------------------------------------------------------------------------------------------------------ /// <summary> /// Записывает серийный номер в устройство БИ при первоначальной инициализации /// </summary> /// <param name="host">Modbus master устройство</param> /// <param name="error">Результат выполнеия операции</param> /// <param name="addressSlave">Адрес подчинённого устройство</param> /// <param name="serialNumber">Серийный номер для записи в устройство</param> public static void Write_HR_SerialNumber(ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out OperationResult error, Byte addressSlave ,UInt64 serialNumber) { // Записываем новое значение в устройство Modbus.OSIModel.Message.Result result; UInt16[] registers = new ushort[3] { 0, 0, 0 }; String msg; //this.Cursor = Cursors.WaitCursor; unchecked { registers[0] = (UInt16)serialNumber; registers[1] = (UInt16)(serialNumber >> 16); registers[2] = (UInt16)(serialNumber >> 32); } result = host.WriteMultipleRegisters( addressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.SerialNumber, registers); if (result.Error != Modbus.OSIModel.ApplicationLayer.Error.NoError) { error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); } else { // Проверяем правильно ли записался параметр // Читаем записанный параметр result = host.ReadHoldingRegisters(addressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.SerialNumber, 3, out registers); if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError) { if (registers.Length != 3) { msg = String.Format( "Ответ БИ содержит количество прочитанных регистров {0}, должно быть 3", registers.Length); error = new OperationResult(OPERATION_RESULT.FAILURE, msg); } else { UInt64 number_wr; number_wr = 0; number_wr = registers[2]; number_wr |= (number_wr << 16); number_wr |= registers[1]; number_wr |= (number_wr << 16); number_wr |= registers[0]; if (number_wr != serialNumber) { msg = String.Format( "Значение записанного прараметра {0} не совподает с прочитанным {1}", serialNumber, number_wr); error = new OperationResult(OPERATION_RESULT.FAILURE, msg); } else { error = new OperationResult(OPERATION_RESULT.OK, String.Empty); } } } else { error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); } } return; }