//---------------------------------------------------------------------------- /// <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; }