//---------------------------------------------------------------------------- /// <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> /// Читает визитную карточку NGK-устройства /// </summary> /// <param name="host"></param> /// <param name="error"></param> /// <param name="addressSlave"></param> /// <param name="card"></param> public static void Read_IRs_CallingCard( ref Modbus.OSIModel.ApplicationLayer.Master.Device host, out OperationResult error, Byte addressSlave, out CallingCard card) { ushort[] registers; Modbus.OSIModel.Message.Result result; String msg; UInt16 startAddress = 0x0000; // Адрес начального входного регистра визитной карточки UInt16 length = 7; result = host.ReadInputRegisters(addressSlave, startAddress, length, out registers); if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError) { if (registers.Length != 7) { msg = String.Format( "Ответ БИ содержит количесво прочитанных регистров {0}, должно быть 7", registers.Length); card = null; error = new OperationResult(OPERATION_RESULT.FAILURE, msg); } else { // Рассчитываем контрольную сумму. List <Byte> arr = new List <Byte>(); // Получаем массив байт (без регистра с CRC16) for (int i = 0; i < (registers.Length - 1); i++) { arr.AddRange(Modbus.Convert.ConvertToBytes(registers[i])); } // Рассчитываем CRC16 и сравниваем с прочитанным Byte[] crc16calc_b = Modbus.OSIModel.DataLinkLayer.CRC16.CalcCRC16(arr.ToArray()); UInt16 crc16calc = 0; crc16calc = crc16calc_b[1]; // Hi_byte crc16 crc16calc = (UInt16)(crc16calc << 8); crc16calc |= crc16calc_b[0]; // Lo_byte crc16 // Проверяем контрольную сумму (прочитанную и рассчитаную) if (registers[registers.Length - 1] == crc16calc) { // Контрольная сумма сошлась, получаем данные визтной карты card = new CallingCard(); // Получаем тип устройства try { card.TypeOfDevice = (TYPE_NGK_DEVICE)Enum.Parse(typeof(TYPE_NGK_DEVICE), registers[0].ToString()); } catch { msg = String.Format( "Неизвестный тип устройства, код типа устройства: {0}", registers[0]); error = new OperationResult(OPERATION_RESULT.FAILURE, msg); return; } // Получаем версию ПО card.SofwareVersion = ((float)registers[1]) / 100; // Получаем версию Аппаратуры card.HardwareVersion = ((float)registers[2]) / 100; // Получаем серийный номер card.SerialNumber = 0; card.SerialNumber = registers[3]; card.SerialNumber |= (card.SerialNumber << 16); card.SerialNumber |= registers[4]; card.SerialNumber |= (card.SerialNumber << 16); card.SerialNumber |= registers[5]; error = new OperationResult(OPERATION_RESULT.OK, String.Empty); } else { msg = "Конрольная сумма визитной краточки не совпала с рассчётной"; card = null; error = new OperationResult(OPERATION_RESULT.FAILURE, msg); } } } else { // При выполнени чтения устройства возникли проблемы... card = null; error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description); } 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; }